diff options
Diffstat (limited to 'gcc/treelang/treelang.texi')
-rw-r--r-- | gcc/treelang/treelang.texi | 1317 |
1 files changed, 0 insertions, 1317 deletions
diff --git a/gcc/treelang/treelang.texi b/gcc/treelang/treelang.texi deleted file mode 100644 index 8f9ea8f6506..00000000000 --- a/gcc/treelang/treelang.texi +++ /dev/null @@ -1,1317 +0,0 @@ -\input texinfo @c -*-texinfo-*- - -@c NOTE THIS IS NOT A GOOD EXAMPLE OF HOW TO DO A MANUAL. FIXME!!! -@c NOTE THIS IS NOT A GOOD EXAMPLE OF HOW TO DO A MANUAL. FIXME!!! -@c NOTE THIS IS NOT A GOOD EXAMPLE OF HOW TO DO A MANUAL. FIXME!!! - - -@c %**start of header -@setfilename treelang.info - -@set last-update 2001-07-30 -@set copyrights-treelang 1995,1996,1997,1998,1999,2000,2001,2002 -@c DEVELOPMENT is set to indicate an in-development version, -@c as compared to a release version. When making a release -@c (e.g. a release branch in the CVS repository for GCC), -@c clear this and set the version information correctly. -@clear DEVELOPMENT -@set version-treelang 1.0 -@set version-GCC 3.0 - -@set email-general gcc@@gcc.gnu.org -@set email-bugs gcc-bugs@@gcc.gnu.org or bug-gcc@@gnu.org -@set email-patches gcc-patches@@gcc.gnu.org -@set path-treelang gcc/gcc/treelang - -@set which-treelang GCC-@value{version-GCC} -@set which-GCC GCC - -@set email-josling tej@@melbpc.org.au -@set www-josling http://www.geocities.com/timjosling - -@c This tells @include'd files that they're part of the overall TREELANG doc -@c set. (They might be part of a higher-level doc set too.) -@set DOC-TREELANG - -@c @setfilename usetreelang.info -@c @setfilename maintaintreelang.info -@c To produce the full manual, use the "treelang.info" setfilename, and -@c make sure the following do NOT begin with '@c' (and the @clear lines DO) -@set INTERNALS -@set USING -@c To produce a user-only manual, use the "usetreelang.info" setfilename, and -@c make sure the following does NOT begin with '@c': -@c @clear INTERNALS -@c To produce a maintainer-only manual, use the "maintaintreelang.info" setfilename, -@c and make sure the following does NOT begin with '@c': -@c @clear USING - -@c 6/27/96 FSF DO wants smallbook fmt for 1st bound edition. (from gcc.texi) -@c @smallbook - -@c i also commented out the finalout command, so if there *are* any -@c overfulls, you'll (hopefully) see the rectangle in the right hand -@c margin. -- burley 1999-03-13 (from mew's comment in GCC.texi). -@c @finalout - -@ifset INTERNALS -@ifset USING -@settitle Using and Maintaining GNU Treelang -@end ifset -@end ifset -@c seems reasonable to assume at least one of INTERNALS or USING is set... -@ifclear INTERNALS -@settitle Using GNU Treelang -@end ifclear -@ifclear USING -@settitle Maintaining GNU Treelang -@end ifclear -@c then again, have some fun -@ifclear INTERNALS -@ifclear USING -@settitle Doing Very Little at all with GNU Treelang -@end ifclear -@end ifclear - -@syncodeindex fn cp -@syncodeindex vr cp -@c %**end of header - -@c Cause even numbered pages to be printed on the left hand side of -@c the page and odd numbered pages to be printed on the right hand -@c side of the page. Using this, you can print on both sides of a -@c sheet of paper and have the text on the same part of the sheet. - -@c The text on right hand pages is pushed towards the right hand -@c margin and the text on left hand pages is pushed toward the left -@c hand margin. -@c (To provide the reverse effect, set bindingoffset to -0.75in.) - -@c @tex -@c \global\bindingoffset=0.75in -@c \global\normaloffset =0.75in -@c @end tex - -@ifinfo -@dircategory Programming -@direntry -* treelang: (treelang). The GNU Treelang compiler. -@end direntry -@ifset INTERNALS -@ifset USING -This file documents the use and the internals of the GNU Treelang -(@code{treelang}) compiler. At the moment this manual is not -incorporated into the main GCC manual as it is too incomplete. It -corresponds to the @value{which-treelang} version of @code{treelang}. -@end ifset -@end ifset -@ifclear USING -This file documents the internals of the GNU Treelang (@code{treelang}) compiler. -It corresponds to the @value{which-treelang} version of @code{treelang}. -@end ifclear -@ifclear INTERNALS -This file documents the use of the GNU Treelang (@code{treelang}) compiler. -It corresponds to the @value{which-treelang} version of @code{treelang}. -@end ifclear - -Published by the Free Software Foundation -59 Temple Place - Suite 330 -Boston, MA 02111-1307 USA - -Copyright (C) @value{copyrights-treelang} Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with the -Invariant Sections being ``GNU General Public License'', the Front-Cover -texts being (a) (see below), and with the Back-Cover Texts being (b) -(see below). A copy of the license is included in the section entitled -``GNU Free Documentation License''. - -(a) The FSF's Front-Cover Text is: - - A GNU Manual - -(b) The FSF's Back-Cover Text is: - - You have freedom to copy and modify this GNU Manual, like GNU - software. Copies published by the Free Software Foundation raise - funds for GNU development. -@end ifinfo - -treelang was Contributed by Tim Josling (@email{@value{email-josling}}). -Inspired by and based on the 'toy' language, written by Richard Kenner. - -This document was written by Tim Josling, based on the GNU C++ -documentation. - -@setchapternewpage odd -@c @finalout -@titlepage -@ifset INTERNALS -@ifset USING -@center @titlefont{Using and Maintaining GNU Treelang} - -@end ifset -@end ifset -@ifclear INTERNALS -@title Using GNU Treelang -@end ifclear -@ifclear USING -@title Maintaining GNU Treelang -@end ifclear -@sp 2 -@center Tim Josling -@sp 3 -@center Last updated @value{last-update} -@sp 1 -@center for version @value{version-treelang} -@page -@vskip 0pt plus 1filll -Copyright @copyright{} @value{copyrights-treelang} Free Software Foundation, Inc. -@sp 2 -For the @value{which-treelang} Version* -@sp 1 -Published by the Free Software Foundation @* -59 Temple Place - Suite 330@* -Boston, MA 02111-1307, USA@* -@c Last printed ??ber, 19??.@* -@c Printed copies are available for $? each.@* -@c ISBN ??? -@sp 1 -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with the -Invariant Sections being ``GNU General Public License'', the Front-Cover -texts being (a) (see below), and with the Back-Cover Texts being (b) -(see below). A copy of the license is included in the section entitled -``GNU Free Documentation License''. - -(a) The FSF's Front-Cover Text is: - - A GNU Manual - -(b) The FSF's Back-Cover Text is: - - You have freedom to copy and modify this GNU Manual, like GNU - software. Copies published by the Free Software Foundation raise - funds for GNU development. -@end titlepage -@page - -@ifinfo - -@node Top, Copying,, (dir) -@top Introduction -@cindex Introduction - -@ifset INTERNALS -@ifset USING -This manual documents how to run, install and maintain @code{treelang}, -as well as its new features and incompatibilities, -and how to report bugs. -It corresponds to the @value{which-treelang} version of @code{treelang}. -@end ifset -@end ifset - -@ifclear INTERNALS -This manual documents how to run and install @code{treelang}, -as well as its new features and incompatibilities, and how to report -bugs. -It corresponds to the @value{which-treelang} version of @code{treelang}. -@end ifclear -@ifclear USING -This manual documents how to maintain @code{treelang}, as well as its -new features and incompatibilities, and how to report bugs. It -corresponds to the @value{which-treelang} version of @code{treelang}. -@end ifclear - -@end ifinfo - -@ifset DEVELOPMENT -@emph{Warning:} This document is still under development, and might not -accurately reflect the @code{treelang} code base of which it is a part. -@end ifset - -@menu -* Copying:: -* Contributors:: -* GNU Free Documentation License:: -* Funding:: -* Getting Started:: -* What is GNU Treelang?:: -* Lexical Syntax:: -* Parsing Syntax:: -* Compiler Overview:: -* TREELANG and GCC:: -* Compiler:: -* Other Languages:: -* treelang internals:: -* Open Questions:: -* Bugs:: -* Service:: -* Projects:: -* Index:: - -@detailmenu - --- The Detailed Node Listing --- - -Other Languages - -* Interoperating with C and C++:: - -treelang internals - -* treelang files:: -* treelang compiler interfaces:: -* Hints and tips:: - -treelang compiler interfaces - -* treelang driver:: -* treelang main compiler:: - -treelang main compiler - -* Interfacing to toplev.c:: -* Interfacing to the garbage collection:: -* Interfacing to the code generation code. :: - -Reporting Bugs - -* Sending Patches:: - -@end detailmenu -@end menu - -@include gpl.texi - -@include fdl.texi - -@node Contributors - -@unnumbered Contributors to GNU Treelang -@cindex contributors -@cindex credits - -Treelang was based on 'toy' by Richard Kenner, and also uses code from -the GCC core code tree. Tim Josling first created the language and -documentation, based on the GCC Fortran compiler's documentation -framework. - -@itemize @bullet -@item -The packaging and compiler portions of GNU Treelang are based largely -on the GCC compiler. -@xref{Contributors,,Contributors to GCC,GCC,Using and Maintaining GCC}, -for more information. - -@item -There is no specific run-time library for treelang, other than the -standard C runtime. - -@item -It would have been difficult to build treelang without access to Joachim -Nadler's guide to writing a front end to GCC (written in German). A -translation of this document into English is available via the -CobolForGCC project or via the documentation links from the GCC home -page @uref{http://GCC.gnu.org}. -@end itemize - -@include funding.texi - -@node Getting Started -@chapter Getting Started -@cindex getting started -@cindex new users -@cindex newbies -@cindex beginners - -Treelang is a sample language, useful only to help people understand how -to implement a new language front end to GCC. It is not a useful -language in itself other than as an example or basis for building a new -language. Therefore only language developers are likely to have an -interest in it. - -This manual assumes familiarity with GCC, which you can obtain by using -it and by reading the manual @samp{Using and Porting GCC}. - -To install treelang, follow the GCC installation instructions, -taking care to ensure you specify treelang in the configure step. - -If you're generally curious about the future of -@code{treelang}, see @ref{Projects}. -If you're curious about its past, -see @ref{Contributors}. - -To see a few of the questions maintainers of @code{treelang} have, -and that you might be able to answer, -see @ref{Open Questions}. - -@ifset USING -@node What is GNU Treelang?, Lexical Syntax, Getting Started, Top -@chapter What is GNU Treelang? -@cindex concepts, basic -@cindex basic concepts - -GNU Treelang, or @code{treelang}, is designed initially as a free -replacement for, or alternative to, the 'toy' language, but which is -amenable to inclusion within the GCC source tree. - -@code{treelang} is largely a cut down version of C, designed to showcase -the features of the GCC code generation back end. Only those features -that are directly supported by the GCC code generation back end are -implemented. Features are implemented in a manner which is easiest and -clearest to implement. Not all or even most code generation back end -features are implemented. The intention is to add features incrementally -until most features of the GCC back end are implemented in treelang. - -The main features missing are structures, arrays and pointers. - -A sample program follows: - -@example -// function prototypes -// function 'add' taking two ints and returning an int -external_definition int add(int arg1, int arg2); -external_definition int subtract(int arg3, int arg4); -external_definition int first_nonzero(int arg5, int arg6); -external_definition int double_plus_one(int arg7); - -// function definition -add -@{ -// return the sum of arg1 and arg2 - return arg1 + arg2; -@} - - -subtract -@{ - return arg3 - arg4; -@} - -double_plus_one -@{ -// aaa is a variable, of type integer and allocated at the start of the function - automatic int aaa; -// set aaa to the value returned from aaa, when passed arg7 and arg7 as the two parameters - aaa=add(arg7, arg7); - aaa=add(aaa, aaa); - aaa=subtract(subtract(aaa, arg7), arg7) + 1; - return aaa; -@} - -first_nonzero -@{ -// C-like if statement - if (arg5) - @{ - return arg5; - @} - else - @{ - @} - return arg6; -@} -@end example - -@node Lexical Syntax, Parsing Syntax, What is GNU Treelang?, Top -@chapter Lexical Syntax -@cindex Lexical Syntax - -Treelang programs consist of whitespace, comments, keywords and names. -@itemize @bullet - -@item -Whitespace consists of the space character and the end of line -character. Tabs are not allowed. Line terminations are as defined by the -standard C library. Whitespace is ignored except within comments, -and where it separates parts of the program. In the example below, A and -B are two separate names separated by whitespace. - -@smallexample -A B -@end smallexample - -@item -Comments consist of @samp{//} followed by any characters up to the end -of the line. C style comments (/* */) are not supported. For example, -the assignment below is followed by a not very helpful comment. - -@smallexample -x=1; // Set X to 1 -@end smallexample - -@item -Keywords consist of any reserved words or symbols as described -later. The list of keywords follows: - -@smallexample -@{ - used to start the statements in a function -@} - used to end the statements in a function -( - start list of function arguments, or to change the precedence of operators in an expression -) - end list or prioritised operators in expression -, - used to separate parameters in a function prototype or in a function call -; - used to end a statement -+ - addition -- - subtraction -= - assignment -== - equality test -if - begin IF statement -else - begin 'else' portion of IF statement -static - indicate variable is permanent, or function has file scope only -automatic - indicate that variable is allocated for the life of the function -external_reference - indicate that variable or function is defined in another file -external_definition - indicate that variable or function is to be accessible from other files -int - variable is an integer (same as C int) -char - variable is a character (same as C char) -unsigned - variable is unsigned. If this is not present, the variable is signed -return - start function return statement -void - used as function type to indicate function returns nothing -@end smallexample - - -@item -Names consist of any letter or "_" followed by any number of letters or -numbers or "_". "$" is not allowed in a name. All names must be globally -unique - the same name may not be used twice in any context - and must -not be a keyword. Names and keywords are case sensitive. For example: - -@smallexample -a A _a a_ IF_X -@end smallexample - -are all different names. - -@end itemize - -@node Parsing Syntax, Compiler Overview, Lexical Syntax, Top -@chapter Parsing Syntax -@cindex Parsing Syntax - -Declarations are built up from the lexical elements described above. A -file may contain one of more declarations. - -@itemize @bullet - -@item -declaration: variable declaration OR function prototype OR function declaration - -@item -Function Prototype: storage type NAME ( parameter_list ) - -@smallexample -static int add (int a, int b) -@end smallexample - -@item -variable_declaration: storage type NAME initial; - -Example: - -@smallexample -int temp1=1; -@end smallexample - -A variable declaration can be outside a function, or at the start of a function. - -@item -storage: automatic OR static OR external_reference OR external_definition - -This defines the scope, duration and visibility of a function or variable - -@enumerate 1 - -@item -automatic: This means a variable is allocated at start of function and -released when the function returns. This can only be used for variables -within functions. It cannot be used for functions. - -@item -static: This means a variable is allocated at start of program and -remains allocated until the program as a whole ends. For a function, it -means that the function is only visible within the current file. - -@item -external_definition: For a variable, which must be defined outside a -function, it means that the variable is visible from other files. For a -function, it means that the function is visible from another file. - -@item -external_reference: For a variable, which must be defined outside a -function, it means that the variable is defined in another file. For a -function, it means that the function is defined in another file. - -@end enumerate - -@item -type: int OR unsigned int OR char OR unsigned char OR void - -This defines the data type of a variable or the return type of a function. - -@enumerate a - -@item -int: The variable is a signed integer. The function returns a signed integer. - -@item -unsigned int: The variable is an unsigned integer. The function returns an unsigned integer. - -@item -char: The variable is a signed character. The function returns a signed character. - -@item -unsigned char: The variable is an unsigned character. The function returns an unsigned character. - -@end enumerate - -@item -parameter_list OR parameter [, parameter]... - -@item -parameter: variable_declaration , - -The variable declarations must not have initialisations. - -@item -initial: = value - -@item -value: integer_constant - -@smallexample -eg 1 +2 -3 -@end smallexample - -@item -function_declaration: name @{variable_declarations statements @} - -A function consists of the function name then the declarations (if any) -and statements (if any) within one pair of braces. - -The details of the function arguments come from the function -prototype. The function prototype must precede the function declaration -in the file. - -@item -statement: if_statement OR expression_statement OR return_statement - -@item -if_statement: if (expression) @{ statements @} else @{ statements @} - -The first lot of statements is executed if the expression is -non-zero. Otherwise the second lot of statements is executed. Either -list of statements may be empty, but both sets of braces and the else must be present. - -@smallexample -if (a==b) -@{ -// nothing -@} -else -@{ -a=b; -@} -@end smallexample - -@item -expression_statement: expression; - -The expression is executed and any side effects, such - -@item -return_statement: return expression_opt; - -Returns from the function. If the function is void, the expression must -be absent, and if the function is not void the expression must be -present. - -@item -expression: variable OR integer_constant OR expression+expression OR expression-expression - OR expression==expression OR (expression) OR variable=expression OR function_call - -An expression can be a constant or a variable reference or a -function_call. Expressions can be combined as a sum of two expressions -or the difference of two expressions, or an equality test of two -expresions. An assignment is also an expression. Expresions and operator -precedence work as in C. - -@item -function_call: function_name (comma_separated_expressions) - -This invokes the function, passing to it the values of the expressions -as actual parameters. - -@end itemize - -@cindex compilers -@node Compiler Overview, TREELANG and GCC, Parsing Syntax, Top -@chapter Compiler Overview -treelang is run as part of the GCC compiler. - -@itemize @bullet -@cindex source code -@cindex file, source -@cindex code, source -@cindex source file -@item -It reads a user's program, stored in a file and containing instructions -written in the appropriate language (Treelang, C, and so on). This file -contains @dfn{source code}. - -@cindex translation of user programs -@cindex machine code -@cindex code, machine -@cindex mistakes -@item -It translates the user's program into instructions a computer can carry -out more quickly than it takes to translate the instructions in the -first place. These instructions are called @dfn{machine code}---code -designed to be efficiently translated and processed by a machine such as -a computer. Humans usually aren't as good writing machine code as they -are at writing Treelang or C, because it is easy to make tiny mistakes -writing machine code. When writing Treelang or C, it is easy to make -big mistakes. But you can only make one mistake, because the compiler -stops after it finds any problem. - -@cindex debugger -@cindex bugs, finding -@cindex @code{gdb}, command -@cindex commands, @code{gdb} -@item -It provides information in the generated machine code -that can make it easier to find bugs in the program -(using a debugging tool, called a @dfn{debugger}, -such as @code{gdb}). - -@cindex libraries -@cindex linking -@cindex @code{ld} command -@cindex commands, @code{ld} -@item -It locates and gathers machine code already generated to perform actions -requested by statements in the user's program. This machine code is -organized into @dfn{libraries} and is located and gathered during the -@dfn{link} phase of the compilation process. (Linking often is thought -of as a separate step, because it can be directly invoked via the -@code{ld} command. However, the @code{gcc} command, as with most -compiler commands, automatically performs the linking step by calling on -@code{ld} directly, unless asked to not do so by the user.) - -@cindex language, incorrect use of -@cindex incorrect use of language -@item -It attempts to diagnose cases where the user's program contains -incorrect usages of the language. The @dfn{diagnostics} produced by the -compiler indicate the problem and the location in the user's source file -where the problem was first noticed. The user can use this information -to locate and fix the problem. - -The compiler stops after the first error. There are no plans to fix -this, ever, as it would vastly complicate the implementation of treelang -to little or no benefit. - -@cindex diagnostics, incorrect -@cindex incorrect diagnostics -@cindex error messages, incorrect -@cindex incorrect error messages -(Sometimes an incorrect usage of the language leads to a situation where -the compiler can not make any sense of what it reads---while a human -might be able to---and thus ends up complaining about an incorrect -``problem'' it encounters that, in fact, reflects a misunderstanding of -the programmer's intention.) - -@cindex warnings -@cindex questionable instructions -@item -There are no warnings in treelang. A program is either correct or in -error. -@end itemize - -@cindex components of treelang -@cindex @code{treelang}, components of -@code{treelang} consists of several components: - -@cindex @code{gcc}, command -@cindex commands, @code{gcc} -@itemize @bullet -@item -A modified version of the @code{gcc} command, which also might be -installed as the system's @code{cc} command. -(In many cases, @code{cc} refers to the -system's ``native'' C compiler, which -might be a non-GNU compiler, or an older version -of @code{GCC} considered more stable or that is -used to build the operating system kernel.) - -@cindex @code{treelang}, command -@cindex commands, @code{treelang} -@item -The @code{treelang} command itself. - -@item -The @code{libc} run-time library. This library contains the machine -code needed to support capabilities of the Treelang language that are -not directly provided by the machine code generated by the -@code{treelang} compilation phase. This is the same library that the -main c compiler uses (libc). - -@cindex @code{tree1}, program -@cindex programs, @code{tree1} -@cindex assembler -@cindex @code{as} command -@cindex commands, @code{as} -@cindex assembly code -@cindex code, assembly -@item -The compiler itself, is internally named @code{tree1}. - -Note that @code{tree1} does not generate machine code directly---it -generates @dfn{assembly code} that is a more readable form -of machine code, leaving the conversion to actual machine code -to an @dfn{assembler}, usually named @code{as}. -@end itemize - -@code{GCC} is often thought of as ``the C compiler'' only, -but it does more than that. -Based on command-line options and the names given for files -on the command line, @code{gcc} determines which actions to perform, including -preprocessing, compiling (in a variety of possible languages), assembling, -and linking. - -@cindex driver, gcc command as -@cindex @code{gcc}, command as driver -@cindex executable file -@cindex files, executable -@cindex cc1 program -@cindex programs, cc1 -@cindex preprocessor -@cindex cpp program -@cindex programs, cpp -For example, the command @samp{gcc foo.c} @dfn{drives} the file -@file{foo.c} through the preprocessor @code{cpp}, then -the C compiler (internally named -@code{cc1}), then the assembler (usually @code{as}), then the linker -(@code{ld}), producing an executable program named @file{a.out} (on -UNIX systems). - -@cindex treelang program -@cindex programs, treelang -As another example, the command @samp{gcc foo.tree} would do much the -same as @samp{gcc foo.c}, but instead of using the C compiler named -@code{cc1}, @code{gcc} would use the treelang compiler (named -@code{tree1}). However there is no preprocessor for treelang. - -@cindex @code{tree1}, program -@cindex programs, @code{tree1} -In a GNU Treelang installation, @code{gcc} recognizes Treelang source -files by name just like it does C and C++ source files. It knows to use -the Treelang compiler named @code{tree1}, instead of @code{cc1} or -@code{cc1plus}, to compile Treelang files. If a file's name ends in -@code{.tree} then GCC knows that the program is written in treelang. You -can also manually override the language. - -@cindex @code{gcc}, not recognizing Treelang source -@cindex unrecognized file format -@cindex file format not recognized -Non-Treelang-related operation of @code{gcc} is generally -unaffected by installing the GNU Treelang version of @code{gcc}. -However, without the installed version of @code{gcc} being the -GNU Treelang version, @code{gcc} will not be able to compile -and link Treelang programs. - -@cindex printing version information -@cindex version information, printing -The command @samp{gcc -v x.tree} where @samp{x.tree} is a file which -must exist but whose contents are ignored, is a quick way to display -version information for the various programs used to compile a typical -Treelang source file. - -The @code{tree1} program represents most of what is unique to GNU -Treelang; @code{tree1} is a combination of two rather large chunks of -code. - -@cindex GCC Back End (GBE) -@cindex GBE -@cindex @code{GCC}, back end -@cindex back end, GCC -@cindex code generator -One chunk is the so-called @dfn{GNU Back End}, or GBE, -which knows how to generate fast code for a wide variety of processors. -The same GBE is used by the C, C++, and Treelang compiler programs @code{cc1}, -@code{cc1plus}, and @code{tree1}, plus others. -Often the GBE is referred to as the ``GCC back end'' or -even just ``GCC''---in this manual, the term GBE is used -whenever the distinction is important. - -@cindex GNU Treelang Front End (TFE) -@cindex tree1 -@cindex @code{treelang}, front end -@cindex front end, @code{treelang} -The other chunk of @code{tree1} is the majority of what is unique about -GNU Treelang---the code that knows how to interpret Treelang programs to -determine what they are intending to do, and then communicate that -knowledge to the GBE for actual compilation of those programs. This -chunk is called the @dfn{Treelang Front End} (TFE). The @code{cc1} and -@code{cc1plus} programs have their own front ends, for the C and C++ -languages, respectively. These fronts ends are responsible for -diagnosing incorrect usage of their respective languages by the programs -the process, and are responsible for most of the warnings about -questionable constructs as well. (The GBE in principle handles -producing some warnings, like those concerning possible references to -undefined variables, but these warnings should not occur in treelang -programs as the front end is meant to pick them up first). - -Because so much is shared among the compilers for various languages, -much of the behavior and many of the user-selectable options for these -compilers are similar. -For example, diagnostics (error messages and -warnings) are similar in appearance; command-line -options like @samp{-Wall} have generally similar effects; and the quality -of generated code (in terms of speed and size) is roughly similar -(since that work is done by the shared GBE). - -@node TREELANG and GCC, Compiler, Compiler Overview, Top -@chapter Compile Treelang, C, or Other Programs -@cindex compiling programs -@cindex programs, compiling - -@cindex @code{gcc}, command -@cindex commands, @code{gcc} -A GNU Treelang installation includes a modified version of the @code{gcc} -command. - -In a non-Treelang installation, @code{gcc} recognizes C, C++, -and Objective-C source files. - -In a GNU Treelang installation, @code{gcc} also recognizes Treelang source -files and accepts Treelang-specific command-line options, plus some -command-line options that are designed to cater to Treelang users -but apply to other languages as well. - -@xref{G++ and GCC,,Compile C; C++; or Objective-C,GCC,Using and Porting GCC}, -for information on the way different languages are handled -by the GCC compiler (@code{gcc}). - -You can use this, combined with the output of the @samp{GCC -v x.tree} -command to get the options applicable to treelang. Treelang programs -must end with the suffix @samp{.tree}. - -@cindex preprocessor - -Treelang programs are not by default run through the C -preprocessor by @code{gcc}. There is no reason why they cannot be run through the -preprocessor manually, but you would need to prevent the preprocessor -from generating #line directives, using the @samp{-P} option, otherwise -tree1 will not accept the input. - -@node Compiler, Other Languages, TREELANG and GCC, Top -@chapter The GNU Treelang Compiler - -The GNU Treelang compiler, @code{treelang}, supports programs written -in the GNU Treelang language. - -@node Other Languages, treelang internals, Compiler, Top -@chapter Other Languages - -@menu -* Interoperating with C and C++:: -@end menu - -@node Interoperating with C and C++, , Other Languages, Other Languages -@section Tools and advice for interoperating with C and C++ - -The output of treelang programs looks like C program code to the linker -and everybody else, so you should be able to freely mix treelang and C -(and C++) code, with one proviso. - -C promotes small integer types to 'int' when used as function parameters and -return values. The treelang compiler does not do this, so if you want to interface -to C, you need to specify the promoted value, not the nominal value. - -@ifset INTERNALS -@node treelang internals, Open Questions, Other Languages, Top -@chapter treelang internals - -@menu -* treelang files:: -* treelang compiler interfaces:: -* Hints and tips:: -@end menu - -@node treelang files, treelang compiler interfaces, treelang internals, treelang internals -@section treelang files - -To create a compiler that integrates into GCC, you need create many -files. Some of the files are integrated into the main GCC makefile, to -build the various parts of the compiler and to run the test -suite. Others are incorporated into various GCC programs such as -GCC.c. Finally you must provide the actual programs comprising your -compiler. - -@cindex files - -The files are: - -@enumerate 1 - -@item -COPYING. This is the copyright file, assuming you are going to use the -GNU General Public Licence. You probably need to use the GPL because if -you use the GCC back end your program and the back end are one program, -and the back end is GPLed. - -This need not be present if the language is incorporated into the main -GCC tree, as the main GCC directory has this file. - -@item -COPYING.LIB. This is the copyright file for those parts of your program -that are not to be covered by the GPL, but are instead to be covered by -the LGPL (Library or Lesser GPL). This licence may be appropriate for -the library routines associated with your compiler. These are the -routines that are linked with the @emph{output} of the compiler. Using -the LGPL for these programs allows programs written using your compiler -to be closed source. For example LIBC is under the LGPL. - -This need not be present if the language is incorporated into the main -GCC tree, as the main GCC directory has this file. - -@item -ChangeLog. Record all the changes to your compiler. Use the same format -as used in treelang as it is supported by an emacs editing mode and is -part of the FSF coding standard. Normally each directory has its own -changelog. The FSF standard allows but does not require a meaningful -comment on why the changes were made, above and beyond @emph{why} they -were made. In the author's opinion it is useful to provide this -information. - -@item -treelang.texi. The manual, written in texinfo. Your manual would have a -different file name. You need not write it in texinfo if you don't want -do, but a lot of GNU software does use texinfo. - -@cindex Make-lang.in -@item -Make-lang.in. This file is part of the make file which in incorporated -with the GCC make file skeleton (Makefile.in in the GCC directory) to -make Makefile, as part of the configuration process. - -Makefile in turn is the main instruction to actually build -everything. The build instructions are held in the main GCC manual and -web site so they are not repeated here. - -There are some comments at the top which will help you understand what -you need to do. - -There are make commands to build things, remove generated files with -various degrees of thoroughness, count the lines of code (so you know -how much progress you are making), build info and html files from the -texinfo source, run the tests etc. - -@item -README. Just a brief informative text file saying what is in this -directory. - -@cindex config-lang.in -@item -config-lang.in. This file is read by the configuration progress and must -be present. You specify the name of your language, the name(s) of the -compiler(s) incouding preprocessors you are going to build, whether any, -usually generated, files should be excluded from diffs (ie when making -diff files to send in patches). Whether the equate 'stagestuff' is used -is unknown (???). - -@cindex lang-options -@item -lang-options. This file is included into GCC.c, the main GCC driver, and -tells it what options your language supports. This is only used to -display help (is this true ???). - -@cindex lang-specs -@item -lang-specs. This file is also included in GCC.c. It tells GCC.c when to -call your programs and what options to send them. The mini-language -'specs' is documented in the source of GCC.c. Do not attempt to write a -specs file from scratch - use an existing one as the base and enhance -it. - -@item -Your texi files. Texinfo can be used to build documentation in HTML, -info, dvi and postscript formats. It is a tagged language, is documented -in its own manual, and has its own emacs mode. - -@item -Your programs. The relationships between all the programs are explained -in the next section. You need to write or use the following programs: - -@itemize @bullet - -@item -lexer. This breaks the input into words and passes these to the -parser. This is lex.l in treelang, which is passed through flex, a lex -variant, to produce C code lex.c. Note there is a school of thought that -says real men hand code their own lexers, however you may prefer to -write far less code and use flex, as was done with treelang. - -@item -parser. This breaks the program into recognizable constructs such as -expressions, statements etc. This is parse.y in treelang, which is -passed through bison, which is a yacc variant, to produce C code parse.c. - -@item -back end interface. This interfaces to the code generation back end. In -treelang, this is tree1.c which mainly interfaces to toplev.c and -treetree.c which mainly interfaces to everything else. Many languages -mix up the back end interface with the parser, as in the C compiler for -example. It is a matter of taste which way to do it, but with treelang -it is separated out to make the back end interface cleaner and easier to -understand. - -@item -header files. For function prototypes and common data items. One point -to note here is that bison can generate a header files with all the -numbers is has assigned to the keywords and symbols, and you can include -the same header in your lexer. This technique is demonstrated in -treelang. - -@item -compiler main file. GCC comes with a program toplev.c which is a -perfectly serviceable main program for your compiler. treelang uses -toplev.c but other languages have been known to replace it with their -own main program. Again this is a matter of taste and how much code you -want to write. - -@end itemize - -@end enumerate - -@node treelang compiler interfaces, Hints and tips, treelang files, treelang internals -@section treelang compiler interfaces - -@cindex driver -@cindex toplev.c - -@menu -* treelang driver:: -* treelang main compiler:: -@end menu - -@node treelang driver, treelang main compiler, treelang compiler interfaces, treelang compiler interfaces -@subsection treelang driver - -The GCC compiler consists of a driver, which then executes the various -compiler phases based on the instructions in the specs files. - -Typically a program's language will be identified from its suffix (eg -.tree) for treelang programs. - -The driver (gcc.c) will then drive (exec) in turn a preprocessor, the main -compiler, the assembler and the link editor. Options to GCC allow you to -override all of this. In the case of treelang programs there is no -preprocessor, and mostly these days the C preprocessor is run within the -main C compiler rather than as a separate process, apparently for reasons of speed. - -You will be using the standard assembler and linkage editor so these are -ignored from now on. - -You have to write your own preprocessor if you want one. This is usually -totally language specific. The main point to be aware of is to ensure -that you find some way to pass file name and line number information -through to the main compiler so that it can tell the back end this -information and so the debugger can find the right source line for each -piece of code. That is all there is to say about the preprocessor except -that the preprocessor will probably not be the slowest part of the -compiler and will probably not use the most memory so don't waste too -much time tuning it until you know you need to do so. - -@node treelang main compiler, , treelang driver, treelang compiler interfaces -@subsection treelang main compiler - -The main compiler for treelang consists of toplev.c from the main GCC -compiler, the parser, lexer and back end interface routines, and the -back end routines themselves, of which there are many. - -toplev.c does a lot of work for you and you should almost certainly use it, - -Writing this code is the hard part of creating a compiler using GCC. The -back end interface documentation is incomplete and the interface is -complex. - -There are three main aspects to interfacing to the other GCC code. - -@menu -* Interfacing to toplev.c:: -* Interfacing to the garbage collection:: -* Interfacing to the code generation code. :: -@end menu - -@node Interfacing to toplev.c, Interfacing to the garbage collection, treelang main compiler, treelang main compiler -@subsubsection Interfacing to toplev.c - -In treelang this is handled mainly in tree1.c -and partly in treetree.c. Peruse toplev.c for details of what you need -to do. - -@node Interfacing to the garbage collection, Interfacing to the code generation code. , Interfacing to toplev.c, treelang main compiler -@subsubsection Interfacing to the garbage collection - -Interfacing to the garbage collection. In treelang this is mainly in -tree1.c. - -Memory allocation in the compiler should be done using the ggc_alloc and -kindred routines in ggc*.*. At the end of every 'function' in your language, toplev.c calls -the garbage collection several times. The garbage collection calls mark -routines which go through the memory which is still used, telling the -garbage collection not to free it. Then all the memory not used is -freed. - -What this means is that you need a way to hook into this marking -process. This is done by calling ggc_add_root. This provides the address -of a callback routine which will be called duing garbage collection and -which can call ggc_mark to save the storage. If storage is only -used within the parsing of a function, you do not need to provide a way -to mark it. - -Note that you can also call ggc_mark_tree to mark any of the back end -internal 'tree' nodes. This routine will follow the branches of the -trees and mark all the subordinate structures. This is useful for -example when you have created a variable declaaration that will be used -across multiple functions, or for a function declaration (from a -prototype) that may be used later on. See the next item for more on the -tree nodes. - -@node Interfacing to the code generation code. , , Interfacing to the garbage collection, treelang main compiler -@subsubsection Interfacing to the code generation code. - -In treelang this is done in treetree.c. A typedef called 'tree' which is -defined in tree.h and tree.def in the GCC directory and largely -implemented in tree.c and stmt.c forms the basic interface to the -compiler back end. - -In general you call various tree routines to generate code, either -directly or through toplev.c. You build up data structures and -expressions in similar ways. - -You can read some documentation on this which can be found via the GCC -main web page. In particular, the documentation produced by Joachim -Nadler and translated by Tim Josling can be quite useful. the C compiler -also has documentation in the main GCC manual (particularly the current -CVS version) which is useful on a lot of the details. - -In time it is hoped to enhance this document to provide a more -comprehensive overview of this topic. The main gap is in explaining how -it all works together. - -@node Hints and tips, , treelang compiler interfaces, treelang internals -@section Hints and tips - -@itemize @bullet - -@item -TAGS: Use the make ETAGS commands to create TAGS files which can be used in -emacs to jump to any symbol quickly. - -@item -GREP: grep is also a useful way to find all uses of a symbol. - -@item -TREE: The main routines to look at are tree.h and tree.def. You will -probably want a hardcopy of these. - -@item -SAMPLE: look at the sample interfacing code in treetree.c. You can use -gdb to trace through the code and learn about how it all works. - -@item -GDB: the GCC back end works well with gdb. It traps abort() and allows -you to trace back what went wrong. - -@item -Error Checking: The compiler back end does some error and consistency -checking. Often the result of an error is just no code being -generated. You will then need to trace through and find out what is -going wrong. The rtl dump files can help here also. - -@item -rtl dump files: The main compiler documents these files which are dumps -of the rtl (intermediate code) which is manipulated doing the code -generation process. This can provide useful clues about what is going -wrong. The rtl 'language' is documented in the main GCC manual. - -@end itemize - -@end ifset - -@node Open Questions, Bugs, treelang internals, Top -@chapter Open Questions - -If you know GCC well, please consider looking at the file treetree.c and -resolving any questions marked "???". - -@node Bugs, Service, Open Questions, Top -@chapter Reporting Bugs -@cindex bugs -@cindex reporting bugs - -You can report bugs to @email{@value{email-bugs}}. Please make -sure bugs are real before reporting them. Follow the guidelines in the -main GCC manual for submitting bug reports. - -@menu -* Sending Patches:: -@end menu - -@node Sending Patches, , Bugs, Bugs -@section Sending Patches for GNU Treelang - -If you would like to write bug fixes or improvements for the GNU -Treelang compiler, that is very helpful. Send suggested fixes to -@email{@value{email-patches}}. - -@node Service, Projects, Bugs, Top -@chapter How To Get Help with GNU Treelang - -If you need help installing, using or changing GNU Treelang, there are two -ways to find it: - -@itemize @bullet - -@item -Look in the service directory for someone who might help you for a fee. -The service directory is found in the file named @file{SERVICE} in the -GCC distribution. - -@item -Send a message to @email{@value{email-general}}. - -@end itemize - -@end ifset -@ifset INTERNALS - -@node Projects, Index, Service, Top -@chapter Projects -@cindex projects - -If you want to contribute to @code{treelang} by doing research, -design, specification, documentation, coding, or testing, -the following information should give you some ideas. - -Send a message to @email{@value{email-general}} if you plan to add a -feature. - -The main requirement for treelang is to add features and to add -documentation. Features are things that the GCC back end can do but -which are not reflected in treelang. Examples include structures, -unions, pointers, arrays. - -@end ifset - -@node Index, , Projects, Top -@unnumbered Index - -@printindex cp -@summarycontents -@contents -@bye |