|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.