Annotation of gcc/gcc.info-8, revision 1.1.1.4

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

unix.superglobalmegacorp.com

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