Annotation of gcc/gcc.info-6, revision 1.1

1.1     ! root        1: This is Info file gcc.info, produced by Makeinfo-1.43 from the input
        !             2: file gcc.texi.
        !             3: 
        !             4:    This file documents the use and the internals of the GNU compiler.
        !             5: 
        !             6:    Copyright (C) 1988, 1989, 1992 Free Software Foundation, Inc.
        !             7: 
        !             8:    Permission is granted to make and distribute verbatim copies of
        !             9: this manual provided the copyright notice and this permission notice
        !            10: are preserved on all copies.
        !            11: 
        !            12:    Permission is granted to copy and distribute modified versions of
        !            13: this manual under the conditions for verbatim copying, provided also
        !            14: that the section entitled "GNU General Public License" is included
        !            15: exactly as in the original, and provided that the entire resulting
        !            16: derived work is distributed under the terms of a permission notice
        !            17: identical to this one.
        !            18: 
        !            19:    Permission is granted to copy and distribute translations of this
        !            20: manual into another language, under the above conditions for modified
        !            21: versions, except that the section entitled "GNU General Public
        !            22: License" and this permission notice may be included in translations
        !            23: approved by the Free Software Foundation instead of in the original
        !            24: English.
        !            25: 
        !            26: 
        !            27: File: gcc.info,  Node: Non-bugs,  Prev: Bug Reporting,  Up: Bugs
        !            28: 
        !            29: Certain Changes We Don't Want to Make
        !            30: =====================================
        !            31: 
        !            32:    This section lists changes that people frequently request, but which
        !            33: we do not make because we think GNU CC is better without them.
        !            34: 
        !            35:    * Checking the number and type of arguments to a function which has
        !            36:      an old-fashioned definition and no prototype.
        !            37: 
        !            38:      Such a feature would work only occasionally--only for calls that
        !            39:      appear in the same file as the called function, following the
        !            40:      definition.  The only way to check all calls reliably is to add a
        !            41:      prototype for the function.  But adding a prototype will
        !            42:      eliminate the need for this feature.  So the feature is not
        !            43:      worthwhile.
        !            44: 
        !            45:    * Warning about using an expression whose type is signed as a shift
        !            46:      count.
        !            47: 
        !            48:      Shift count operands are probably signed more often than unsigned. 
        !            49:      Warning about this would cause far more annoyance than good.
        !            50: 
        !            51:    * Warning about assigning a signed value to an unsigned variable.
        !            52: 
        !            53:      Such assignments must be very common; warning about them would
        !            54:      cause more annoyance than good.
        !            55: 
        !            56:    * Making bitfields unsigned by default on particular machines where
        !            57:      "the ABI standard" says to do so.
        !            58: 
        !            59:      The ANSI C standard leaves it up to the implementation whether a
        !            60:      bitfield declared plain `int' is signed or not.  This in effect
        !            61:      creates two alternative dialects of C.
        !            62: 
        !            63:      The GNU C compiler supports both dialects; you can specify the
        !            64:      dialect you want with the option `-fsigned-bitfields' or
        !            65:      `-funsigned-bitfields'.  However, this leaves open the question
        !            66:      of which dialect to use by default.
        !            67: 
        !            68:      Currently, the preferred dialect makes plain bitfields signed,
        !            69:      because this is simplest.  Since `int' is the same as `signed
        !            70:      int' in every other context, it is cleanest for them to be the
        !            71:      same in bitfields as well.
        !            72: 
        !            73:      Some computer manufacturers have published Application Binary
        !            74:      Interface standards which specify that plain bitfields should be
        !            75:      unsigned.  It is a mistake, however, to say anything about this
        !            76:      issue in an ABI.  This is because the handling of plain bitfields
        !            77:      distinguishes two dialects of C.  Both dialects are meaningful on
        !            78:      every type of machine.  Whether a particular object file was
        !            79:      compiled using signed bitfields or unsigned is of no concern to
        !            80:      functions in any other object file, even if they access the same
        !            81:      bitfields in the same data structures.
        !            82: 
        !            83:      A given program is written in one or the other of these two
        !            84:      dialects.  The program stands a chance to work on most any
        !            85:      machine if it is compiled with the proper dialect.  It is
        !            86:      unlikely to work at all if compiled with the wrong dialect.
        !            87: 
        !            88:      Many users appreciate the GNU C compiler because it provides an
        !            89:      environment that is uniform across machines.  These users would be
        !            90:      inconvenienced if the compiler treated plain bitfields
        !            91:      differently on certain machines.
        !            92: 
        !            93:      Occasionally users write programs intended only for a particular
        !            94:      machine type.  On these occasions, the users would benefit if the
        !            95:      GNU C compiler were to support by default the same dialect as the
        !            96:      other compilers on that machine.  But such applications are rare.
        !            97:       And users writing a program to run on more than one type of
        !            98:      machine cannot possibly benefit from this kind of compatibility.
        !            99: 
        !           100:      This is why GNU CC does and will treat plain bitfields in the same
        !           101:      fashion on all types of machines (by default).
        !           102: 
        !           103:      (Of course, users strongly concerned about portability should
        !           104:      indicate explicitly in each bitfield whether it is signed or not.)
        !           105: 
        !           106:    * Undefining `__STDC__' when `-ansi' is not used.
        !           107: 
        !           108:      Currently, GNU CC defines `__STDC__' as long as you don't use
        !           109:      `-traditional'.  This provides good results in practice.
        !           110: 
        !           111:      Programmers normally use conditionals on `__STDC__' to ask whether
        !           112:      it is safe to use certain features of ANSI C, such as function
        !           113:      prototypes or ANSI token concatenation.  Since plain `gcc'
        !           114:      supports all the features of ANSI C, the correct answer to these
        !           115:      questions is "yes".
        !           116: 
        !           117:      Some users try to use `__STDC__' to check for the availability of
        !           118:      certain library facilities.  This is actually incorrect usage in
        !           119:      an ANSI C program, because the ANSI C standard says that a
        !           120:      conforming freestanding implementation should define `__STDC__'
        !           121:      even though it does not have the library facilities.  `gcc -ansi
        !           122:      -pedantic' is a conforming freestanding implementation, and it is
        !           123:      therefore required to define `__STDC__', even though it does not
        !           124:      come with an ANSI C library.
        !           125: 
        !           126:      Sometimes people say that defining `__STDC__' in a compiler that
        !           127:      does not completely conform to the ANSI C standard somehow
        !           128:      violates the standard.  This is illogical.  The standard is a
        !           129:      standard for compilers that are supposed to conform.  It says
        !           130:      nothing about what any other compilers should do.  Whatever the
        !           131:      ANSI C standard says is relevant to the design of plain `gcc'
        !           132:      without `-ansi' only for pragmatic reasons, not as a requirement.
        !           133: 
        !           134:    * Undefining `__STDC__' in C++.
        !           135: 
        !           136:      Programs written to compile with C++-to-C translators get the
        !           137:      value of `__STDC__' that goes with the C compiler that is
        !           138:      subsequently used.  These programs must test `__STDC__' to
        !           139:      determine what kind of C preprocessor that compiler uses: whether
        !           140:      they should concatenate tokens in the ANSI C fashion or in the
        !           141:      traditional fashion.
        !           142: 
        !           143:      These programs work properly with GNU C++ if `__STDC__' is
        !           144:      defined.  They would not work otherwise.
        !           145: 
        !           146:      In addition, many header files are written to provide prototypes
        !           147:      in ANSI C but not in traditional C.  Many of these header files
        !           148:      can work without change in C++ provided `__STDC__' is defined. 
        !           149:      If `__STDC__' is not defined, they will all fail, and will all
        !           150:      need to be changed to test explicitly for C++ as well.
        !           151: 
        !           152: 
        !           153: File: gcc.info,  Node: VMS,  Next: Portability,  Prev: Bugs,  Up: Top
        !           154: 
        !           155: Using GNU CC on VMS
        !           156: *******************
        !           157: 
        !           158: * Menu:
        !           159: 
        !           160: * Include Files and VMS::  Where the preprocessor looks for the include files.
        !           161: * Global Declarations::    How to do globaldef, globalref and globalvalue with
        !           162:                            GNU CC.
        !           163: * VMS Misc::              Misc information.
        !           164: 
        !           165: 
        !           166: File: gcc.info,  Node: Include Files and VMS,  Next: Global Declarations,  Prev: VMS,  Up: VMS
        !           167: 
        !           168: Include Files and VMS
        !           169: =====================
        !           170: 
        !           171:    Due to the differences between the filesystems of Unix and VMS, GNU
        !           172: CC attempts to translate file names in `#include' into names that VMS
        !           173: will understand.  The basic strategy is to prepend a prefix to the
        !           174: specification of the include file, convert the whole filename to a VMS
        !           175: filename, and then try to open the file.  GNU CC tries various prefixes
        !           176: one by one until one of them succeeds:
        !           177: 
        !           178:   1. The first prefix is the `GNU_CC_INCLUDE:' logical name: this is
        !           179:      where GNU C header files are traditionally stored.  If you wish
        !           180:      to store header files in non-standard locations, then you can
        !           181:      assign the logical `GNU_CC_INCLUDE' to be a search list, where
        !           182:      each element of the list is suitable for use with a rooted
        !           183:      logical.
        !           184: 
        !           185:   2. The next prefix tried is `SYS$SYSROOT:[SYSLIB.]'.  This is where
        !           186:      VAX-C header files are traditionally stored.
        !           187: 
        !           188:   3. If the include file specification by itself is a valid VMS
        !           189:      filename, the preprocessor then uses this name with no prefix in
        !           190:      an attempt to open the include file.
        !           191: 
        !           192:   4. If the file specification is not a valid VMS filename (i.e. does
        !           193:      not contain a device or a directory specifier, and contains a `/'
        !           194:      character), the preprocessor tries to convert it from Unix syntax
        !           195:      to VMS syntax.
        !           196: 
        !           197:         Conversion works like this: the first directory name becomes a
        !           198:      device, and the rest of the directories are converted into
        !           199:      VMS-format directory names.  For example, `X11/foobar.h' is
        !           200:      translated to `X11:[000000]foobar.h' or `X11:foobar.h', whichever
        !           201:      one can be opened.  This strategy allows you to assign a logical
        !           202:      name to point to the actual location of the header files.
        !           203: 
        !           204:   5. If none of these strategies succeeds, the `#include' fails.
        !           205: 
        !           206:    Include directives of the form:
        !           207: 
        !           208:      #include foobar
        !           209: 
        !           210: are a common source of incompatibility between VAX-C and GNU CC.  VAX-C
        !           211: treats this much like a standard `#include <foobar.h>' directive. 
        !           212: That is incompatible with the ANSI C behavior implemented by GNU CC: to
        !           213: expand the name `foobar' as a macro.  Macro expansion should
        !           214: eventually yield one of the two standard formats for `#include':
        !           215: 
        !           216:      #include "FILE"
        !           217:      #include <FILE>
        !           218: 
        !           219:    If you have this problem, the best solution is to modify the source
        !           220: to convert the `#include' directives to one of the two standard forms. 
        !           221: That will work with either compiler.  If you want a quick and dirty
        !           222: fix, define the file names as macros with the proper expansion, like
        !           223: this:
        !           224: 
        !           225:      #define stdio <stdio.h>
        !           226: 
        !           227: This will work, as long as the name doesn't conflict with anything else
        !           228: in the program.
        !           229: 
        !           230:    Another source of incompatibility is that VAX-C assumes that:
        !           231: 
        !           232:      #include "foobar"
        !           233: 
        !           234: is actually asking for the file `foobar.h'.  GNU CC does not make this
        !           235: assumption, and instead takes what you ask for literally; it tries to
        !           236: read the file `foobar'.  The best way to avoid this problem is to
        !           237: always specify the desired file extension in your include directives.
        !           238: 
        !           239:    GNU CC for VMS is distributed with a set of include files that is
        !           240: sufficient to compile most general purpose programs.  Even though the
        !           241: GNU CC distribution does not contain header files to define constants
        !           242: and structures for some VMS system-specific functions, there is no
        !           243: reason why you cannot use GNU CC with any of these functions.  You
        !           244: first may have to generate or create header files, either by using the
        !           245: public domain utility `UNSDL' (which can be found on a DECUS tape), or
        !           246: by extracting the relevant modules from one of the system macro
        !           247: libraries, and using an editor to construct a C header file.
        !           248: 
        !           249: 
        !           250: File: gcc.info,  Node: Global Declarations,  Next: VMS Misc,  Prev: Include Files and VMS,  Up: VMS
        !           251: 
        !           252: Global Declarations and VMS
        !           253: ===========================
        !           254: 
        !           255:    GNU CC does not provide the `globalref', `globaldef' and
        !           256: `globalvalue' keywords of VAX-C.  You can get the same effect with an
        !           257: obscure feature of GAS, the GNU assembler.  (This requires GAS version
        !           258: 1.39 or later.)  The following macros allow you to use this feature in
        !           259: a fairly natural way:
        !           260: 
        !           261:      #ifdef __GNUC__
        !           262:      #define GLOBALREF(NAME) \
        !           263:              NAME asm("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME  )
        !           264:      #define GLOBALDEF(NAME,VALUE) \
        !           265:              NAME asm("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME  ) = VALUE
        !           266:      #define GLOBALVALUEREF(NAME) \
        !           267:        const NAME [1] asm("_$$PsectAttributes_GLOBALVALUE$$" #NAME  )
        !           268:      #define GLOBALVALUEDEF(NAME,VALUE) \
        !           269:        const NAME [1] asm("_$$PsectAttributes_GLOBALVALUE$$" #NAME  ) = {VALUE}
        !           270:      #else
        !           271:      #define GLOBALREF(NAME) globalref NAME
        !           272:      #define GLOBALDEF(NAME,VALUE) globaldef NAME = VALUE
        !           273:      #define GLOBALVALUEDEF(NAME,VALUE) globalvalue NAME = VALUE
        !           274:      #define GLOBALVALUEREF(NAME) globalvalue NAME
        !           275:      #endif
        !           276: 
        !           277: (The `_$$PsectAttributes_GLOBALSYMBOL' prefix at the start of the name
        !           278: is removed by the assembler, after it has modified the attributes of
        !           279: the symbol).  These macros are provided in the VMS binaries
        !           280: distribution in a header file `GNU_HACKS.H'.  An example of the usage
        !           281: is:
        !           282: 
        !           283:      int GLOBALREF (ijk);
        !           284:      int GLOBALDEF (jkl, 0);
        !           285: 
        !           286:    The macros `GLOBALREF' and `GLOBALDEF' cannot be used
        !           287: straightforwardly for arrays, since there is no way to insert the array
        !           288: dimension into the declaration at the right place.  However, you can
        !           289: declare an array with these macros if you first define a typedef for
        !           290: the array type, like this:
        !           291: 
        !           292:      typedef int intvector[10];
        !           293:      intvector GLOBALREF (foo);
        !           294: 
        !           295:    Array and structure initializers will also break the macros; you can
        !           296: define the initializer to be a macro of its own, or you can expand the
        !           297: `GLOBALDEF' macro by hand.  You may find a case where you wish to use
        !           298: the `GLOBALDEF' macro with a large array, but you are not interested
        !           299: in explicitly initializing each element of the array.  In such cases
        !           300: you can use an initializer like: `{0,}', which will initialize the
        !           301: entire array to `0'.
        !           302: 
        !           303:    A shortcoming of this implementation is that a variable declared
        !           304: with `GLOBALVALUEREF' or `GLOBALVALUEDEF' is always an array.  For
        !           305: example, the declaration:
        !           306: 
        !           307:      int GLOBALVALUEREF(ijk);
        !           308: 
        !           309: declares the variable `ijk' as an array of type `int [1]'.  This is
        !           310: done because a globalvalue is actually a constant; its "value" is what
        !           311: the linker would normally consider an address.  That is not how an
        !           312: integer value works in C, but it is how an array works.  So treating
        !           313: the symbol as an array name gives consistent results--with the
        !           314: exception that the value seems to have the wrong type.  *Don't try to
        !           315: access an element of the array.*  It doesn't have any elements.  The
        !           316: array "address" may not be the address of actual storage.
        !           317: 
        !           318:    The fact that the symbol is an array may lead to warnings where the
        !           319: variable is used.  Insert type casts to avoid the warnings.  Here is an
        !           320: example; it takes advantage of the ANSI C feature allowing macros that
        !           321: expand to use the same name as the macro itself.
        !           322: 
        !           323:      int GLOBALVALUEREF (ss$_normal);
        !           324:      int GLOBALVALUEDEF (xyzzy,123);
        !           325:      #ifdef __GNUC__
        !           326:      #define ss$_normal ((int) ss$_normal)
        !           327:      #define xyzzy ((int) xyzzy)
        !           328:      #endif
        !           329: 
        !           330:    Don't use `globaldef' or `globalref' with a variable whose type is
        !           331: an enumeration type; this is not implemented.  Instead, make the
        !           332: variable an integer, and use a `globalvaluedef' for each of the
        !           333: enumeration values.  An example of this would be:
        !           334: 
        !           335:      #ifdef __GNUC__
        !           336:      int GLOBALDEF (color, 0);
        !           337:      int GLOBALVALUEDEF (RED, 0);
        !           338:      int GLOBALVALUEDEF (BLUE, 1);
        !           339:      int GLOBALVALUEDEF (GREEN, 3);
        !           340:      #else
        !           341:      enum globaldef color {RED, BLUE, GREEN = 3};
        !           342:      #endif
        !           343: 
        !           344: 
        !           345: File: gcc.info,  Node: VMS Misc,  Prev: Global Declarations,  Up: VMS
        !           346: 
        !           347: Other VMS Issues
        !           348: ================
        !           349: 
        !           350:    GNU CC automatically arranges for `main' to return 1 by default if
        !           351: you fail to specify an explicit return value.  This will be interpreted
        !           352: by VMS as a status code indicating a normal successful completion. 
        !           353: Version 1 of GNU CC did not provide this default.
        !           354: 
        !           355:    GNU CC on VMS works only with the GNU assembler, GAS.  You need
        !           356: version 1.37 or later of GAS in order to produce value debugging
        !           357: information for the VMS debugger.  Use the ordinary VMS linker with
        !           358: the object files produced by GAS.
        !           359: 
        !           360:    Under previous versions of GNU CC, the generated code would
        !           361: occasionally give strange results when linked to the sharable
        !           362: `VAXCRTL' library.  Now this should work.
        !           363: 
        !           364:    A caveat for use of `const' global variables: the `const' modifier
        !           365: must be specified in every external declaration of the variable in all
        !           366: of the source files that use that variable.  Otherwise the linker will
        !           367: issue warnings about conflicting attributes for the variable.  Your
        !           368: program will still work despite the warnings, but the variable will be
        !           369: placed in writable storage.
        !           370: 
        !           371:    The VMS linker does not distinguish between upper and lower case
        !           372: letters in function and variable names.  However, usual practice in C
        !           373: is to distinguish case.  Normally GNU CC (by means of the assembler
        !           374: GAS) implements usual C behavior by augmenting each name that is not
        !           375: all lower-case.  A name is augmented by truncating it to at most 23
        !           376: characters and then adding more characters at the end which encode the
        !           377: case pattern the rest.
        !           378: 
        !           379:    Name augmentation yields bad results for programs that use
        !           380: precompiled libraries (such as Xlib) which were generated by another
        !           381: compiler.  You can use the compiler option `/NOCASE_HACK' to inhibit
        !           382: augmentation; it makes external C functions and variables
        !           383: case-independent as is usual on VMS.  Alternatively, you could write
        !           384: all references to the functions and variables in such libraries using
        !           385: lower case; this will work on VMS, but is not portable to other
        !           386: systems.
        !           387: 
        !           388:    Function and variable names are handled somewhat differently with
        !           389: GNU C++.  The GNU C++ compiler performs "name mangling" on function
        !           390: names, which means that it adds information to the function name to
        !           391: describe the data types of the arguments that the function takes. One
        !           392: result of this is that the name of a function can become very long. 
        !           393: Since the VMS linker only recognizes the first 31 characters in a name,
        !           394: special action is taken to ensure that each function and variable has a
        !           395: unique name that can be represented in 31 characters.
        !           396: 
        !           397:    If the name (plus a name augmentation, if required) is less than 32
        !           398: characters in length, then no special action is performed. If the name
        !           399: is longer than 31 characters, the assembler (GAS) will generate a hash
        !           400: string based upon the function name, truncate the function name to 23
        !           401: characters, and append the hash string to the truncated name.  If the
        !           402: `/VERBOSE' compiler option is used, the assembler will print both the
        !           403: full and truncated names of each symbol that is truncated.
        !           404: 
        !           405:    The `/NOCASE_HACK' compiler option should not be used when you are
        !           406: compiling programs that use libg++. libg++ has several instances of
        !           407: objects (i.e.  `Filebuf' and `filebuf') which become indistinguishable
        !           408: in a case-insensitive environment.  This leads to cases where you need
        !           409: to inhibit augmentation selectively (if you were using libg++ and Xlib
        !           410: in the same program, for example).  There is no special feature for
        !           411: doing this, but you can get the result by defining a macro for each
        !           412: mixed case symbol for which you wish to inhibit augmentation.  The
        !           413: macro should expand into the lower case equivalent of itself.  For
        !           414: example:
        !           415: 
        !           416:      #define StuDlyCapS studlycaps
        !           417: 
        !           418:    These macro definitions can be placed in a header file to minimize
        !           419: the number of changes to your source code.
        !           420: 
        !           421: 
        !           422: File: gcc.info,  Node: Portability,  Next: Interface,  Prev: VMS,  Up: Top
        !           423: 
        !           424: GNU CC and Portability
        !           425: **********************
        !           426: 
        !           427:    The main goal of GNU CC was to make a good, fast compiler for
        !           428: machines in the class that the GNU system aims to run on: 32-bit
        !           429: machines that address 8-bit bytes and have several general registers. 
        !           430: Elegance, theoretical power and simplicity are only secondary.
        !           431: 
        !           432:    GNU CC gets most of the information about the target machine from a
        !           433: machine description which gives an algebraic formula for each of the
        !           434: machine's instructions.  This is a very clean way to describe the
        !           435: target.  But when the compiler needs information that is difficult to
        !           436: express in this fashion, I have not hesitated to define an ad-hoc
        !           437: parameter to the machine description.  The purpose of portability is
        !           438: to reduce the total work needed on the compiler; it was not of
        !           439: interest for its own sake.
        !           440: 
        !           441:    GNU CC does not contain machine dependent code, but it does contain
        !           442: code that depends on machine parameters such as endianness (whether
        !           443: the most significant byte has the highest or lowest address of the
        !           444: bytes in a word) and the availability of autoincrement addressing.  In
        !           445: the RTL-generation pass, it is often necessary to have multiple
        !           446: strategies for generating code for a particular kind of syntax tree,
        !           447: strategies that are usable for different combinations of parameters. 
        !           448: Often I have not tried to address all possible cases, but only the
        !           449: common ones or only the ones that I have encountered.  As a result, a
        !           450: new target may require additional strategies.  You will know if this
        !           451: happens because the compiler will call `abort'.  Fortunately, the new
        !           452: strategies can be added in a machine-independent fashion, and will
        !           453: affect only the target machines that need them.
        !           454: 
        !           455: 
        !           456: File: gcc.info,  Node: Interface,  Next: Passes,  Prev: Portability,  Up: Top
        !           457: 
        !           458: Interfacing to GNU CC Output
        !           459: ****************************
        !           460: 
        !           461:    GNU CC is normally configured to use the same function calling
        !           462: convention normally in use on the target system.  This is done with the
        !           463: machine-description macros described (*note Machine Macros::.).
        !           464: 
        !           465:    However, returning of structure and union values is done
        !           466: differently on some target machines.  As a result, functions compiled
        !           467: with PCC returning such types cannot be called from code compiled with
        !           468: GNU CC, and vice versa.  This does not cause trouble often because few
        !           469: Unix library routines return structures or unions.
        !           470: 
        !           471:    GNU CC code returns structures and unions that are 1, 2, 4 or 8
        !           472: bytes long in the same registers used for `int' or `double' return
        !           473: values.  (GNU CC typically allocates variables of such types in
        !           474: registers also.)  Structures and unions of other sizes are returned by
        !           475: storing them into an address passed by the caller (usually in a
        !           476: register).  The machine-description macros `STRUCT_VALUE' and
        !           477: `STRUCT_INCOMING_VALUE' tell GNU CC where to pass this address.
        !           478: 
        !           479:    By contrast, PCC on most target machines returns structures and
        !           480: unions of any size by copying the data into an area of static storage,
        !           481: and then returning the address of that storage as if it were a pointer
        !           482: value.  The caller must copy the data from that memory area to the
        !           483: place where the value is wanted.  This is slower than the method used
        !           484: by GNU CC, and fails to be reentrant.
        !           485: 
        !           486:    On some target machines, such as RISC machines and the 80386, the
        !           487: standard system convention is to pass to the subroutine the address of
        !           488: where to return the value.  On these machines, GNU CC has been
        !           489: configured to be compatible with the standard compiler, when this
        !           490: method is used.  It may not be compatible for structures of 1, 2, 4 or
        !           491: 8 bytes.
        !           492: 
        !           493:    GNU CC uses the system's standard convention for passing arguments.
        !           494:  On some machines, the first few arguments are passed in registers; in
        !           495: others, all are passed on the stack.  It would be possible to use
        !           496: registers for argument passing on any machine, and this would probably
        !           497: result in a significant speedup.  But the result would be complete
        !           498: incompatibility with code that follows the standard convention.  So
        !           499: this change is practical only if you are switching to GNU CC as the
        !           500: sole C compiler for the system.  We may implement register argument
        !           501: passing on certain machines once we have a complete GNU system so that
        !           502: we can compile the libraries with GNU CC.
        !           503: 
        !           504:    On some machines (particularly the Sparc), certain types of
        !           505: arguments are passed "by invisible reference".  This means that the
        !           506: value is stored in memory, and the address of the memory location is
        !           507: passed to the subroutine.
        !           508: 
        !           509:    If you use `longjmp', beware of automatic variables.  ANSI C says
        !           510: that automatic variables that are not declared `volatile' have
        !           511: undefined values after a `longjmp'.  And this is all GNU CC promises
        !           512: to do, because it is very difficult to restore register variables
        !           513: correctly, and one of GNU CC's features is that it can put variables
        !           514: in registers without your asking it to.
        !           515: 
        !           516:    If you want a variable to be unaltered by `longjmp', and you don't
        !           517: want to write `volatile' because old C compilers don't accept it, just
        !           518: take the address of the variable.  If a variable's address is ever
        !           519: taken, even if just to compute it and ignore it, then the variable
        !           520: cannot go in a register:
        !           521: 
        !           522:      {
        !           523:        int careful;
        !           524:        &careful;
        !           525:        ...
        !           526:      }
        !           527: 
        !           528:    Code compiled with GNU CC may call certain library routines.  Most
        !           529: of them handle arithmetic for which there are no instructions.  This
        !           530: includes multiply and divide on some machines, and floating point
        !           531: operations on any machine for which floating point support is disabled
        !           532: with `-msoft-float'.  Some standard parts of the C library, such as
        !           533: `bcopy' or `memcpy', are also called automatically.  The usual
        !           534: function call interface is used for calling the library routines.
        !           535: 
        !           536:    These library routines should be defined in the library `libgcc.a',
        !           537: which GNU CC automatically searches whenever it links a program.  On
        !           538: machines that have multiply and divide instructions, if hardware
        !           539: floating point is in use, normally `libgcc.a' is not needed, but it is
        !           540: searched just in case.
        !           541: 
        !           542:    Each arithmetic function is defined in `libgcc1.c' to use the
        !           543: corresponding C arithmetic operator.  As long as the file is compiled
        !           544: with another C compiler, which supports all the C arithmetic operators,
        !           545: this file will work portably.  However, `libgcc1.c' does not work if
        !           546: compiled with GNU CC, because each arithmetic function would compile
        !           547: into a call to itself!
        !           548: 
        !           549: 
        !           550: File: gcc.info,  Node: Passes,  Next: RTL,  Prev: Interface,  Up: Top
        !           551: 
        !           552: Passes and Files of the Compiler
        !           553: ********************************
        !           554: 
        !           555:    The overall control structure of the compiler is in `toplev.c'. 
        !           556: This file is responsible for initialization, decoding arguments,
        !           557: opening and closing files, and sequencing the passes.
        !           558: 
        !           559:    The parsing pass is invoked only once, to parse the entire input. 
        !           560: The RTL intermediate code for a function is generated as the function
        !           561: is parsed, a statement at a time.  Each statement is read in as a
        !           562: syntax tree and then converted to RTL; then the storage for the tree
        !           563: for the statement is reclaimed.  Storage for types (and the
        !           564: expressions for their sizes), declarations, and a representation of
        !           565: the binding contours and how they nest, remain until the function is
        !           566: finished being compiled; these are all needed to output the debugging
        !           567: information.
        !           568: 
        !           569:    Each time the parsing pass reads a complete function definition or
        !           570: top-level declaration, it calls the function `rest_of_compilation' or
        !           571: `rest_of_decl_compilation' in `toplev.c', which are responsible for
        !           572: all further processing necessary, ending with output of the assembler
        !           573: language.  All other compiler passes run, in sequence, within
        !           574: `rest_of_compilation'.  When that function returns from compiling a
        !           575: function definition, the storage used for that function definition's
        !           576: compilation is entirely freed, unless it is an inline function (*note
        !           577: Inline::.).
        !           578: 
        !           579:    Here is a list of all the passes of the compiler and their source
        !           580: files.  Also included is a description of where debugging dumps can be
        !           581: requested with `-d' options.
        !           582: 
        !           583:    * Parsing.  This pass reads the entire text of a function
        !           584:      definition, constructing partial syntax trees.  This and RTL
        !           585:      generation are no longer truly separate passes (formerly they
        !           586:      were), but it is easier to think of them as separate.
        !           587: 
        !           588:      The tree representation does not entirely follow C syntax,
        !           589:      because it is intended to support other languages as well.
        !           590: 
        !           591:      Language-specific data type analysis is also done in this pass,
        !           592:      and every tree node that represents an expression has a data type
        !           593:      attached.  Variables are represented as declaration nodes.
        !           594: 
        !           595:      Constant folding and some arithmetic simplifications are also done
        !           596:      during this pass.
        !           597: 
        !           598:      The language-independent source files for parsing are
        !           599:      `stor-layout.c', `fold-const.c', and `tree.c'.  There are also
        !           600:      header files `tree.h' and `tree.def' which define the format of
        !           601:      the tree representation.
        !           602: 
        !           603:      The source files for parsing C are `c-parse.y', `c-decl.c',
        !           604:      `c-typeck.c', `c-convert.c', `c-lang.c', and `c-aux-info.c' along
        !           605:      with header files `c-lex.h', and `c-tree.h'.
        !           606: 
        !           607:      The source files for parsing C++ are `cp-parse.y', `cp-class.c',
        !           608:      `cp-cvt.c',
        !           609:       `cp-decl.c', `cp-decl.c', `cp-decl2.c', `cp-dem.c',
        !           610:      `cp-except.c',
        !           611:       `cp-expr.c', `cp-init.c', `cp-lex.c', `cp-method.c',
        !           612:      `cp-ptree.c',
        !           613:       `cp-search.c', `cp-tree.c', `cp-type2.c', and `cp-typeck.c',
        !           614:      along with header files `cp-tree.def', `cp-tree.h', and
        !           615:      `cp-decl.h'.
        !           616: 
        !           617:      The special source files for parsing Objective C are
        !           618:      `objc-parse.y', `objc-actions.c', `objc-tree.def', and
        !           619:      `objc-actions.h'.  Certain C-specific files are used for this as
        !           620:      well.
        !           621: 
        !           622:      The file `c-common.c' is also used for all of the above languages.
        !           623: 
        !           624:    * RTL generation.  This is the conversion of syntax tree into RTL
        !           625:      code.  It is actually done statement-by-statement during parsing,
        !           626:      but for most purposes it can be thought of as a separate pass.
        !           627: 
        !           628:      This is where the bulk of target-parameter-dependent code is
        !           629:      found, since often it is necessary for strategies to apply only
        !           630:      when certain standard kinds of instructions are available.  The
        !           631:      purpose of named instruction patterns is to provide this
        !           632:      information to the RTL generation pass.
        !           633: 
        !           634:      Optimization is done in this pass for `if'-conditions that are
        !           635:      comparisons, boolean operations or conditional expressions.  Tail
        !           636:      recursion is detected at this time also.  Decisions are made
        !           637:      about how best to arrange loops and how to output `switch'
        !           638:      statements.
        !           639: 
        !           640:      The source files for RTL generation include `stmt.c',
        !           641:      `function.c', `expr.c', `calls.c', `explow.c', `expmed.c',
        !           642:      `optabs.c' and `emit-rtl.c'.  Also, the file `insn-emit.c',
        !           643:      generated from the machine description by the program `genemit',
        !           644:      is used in this pass.  The header file `expr.h' is used for
        !           645:      communication within this pass.
        !           646: 
        !           647:      The header files `insn-flags.h' and `insn-codes.h', generated
        !           648:      from the machine description by the programs `genflags' and
        !           649:      `gencodes', tell this pass which standard names are available for
        !           650:      use and which patterns correspond to them.
        !           651: 
        !           652:      Aside from debugging information output, none of the following
        !           653:      passes refers to the tree structure representation of the
        !           654:      function (only part of which is saved).
        !           655: 
        !           656:      The decision of whether the function can and should be expanded
        !           657:      inline in its subsequent callers is made at the end of rtl
        !           658:      generation.  The function must meet certain criteria, currently
        !           659:      related to the size of the function and the types and number of
        !           660:      parameters it has.  Note that this function may contain loops,
        !           661:      recursive calls to itself (tail-recursive functions can be
        !           662:      inlined!), gotos, in short, all constructs supported by GNU CC. 
        !           663:      The file `integrate.c' contains the code to save a function's rtl
        !           664:      for later inlining and to inline that rtl when the function is
        !           665:      called.  The header file `integrate.h' is also used for this
        !           666:      purpose.
        !           667: 
        !           668:      The option `-dr' causes a debugging dump of the RTL code after
        !           669:      this pass.  This dump file's name is made by appending `.rtl' to
        !           670:      the input file name.
        !           671: 
        !           672:    * Jump optimization.  This pass simplifies jumps to the following
        !           673:      instruction, jumps across jumps, and jumps to jumps.  It deletes
        !           674:      unreferenced labels and unreachable code, except that unreachable
        !           675:      code that contains a loop is not recognized as unreachable in
        !           676:      this pass.  (Such loops are deleted later in the basic block
        !           677:      analysis.)  It also converts some code originally written with
        !           678:      jumps into sequences of instructions that directly set values
        !           679:      from the results of comparisons, if the machine has such
        !           680:      instructions.
        !           681: 
        !           682:      Jump optimization is performed two or three times.  The first
        !           683:      time is immediately following RTL generation.  The second time is
        !           684:      after CSE, but only if CSE says repeated jump optimization is
        !           685:      needed.  The last time is right before the final pass.  That
        !           686:      time, cross-jumping and deletion of no-op move instructions are
        !           687:      done together with the optimizations described above.
        !           688: 
        !           689:      The source file of this pass is `jump.c'.
        !           690: 
        !           691:      The option `-dj' causes a debugging dump of the RTL code after
        !           692:      this pass is run for the first time.  This dump file's name is
        !           693:      made by appending `.jump' to the input file name.
        !           694: 
        !           695:    * Register scan.  This pass finds the first and last use of each
        !           696:      register, as a guide for common subexpression elimination.  Its
        !           697:      source is in `regclass.c'.
        !           698: 
        !           699:    * Jump threading.  This pass detects a condition jump that branches
        !           700:      to an identical or inverse test.  Such jumps can be `threaded'
        !           701:      through the second conditional test.  The source code for this
        !           702:      pass is in `jump.c'.  This optimization is only performed if
        !           703:      `-fthread-jumps' is enabled.
        !           704: 
        !           705:    * Common subexpression elimination.  This pass also does constant
        !           706:      propagation.  Its source file is `cse.c'.  If constant
        !           707:      propagation causes conditional jumps to become unconditional or to
        !           708:      become no-ops, jump optimization is run again when CSE is
        !           709:      finished.
        !           710: 
        !           711:      The option `-ds' causes a debugging dump of the RTL code after
        !           712:      this pass.  This dump file's name is made by appending `.cse' to
        !           713:      the input file name.
        !           714: 
        !           715:    * Loop optimization.  This pass moves constant expressions out of
        !           716:      loops, and optionally does strength-reduction and loop unrolling
        !           717:      as well.  Its source files are `loop.c' and `unroll.c', plus the
        !           718:      header `loop.h' used for communication between them.  Loop
        !           719:      unrolling uses some functions in `integrate.c' and the header
        !           720:      `integrate.h'.
        !           721: 
        !           722:      The option `-dL' causes a debugging dump of the RTL code after
        !           723:      this pass.  This dump file's name is made by appending `.loop' to
        !           724:      the input file name.
        !           725: 
        !           726:    * If `-frerun-cse-after-loop' was enabled, a second common
        !           727:      subexpression elimination pass is performed after the loop
        !           728:      optimization pass.  Jump threading is also done again at this
        !           729:      time if it was specified.
        !           730: 
        !           731:      The option `-dt' causes a debugging dump of the RTL code after
        !           732:      this pass.  This dump file's name is made by appending `.cse2' to
        !           733:      the input file name.
        !           734: 
        !           735:    * Stupid register allocation is performed at this point in a
        !           736:      nonoptimizing compilation.  It does a little data flow analysis as
        !           737:      well.  When stupid register allocation is in use, the next pass
        !           738:      executed is the reloading pass; the others in between are skipped. 
        !           739:      The source file is `stupid.c'.
        !           740: 
        !           741:    * Data flow analysis (`flow.c').  This pass divides the program
        !           742:      into basic blocks (and in the process deletes unreachable loops);
        !           743:      then it computes which pseudo-registers are live at each point in
        !           744:      the program, and makes the first instruction that uses a value
        !           745:      point at the instruction that computed the value.
        !           746: 
        !           747:      This pass also deletes computations whose results are never used,
        !           748:      and combines memory references with add or subtract instructions
        !           749:      to make autoincrement or autodecrement addressing.
        !           750: 
        !           751:      The option `-df' causes a debugging dump of the RTL code after
        !           752:      this pass.  This dump file's name is made by appending `.flow' to
        !           753:      the input file name.  If stupid register allocation is in use,
        !           754:      this dump file reflects the full results of such allocation.
        !           755: 
        !           756:    * Instruction combination (`combine.c').  This pass attempts to
        !           757:      combine groups of two or three instructions that are related by
        !           758:      data flow into single instructions.  It combines the RTL
        !           759:      expressions for the instructions by substitution, simplifies the
        !           760:      result using algebra, and then attempts to match the result
        !           761:      against the machine description.
        !           762: 
        !           763:      The option `-dc' causes a debugging dump of the RTL code after
        !           764:      this pass.  This dump file's name is made by appending `.combine'
        !           765:      to the input file name.
        !           766: 
        !           767:    * Instruction scheduling (`sched.c').  This pass looks for
        !           768:      instructions whose output will not be available by the time that
        !           769:      it is used in subsequent instructions.  (Memory loads and
        !           770:      floating point instructions often have this behavior on RISC
        !           771:      machines).  It re-orders instructions within a basic block to try
        !           772:      to separate the definition and use of items that otherwise would
        !           773:      cause pipeline stalls.
        !           774: 
        !           775:      Instruction scheduling is performed twice.  The first time is
        !           776:      immediately after instruction combination and the second is
        !           777:      immediately after reload.
        !           778: 
        !           779:      The option `-dS' causes a debugging dump of the RTL code after
        !           780:      this pass is run for the first time.  The dump file's name is
        !           781:      made by appending `.sched' to the input file name.
        !           782: 
        !           783:    * Register class preferencing.  The RTL code is scanned to find out
        !           784:      which register class is best for each pseudo register.  The source
        !           785:      file is `regclass.c'.
        !           786: 
        !           787:    * Local register allocation (`local-alloc.c').  This pass allocates
        !           788:      hard registers to pseudo registers that are used only within one
        !           789:      basic block.  Because the basic block is linear, it can use fast
        !           790:      and powerful techniques to do a very good job.
        !           791: 
        !           792:      The option `-dl' causes a debugging dump of the RTL code after
        !           793:      this pass.  This dump file's name is made by appending `.lreg' to
        !           794:      the input file name.
        !           795: 
        !           796:    * Global register allocation (`global-alloc.c').  This pass
        !           797:      allocates hard registers for the remaining pseudo registers (those
        !           798:      whose life spans are not contained in one basic block).
        !           799: 
        !           800:    * Reloading.  This pass renumbers pseudo registers with the hardware
        !           801:      registers numbers they were allocated.  Pseudo registers that did
        !           802:      not get hard registers are replaced with stack slots.  Then it
        !           803:      finds instructions that are invalid because a value has failed to
        !           804:      end up in a register, or has ended up in a register of the wrong
        !           805:      kind.  It fixes up these instructions by reloading the
        !           806:      problematical values temporarily into registers.  Additional
        !           807:      instructions are generated to do the copying.
        !           808: 
        !           809:      The reload pass also optionally eliminates the frame pointer and
        !           810:      inserts instructions to save and restore call-clobbered registers
        !           811:      around calls.
        !           812: 
        !           813:      Source files are `reload.c' and `reload1.c', plus the header
        !           814:      `reload.h' used for communication between them.
        !           815: 
        !           816:      The option `-dg' causes a debugging dump of the RTL code after
        !           817:      this pass.  This dump file's name is made by appending `.greg' to
        !           818:      the input file name.
        !           819: 
        !           820:    * Instruction scheduling is repeated here to try to avoid pipeline
        !           821:      stalls due to memory loads generated for spilled pseudo registers.
        !           822: 
        !           823:      The option `-dR' causes a debugging dump of the RTL code after
        !           824:      this pass.  This dump file's name is made by appending `.sched2'
        !           825:      to the input file name.
        !           826: 
        !           827:    * Jump optimization is repeated, this time including cross-jumping
        !           828:      and deletion of no-op move instructions.
        !           829: 
        !           830:      The option `-dJ' causes a debugging dump of the RTL code after
        !           831:      this pass.  This dump file's name is made by appending `.jump2'
        !           832:      to the input file name.
        !           833: 
        !           834:    * Delayed branch scheduling.  This optional pass attempts to find
        !           835:      instructions that can go into the delay slots of other
        !           836:      instructions, usually jumps and calls.  The source file name is
        !           837:      `reorg.c'.
        !           838: 
        !           839:      The option `-dd' causes a debugging dump of the RTL code after
        !           840:      this pass.  This dump file's name is made by appending `.dbr' to
        !           841:      the input file name.
        !           842: 
        !           843:    * Conversion from usage of some hard registers to usage of a
        !           844:      register stack may be done at this point.  Currently, this is
        !           845:      supported only for the floating-point registers of the Intel
        !           846:      80387 coprocessor.   The source file name is `reg-stack.c'.
        !           847: 
        !           848:      The options `-dk' causes a debugging dump of the RTL code after
        !           849:      this pass.  This dump file's name is made by appending `.stack'
        !           850:      to the input file name.
        !           851: 
        !           852:    * Final.  This pass outputs the assembler code for the function. 
        !           853:      It is also responsible for identifying spurious test and compare
        !           854:      instructions.  Machine-specific peephole optimizations are
        !           855:      performed at the same time.  The function entry and exit
        !           856:      sequences are generated directly as assembler code in this pass;
        !           857:      they never exist as RTL.
        !           858: 
        !           859:      The source files are `final.c' plus `insn-output.c'; the latter
        !           860:      is generated automatically from the machine description by the
        !           861:      tool `genoutput'.  The header file `conditions.h' is used for
        !           862:      communication between these files.
        !           863: 
        !           864:    * Debugging information output.  This is run after final because it
        !           865:      must output the stack slot offsets for pseudo registers that did
        !           866:      not get hard registers.  Source files are `dbxout.c' for DBX
        !           867:      symbol table format, `sdbout.c' for SDB symbol table format, and
        !           868:      `dwarfout.c' for DWARF symbol table format.
        !           869: 
        !           870:    Some additional files are used by all or many passes:
        !           871: 
        !           872:    * Every pass uses `machmode.def' and `machmode.h' which define the
        !           873:      machine modes.
        !           874: 
        !           875:    * Several passes use `real.h', which defines the default
        !           876:      representation of floating point constants and how to operate on
        !           877:      them.
        !           878: 
        !           879:    * All the passes that work with RTL use the header files `rtl.h'
        !           880:      and `rtl.def', and subroutines in file `rtl.c'.  The tools `gen*'
        !           881:      also use these files to read and work with the machine
        !           882:      description RTL.
        !           883: 
        !           884:    * Several passes refer to the header file `insn-config.h' which
        !           885:      contains a few parameters (C macro definitions) generated
        !           886:      automatically from the machine description RTL by the tool
        !           887:      `genconfig'.
        !           888: 
        !           889:    * Several passes use the instruction recognizer, which consists of
        !           890:      `recog.c' and `recog.h', plus the files `insn-recog.c' and
        !           891:      `insn-extract.c' that are generated automatically from the
        !           892:      machine description by the tools `genrecog' and `genextract'.
        !           893: 
        !           894:    * Several passes use the header files `regs.h' which defines the
        !           895:      information recorded about pseudo register usage, and
        !           896:      `basic-block.h' which defines the information recorded about
        !           897:      basic blocks.
        !           898: 
        !           899:    * `hard-reg-set.h' defines the type `HARD_REG_SET', a bit-vector
        !           900:      with a bit for each hard register, and some macros to manipulate
        !           901:      it.  This type is just `int' if the machine has few enough hard
        !           902:      registers; otherwise it is an array of `int' and some of the
        !           903:      macros expand into loops.
        !           904: 
        !           905:    * Several passes use instruction attributes.  A definition of the
        !           906:      attributes defined for a particular machine is in file
        !           907:      `insn-attr.h', which is generated from the machine description by
        !           908:      the program `genattr'.  The file `insn-attrtab.c' contains
        !           909:      subroutines to obtain the attribute values for insns.  It is
        !           910:      generated from the machine description by the program
        !           911:      `genattrtab'.
        !           912: 
        !           913: 
        !           914: File: gcc.info,  Node: RTL,  Next: Machine Desc,  Prev: Passes,  Up: Top
        !           915: 
        !           916: RTL Representation
        !           917: ******************
        !           918: 
        !           919:    Most of the work of the compiler is done on an intermediate
        !           920: representation called register transfer language.  In this language,
        !           921: the instructions to be output are described, pretty much one by one,
        !           922: in an algebraic form that describes what the instruction does.
        !           923: 
        !           924:    RTL is inspired by Lisp lists.  It has both an internal form, made
        !           925: up of structures that point at other structures, and a textual form
        !           926: that is used in the machine description and in printed debugging
        !           927: dumps.  The textual form uses nested parentheses to indicate the
        !           928: pointers in the internal form.
        !           929: 
        !           930: * Menu:
        !           931: 
        !           932: * RTL Objects::       Expressions vs vectors vs strings vs integers.
        !           933: * Accessors::         Macros to access expression operands or vector elts.
        !           934: * Flags::             Other flags in an RTL expression.
        !           935: * Machine Modes::     Describing the size and format of a datum.
        !           936: * Constants::         Expressions with constant values.
        !           937: * Regs and Memory::   Expressions representing register contents or memory.
        !           938: * Arithmetic::        Expressions representing arithmetic on other expressions.
        !           939: * Comparisons::       Expressions representing comparison of expressions.
        !           940: * Bit Fields::        Expressions representing bit-fields in memory or reg.
        !           941: * Conversions::       Extending, truncating, floating or fixing.
        !           942: * RTL Declarations::  Declaring volatility, constancy, etc.
        !           943: * Side Effects::      Expressions for storing in registers, etc.
        !           944: * Incdec::            Embedded side-effects for autoincrement addressing.
        !           945: * Assembler::         Representing `asm' with operands.
        !           946: * Insns::             Expression types for entire insns.
        !           947: * Calls::             RTL representation of function call insns.
        !           948: * Sharing::           Some expressions are unique; others *must* be copied.
        !           949: 
        !           950: 
        !           951: File: gcc.info,  Node: RTL Objects,  Next: Accessors,  Prev: RTL,  Up: RTL
        !           952: 
        !           953: RTL Object Types
        !           954: ================
        !           955: 
        !           956:    RTL uses four kinds of objects: expressions, integers, strings and
        !           957: vectors.  Expressions are the most important ones.  An RTL expression
        !           958: ("RTX", for short) is a C structure, but it is usually referred to
        !           959: with a pointer; a type that is given the typedef name `rtx'.
        !           960: 
        !           961:    An integer is simply an `int'; their written form uses decimal
        !           962: digits.
        !           963: 
        !           964:    A string is a sequence of characters.  In core it is represented as
        !           965: a `char *' in usual C fashion, and it is written in C syntax as well. 
        !           966: However, strings in RTL may never be null.  If you write an empty
        !           967: string in a machine description, it is represented in core as a null
        !           968: pointer rather than as a pointer to a null character.  In certain
        !           969: contexts, these null pointers instead of strings are valid.  Within
        !           970: RTL code, strings are most commonly found inside `symbol_ref'
        !           971: expressions, but they appear in other contexts in the RTL expressions
        !           972: that make up machine descriptions.
        !           973: 
        !           974:    A vector contains an arbitrary number of pointers to expressions. 
        !           975: The number of elements in the vector is explicitly present in the
        !           976: vector.  The written form of a vector consists of square brackets
        !           977: (`[...]') surrounding the elements, in sequence and with whitespace
        !           978: separating them.  Vectors of length zero are not created; null
        !           979: pointers are used instead.
        !           980: 
        !           981:    Expressions are classified by "expression codes" (also called RTX
        !           982: codes).  The expression code is a name defined in `rtl.def', which is
        !           983: also (in upper case) a C enumeration constant.  The possible expression
        !           984: codes and their meanings are machine-independent.  The code of an RTX
        !           985: can be extracted with the macro `GET_CODE (X)' and altered with
        !           986: `PUT_CODE (X, NEWCODE)'.
        !           987: 
        !           988:    The expression code determines how many operands the expression
        !           989: contains, and what kinds of objects they are.  In RTL, unlike Lisp,
        !           990: you cannot tell by looking at an operand what kind of object it is. 
        !           991: Instead, you must know from its context--from the expression code of
        !           992: the containing expression.  For example, in an expression of code
        !           993: `subreg', the first operand is to be regarded as an expression and the
        !           994: second operand as an integer.  In an expression of code `plus', there
        !           995: are two operands, both of which are to be regarded as expressions.  In
        !           996: a `symbol_ref' expression, there is one operand, which is to be
        !           997: regarded as a string.
        !           998: 
        !           999:    Expressions are written as parentheses containing the name of the
        !          1000: expression type, its flags and machine mode if any, and then the
        !          1001: operands of the expression (separated by spaces).
        !          1002: 
        !          1003:    Expression code names in the `md' file are written in lower case,
        !          1004: but when they appear in C code they are written in upper case.  In this
        !          1005: manual, they are shown as follows: `const_int'.
        !          1006: 
        !          1007:    In a few contexts a null pointer is valid where an expression is
        !          1008: normally wanted.  The written form of this is `(nil)'.
        !          1009: 
        !          1010: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.