Annotation of gcc/gcc.info-13, revision 1.1.1.8

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

unix.superglobalmegacorp.com

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