diff options
Diffstat (limited to 'gcc-4.9/gcc/doc/gccint.info')
-rw-r--r-- | gcc-4.9/gcc/doc/gccint.info | 50307 |
1 files changed, 50307 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/doc/gccint.info b/gcc-4.9/gcc/doc/gccint.info new file mode 100644 index 000000000..c4b7319c9 --- /dev/null +++ b/gcc-4.9/gcc/doc/gccint.info @@ -0,0 +1,50307 @@ +This is gccint.info, produced by makeinfo version 5.1 from gccint.texi. + +Copyright (C) 1988-2014 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with the +Invariant Sections being "Funding Free Software", the Front-Cover Texts +being (a) (see below), and with the Back-Cover Texts being (b) (see +below). A copy of the license is included in the section entitled "GNU +Free Documentation License". + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU software. +Copies published by the Free Software Foundation raise funds for GNU +development. +INFO-DIR-SECTION Software development +START-INFO-DIR-ENTRY +* gccint: (gccint). Internals of the GNU Compiler Collection. +END-INFO-DIR-ENTRY + + This file documents the internals of the GNU compilers. + + Copyright (C) 1988-2014 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with the +Invariant Sections being "Funding Free Software", the Front-Cover Texts +being (a) (see below), and with the Back-Cover Texts being (b) (see +below). A copy of the license is included in the section entitled "GNU +Free Documentation License". + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU software. +Copies published by the Free Software Foundation raise funds for GNU +development. + + +File: gccint.info, Node: Top, Next: Contributing, Up: (DIR) + +Introduction +************ + +This manual documents the internals of the GNU compilers, including how +to port them to new targets and some information about how to write +front ends for new languages. It corresponds to the compilers (GCC) +version 4.9.0. The use of the GNU compilers is documented in a separate +manual. *Note Introduction: (gcc)Top. + + This manual is mainly a reference manual rather than a tutorial. It +discusses how to contribute to GCC (*note Contributing::), the +characteristics of the machines supported by GCC as hosts and targets +(*note Portability::), how GCC relates to the ABIs on such systems +(*note Interface::), and the characteristics of the languages for which +GCC front ends are written (*note Languages::). It then describes the +GCC source tree structure and build system, some of the interfaces to +GCC front ends, and how support for a target system is implemented in +GCC. + + Additional tutorial information is linked to from +<http://gcc.gnu.org/readings.html>. + +* Menu: + +* Contributing:: How to contribute to testing and developing GCC. +* Portability:: Goals of GCC's portability features. +* Interface:: Function-call interface of GCC output. +* Libgcc:: Low-level runtime library used by GCC. +* Languages:: Languages for which GCC front ends are written. +* Source Tree:: GCC source tree structure and build system. +* Testsuites:: GCC testsuites. +* Options:: Option specification files. +* Passes:: Order of passes, what they do, and what each file is for. +* GENERIC:: Language-independent representation generated by Front Ends +* GIMPLE:: Tuple representation used by Tree SSA optimizers +* Tree SSA:: Analysis and optimization of GIMPLE +* RTL:: Machine-dependent low-level intermediate representation. +* Control Flow:: Maintaining and manipulating the control flow graph. +* Loop Analysis and Representation:: Analysis and representation of loops +* Machine Desc:: How to write machine description instruction patterns. +* Target Macros:: How to write the machine description C macros and functions. +* Host Config:: Writing the 'xm-MACHINE.h' file. +* Fragments:: Writing the 't-TARGET' and 'x-HOST' files. +* Collect2:: How 'collect2' works; how it finds 'ld'. +* Header Dirs:: Understanding the standard header file directories. +* Type Information:: GCC's memory management; generating type information. +* Plugins:: Extending the compiler with plugins. +* LTO:: Using Link-Time Optimization. + +* Funding:: How to help assure funding for free software. +* GNU Project:: The GNU Project and GNU/Linux. + +* Copying:: GNU General Public License says + how you can copy and share GCC. +* GNU Free Documentation License:: How you can copy and share this manual. +* Contributors:: People who have contributed to GCC. + +* Option Index:: Index to command line options. +* Concept Index:: Index of concepts and symbol names. + + +File: gccint.info, Node: Contributing, Next: Portability, Up: Top + +1 Contributing to GCC Development +********************************* + +If you would like to help pretest GCC releases to assure they work well, +current development sources are available by SVN (see +<http://gcc.gnu.org/svn.html>). Source and binary snapshots are also +available for FTP; see <http://gcc.gnu.org/snapshots.html>. + + If you would like to work on improvements to GCC, please read the +advice at these URLs: + + <http://gcc.gnu.org/contribute.html> + <http://gcc.gnu.org/contributewhy.html> + +for information on how to make useful contributions and avoid +duplication of effort. Suggested projects are listed at +<http://gcc.gnu.org/projects/>. + + +File: gccint.info, Node: Portability, Next: Interface, Prev: Contributing, Up: Top + +2 GCC and Portability +********************* + +GCC itself aims to be portable to any machine where 'int' is at least a +32-bit type. It aims to target machines with a flat (non-segmented) +byte addressed data address space (the code address space can be +separate). Target ABIs may have 8, 16, 32 or 64-bit 'int' type. 'char' +can be wider than 8 bits. + + GCC gets most of the information about the target machine from a +machine description which gives an algebraic formula for each of the +machine's instructions. This is a very clean way to describe the +target. But when the compiler needs information that is difficult to +express in this fashion, ad-hoc parameters have been defined for machine +descriptions. The purpose of portability is to reduce the total work +needed on the compiler; it was not of interest for its own sake. + + GCC does not contain machine dependent code, but it does contain code +that depends on machine parameters such as endianness (whether the most +significant byte has the highest or lowest address of the bytes in a +word) and the availability of autoincrement addressing. In the +RTL-generation pass, it is often necessary to have multiple strategies +for generating code for a particular kind of syntax tree, strategies +that are usable for different combinations of parameters. Often, not +all possible cases have been addressed, but only the common ones or only +the ones that have been encountered. As a result, a new target may +require additional strategies. You will know if this happens because +the compiler will call 'abort'. Fortunately, the new strategies can be +added in a machine-independent fashion, and will affect only the target +machines that need them. + + +File: gccint.info, Node: Interface, Next: Libgcc, Prev: Portability, Up: Top + +3 Interfacing to GCC Output +*************************** + +GCC is normally configured to use the same function calling convention +normally in use on the target system. This is done with the +machine-description macros described (*note Target Macros::). + + However, returning of structure and union values is done differently on +some target machines. As a result, functions compiled with PCC +returning such types cannot be called from code compiled with GCC, and +vice versa. This does not cause trouble often because few Unix library +routines return structures or unions. + + GCC code returns structures and unions that are 1, 2, 4 or 8 bytes long +in the same registers used for 'int' or 'double' return values. (GCC +typically allocates variables of such types in registers also.) +Structures and unions of other sizes are returned by storing them into +an address passed by the caller (usually in a register). The target +hook 'TARGET_STRUCT_VALUE_RTX' tells GCC where to pass this address. + + By contrast, PCC on most target machines returns structures and unions +of any size by copying the data into an area of static storage, and then +returning the address of that storage as if it were a pointer value. +The caller must copy the data from that memory area to the place where +the value is wanted. This is slower than the method used by GCC, and +fails to be reentrant. + + On some target machines, such as RISC machines and the 80386, the +standard system convention is to pass to the subroutine the address of +where to return the value. On these machines, GCC has been configured +to be compatible with the standard compiler, when this method is used. +It may not be compatible for structures of 1, 2, 4 or 8 bytes. + + GCC uses the system's standard convention for passing arguments. On +some machines, the first few arguments are passed in registers; in +others, all are passed on the stack. It would be possible to use +registers for argument passing on any machine, and this would probably +result in a significant speedup. But the result would be complete +incompatibility with code that follows the standard convention. So this +change is practical only if you are switching to GCC as the sole C +compiler for the system. We may implement register argument passing on +certain machines once we have a complete GNU system so that we can +compile the libraries with GCC. + + On some machines (particularly the SPARC), certain types of arguments +are passed "by invisible reference". This means that the value is +stored in memory, and the address of the memory location is passed to +the subroutine. + + If you use 'longjmp', beware of automatic variables. ISO C says that +automatic variables that are not declared 'volatile' have undefined +values after a 'longjmp'. And this is all GCC promises to do, because +it is very difficult to restore register variables correctly, and one of +GCC's features is that it can put variables in registers without your +asking it to. + + +File: gccint.info, Node: Libgcc, Next: Languages, Prev: Interface, Up: Top + +4 The GCC low-level runtime library +*********************************** + +GCC provides a low-level runtime library, 'libgcc.a' or 'libgcc_s.so.1' +on some platforms. GCC generates calls to routines in this library +automatically, whenever it needs to perform some operation that is too +complicated to emit inline code for. + + Most of the routines in 'libgcc' handle arithmetic operations that the +target processor cannot perform directly. This includes integer +multiply and divide on some machines, and all floating-point and +fixed-point operations on other machines. 'libgcc' also includes +routines for exception handling, and a handful of miscellaneous +operations. + + Some of these routines can be defined in mostly machine-independent C. +Others must be hand-written in assembly language for each processor that +needs them. + + GCC will also generate calls to C library routines, such as 'memcpy' +and 'memset', in some cases. The set of routines that GCC may possibly +use is documented in *note (gcc)Other Builtins::. + + These routines take arguments and return values of a specific machine +mode, not a specific C type. *Note Machine Modes::, for an explanation +of this concept. For illustrative purposes, in this chapter the +floating point type 'float' is assumed to correspond to 'SFmode'; +'double' to 'DFmode'; and 'long double' to both 'TFmode' and 'XFmode'. +Similarly, the integer types 'int' and 'unsigned int' correspond to +'SImode'; 'long' and 'unsigned long' to 'DImode'; and 'long long' and +'unsigned long long' to 'TImode'. + +* Menu: + +* Integer library routines:: +* Soft float library routines:: +* Decimal float library routines:: +* Fixed-point fractional library routines:: +* Exception handling routines:: +* Miscellaneous routines:: + + +File: gccint.info, Node: Integer library routines, Next: Soft float library routines, Up: Libgcc + +4.1 Routines for integer arithmetic +=================================== + +The integer arithmetic routines are used on platforms that don't provide +hardware support for arithmetic operations on some modes. + +4.1.1 Arithmetic functions +-------------------------- + + -- Runtime Function: int __ashlsi3 (int A, int B) + -- Runtime Function: long __ashldi3 (long A, int B) + -- Runtime Function: long long __ashlti3 (long long A, int B) + These functions return the result of shifting A left by B bits. + + -- Runtime Function: int __ashrsi3 (int A, int B) + -- Runtime Function: long __ashrdi3 (long A, int B) + -- Runtime Function: long long __ashrti3 (long long A, int B) + These functions return the result of arithmetically shifting A + right by B bits. + + -- Runtime Function: int __divsi3 (int A, int B) + -- Runtime Function: long __divdi3 (long A, long B) + -- Runtime Function: long long __divti3 (long long A, long long B) + These functions return the quotient of the signed division of A and + B. + + -- Runtime Function: int __lshrsi3 (int A, int B) + -- Runtime Function: long __lshrdi3 (long A, int B) + -- Runtime Function: long long __lshrti3 (long long A, int B) + These functions return the result of logically shifting A right by + B bits. + + -- Runtime Function: int __modsi3 (int A, int B) + -- Runtime Function: long __moddi3 (long A, long B) + -- Runtime Function: long long __modti3 (long long A, long long B) + These functions return the remainder of the signed division of A + and B. + + -- Runtime Function: int __mulsi3 (int A, int B) + -- Runtime Function: long __muldi3 (long A, long B) + -- Runtime Function: long long __multi3 (long long A, long long B) + These functions return the product of A and B. + + -- Runtime Function: long __negdi2 (long A) + -- Runtime Function: long long __negti2 (long long A) + These functions return the negation of A. + + -- Runtime Function: unsigned int __udivsi3 (unsigned int A, unsigned + int B) + -- Runtime Function: unsigned long __udivdi3 (unsigned long A, unsigned + long B) + -- Runtime Function: unsigned long long __udivti3 (unsigned long long + A, unsigned long long B) + These functions return the quotient of the unsigned division of A + and B. + + -- Runtime Function: unsigned long __udivmoddi4 (unsigned long A, + unsigned long B, unsigned long *C) + -- Runtime Function: unsigned long long __udivmodti4 (unsigned long + long A, unsigned long long B, unsigned long long *C) + These functions calculate both the quotient and remainder of the + unsigned division of A and B. The return value is the quotient, + and the remainder is placed in variable pointed to by C. + + -- Runtime Function: unsigned int __umodsi3 (unsigned int A, unsigned + int B) + -- Runtime Function: unsigned long __umoddi3 (unsigned long A, unsigned + long B) + -- Runtime Function: unsigned long long __umodti3 (unsigned long long + A, unsigned long long B) + These functions return the remainder of the unsigned division of A + and B. + +4.1.2 Comparison functions +-------------------------- + +The following functions implement integral comparisons. These functions +implement a low-level compare, upon which the higher level comparison +operators (such as less than and greater than or equal to) can be +constructed. The returned values lie in the range zero to two, to allow +the high-level operators to be implemented by testing the returned +result using either signed or unsigned comparison. + + -- Runtime Function: int __cmpdi2 (long A, long B) + -- Runtime Function: int __cmpti2 (long long A, long long B) + These functions perform a signed comparison of A and B. If A is + less than B, they return 0; if A is greater than B, they return 2; + and if A and B are equal they return 1. + + -- Runtime Function: int __ucmpdi2 (unsigned long A, unsigned long B) + -- Runtime Function: int __ucmpti2 (unsigned long long A, unsigned long + long B) + These functions perform an unsigned comparison of A and B. If A is + less than B, they return 0; if A is greater than B, they return 2; + and if A and B are equal they return 1. + +4.1.3 Trapping arithmetic functions +----------------------------------- + +The following functions implement trapping arithmetic. These functions +call the libc function 'abort' upon signed arithmetic overflow. + + -- Runtime Function: int __absvsi2 (int A) + -- Runtime Function: long __absvdi2 (long A) + These functions return the absolute value of A. + + -- Runtime Function: int __addvsi3 (int A, int B) + -- Runtime Function: long __addvdi3 (long A, long B) + These functions return the sum of A and B; that is 'A + B'. + + -- Runtime Function: int __mulvsi3 (int A, int B) + -- Runtime Function: long __mulvdi3 (long A, long B) + The functions return the product of A and B; that is 'A * B'. + + -- Runtime Function: int __negvsi2 (int A) + -- Runtime Function: long __negvdi2 (long A) + These functions return the negation of A; that is '-A'. + + -- Runtime Function: int __subvsi3 (int A, int B) + -- Runtime Function: long __subvdi3 (long A, long B) + These functions return the difference between B and A; that is 'A - + B'. + +4.1.4 Bit operations +-------------------- + + -- Runtime Function: int __clzsi2 (int A) + -- Runtime Function: int __clzdi2 (long A) + -- Runtime Function: int __clzti2 (long long A) + These functions return the number of leading 0-bits in A, starting + at the most significant bit position. If A is zero, the result is + undefined. + + -- Runtime Function: int __ctzsi2 (int A) + -- Runtime Function: int __ctzdi2 (long A) + -- Runtime Function: int __ctzti2 (long long A) + These functions return the number of trailing 0-bits in A, starting + at the least significant bit position. If A is zero, the result is + undefined. + + -- Runtime Function: int __ffsdi2 (long A) + -- Runtime Function: int __ffsti2 (long long A) + These functions return the index of the least significant 1-bit in + A, or the value zero if A is zero. The least significant bit is + index one. + + -- Runtime Function: int __paritysi2 (int A) + -- Runtime Function: int __paritydi2 (long A) + -- Runtime Function: int __parityti2 (long long A) + These functions return the value zero if the number of bits set in + A is even, and the value one otherwise. + + -- Runtime Function: int __popcountsi2 (int A) + -- Runtime Function: int __popcountdi2 (long A) + -- Runtime Function: int __popcountti2 (long long A) + These functions return the number of bits set in A. + + -- Runtime Function: int32_t __bswapsi2 (int32_t A) + -- Runtime Function: int64_t __bswapdi2 (int64_t A) + These functions return the A byteswapped. + + +File: gccint.info, Node: Soft float library routines, Next: Decimal float library routines, Prev: Integer library routines, Up: Libgcc + +4.2 Routines for floating point emulation +========================================= + +The software floating point library is used on machines which do not +have hardware support for floating point. It is also used whenever +'-msoft-float' is used to disable generation of floating point +instructions. (Not all targets support this switch.) + + For compatibility with other compilers, the floating point emulation +routines can be renamed with the 'DECLARE_LIBRARY_RENAMES' macro (*note +Library Calls::). In this section, the default names are used. + + Presently the library does not support 'XFmode', which is used for +'long double' on some architectures. + +4.2.1 Arithmetic functions +-------------------------- + + -- Runtime Function: float __addsf3 (float A, float B) + -- Runtime Function: double __adddf3 (double A, double B) + -- Runtime Function: long double __addtf3 (long double A, long double + B) + -- Runtime Function: long double __addxf3 (long double A, long double + B) + These functions return the sum of A and B. + + -- Runtime Function: float __subsf3 (float A, float B) + -- Runtime Function: double __subdf3 (double A, double B) + -- Runtime Function: long double __subtf3 (long double A, long double + B) + -- Runtime Function: long double __subxf3 (long double A, long double + B) + These functions return the difference between B and A; that is, + A - B. + + -- Runtime Function: float __mulsf3 (float A, float B) + -- Runtime Function: double __muldf3 (double A, double B) + -- Runtime Function: long double __multf3 (long double A, long double + B) + -- Runtime Function: long double __mulxf3 (long double A, long double + B) + These functions return the product of A and B. + + -- Runtime Function: float __divsf3 (float A, float B) + -- Runtime Function: double __divdf3 (double A, double B) + -- Runtime Function: long double __divtf3 (long double A, long double + B) + -- Runtime Function: long double __divxf3 (long double A, long double + B) + These functions return the quotient of A and B; that is, A / B. + + -- Runtime Function: float __negsf2 (float A) + -- Runtime Function: double __negdf2 (double A) + -- Runtime Function: long double __negtf2 (long double A) + -- Runtime Function: long double __negxf2 (long double A) + These functions return the negation of A. They simply flip the + sign bit, so they can produce negative zero and negative NaN. + +4.2.2 Conversion functions +-------------------------- + + -- Runtime Function: double __extendsfdf2 (float A) + -- Runtime Function: long double __extendsftf2 (float A) + -- Runtime Function: long double __extendsfxf2 (float A) + -- Runtime Function: long double __extenddftf2 (double A) + -- Runtime Function: long double __extenddfxf2 (double A) + These functions extend A to the wider mode of their return type. + + -- Runtime Function: double __truncxfdf2 (long double A) + -- Runtime Function: double __trunctfdf2 (long double A) + -- Runtime Function: float __truncxfsf2 (long double A) + -- Runtime Function: float __trunctfsf2 (long double A) + -- Runtime Function: float __truncdfsf2 (double A) + These functions truncate A to the narrower mode of their return + type, rounding toward zero. + + -- Runtime Function: int __fixsfsi (float A) + -- Runtime Function: int __fixdfsi (double A) + -- Runtime Function: int __fixtfsi (long double A) + -- Runtime Function: int __fixxfsi (long double A) + These functions convert A to a signed integer, rounding toward + zero. + + -- Runtime Function: long __fixsfdi (float A) + -- Runtime Function: long __fixdfdi (double A) + -- Runtime Function: long __fixtfdi (long double A) + -- Runtime Function: long __fixxfdi (long double A) + These functions convert A to a signed long, rounding toward zero. + + -- Runtime Function: long long __fixsfti (float A) + -- Runtime Function: long long __fixdfti (double A) + -- Runtime Function: long long __fixtfti (long double A) + -- Runtime Function: long long __fixxfti (long double A) + These functions convert A to a signed long long, rounding toward + zero. + + -- Runtime Function: unsigned int __fixunssfsi (float A) + -- Runtime Function: unsigned int __fixunsdfsi (double A) + -- Runtime Function: unsigned int __fixunstfsi (long double A) + -- Runtime Function: unsigned int __fixunsxfsi (long double A) + These functions convert A to an unsigned integer, rounding toward + zero. Negative values all become zero. + + -- Runtime Function: unsigned long __fixunssfdi (float A) + -- Runtime Function: unsigned long __fixunsdfdi (double A) + -- Runtime Function: unsigned long __fixunstfdi (long double A) + -- Runtime Function: unsigned long __fixunsxfdi (long double A) + These functions convert A to an unsigned long, rounding toward + zero. Negative values all become zero. + + -- Runtime Function: unsigned long long __fixunssfti (float A) + -- Runtime Function: unsigned long long __fixunsdfti (double A) + -- Runtime Function: unsigned long long __fixunstfti (long double A) + -- Runtime Function: unsigned long long __fixunsxfti (long double A) + These functions convert A to an unsigned long long, rounding toward + zero. Negative values all become zero. + + -- Runtime Function: float __floatsisf (int I) + -- Runtime Function: double __floatsidf (int I) + -- Runtime Function: long double __floatsitf (int I) + -- Runtime Function: long double __floatsixf (int I) + These functions convert I, a signed integer, to floating point. + + -- Runtime Function: float __floatdisf (long I) + -- Runtime Function: double __floatdidf (long I) + -- Runtime Function: long double __floatditf (long I) + -- Runtime Function: long double __floatdixf (long I) + These functions convert I, a signed long, to floating point. + + -- Runtime Function: float __floattisf (long long I) + -- Runtime Function: double __floattidf (long long I) + -- Runtime Function: long double __floattitf (long long I) + -- Runtime Function: long double __floattixf (long long I) + These functions convert I, a signed long long, to floating point. + + -- Runtime Function: float __floatunsisf (unsigned int I) + -- Runtime Function: double __floatunsidf (unsigned int I) + -- Runtime Function: long double __floatunsitf (unsigned int I) + -- Runtime Function: long double __floatunsixf (unsigned int I) + These functions convert I, an unsigned integer, to floating point. + + -- Runtime Function: float __floatundisf (unsigned long I) + -- Runtime Function: double __floatundidf (unsigned long I) + -- Runtime Function: long double __floatunditf (unsigned long I) + -- Runtime Function: long double __floatundixf (unsigned long I) + These functions convert I, an unsigned long, to floating point. + + -- Runtime Function: float __floatuntisf (unsigned long long I) + -- Runtime Function: double __floatuntidf (unsigned long long I) + -- Runtime Function: long double __floatuntitf (unsigned long long I) + -- Runtime Function: long double __floatuntixf (unsigned long long I) + These functions convert I, an unsigned long long, to floating + point. + +4.2.3 Comparison functions +-------------------------- + +There are two sets of basic comparison functions. + + -- Runtime Function: int __cmpsf2 (float A, float B) + -- Runtime Function: int __cmpdf2 (double A, double B) + -- Runtime Function: int __cmptf2 (long double A, long double B) + These functions calculate a <=> b. That is, if A is less than B, + they return -1; if A is greater than B, they return 1; and if A and + B are equal they return 0. If either argument is NaN they return + 1, but you should not rely on this; if NaN is a possibility, use + one of the higher-level comparison functions. + + -- Runtime Function: int __unordsf2 (float A, float B) + -- Runtime Function: int __unorddf2 (double A, double B) + -- Runtime Function: int __unordtf2 (long double A, long double B) + These functions return a nonzero value if either argument is NaN, + otherwise 0. + + There is also a complete group of higher level functions which +correspond directly to comparison operators. They implement the ISO C +semantics for floating-point comparisons, taking NaN into account. Pay +careful attention to the return values defined for each set. Under the +hood, all of these routines are implemented as + + if (__unordXf2 (a, b)) + return E; + return __cmpXf2 (a, b); + +where E is a constant chosen to give the proper behavior for NaN. Thus, +the meaning of the return value is different for each set. Do not rely +on this implementation; only the semantics documented below are +guaranteed. + + -- Runtime Function: int __eqsf2 (float A, float B) + -- Runtime Function: int __eqdf2 (double A, double B) + -- Runtime Function: int __eqtf2 (long double A, long double B) + These functions return zero if neither argument is NaN, and A and B + are equal. + + -- Runtime Function: int __nesf2 (float A, float B) + -- Runtime Function: int __nedf2 (double A, double B) + -- Runtime Function: int __netf2 (long double A, long double B) + These functions return a nonzero value if either argument is NaN, + or if A and B are unequal. + + -- Runtime Function: int __gesf2 (float A, float B) + -- Runtime Function: int __gedf2 (double A, double B) + -- Runtime Function: int __getf2 (long double A, long double B) + These functions return a value greater than or equal to zero if + neither argument is NaN, and A is greater than or equal to B. + + -- Runtime Function: int __ltsf2 (float A, float B) + -- Runtime Function: int __ltdf2 (double A, double B) + -- Runtime Function: int __lttf2 (long double A, long double B) + These functions return a value less than zero if neither argument + is NaN, and A is strictly less than B. + + -- Runtime Function: int __lesf2 (float A, float B) + -- Runtime Function: int __ledf2 (double A, double B) + -- Runtime Function: int __letf2 (long double A, long double B) + These functions return a value less than or equal to zero if + neither argument is NaN, and A is less than or equal to B. + + -- Runtime Function: int __gtsf2 (float A, float B) + -- Runtime Function: int __gtdf2 (double A, double B) + -- Runtime Function: int __gttf2 (long double A, long double B) + These functions return a value greater than zero if neither + argument is NaN, and A is strictly greater than B. + +4.2.4 Other floating-point functions +------------------------------------ + + -- Runtime Function: float __powisf2 (float A, int B) + -- Runtime Function: double __powidf2 (double A, int B) + -- Runtime Function: long double __powitf2 (long double A, int B) + -- Runtime Function: long double __powixf2 (long double A, int B) + These functions convert raise A to the power B. + + -- Runtime Function: complex float __mulsc3 (float A, float B, float C, + float D) + -- Runtime Function: complex double __muldc3 (double A, double B, + double C, double D) + -- Runtime Function: complex long double __multc3 (long double A, long + double B, long double C, long double D) + -- Runtime Function: complex long double __mulxc3 (long double A, long + double B, long double C, long double D) + These functions return the product of A + iB and C + iD, following + the rules of C99 Annex G. + + -- Runtime Function: complex float __divsc3 (float A, float B, float C, + float D) + -- Runtime Function: complex double __divdc3 (double A, double B, + double C, double D) + -- Runtime Function: complex long double __divtc3 (long double A, long + double B, long double C, long double D) + -- Runtime Function: complex long double __divxc3 (long double A, long + double B, long double C, long double D) + These functions return the quotient of A + iB and C + iD (i.e., (A + + iB) / (C + iD)), following the rules of C99 Annex G. + + +File: gccint.info, Node: Decimal float library routines, Next: Fixed-point fractional library routines, Prev: Soft float library routines, Up: Libgcc + +4.3 Routines for decimal floating point emulation +================================================= + +The software decimal floating point library implements IEEE 754-2008 +decimal floating point arithmetic and is only activated on selected +targets. + + The software decimal floating point library supports either DPD +(Densely Packed Decimal) or BID (Binary Integer Decimal) encoding as +selected at configure time. + +4.3.1 Arithmetic functions +-------------------------- + + -- Runtime Function: _Decimal32 __dpd_addsd3 (_Decimal32 A, _Decimal32 + B) + -- Runtime Function: _Decimal32 __bid_addsd3 (_Decimal32 A, _Decimal32 + B) + -- Runtime Function: _Decimal64 __dpd_adddd3 (_Decimal64 A, _Decimal64 + B) + -- Runtime Function: _Decimal64 __bid_adddd3 (_Decimal64 A, _Decimal64 + B) + -- Runtime Function: _Decimal128 __dpd_addtd3 (_Decimal128 A, + _Decimal128 B) + -- Runtime Function: _Decimal128 __bid_addtd3 (_Decimal128 A, + _Decimal128 B) + These functions return the sum of A and B. + + -- Runtime Function: _Decimal32 __dpd_subsd3 (_Decimal32 A, _Decimal32 + B) + -- Runtime Function: _Decimal32 __bid_subsd3 (_Decimal32 A, _Decimal32 + B) + -- Runtime Function: _Decimal64 __dpd_subdd3 (_Decimal64 A, _Decimal64 + B) + -- Runtime Function: _Decimal64 __bid_subdd3 (_Decimal64 A, _Decimal64 + B) + -- Runtime Function: _Decimal128 __dpd_subtd3 (_Decimal128 A, + _Decimal128 B) + -- Runtime Function: _Decimal128 __bid_subtd3 (_Decimal128 A, + _Decimal128 B) + These functions return the difference between B and A; that is, + A - B. + + -- Runtime Function: _Decimal32 __dpd_mulsd3 (_Decimal32 A, _Decimal32 + B) + -- Runtime Function: _Decimal32 __bid_mulsd3 (_Decimal32 A, _Decimal32 + B) + -- Runtime Function: _Decimal64 __dpd_muldd3 (_Decimal64 A, _Decimal64 + B) + -- Runtime Function: _Decimal64 __bid_muldd3 (_Decimal64 A, _Decimal64 + B) + -- Runtime Function: _Decimal128 __dpd_multd3 (_Decimal128 A, + _Decimal128 B) + -- Runtime Function: _Decimal128 __bid_multd3 (_Decimal128 A, + _Decimal128 B) + These functions return the product of A and B. + + -- Runtime Function: _Decimal32 __dpd_divsd3 (_Decimal32 A, _Decimal32 + B) + -- Runtime Function: _Decimal32 __bid_divsd3 (_Decimal32 A, _Decimal32 + B) + -- Runtime Function: _Decimal64 __dpd_divdd3 (_Decimal64 A, _Decimal64 + B) + -- Runtime Function: _Decimal64 __bid_divdd3 (_Decimal64 A, _Decimal64 + B) + -- Runtime Function: _Decimal128 __dpd_divtd3 (_Decimal128 A, + _Decimal128 B) + -- Runtime Function: _Decimal128 __bid_divtd3 (_Decimal128 A, + _Decimal128 B) + These functions return the quotient of A and B; that is, A / B. + + -- Runtime Function: _Decimal32 __dpd_negsd2 (_Decimal32 A) + -- Runtime Function: _Decimal32 __bid_negsd2 (_Decimal32 A) + -- Runtime Function: _Decimal64 __dpd_negdd2 (_Decimal64 A) + -- Runtime Function: _Decimal64 __bid_negdd2 (_Decimal64 A) + -- Runtime Function: _Decimal128 __dpd_negtd2 (_Decimal128 A) + -- Runtime Function: _Decimal128 __bid_negtd2 (_Decimal128 A) + These functions return the negation of A. They simply flip the + sign bit, so they can produce negative zero and negative NaN. + +4.3.2 Conversion functions +-------------------------- + + -- Runtime Function: _Decimal64 __dpd_extendsddd2 (_Decimal32 A) + -- Runtime Function: _Decimal64 __bid_extendsddd2 (_Decimal32 A) + -- Runtime Function: _Decimal128 __dpd_extendsdtd2 (_Decimal32 A) + -- Runtime Function: _Decimal128 __bid_extendsdtd2 (_Decimal32 A) + -- Runtime Function: _Decimal128 __dpd_extendddtd2 (_Decimal64 A) + -- Runtime Function: _Decimal128 __bid_extendddtd2 (_Decimal64 A) + -- Runtime Function: _Decimal32 __dpd_truncddsd2 (_Decimal64 A) + -- Runtime Function: _Decimal32 __bid_truncddsd2 (_Decimal64 A) + -- Runtime Function: _Decimal32 __dpd_trunctdsd2 (_Decimal128 A) + -- Runtime Function: _Decimal32 __bid_trunctdsd2 (_Decimal128 A) + -- Runtime Function: _Decimal64 __dpd_trunctddd2 (_Decimal128 A) + -- Runtime Function: _Decimal64 __bid_trunctddd2 (_Decimal128 A) + These functions convert the value A from one decimal floating type + to another. + + -- Runtime Function: _Decimal64 __dpd_extendsfdd (float A) + -- Runtime Function: _Decimal64 __bid_extendsfdd (float A) + -- Runtime Function: _Decimal128 __dpd_extendsftd (float A) + -- Runtime Function: _Decimal128 __bid_extendsftd (float A) + -- Runtime Function: _Decimal128 __dpd_extenddftd (double A) + -- Runtime Function: _Decimal128 __bid_extenddftd (double A) + -- Runtime Function: _Decimal128 __dpd_extendxftd (long double A) + -- Runtime Function: _Decimal128 __bid_extendxftd (long double A) + -- Runtime Function: _Decimal32 __dpd_truncdfsd (double A) + -- Runtime Function: _Decimal32 __bid_truncdfsd (double A) + -- Runtime Function: _Decimal32 __dpd_truncxfsd (long double A) + -- Runtime Function: _Decimal32 __bid_truncxfsd (long double A) + -- Runtime Function: _Decimal32 __dpd_trunctfsd (long double A) + -- Runtime Function: _Decimal32 __bid_trunctfsd (long double A) + -- Runtime Function: _Decimal64 __dpd_truncxfdd (long double A) + -- Runtime Function: _Decimal64 __bid_truncxfdd (long double A) + -- Runtime Function: _Decimal64 __dpd_trunctfdd (long double A) + -- Runtime Function: _Decimal64 __bid_trunctfdd (long double A) + These functions convert the value of A from a binary floating type + to a decimal floating type of a different size. + + -- Runtime Function: float __dpd_truncddsf (_Decimal64 A) + -- Runtime Function: float __bid_truncddsf (_Decimal64 A) + -- Runtime Function: float __dpd_trunctdsf (_Decimal128 A) + -- Runtime Function: float __bid_trunctdsf (_Decimal128 A) + -- Runtime Function: double __dpd_extendsddf (_Decimal32 A) + -- Runtime Function: double __bid_extendsddf (_Decimal32 A) + -- Runtime Function: double __dpd_trunctddf (_Decimal128 A) + -- Runtime Function: double __bid_trunctddf (_Decimal128 A) + -- Runtime Function: long double __dpd_extendsdxf (_Decimal32 A) + -- Runtime Function: long double __bid_extendsdxf (_Decimal32 A) + -- Runtime Function: long double __dpd_extendddxf (_Decimal64 A) + -- Runtime Function: long double __bid_extendddxf (_Decimal64 A) + -- Runtime Function: long double __dpd_trunctdxf (_Decimal128 A) + -- Runtime Function: long double __bid_trunctdxf (_Decimal128 A) + -- Runtime Function: long double __dpd_extendsdtf (_Decimal32 A) + -- Runtime Function: long double __bid_extendsdtf (_Decimal32 A) + -- Runtime Function: long double __dpd_extendddtf (_Decimal64 A) + -- Runtime Function: long double __bid_extendddtf (_Decimal64 A) + These functions convert the value of A from a decimal floating type + to a binary floating type of a different size. + + -- Runtime Function: _Decimal32 __dpd_extendsfsd (float A) + -- Runtime Function: _Decimal32 __bid_extendsfsd (float A) + -- Runtime Function: _Decimal64 __dpd_extenddfdd (double A) + -- Runtime Function: _Decimal64 __bid_extenddfdd (double A) + -- Runtime Function: _Decimal128 __dpd_extendtftd (long double A) + -- Runtime Function: _Decimal128 __bid_extendtftd (long double A) + -- Runtime Function: float __dpd_truncsdsf (_Decimal32 A) + -- Runtime Function: float __bid_truncsdsf (_Decimal32 A) + -- Runtime Function: double __dpd_truncdddf (_Decimal64 A) + -- Runtime Function: double __bid_truncdddf (_Decimal64 A) + -- Runtime Function: long double __dpd_trunctdtf (_Decimal128 A) + -- Runtime Function: long double __bid_trunctdtf (_Decimal128 A) + These functions convert the value of A between decimal and binary + floating types of the same size. + + -- Runtime Function: int __dpd_fixsdsi (_Decimal32 A) + -- Runtime Function: int __bid_fixsdsi (_Decimal32 A) + -- Runtime Function: int __dpd_fixddsi (_Decimal64 A) + -- Runtime Function: int __bid_fixddsi (_Decimal64 A) + -- Runtime Function: int __dpd_fixtdsi (_Decimal128 A) + -- Runtime Function: int __bid_fixtdsi (_Decimal128 A) + These functions convert A to a signed integer. + + -- Runtime Function: long __dpd_fixsddi (_Decimal32 A) + -- Runtime Function: long __bid_fixsddi (_Decimal32 A) + -- Runtime Function: long __dpd_fixdddi (_Decimal64 A) + -- Runtime Function: long __bid_fixdddi (_Decimal64 A) + -- Runtime Function: long __dpd_fixtddi (_Decimal128 A) + -- Runtime Function: long __bid_fixtddi (_Decimal128 A) + These functions convert A to a signed long. + + -- Runtime Function: unsigned int __dpd_fixunssdsi (_Decimal32 A) + -- Runtime Function: unsigned int __bid_fixunssdsi (_Decimal32 A) + -- Runtime Function: unsigned int __dpd_fixunsddsi (_Decimal64 A) + -- Runtime Function: unsigned int __bid_fixunsddsi (_Decimal64 A) + -- Runtime Function: unsigned int __dpd_fixunstdsi (_Decimal128 A) + -- Runtime Function: unsigned int __bid_fixunstdsi (_Decimal128 A) + These functions convert A to an unsigned integer. Negative values + all become zero. + + -- Runtime Function: unsigned long __dpd_fixunssddi (_Decimal32 A) + -- Runtime Function: unsigned long __bid_fixunssddi (_Decimal32 A) + -- Runtime Function: unsigned long __dpd_fixunsdddi (_Decimal64 A) + -- Runtime Function: unsigned long __bid_fixunsdddi (_Decimal64 A) + -- Runtime Function: unsigned long __dpd_fixunstddi (_Decimal128 A) + -- Runtime Function: unsigned long __bid_fixunstddi (_Decimal128 A) + These functions convert A to an unsigned long. Negative values all + become zero. + + -- Runtime Function: _Decimal32 __dpd_floatsisd (int I) + -- Runtime Function: _Decimal32 __bid_floatsisd (int I) + -- Runtime Function: _Decimal64 __dpd_floatsidd (int I) + -- Runtime Function: _Decimal64 __bid_floatsidd (int I) + -- Runtime Function: _Decimal128 __dpd_floatsitd (int I) + -- Runtime Function: _Decimal128 __bid_floatsitd (int I) + These functions convert I, a signed integer, to decimal floating + point. + + -- Runtime Function: _Decimal32 __dpd_floatdisd (long I) + -- Runtime Function: _Decimal32 __bid_floatdisd (long I) + -- Runtime Function: _Decimal64 __dpd_floatdidd (long I) + -- Runtime Function: _Decimal64 __bid_floatdidd (long I) + -- Runtime Function: _Decimal128 __dpd_floatditd (long I) + -- Runtime Function: _Decimal128 __bid_floatditd (long I) + These functions convert I, a signed long, to decimal floating + point. + + -- Runtime Function: _Decimal32 __dpd_floatunssisd (unsigned int I) + -- Runtime Function: _Decimal32 __bid_floatunssisd (unsigned int I) + -- Runtime Function: _Decimal64 __dpd_floatunssidd (unsigned int I) + -- Runtime Function: _Decimal64 __bid_floatunssidd (unsigned int I) + -- Runtime Function: _Decimal128 __dpd_floatunssitd (unsigned int I) + -- Runtime Function: _Decimal128 __bid_floatunssitd (unsigned int I) + These functions convert I, an unsigned integer, to decimal floating + point. + + -- Runtime Function: _Decimal32 __dpd_floatunsdisd (unsigned long I) + -- Runtime Function: _Decimal32 __bid_floatunsdisd (unsigned long I) + -- Runtime Function: _Decimal64 __dpd_floatunsdidd (unsigned long I) + -- Runtime Function: _Decimal64 __bid_floatunsdidd (unsigned long I) + -- Runtime Function: _Decimal128 __dpd_floatunsditd (unsigned long I) + -- Runtime Function: _Decimal128 __bid_floatunsditd (unsigned long I) + These functions convert I, an unsigned long, to decimal floating + point. + +4.3.3 Comparison functions +-------------------------- + + -- Runtime Function: int __dpd_unordsd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __bid_unordsd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __dpd_unorddd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __bid_unorddd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __dpd_unordtd2 (_Decimal128 A, _Decimal128 B) + -- Runtime Function: int __bid_unordtd2 (_Decimal128 A, _Decimal128 B) + These functions return a nonzero value if either argument is NaN, + otherwise 0. + + There is also a complete group of higher level functions which +correspond directly to comparison operators. They implement the ISO C +semantics for floating-point comparisons, taking NaN into account. Pay +careful attention to the return values defined for each set. Under the +hood, all of these routines are implemented as + + if (__bid_unordXd2 (a, b)) + return E; + return __bid_cmpXd2 (a, b); + +where E is a constant chosen to give the proper behavior for NaN. Thus, +the meaning of the return value is different for each set. Do not rely +on this implementation; only the semantics documented below are +guaranteed. + + -- Runtime Function: int __dpd_eqsd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __bid_eqsd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __dpd_eqdd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __bid_eqdd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __dpd_eqtd2 (_Decimal128 A, _Decimal128 B) + -- Runtime Function: int __bid_eqtd2 (_Decimal128 A, _Decimal128 B) + These functions return zero if neither argument is NaN, and A and B + are equal. + + -- Runtime Function: int __dpd_nesd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __bid_nesd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __dpd_nedd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __bid_nedd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __dpd_netd2 (_Decimal128 A, _Decimal128 B) + -- Runtime Function: int __bid_netd2 (_Decimal128 A, _Decimal128 B) + These functions return a nonzero value if either argument is NaN, + or if A and B are unequal. + + -- Runtime Function: int __dpd_gesd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __bid_gesd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __dpd_gedd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __bid_gedd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __dpd_getd2 (_Decimal128 A, _Decimal128 B) + -- Runtime Function: int __bid_getd2 (_Decimal128 A, _Decimal128 B) + These functions return a value greater than or equal to zero if + neither argument is NaN, and A is greater than or equal to B. + + -- Runtime Function: int __dpd_ltsd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __bid_ltsd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __dpd_ltdd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __bid_ltdd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __dpd_lttd2 (_Decimal128 A, _Decimal128 B) + -- Runtime Function: int __bid_lttd2 (_Decimal128 A, _Decimal128 B) + These functions return a value less than zero if neither argument + is NaN, and A is strictly less than B. + + -- Runtime Function: int __dpd_lesd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __bid_lesd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __dpd_ledd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __bid_ledd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __dpd_letd2 (_Decimal128 A, _Decimal128 B) + -- Runtime Function: int __bid_letd2 (_Decimal128 A, _Decimal128 B) + These functions return a value less than or equal to zero if + neither argument is NaN, and A is less than or equal to B. + + -- Runtime Function: int __dpd_gtsd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __bid_gtsd2 (_Decimal32 A, _Decimal32 B) + -- Runtime Function: int __dpd_gtdd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __bid_gtdd2 (_Decimal64 A, _Decimal64 B) + -- Runtime Function: int __dpd_gttd2 (_Decimal128 A, _Decimal128 B) + -- Runtime Function: int __bid_gttd2 (_Decimal128 A, _Decimal128 B) + These functions return a value greater than zero if neither + argument is NaN, and A is strictly greater than B. + + +File: gccint.info, Node: Fixed-point fractional library routines, Next: Exception handling routines, Prev: Decimal float library routines, Up: Libgcc + +4.4 Routines for fixed-point fractional emulation +================================================= + +The software fixed-point library implements fixed-point fractional +arithmetic, and is only activated on selected targets. + + For ease of comprehension 'fract' is an alias for the '_Fract' type, +'accum' an alias for '_Accum', and 'sat' an alias for '_Sat'. + + For illustrative purposes, in this section the fixed-point fractional +type 'short fract' is assumed to correspond to machine mode 'QQmode'; +'unsigned short fract' to 'UQQmode'; 'fract' to 'HQmode'; +'unsigned fract' to 'UHQmode'; 'long fract' to 'SQmode'; +'unsigned long fract' to 'USQmode'; 'long long fract' to 'DQmode'; and +'unsigned long long fract' to 'UDQmode'. Similarly the fixed-point +accumulator type 'short accum' corresponds to 'HAmode'; +'unsigned short accum' to 'UHAmode'; 'accum' to 'SAmode'; +'unsigned accum' to 'USAmode'; 'long accum' to 'DAmode'; +'unsigned long accum' to 'UDAmode'; 'long long accum' to 'TAmode'; and +'unsigned long long accum' to 'UTAmode'. + +4.4.1 Arithmetic functions +-------------------------- + + -- Runtime Function: short fract __addqq3 (short fract A, short fract + B) + -- Runtime Function: fract __addhq3 (fract A, fract B) + -- Runtime Function: long fract __addsq3 (long fract A, long fract B) + -- Runtime Function: long long fract __adddq3 (long long fract A, long + long fract B) + -- Runtime Function: unsigned short fract __adduqq3 (unsigned short + fract A, unsigned short fract B) + -- Runtime Function: unsigned fract __adduhq3 (unsigned fract A, + unsigned fract B) + -- Runtime Function: unsigned long fract __addusq3 (unsigned long fract + A, unsigned long fract B) + -- Runtime Function: unsigned long long fract __addudq3 (unsigned long + long fract A, unsigned long long fract B) + -- Runtime Function: short accum __addha3 (short accum A, short accum + B) + -- Runtime Function: accum __addsa3 (accum A, accum B) + -- Runtime Function: long accum __addda3 (long accum A, long accum B) + -- Runtime Function: long long accum __addta3 (long long accum A, long + long accum B) + -- Runtime Function: unsigned short accum __adduha3 (unsigned short + accum A, unsigned short accum B) + -- Runtime Function: unsigned accum __addusa3 (unsigned accum A, + unsigned accum B) + -- Runtime Function: unsigned long accum __adduda3 (unsigned long accum + A, unsigned long accum B) + -- Runtime Function: unsigned long long accum __adduta3 (unsigned long + long accum A, unsigned long long accum B) + These functions return the sum of A and B. + + -- Runtime Function: short fract __ssaddqq3 (short fract A, short fract + B) + -- Runtime Function: fract __ssaddhq3 (fract A, fract B) + -- Runtime Function: long fract __ssaddsq3 (long fract A, long fract B) + -- Runtime Function: long long fract __ssadddq3 (long long fract A, + long long fract B) + -- Runtime Function: short accum __ssaddha3 (short accum A, short accum + B) + -- Runtime Function: accum __ssaddsa3 (accum A, accum B) + -- Runtime Function: long accum __ssaddda3 (long accum A, long accum B) + -- Runtime Function: long long accum __ssaddta3 (long long accum A, + long long accum B) + These functions return the sum of A and B with signed saturation. + + -- Runtime Function: unsigned short fract __usadduqq3 (unsigned short + fract A, unsigned short fract B) + -- Runtime Function: unsigned fract __usadduhq3 (unsigned fract A, + unsigned fract B) + -- Runtime Function: unsigned long fract __usaddusq3 (unsigned long + fract A, unsigned long fract B) + -- Runtime Function: unsigned long long fract __usaddudq3 (unsigned + long long fract A, unsigned long long fract B) + -- Runtime Function: unsigned short accum __usadduha3 (unsigned short + accum A, unsigned short accum B) + -- Runtime Function: unsigned accum __usaddusa3 (unsigned accum A, + unsigned accum B) + -- Runtime Function: unsigned long accum __usadduda3 (unsigned long + accum A, unsigned long accum B) + -- Runtime Function: unsigned long long accum __usadduta3 (unsigned + long long accum A, unsigned long long accum B) + These functions return the sum of A and B with unsigned saturation. + + -- Runtime Function: short fract __subqq3 (short fract A, short fract + B) + -- Runtime Function: fract __subhq3 (fract A, fract B) + -- Runtime Function: long fract __subsq3 (long fract A, long fract B) + -- Runtime Function: long long fract __subdq3 (long long fract A, long + long fract B) + -- Runtime Function: unsigned short fract __subuqq3 (unsigned short + fract A, unsigned short fract B) + -- Runtime Function: unsigned fract __subuhq3 (unsigned fract A, + unsigned fract B) + -- Runtime Function: unsigned long fract __subusq3 (unsigned long fract + A, unsigned long fract B) + -- Runtime Function: unsigned long long fract __subudq3 (unsigned long + long fract A, unsigned long long fract B) + -- Runtime Function: short accum __subha3 (short accum A, short accum + B) + -- Runtime Function: accum __subsa3 (accum A, accum B) + -- Runtime Function: long accum __subda3 (long accum A, long accum B) + -- Runtime Function: long long accum __subta3 (long long accum A, long + long accum B) + -- Runtime Function: unsigned short accum __subuha3 (unsigned short + accum A, unsigned short accum B) + -- Runtime Function: unsigned accum __subusa3 (unsigned accum A, + unsigned accum B) + -- Runtime Function: unsigned long accum __subuda3 (unsigned long accum + A, unsigned long accum B) + -- Runtime Function: unsigned long long accum __subuta3 (unsigned long + long accum A, unsigned long long accum B) + These functions return the difference of A and B; that is, 'A - B'. + + -- Runtime Function: short fract __sssubqq3 (short fract A, short fract + B) + -- Runtime Function: fract __sssubhq3 (fract A, fract B) + -- Runtime Function: long fract __sssubsq3 (long fract A, long fract B) + -- Runtime Function: long long fract __sssubdq3 (long long fract A, + long long fract B) + -- Runtime Function: short accum __sssubha3 (short accum A, short accum + B) + -- Runtime Function: accum __sssubsa3 (accum A, accum B) + -- Runtime Function: long accum __sssubda3 (long accum A, long accum B) + -- Runtime Function: long long accum __sssubta3 (long long accum A, + long long accum B) + These functions return the difference of A and B with signed + saturation; that is, 'A - B'. + + -- Runtime Function: unsigned short fract __ussubuqq3 (unsigned short + fract A, unsigned short fract B) + -- Runtime Function: unsigned fract __ussubuhq3 (unsigned fract A, + unsigned fract B) + -- Runtime Function: unsigned long fract __ussubusq3 (unsigned long + fract A, unsigned long fract B) + -- Runtime Function: unsigned long long fract __ussubudq3 (unsigned + long long fract A, unsigned long long fract B) + -- Runtime Function: unsigned short accum __ussubuha3 (unsigned short + accum A, unsigned short accum B) + -- Runtime Function: unsigned accum __ussubusa3 (unsigned accum A, + unsigned accum B) + -- Runtime Function: unsigned long accum __ussubuda3 (unsigned long + accum A, unsigned long accum B) + -- Runtime Function: unsigned long long accum __ussubuta3 (unsigned + long long accum A, unsigned long long accum B) + These functions return the difference of A and B with unsigned + saturation; that is, 'A - B'. + + -- Runtime Function: short fract __mulqq3 (short fract A, short fract + B) + -- Runtime Function: fract __mulhq3 (fract A, fract B) + -- Runtime Function: long fract __mulsq3 (long fract A, long fract B) + -- Runtime Function: long long fract __muldq3 (long long fract A, long + long fract B) + -- Runtime Function: unsigned short fract __muluqq3 (unsigned short + fract A, unsigned short fract B) + -- Runtime Function: unsigned fract __muluhq3 (unsigned fract A, + unsigned fract B) + -- Runtime Function: unsigned long fract __mulusq3 (unsigned long fract + A, unsigned long fract B) + -- Runtime Function: unsigned long long fract __muludq3 (unsigned long + long fract A, unsigned long long fract B) + -- Runtime Function: short accum __mulha3 (short accum A, short accum + B) + -- Runtime Function: accum __mulsa3 (accum A, accum B) + -- Runtime Function: long accum __mulda3 (long accum A, long accum B) + -- Runtime Function: long long accum __multa3 (long long accum A, long + long accum B) + -- Runtime Function: unsigned short accum __muluha3 (unsigned short + accum A, unsigned short accum B) + -- Runtime Function: unsigned accum __mulusa3 (unsigned accum A, + unsigned accum B) + -- Runtime Function: unsigned long accum __muluda3 (unsigned long accum + A, unsigned long accum B) + -- Runtime Function: unsigned long long accum __muluta3 (unsigned long + long accum A, unsigned long long accum B) + These functions return the product of A and B. + + -- Runtime Function: short fract __ssmulqq3 (short fract A, short fract + B) + -- Runtime Function: fract __ssmulhq3 (fract A, fract B) + -- Runtime Function: long fract __ssmulsq3 (long fract A, long fract B) + -- Runtime Function: long long fract __ssmuldq3 (long long fract A, + long long fract B) + -- Runtime Function: short accum __ssmulha3 (short accum A, short accum + B) + -- Runtime Function: accum __ssmulsa3 (accum A, accum B) + -- Runtime Function: long accum __ssmulda3 (long accum A, long accum B) + -- Runtime Function: long long accum __ssmulta3 (long long accum A, + long long accum B) + These functions return the product of A and B with signed + saturation. + + -- Runtime Function: unsigned short fract __usmuluqq3 (unsigned short + fract A, unsigned short fract B) + -- Runtime Function: unsigned fract __usmuluhq3 (unsigned fract A, + unsigned fract B) + -- Runtime Function: unsigned long fract __usmulusq3 (unsigned long + fract A, unsigned long fract B) + -- Runtime Function: unsigned long long fract __usmuludq3 (unsigned + long long fract A, unsigned long long fract B) + -- Runtime Function: unsigned short accum __usmuluha3 (unsigned short + accum A, unsigned short accum B) + -- Runtime Function: unsigned accum __usmulusa3 (unsigned accum A, + unsigned accum B) + -- Runtime Function: unsigned long accum __usmuluda3 (unsigned long + accum A, unsigned long accum B) + -- Runtime Function: unsigned long long accum __usmuluta3 (unsigned + long long accum A, unsigned long long accum B) + These functions return the product of A and B with unsigned + saturation. + + -- Runtime Function: short fract __divqq3 (short fract A, short fract + B) + -- Runtime Function: fract __divhq3 (fract A, fract B) + -- Runtime Function: long fract __divsq3 (long fract A, long fract B) + -- Runtime Function: long long fract __divdq3 (long long fract A, long + long fract B) + -- Runtime Function: short accum __divha3 (short accum A, short accum + B) + -- Runtime Function: accum __divsa3 (accum A, accum B) + -- Runtime Function: long accum __divda3 (long accum A, long accum B) + -- Runtime Function: long long accum __divta3 (long long accum A, long + long accum B) + These functions return the quotient of the signed division of A and + B. + + -- Runtime Function: unsigned short fract __udivuqq3 (unsigned short + fract A, unsigned short fract B) + -- Runtime Function: unsigned fract __udivuhq3 (unsigned fract A, + unsigned fract B) + -- Runtime Function: unsigned long fract __udivusq3 (unsigned long + fract A, unsigned long fract B) + -- Runtime Function: unsigned long long fract __udivudq3 (unsigned long + long fract A, unsigned long long fract B) + -- Runtime Function: unsigned short accum __udivuha3 (unsigned short + accum A, unsigned short accum B) + -- Runtime Function: unsigned accum __udivusa3 (unsigned accum A, + unsigned accum B) + -- Runtime Function: unsigned long accum __udivuda3 (unsigned long + accum A, unsigned long accum B) + -- Runtime Function: unsigned long long accum __udivuta3 (unsigned long + long accum A, unsigned long long accum B) + These functions return the quotient of the unsigned division of A + and B. + + -- Runtime Function: short fract __ssdivqq3 (short fract A, short fract + B) + -- Runtime Function: fract __ssdivhq3 (fract A, fract B) + -- Runtime Function: long fract __ssdivsq3 (long fract A, long fract B) + -- Runtime Function: long long fract __ssdivdq3 (long long fract A, + long long fract B) + -- Runtime Function: short accum __ssdivha3 (short accum A, short accum + B) + -- Runtime Function: accum __ssdivsa3 (accum A, accum B) + -- Runtime Function: long accum __ssdivda3 (long accum A, long accum B) + -- Runtime Function: long long accum __ssdivta3 (long long accum A, + long long accum B) + These functions return the quotient of the signed division of A and + B with signed saturation. + + -- Runtime Function: unsigned short fract __usdivuqq3 (unsigned short + fract A, unsigned short fract B) + -- Runtime Function: unsigned fract __usdivuhq3 (unsigned fract A, + unsigned fract B) + -- Runtime Function: unsigned long fract __usdivusq3 (unsigned long + fract A, unsigned long fract B) + -- Runtime Function: unsigned long long fract __usdivudq3 (unsigned + long long fract A, unsigned long long fract B) + -- Runtime Function: unsigned short accum __usdivuha3 (unsigned short + accum A, unsigned short accum B) + -- Runtime Function: unsigned accum __usdivusa3 (unsigned accum A, + unsigned accum B) + -- Runtime Function: unsigned long accum __usdivuda3 (unsigned long + accum A, unsigned long accum B) + -- Runtime Function: unsigned long long accum __usdivuta3 (unsigned + long long accum A, unsigned long long accum B) + These functions return the quotient of the unsigned division of A + and B with unsigned saturation. + + -- Runtime Function: short fract __negqq2 (short fract A) + -- Runtime Function: fract __neghq2 (fract A) + -- Runtime Function: long fract __negsq2 (long fract A) + -- Runtime Function: long long fract __negdq2 (long long fract A) + -- Runtime Function: unsigned short fract __neguqq2 (unsigned short + fract A) + -- Runtime Function: unsigned fract __neguhq2 (unsigned fract A) + -- Runtime Function: unsigned long fract __negusq2 (unsigned long fract + A) + -- Runtime Function: unsigned long long fract __negudq2 (unsigned long + long fract A) + -- Runtime Function: short accum __negha2 (short accum A) + -- Runtime Function: accum __negsa2 (accum A) + -- Runtime Function: long accum __negda2 (long accum A) + -- Runtime Function: long long accum __negta2 (long long accum A) + -- Runtime Function: unsigned short accum __neguha2 (unsigned short + accum A) + -- Runtime Function: unsigned accum __negusa2 (unsigned accum A) + -- Runtime Function: unsigned long accum __neguda2 (unsigned long accum + A) + -- Runtime Function: unsigned long long accum __neguta2 (unsigned long + long accum A) + These functions return the negation of A. + + -- Runtime Function: short fract __ssnegqq2 (short fract A) + -- Runtime Function: fract __ssneghq2 (fract A) + -- Runtime Function: long fract __ssnegsq2 (long fract A) + -- Runtime Function: long long fract __ssnegdq2 (long long fract A) + -- Runtime Function: short accum __ssnegha2 (short accum A) + -- Runtime Function: accum __ssnegsa2 (accum A) + -- Runtime Function: long accum __ssnegda2 (long accum A) + -- Runtime Function: long long accum __ssnegta2 (long long accum A) + These functions return the negation of A with signed saturation. + + -- Runtime Function: unsigned short fract __usneguqq2 (unsigned short + fract A) + -- Runtime Function: unsigned fract __usneguhq2 (unsigned fract A) + -- Runtime Function: unsigned long fract __usnegusq2 (unsigned long + fract A) + -- Runtime Function: unsigned long long fract __usnegudq2 (unsigned + long long fract A) + -- Runtime Function: unsigned short accum __usneguha2 (unsigned short + accum A) + -- Runtime Function: unsigned accum __usnegusa2 (unsigned accum A) + -- Runtime Function: unsigned long accum __usneguda2 (unsigned long + accum A) + -- Runtime Function: unsigned long long accum __usneguta2 (unsigned + long long accum A) + These functions return the negation of A with unsigned saturation. + + -- Runtime Function: short fract __ashlqq3 (short fract A, int B) + -- Runtime Function: fract __ashlhq3 (fract A, int B) + -- Runtime Function: long fract __ashlsq3 (long fract A, int B) + -- Runtime Function: long long fract __ashldq3 (long long fract A, int + B) + -- Runtime Function: unsigned short fract __ashluqq3 (unsigned short + fract A, int B) + -- Runtime Function: unsigned fract __ashluhq3 (unsigned fract A, int + B) + -- Runtime Function: unsigned long fract __ashlusq3 (unsigned long + fract A, int B) + -- Runtime Function: unsigned long long fract __ashludq3 (unsigned long + long fract A, int B) + -- Runtime Function: short accum __ashlha3 (short accum A, int B) + -- Runtime Function: accum __ashlsa3 (accum A, int B) + -- Runtime Function: long accum __ashlda3 (long accum A, int B) + -- Runtime Function: long long accum __ashlta3 (long long accum A, int + B) + -- Runtime Function: unsigned short accum __ashluha3 (unsigned short + accum A, int B) + -- Runtime Function: unsigned accum __ashlusa3 (unsigned accum A, int + B) + -- Runtime Function: unsigned long accum __ashluda3 (unsigned long + accum A, int B) + -- Runtime Function: unsigned long long accum __ashluta3 (unsigned long + long accum A, int B) + These functions return the result of shifting A left by B bits. + + -- Runtime Function: short fract __ashrqq3 (short fract A, int B) + -- Runtime Function: fract __ashrhq3 (fract A, int B) + -- Runtime Function: long fract __ashrsq3 (long fract A, int B) + -- Runtime Function: long long fract __ashrdq3 (long long fract A, int + B) + -- Runtime Function: short accum __ashrha3 (short accum A, int B) + -- Runtime Function: accum __ashrsa3 (accum A, int B) + -- Runtime Function: long accum __ashrda3 (long accum A, int B) + -- Runtime Function: long long accum __ashrta3 (long long accum A, int + B) + These functions return the result of arithmetically shifting A + right by B bits. + + -- Runtime Function: unsigned short fract __lshruqq3 (unsigned short + fract A, int B) + -- Runtime Function: unsigned fract __lshruhq3 (unsigned fract A, int + B) + -- Runtime Function: unsigned long fract __lshrusq3 (unsigned long + fract A, int B) + -- Runtime Function: unsigned long long fract __lshrudq3 (unsigned long + long fract A, int B) + -- Runtime Function: unsigned short accum __lshruha3 (unsigned short + accum A, int B) + -- Runtime Function: unsigned accum __lshrusa3 (unsigned accum A, int + B) + -- Runtime Function: unsigned long accum __lshruda3 (unsigned long + accum A, int B) + -- Runtime Function: unsigned long long accum __lshruta3 (unsigned long + long accum A, int B) + These functions return the result of logically shifting A right by + B bits. + + -- Runtime Function: fract __ssashlhq3 (fract A, int B) + -- Runtime Function: long fract __ssashlsq3 (long fract A, int B) + -- Runtime Function: long long fract __ssashldq3 (long long fract A, + int B) + -- Runtime Function: short accum __ssashlha3 (short accum A, int B) + -- Runtime Function: accum __ssashlsa3 (accum A, int B) + -- Runtime Function: long accum __ssashlda3 (long accum A, int B) + -- Runtime Function: long long accum __ssashlta3 (long long accum A, + int B) + These functions return the result of shifting A left by B bits with + signed saturation. + + -- Runtime Function: unsigned short fract __usashluqq3 (unsigned short + fract A, int B) + -- Runtime Function: unsigned fract __usashluhq3 (unsigned fract A, int + B) + -- Runtime Function: unsigned long fract __usashlusq3 (unsigned long + fract A, int B) + -- Runtime Function: unsigned long long fract __usashludq3 (unsigned + long long fract A, int B) + -- Runtime Function: unsigned short accum __usashluha3 (unsigned short + accum A, int B) + -- Runtime Function: unsigned accum __usashlusa3 (unsigned accum A, int + B) + -- Runtime Function: unsigned long accum __usashluda3 (unsigned long + accum A, int B) + -- Runtime Function: unsigned long long accum __usashluta3 (unsigned + long long accum A, int B) + These functions return the result of shifting A left by B bits with + unsigned saturation. + +4.4.2 Comparison functions +-------------------------- + +The following functions implement fixed-point comparisons. These +functions implement a low-level compare, upon which the higher level +comparison operators (such as less than and greater than or equal to) +can be constructed. The returned values lie in the range zero to two, +to allow the high-level operators to be implemented by testing the +returned result using either signed or unsigned comparison. + + -- Runtime Function: int __cmpqq2 (short fract A, short fract B) + -- Runtime Function: int __cmphq2 (fract A, fract B) + -- Runtime Function: int __cmpsq2 (long fract A, long fract B) + -- Runtime Function: int __cmpdq2 (long long fract A, long long fract + B) + -- Runtime Function: int __cmpuqq2 (unsigned short fract A, unsigned + short fract B) + -- Runtime Function: int __cmpuhq2 (unsigned fract A, unsigned fract B) + -- Runtime Function: int __cmpusq2 (unsigned long fract A, unsigned + long fract B) + -- Runtime Function: int __cmpudq2 (unsigned long long fract A, + unsigned long long fract B) + -- Runtime Function: int __cmpha2 (short accum A, short accum B) + -- Runtime Function: int __cmpsa2 (accum A, accum B) + -- Runtime Function: int __cmpda2 (long accum A, long accum B) + -- Runtime Function: int __cmpta2 (long long accum A, long long accum + B) + -- Runtime Function: int __cmpuha2 (unsigned short accum A, unsigned + short accum B) + -- Runtime Function: int __cmpusa2 (unsigned accum A, unsigned accum B) + -- Runtime Function: int __cmpuda2 (unsigned long accum A, unsigned + long accum B) + -- Runtime Function: int __cmputa2 (unsigned long long accum A, + unsigned long long accum B) + These functions perform a signed or unsigned comparison of A and B + (depending on the selected machine mode). If A is less than B, + they return 0; if A is greater than B, they return 2; and if A and + B are equal they return 1. + +4.4.3 Conversion functions +-------------------------- + + -- Runtime Function: fract __fractqqhq2 (short fract A) + -- Runtime Function: long fract __fractqqsq2 (short fract A) + -- Runtime Function: long long fract __fractqqdq2 (short fract A) + -- Runtime Function: short accum __fractqqha (short fract A) + -- Runtime Function: accum __fractqqsa (short fract A) + -- Runtime Function: long accum __fractqqda (short fract A) + -- Runtime Function: long long accum __fractqqta (short fract A) + -- Runtime Function: unsigned short fract __fractqquqq (short fract A) + -- Runtime Function: unsigned fract __fractqquhq (short fract A) + -- Runtime Function: unsigned long fract __fractqqusq (short fract A) + -- Runtime Function: unsigned long long fract __fractqqudq (short fract + A) + -- Runtime Function: unsigned short accum __fractqquha (short fract A) + -- Runtime Function: unsigned accum __fractqqusa (short fract A) + -- Runtime Function: unsigned long accum __fractqquda (short fract A) + -- Runtime Function: unsigned long long accum __fractqquta (short fract + A) + -- Runtime Function: signed char __fractqqqi (short fract A) + -- Runtime Function: short __fractqqhi (short fract A) + -- Runtime Function: int __fractqqsi (short fract A) + -- Runtime Function: long __fractqqdi (short fract A) + -- Runtime Function: long long __fractqqti (short fract A) + -- Runtime Function: float __fractqqsf (short fract A) + -- Runtime Function: double __fractqqdf (short fract A) + -- Runtime Function: short fract __fracthqqq2 (fract A) + -- Runtime Function: long fract __fracthqsq2 (fract A) + -- Runtime Function: long long fract __fracthqdq2 (fract A) + -- Runtime Function: short accum __fracthqha (fract A) + -- Runtime Function: accum __fracthqsa (fract A) + -- Runtime Function: long accum __fracthqda (fract A) + -- Runtime Function: long long accum __fracthqta (fract A) + -- Runtime Function: unsigned short fract __fracthquqq (fract A) + -- Runtime Function: unsigned fract __fracthquhq (fract A) + -- Runtime Function: unsigned long fract __fracthqusq (fract A) + -- Runtime Function: unsigned long long fract __fracthqudq (fract A) + -- Runtime Function: unsigned short accum __fracthquha (fract A) + -- Runtime Function: unsigned accum __fracthqusa (fract A) + -- Runtime Function: unsigned long accum __fracthquda (fract A) + -- Runtime Function: unsigned long long accum __fracthquta (fract A) + -- Runtime Function: signed char __fracthqqi (fract A) + -- Runtime Function: short __fracthqhi (fract A) + -- Runtime Function: int __fracthqsi (fract A) + -- Runtime Function: long __fracthqdi (fract A) + -- Runtime Function: long long __fracthqti (fract A) + -- Runtime Function: float __fracthqsf (fract A) + -- Runtime Function: double __fracthqdf (fract A) + -- Runtime Function: short fract __fractsqqq2 (long fract A) + -- Runtime Function: fract __fractsqhq2 (long fract A) + -- Runtime Function: long long fract __fractsqdq2 (long fract A) + -- Runtime Function: short accum __fractsqha (long fract A) + -- Runtime Function: accum __fractsqsa (long fract A) + -- Runtime Function: long accum __fractsqda (long fract A) + -- Runtime Function: long long accum __fractsqta (long fract A) + -- Runtime Function: unsigned short fract __fractsquqq (long fract A) + -- Runtime Function: unsigned fract __fractsquhq (long fract A) + -- Runtime Function: unsigned long fract __fractsqusq (long fract A) + -- Runtime Function: unsigned long long fract __fractsqudq (long fract + A) + -- Runtime Function: unsigned short accum __fractsquha (long fract A) + -- Runtime Function: unsigned accum __fractsqusa (long fract A) + -- Runtime Function: unsigned long accum __fractsquda (long fract A) + -- Runtime Function: unsigned long long accum __fractsquta (long fract + A) + -- Runtime Function: signed char __fractsqqi (long fract A) + -- Runtime Function: short __fractsqhi (long fract A) + -- Runtime Function: int __fractsqsi (long fract A) + -- Runtime Function: long __fractsqdi (long fract A) + -- Runtime Function: long long __fractsqti (long fract A) + -- Runtime Function: float __fractsqsf (long fract A) + -- Runtime Function: double __fractsqdf (long fract A) + -- Runtime Function: short fract __fractdqqq2 (long long fract A) + -- Runtime Function: fract __fractdqhq2 (long long fract A) + -- Runtime Function: long fract __fractdqsq2 (long long fract A) + -- Runtime Function: short accum __fractdqha (long long fract A) + -- Runtime Function: accum __fractdqsa (long long fract A) + -- Runtime Function: long accum __fractdqda (long long fract A) + -- Runtime Function: long long accum __fractdqta (long long fract A) + -- Runtime Function: unsigned short fract __fractdquqq (long long fract + A) + -- Runtime Function: unsigned fract __fractdquhq (long long fract A) + -- Runtime Function: unsigned long fract __fractdqusq (long long fract + A) + -- Runtime Function: unsigned long long fract __fractdqudq (long long + fract A) + -- Runtime Function: unsigned short accum __fractdquha (long long fract + A) + -- Runtime Function: unsigned accum __fractdqusa (long long fract A) + -- Runtime Function: unsigned long accum __fractdquda (long long fract + A) + -- Runtime Function: unsigned long long accum __fractdquta (long long + fract A) + -- Runtime Function: signed char __fractdqqi (long long fract A) + -- Runtime Function: short __fractdqhi (long long fract A) + -- Runtime Function: int __fractdqsi (long long fract A) + -- Runtime Function: long __fractdqdi (long long fract A) + -- Runtime Function: long long __fractdqti (long long fract A) + -- Runtime Function: float __fractdqsf (long long fract A) + -- Runtime Function: double __fractdqdf (long long fract A) + -- Runtime Function: short fract __fracthaqq (short accum A) + -- Runtime Function: fract __fracthahq (short accum A) + -- Runtime Function: long fract __fracthasq (short accum A) + -- Runtime Function: long long fract __fracthadq (short accum A) + -- Runtime Function: accum __fracthasa2 (short accum A) + -- Runtime Function: long accum __fracthada2 (short accum A) + -- Runtime Function: long long accum __fracthata2 (short accum A) + -- Runtime Function: unsigned short fract __fracthauqq (short accum A) + -- Runtime Function: unsigned fract __fracthauhq (short accum A) + -- Runtime Function: unsigned long fract __fracthausq (short accum A) + -- Runtime Function: unsigned long long fract __fracthaudq (short accum + A) + -- Runtime Function: unsigned short accum __fracthauha (short accum A) + -- Runtime Function: unsigned accum __fracthausa (short accum A) + -- Runtime Function: unsigned long accum __fracthauda (short accum A) + -- Runtime Function: unsigned long long accum __fracthauta (short accum + A) + -- Runtime Function: signed char __fracthaqi (short accum A) + -- Runtime Function: short __fracthahi (short accum A) + -- Runtime Function: int __fracthasi (short accum A) + -- Runtime Function: long __fracthadi (short accum A) + -- Runtime Function: long long __fracthati (short accum A) + -- Runtime Function: float __fracthasf (short accum A) + -- Runtime Function: double __fracthadf (short accum A) + -- Runtime Function: short fract __fractsaqq (accum A) + -- Runtime Function: fract __fractsahq (accum A) + -- Runtime Function: long fract __fractsasq (accum A) + -- Runtime Function: long long fract __fractsadq (accum A) + -- Runtime Function: short accum __fractsaha2 (accum A) + -- Runtime Function: long accum __fractsada2 (accum A) + -- Runtime Function: long long accum __fractsata2 (accum A) + -- Runtime Function: unsigned short fract __fractsauqq (accum A) + -- Runtime Function: unsigned fract __fractsauhq (accum A) + -- Runtime Function: unsigned long fract __fractsausq (accum A) + -- Runtime Function: unsigned long long fract __fractsaudq (accum A) + -- Runtime Function: unsigned short accum __fractsauha (accum A) + -- Runtime Function: unsigned accum __fractsausa (accum A) + -- Runtime Function: unsigned long accum __fractsauda (accum A) + -- Runtime Function: unsigned long long accum __fractsauta (accum A) + -- Runtime Function: signed char __fractsaqi (accum A) + -- Runtime Function: short __fractsahi (accum A) + -- Runtime Function: int __fractsasi (accum A) + -- Runtime Function: long __fractsadi (accum A) + -- Runtime Function: long long __fractsati (accum A) + -- Runtime Function: float __fractsasf (accum A) + -- Runtime Function: double __fractsadf (accum A) + -- Runtime Function: short fract __fractdaqq (long accum A) + -- Runtime Function: fract __fractdahq (long accum A) + -- Runtime Function: long fract __fractdasq (long accum A) + -- Runtime Function: long long fract __fractdadq (long accum A) + -- Runtime Function: short accum __fractdaha2 (long accum A) + -- Runtime Function: accum __fractdasa2 (long accum A) + -- Runtime Function: long long accum __fractdata2 (long accum A) + -- Runtime Function: unsigned short fract __fractdauqq (long accum A) + -- Runtime Function: unsigned fract __fractdauhq (long accum A) + -- Runtime Function: unsigned long fract __fractdausq (long accum A) + -- Runtime Function: unsigned long long fract __fractdaudq (long accum + A) + -- Runtime Function: unsigned short accum __fractdauha (long accum A) + -- Runtime Function: unsigned accum __fractdausa (long accum A) + -- Runtime Function: unsigned long accum __fractdauda (long accum A) + -- Runtime Function: unsigned long long accum __fractdauta (long accum + A) + -- Runtime Function: signed char __fractdaqi (long accum A) + -- Runtime Function: short __fractdahi (long accum A) + -- Runtime Function: int __fractdasi (long accum A) + -- Runtime Function: long __fractdadi (long accum A) + -- Runtime Function: long long __fractdati (long accum A) + -- Runtime Function: float __fractdasf (long accum A) + -- Runtime Function: double __fractdadf (long accum A) + -- Runtime Function: short fract __fracttaqq (long long accum A) + -- Runtime Function: fract __fracttahq (long long accum A) + -- Runtime Function: long fract __fracttasq (long long accum A) + -- Runtime Function: long long fract __fracttadq (long long accum A) + -- Runtime Function: short accum __fracttaha2 (long long accum A) + -- Runtime Function: accum __fracttasa2 (long long accum A) + -- Runtime Function: long accum __fracttada2 (long long accum A) + -- Runtime Function: unsigned short fract __fracttauqq (long long accum + A) + -- Runtime Function: unsigned fract __fracttauhq (long long accum A) + -- Runtime Function: unsigned long fract __fracttausq (long long accum + A) + -- Runtime Function: unsigned long long fract __fracttaudq (long long + accum A) + -- Runtime Function: unsigned short accum __fracttauha (long long accum + A) + -- Runtime Function: unsigned accum __fracttausa (long long accum A) + -- Runtime Function: unsigned long accum __fracttauda (long long accum + A) + -- Runtime Function: unsigned long long accum __fracttauta (long long + accum A) + -- Runtime Function: signed char __fracttaqi (long long accum A) + -- Runtime Function: short __fracttahi (long long accum A) + -- Runtime Function: int __fracttasi (long long accum A) + -- Runtime Function: long __fracttadi (long long accum A) + -- Runtime Function: long long __fracttati (long long accum A) + -- Runtime Function: float __fracttasf (long long accum A) + -- Runtime Function: double __fracttadf (long long accum A) + -- Runtime Function: short fract __fractuqqqq (unsigned short fract A) + -- Runtime Function: fract __fractuqqhq (unsigned short fract A) + -- Runtime Function: long fract __fractuqqsq (unsigned short fract A) + -- Runtime Function: long long fract __fractuqqdq (unsigned short fract + A) + -- Runtime Function: short accum __fractuqqha (unsigned short fract A) + -- Runtime Function: accum __fractuqqsa (unsigned short fract A) + -- Runtime Function: long accum __fractuqqda (unsigned short fract A) + -- Runtime Function: long long accum __fractuqqta (unsigned short fract + A) + -- Runtime Function: unsigned fract __fractuqquhq2 (unsigned short + fract A) + -- Runtime Function: unsigned long fract __fractuqqusq2 (unsigned short + fract A) + -- Runtime Function: unsigned long long fract __fractuqqudq2 (unsigned + short fract A) + -- Runtime Function: unsigned short accum __fractuqquha (unsigned short + fract A) + -- Runtime Function: unsigned accum __fractuqqusa (unsigned short fract + A) + -- Runtime Function: unsigned long accum __fractuqquda (unsigned short + fract A) + -- Runtime Function: unsigned long long accum __fractuqquta (unsigned + short fract A) + -- Runtime Function: signed char __fractuqqqi (unsigned short fract A) + -- Runtime Function: short __fractuqqhi (unsigned short fract A) + -- Runtime Function: int __fractuqqsi (unsigned short fract A) + -- Runtime Function: long __fractuqqdi (unsigned short fract A) + -- Runtime Function: long long __fractuqqti (unsigned short fract A) + -- Runtime Function: float __fractuqqsf (unsigned short fract A) + -- Runtime Function: double __fractuqqdf (unsigned short fract A) + -- Runtime Function: short fract __fractuhqqq (unsigned fract A) + -- Runtime Function: fract __fractuhqhq (unsigned fract A) + -- Runtime Function: long fract __fractuhqsq (unsigned fract A) + -- Runtime Function: long long fract __fractuhqdq (unsigned fract A) + -- Runtime Function: short accum __fractuhqha (unsigned fract A) + -- Runtime Function: accum __fractuhqsa (unsigned fract A) + -- Runtime Function: long accum __fractuhqda (unsigned fract A) + -- Runtime Function: long long accum __fractuhqta (unsigned fract A) + -- Runtime Function: unsigned short fract __fractuhquqq2 (unsigned + fract A) + -- Runtime Function: unsigned long fract __fractuhqusq2 (unsigned fract + A) + -- Runtime Function: unsigned long long fract __fractuhqudq2 (unsigned + fract A) + -- Runtime Function: unsigned short accum __fractuhquha (unsigned fract + A) + -- Runtime Function: unsigned accum __fractuhqusa (unsigned fract A) + -- Runtime Function: unsigned long accum __fractuhquda (unsigned fract + A) + -- Runtime Function: unsigned long long accum __fractuhquta (unsigned + fract A) + -- Runtime Function: signed char __fractuhqqi (unsigned fract A) + -- Runtime Function: short __fractuhqhi (unsigned fract A) + -- Runtime Function: int __fractuhqsi (unsigned fract A) + -- Runtime Function: long __fractuhqdi (unsigned fract A) + -- Runtime Function: long long __fractuhqti (unsigned fract A) + -- Runtime Function: float __fractuhqsf (unsigned fract A) + -- Runtime Function: double __fractuhqdf (unsigned fract A) + -- Runtime Function: short fract __fractusqqq (unsigned long fract A) + -- Runtime Function: fract __fractusqhq (unsigned long fract A) + -- Runtime Function: long fract __fractusqsq (unsigned long fract A) + -- Runtime Function: long long fract __fractusqdq (unsigned long fract + A) + -- Runtime Function: short accum __fractusqha (unsigned long fract A) + -- Runtime Function: accum __fractusqsa (unsigned long fract A) + -- Runtime Function: long accum __fractusqda (unsigned long fract A) + -- Runtime Function: long long accum __fractusqta (unsigned long fract + A) + -- Runtime Function: unsigned short fract __fractusquqq2 (unsigned long + fract A) + -- Runtime Function: unsigned fract __fractusquhq2 (unsigned long fract + A) + -- Runtime Function: unsigned long long fract __fractusqudq2 (unsigned + long fract A) + -- Runtime Function: unsigned short accum __fractusquha (unsigned long + fract A) + -- Runtime Function: unsigned accum __fractusqusa (unsigned long fract + A) + -- Runtime Function: unsigned long accum __fractusquda (unsigned long + fract A) + -- Runtime Function: unsigned long long accum __fractusquta (unsigned + long fract A) + -- Runtime Function: signed char __fractusqqi (unsigned long fract A) + -- Runtime Function: short __fractusqhi (unsigned long fract A) + -- Runtime Function: int __fractusqsi (unsigned long fract A) + -- Runtime Function: long __fractusqdi (unsigned long fract A) + -- Runtime Function: long long __fractusqti (unsigned long fract A) + -- Runtime Function: float __fractusqsf (unsigned long fract A) + -- Runtime Function: double __fractusqdf (unsigned long fract A) + -- Runtime Function: short fract __fractudqqq (unsigned long long fract + A) + -- Runtime Function: fract __fractudqhq (unsigned long long fract A) + -- Runtime Function: long fract __fractudqsq (unsigned long long fract + A) + -- Runtime Function: long long fract __fractudqdq (unsigned long long + fract A) + -- Runtime Function: short accum __fractudqha (unsigned long long fract + A) + -- Runtime Function: accum __fractudqsa (unsigned long long fract A) + -- Runtime Function: long accum __fractudqda (unsigned long long fract + A) + -- Runtime Function: long long accum __fractudqta (unsigned long long + fract A) + -- Runtime Function: unsigned short fract __fractudquqq2 (unsigned long + long fract A) + -- Runtime Function: unsigned fract __fractudquhq2 (unsigned long long + fract A) + -- Runtime Function: unsigned long fract __fractudqusq2 (unsigned long + long fract A) + -- Runtime Function: unsigned short accum __fractudquha (unsigned long + long fract A) + -- Runtime Function: unsigned accum __fractudqusa (unsigned long long + fract A) + -- Runtime Function: unsigned long accum __fractudquda (unsigned long + long fract A) + -- Runtime Function: unsigned long long accum __fractudquta (unsigned + long long fract A) + -- Runtime Function: signed char __fractudqqi (unsigned long long fract + A) + -- Runtime Function: short __fractudqhi (unsigned long long fract A) + -- Runtime Function: int __fractudqsi (unsigned long long fract A) + -- Runtime Function: long __fractudqdi (unsigned long long fract A) + -- Runtime Function: long long __fractudqti (unsigned long long fract + A) + -- Runtime Function: float __fractudqsf (unsigned long long fract A) + -- Runtime Function: double __fractudqdf (unsigned long long fract A) + -- Runtime Function: short fract __fractuhaqq (unsigned short accum A) + -- Runtime Function: fract __fractuhahq (unsigned short accum A) + -- Runtime Function: long fract __fractuhasq (unsigned short accum A) + -- Runtime Function: long long fract __fractuhadq (unsigned short accum + A) + -- Runtime Function: short accum __fractuhaha (unsigned short accum A) + -- Runtime Function: accum __fractuhasa (unsigned short accum A) + -- Runtime Function: long accum __fractuhada (unsigned short accum A) + -- Runtime Function: long long accum __fractuhata (unsigned short accum + A) + -- Runtime Function: unsigned short fract __fractuhauqq (unsigned short + accum A) + -- Runtime Function: unsigned fract __fractuhauhq (unsigned short accum + A) + -- Runtime Function: unsigned long fract __fractuhausq (unsigned short + accum A) + -- Runtime Function: unsigned long long fract __fractuhaudq (unsigned + short accum A) + -- Runtime Function: unsigned accum __fractuhausa2 (unsigned short + accum A) + -- Runtime Function: unsigned long accum __fractuhauda2 (unsigned short + accum A) + -- Runtime Function: unsigned long long accum __fractuhauta2 (unsigned + short accum A) + -- Runtime Function: signed char __fractuhaqi (unsigned short accum A) + -- Runtime Function: short __fractuhahi (unsigned short accum A) + -- Runtime Function: int __fractuhasi (unsigned short accum A) + -- Runtime Function: long __fractuhadi (unsigned short accum A) + -- Runtime Function: long long __fractuhati (unsigned short accum A) + -- Runtime Function: float __fractuhasf (unsigned short accum A) + -- Runtime Function: double __fractuhadf (unsigned short accum A) + -- Runtime Function: short fract __fractusaqq (unsigned accum A) + -- Runtime Function: fract __fractusahq (unsigned accum A) + -- Runtime Function: long fract __fractusasq (unsigned accum A) + -- Runtime Function: long long fract __fractusadq (unsigned accum A) + -- Runtime Function: short accum __fractusaha (unsigned accum A) + -- Runtime Function: accum __fractusasa (unsigned accum A) + -- Runtime Function: long accum __fractusada (unsigned accum A) + -- Runtime Function: long long accum __fractusata (unsigned accum A) + -- Runtime Function: unsigned short fract __fractusauqq (unsigned accum + A) + -- Runtime Function: unsigned fract __fractusauhq (unsigned accum A) + -- Runtime Function: unsigned long fract __fractusausq (unsigned accum + A) + -- Runtime Function: unsigned long long fract __fractusaudq (unsigned + accum A) + -- Runtime Function: unsigned short accum __fractusauha2 (unsigned + accum A) + -- Runtime Function: unsigned long accum __fractusauda2 (unsigned accum + A) + -- Runtime Function: unsigned long long accum __fractusauta2 (unsigned + accum A) + -- Runtime Function: signed char __fractusaqi (unsigned accum A) + -- Runtime Function: short __fractusahi (unsigned accum A) + -- Runtime Function: int __fractusasi (unsigned accum A) + -- Runtime Function: long __fractusadi (unsigned accum A) + -- Runtime Function: long long __fractusati (unsigned accum A) + -- Runtime Function: float __fractusasf (unsigned accum A) + -- Runtime Function: double __fractusadf (unsigned accum A) + -- Runtime Function: short fract __fractudaqq (unsigned long accum A) + -- Runtime Function: fract __fractudahq (unsigned long accum A) + -- Runtime Function: long fract __fractudasq (unsigned long accum A) + -- Runtime Function: long long fract __fractudadq (unsigned long accum + A) + -- Runtime Function: short accum __fractudaha (unsigned long accum A) + -- Runtime Function: accum __fractudasa (unsigned long accum A) + -- Runtime Function: long accum __fractudada (unsigned long accum A) + -- Runtime Function: long long accum __fractudata (unsigned long accum + A) + -- Runtime Function: unsigned short fract __fractudauqq (unsigned long + accum A) + -- Runtime Function: unsigned fract __fractudauhq (unsigned long accum + A) + -- Runtime Function: unsigned long fract __fractudausq (unsigned long + accum A) + -- Runtime Function: unsigned long long fract __fractudaudq (unsigned + long accum A) + -- Runtime Function: unsigned short accum __fractudauha2 (unsigned long + accum A) + -- Runtime Function: unsigned accum __fractudausa2 (unsigned long accum + A) + -- Runtime Function: unsigned long long accum __fractudauta2 (unsigned + long accum A) + -- Runtime Function: signed char __fractudaqi (unsigned long accum A) + -- Runtime Function: short __fractudahi (unsigned long accum A) + -- Runtime Function: int __fractudasi (unsigned long accum A) + -- Runtime Function: long __fractudadi (unsigned long accum A) + -- Runtime Function: long long __fractudati (unsigned long accum A) + -- Runtime Function: float __fractudasf (unsigned long accum A) + -- Runtime Function: double __fractudadf (unsigned long accum A) + -- Runtime Function: short fract __fractutaqq (unsigned long long accum + A) + -- Runtime Function: fract __fractutahq (unsigned long long accum A) + -- Runtime Function: long fract __fractutasq (unsigned long long accum + A) + -- Runtime Function: long long fract __fractutadq (unsigned long long + accum A) + -- Runtime Function: short accum __fractutaha (unsigned long long accum + A) + -- Runtime Function: accum __fractutasa (unsigned long long accum A) + -- Runtime Function: long accum __fractutada (unsigned long long accum + A) + -- Runtime Function: long long accum __fractutata (unsigned long long + accum A) + -- Runtime Function: unsigned short fract __fractutauqq (unsigned long + long accum A) + -- Runtime Function: unsigned fract __fractutauhq (unsigned long long + accum A) + -- Runtime Function: unsigned long fract __fractutausq (unsigned long + long accum A) + -- Runtime Function: unsigned long long fract __fractutaudq (unsigned + long long accum A) + -- Runtime Function: unsigned short accum __fractutauha2 (unsigned long + long accum A) + -- Runtime Function: unsigned accum __fractutausa2 (unsigned long long + accum A) + -- Runtime Function: unsigned long accum __fractutauda2 (unsigned long + long accum A) + -- Runtime Function: signed char __fractutaqi (unsigned long long accum + A) + -- Runtime Function: short __fractutahi (unsigned long long accum A) + -- Runtime Function: int __fractutasi (unsigned long long accum A) + -- Runtime Function: long __fractutadi (unsigned long long accum A) + -- Runtime Function: long long __fractutati (unsigned long long accum + A) + -- Runtime Function: float __fractutasf (unsigned long long accum A) + -- Runtime Function: double __fractutadf (unsigned long long accum A) + -- Runtime Function: short fract __fractqiqq (signed char A) + -- Runtime Function: fract __fractqihq (signed char A) + -- Runtime Function: long fract __fractqisq (signed char A) + -- Runtime Function: long long fract __fractqidq (signed char A) + -- Runtime Function: short accum __fractqiha (signed char A) + -- Runtime Function: accum __fractqisa (signed char A) + -- Runtime Function: long accum __fractqida (signed char A) + -- Runtime Function: long long accum __fractqita (signed char A) + -- Runtime Function: unsigned short fract __fractqiuqq (signed char A) + -- Runtime Function: unsigned fract __fractqiuhq (signed char A) + -- Runtime Function: unsigned long fract __fractqiusq (signed char A) + -- Runtime Function: unsigned long long fract __fractqiudq (signed char + A) + -- Runtime Function: unsigned short accum __fractqiuha (signed char A) + -- Runtime Function: unsigned accum __fractqiusa (signed char A) + -- Runtime Function: unsigned long accum __fractqiuda (signed char A) + -- Runtime Function: unsigned long long accum __fractqiuta (signed char + A) + -- Runtime Function: short fract __fracthiqq (short A) + -- Runtime Function: fract __fracthihq (short A) + -- Runtime Function: long fract __fracthisq (short A) + -- Runtime Function: long long fract __fracthidq (short A) + -- Runtime Function: short accum __fracthiha (short A) + -- Runtime Function: accum __fracthisa (short A) + -- Runtime Function: long accum __fracthida (short A) + -- Runtime Function: long long accum __fracthita (short A) + -- Runtime Function: unsigned short fract __fracthiuqq (short A) + -- Runtime Function: unsigned fract __fracthiuhq (short A) + -- Runtime Function: unsigned long fract __fracthiusq (short A) + -- Runtime Function: unsigned long long fract __fracthiudq (short A) + -- Runtime Function: unsigned short accum __fracthiuha (short A) + -- Runtime Function: unsigned accum __fracthiusa (short A) + -- Runtime Function: unsigned long accum __fracthiuda (short A) + -- Runtime Function: unsigned long long accum __fracthiuta (short A) + -- Runtime Function: short fract __fractsiqq (int A) + -- Runtime Function: fract __fractsihq (int A) + -- Runtime Function: long fract __fractsisq (int A) + -- Runtime Function: long long fract __fractsidq (int A) + -- Runtime Function: short accum __fractsiha (int A) + -- Runtime Function: accum __fractsisa (int A) + -- Runtime Function: long accum __fractsida (int A) + -- Runtime Function: long long accum __fractsita (int A) + -- Runtime Function: unsigned short fract __fractsiuqq (int A) + -- Runtime Function: unsigned fract __fractsiuhq (int A) + -- Runtime Function: unsigned long fract __fractsiusq (int A) + -- Runtime Function: unsigned long long fract __fractsiudq (int A) + -- Runtime Function: unsigned short accum __fractsiuha (int A) + -- Runtime Function: unsigned accum __fractsiusa (int A) + -- Runtime Function: unsigned long accum __fractsiuda (int A) + -- Runtime Function: unsigned long long accum __fractsiuta (int A) + -- Runtime Function: short fract __fractdiqq (long A) + -- Runtime Function: fract __fractdihq (long A) + -- Runtime Function: long fract __fractdisq (long A) + -- Runtime Function: long long fract __fractdidq (long A) + -- Runtime Function: short accum __fractdiha (long A) + -- Runtime Function: accum __fractdisa (long A) + -- Runtime Function: long accum __fractdida (long A) + -- Runtime Function: long long accum __fractdita (long A) + -- Runtime Function: unsigned short fract __fractdiuqq (long A) + -- Runtime Function: unsigned fract __fractdiuhq (long A) + -- Runtime Function: unsigned long fract __fractdiusq (long A) + -- Runtime Function: unsigned long long fract __fractdiudq (long A) + -- Runtime Function: unsigned short accum __fractdiuha (long A) + -- Runtime Function: unsigned accum __fractdiusa (long A) + -- Runtime Function: unsigned long accum __fractdiuda (long A) + -- Runtime Function: unsigned long long accum __fractdiuta (long A) + -- Runtime Function: short fract __fracttiqq (long long A) + -- Runtime Function: fract __fracttihq (long long A) + -- Runtime Function: long fract __fracttisq (long long A) + -- Runtime Function: long long fract __fracttidq (long long A) + -- Runtime Function: short accum __fracttiha (long long A) + -- Runtime Function: accum __fracttisa (long long A) + -- Runtime Function: long accum __fracttida (long long A) + -- Runtime Function: long long accum __fracttita (long long A) + -- Runtime Function: unsigned short fract __fracttiuqq (long long A) + -- Runtime Function: unsigned fract __fracttiuhq (long long A) + -- Runtime Function: unsigned long fract __fracttiusq (long long A) + -- Runtime Function: unsigned long long fract __fracttiudq (long long + A) + -- Runtime Function: unsigned short accum __fracttiuha (long long A) + -- Runtime Function: unsigned accum __fracttiusa (long long A) + -- Runtime Function: unsigned long accum __fracttiuda (long long A) + -- Runtime Function: unsigned long long accum __fracttiuta (long long + A) + -- Runtime Function: short fract __fractsfqq (float A) + -- Runtime Function: fract __fractsfhq (float A) + -- Runtime Function: long fract __fractsfsq (float A) + -- Runtime Function: long long fract __fractsfdq (float A) + -- Runtime Function: short accum __fractsfha (float A) + -- Runtime Function: accum __fractsfsa (float A) + -- Runtime Function: long accum __fractsfda (float A) + -- Runtime Function: long long accum __fractsfta (float A) + -- Runtime Function: unsigned short fract __fractsfuqq (float A) + -- Runtime Function: unsigned fract __fractsfuhq (float A) + -- Runtime Function: unsigned long fract __fractsfusq (float A) + -- Runtime Function: unsigned long long fract __fractsfudq (float A) + -- Runtime Function: unsigned short accum __fractsfuha (float A) + -- Runtime Function: unsigned accum __fractsfusa (float A) + -- Runtime Function: unsigned long accum __fractsfuda (float A) + -- Runtime Function: unsigned long long accum __fractsfuta (float A) + -- Runtime Function: short fract __fractdfqq (double A) + -- Runtime Function: fract __fractdfhq (double A) + -- Runtime Function: long fract __fractdfsq (double A) + -- Runtime Function: long long fract __fractdfdq (double A) + -- Runtime Function: short accum __fractdfha (double A) + -- Runtime Function: accum __fractdfsa (double A) + -- Runtime Function: long accum __fractdfda (double A) + -- Runtime Function: long long accum __fractdfta (double A) + -- Runtime Function: unsigned short fract __fractdfuqq (double A) + -- Runtime Function: unsigned fract __fractdfuhq (double A) + -- Runtime Function: unsigned long fract __fractdfusq (double A) + -- Runtime Function: unsigned long long fract __fractdfudq (double A) + -- Runtime Function: unsigned short accum __fractdfuha (double A) + -- Runtime Function: unsigned accum __fractdfusa (double A) + -- Runtime Function: unsigned long accum __fractdfuda (double A) + -- Runtime Function: unsigned long long accum __fractdfuta (double A) + These functions convert from fractional and signed non-fractionals + to fractionals and signed non-fractionals, without saturation. + + -- Runtime Function: fract __satfractqqhq2 (short fract A) + -- Runtime Function: long fract __satfractqqsq2 (short fract A) + -- Runtime Function: long long fract __satfractqqdq2 (short fract A) + -- Runtime Function: short accum __satfractqqha (short fract A) + -- Runtime Function: accum __satfractqqsa (short fract A) + -- Runtime Function: long accum __satfractqqda (short fract A) + -- Runtime Function: long long accum __satfractqqta (short fract A) + -- Runtime Function: unsigned short fract __satfractqquqq (short fract + A) + -- Runtime Function: unsigned fract __satfractqquhq (short fract A) + -- Runtime Function: unsigned long fract __satfractqqusq (short fract + A) + -- Runtime Function: unsigned long long fract __satfractqqudq (short + fract A) + -- Runtime Function: unsigned short accum __satfractqquha (short fract + A) + -- Runtime Function: unsigned accum __satfractqqusa (short fract A) + -- Runtime Function: unsigned long accum __satfractqquda (short fract + A) + -- Runtime Function: unsigned long long accum __satfractqquta (short + fract A) + -- Runtime Function: short fract __satfracthqqq2 (fract A) + -- Runtime Function: long fract __satfracthqsq2 (fract A) + -- Runtime Function: long long fract __satfracthqdq2 (fract A) + -- Runtime Function: short accum __satfracthqha (fract A) + -- Runtime Function: accum __satfracthqsa (fract A) + -- Runtime Function: long accum __satfracthqda (fract A) + -- Runtime Function: long long accum __satfracthqta (fract A) + -- Runtime Function: unsigned short fract __satfracthquqq (fract A) + -- Runtime Function: unsigned fract __satfracthquhq (fract A) + -- Runtime Function: unsigned long fract __satfracthqusq (fract A) + -- Runtime Function: unsigned long long fract __satfracthqudq (fract A) + -- Runtime Function: unsigned short accum __satfracthquha (fract A) + -- Runtime Function: unsigned accum __satfracthqusa (fract A) + -- Runtime Function: unsigned long accum __satfracthquda (fract A) + -- Runtime Function: unsigned long long accum __satfracthquta (fract A) + -- Runtime Function: short fract __satfractsqqq2 (long fract A) + -- Runtime Function: fract __satfractsqhq2 (long fract A) + -- Runtime Function: long long fract __satfractsqdq2 (long fract A) + -- Runtime Function: short accum __satfractsqha (long fract A) + -- Runtime Function: accum __satfractsqsa (long fract A) + -- Runtime Function: long accum __satfractsqda (long fract A) + -- Runtime Function: long long accum __satfractsqta (long fract A) + -- Runtime Function: unsigned short fract __satfractsquqq (long fract + A) + -- Runtime Function: unsigned fract __satfractsquhq (long fract A) + -- Runtime Function: unsigned long fract __satfractsqusq (long fract A) + -- Runtime Function: unsigned long long fract __satfractsqudq (long + fract A) + -- Runtime Function: unsigned short accum __satfractsquha (long fract + A) + -- Runtime Function: unsigned accum __satfractsqusa (long fract A) + -- Runtime Function: unsigned long accum __satfractsquda (long fract A) + -- Runtime Function: unsigned long long accum __satfractsquta (long + fract A) + -- Runtime Function: short fract __satfractdqqq2 (long long fract A) + -- Runtime Function: fract __satfractdqhq2 (long long fract A) + -- Runtime Function: long fract __satfractdqsq2 (long long fract A) + -- Runtime Function: short accum __satfractdqha (long long fract A) + -- Runtime Function: accum __satfractdqsa (long long fract A) + -- Runtime Function: long accum __satfractdqda (long long fract A) + -- Runtime Function: long long accum __satfractdqta (long long fract A) + -- Runtime Function: unsigned short fract __satfractdquqq (long long + fract A) + -- Runtime Function: unsigned fract __satfractdquhq (long long fract A) + -- Runtime Function: unsigned long fract __satfractdqusq (long long + fract A) + -- Runtime Function: unsigned long long fract __satfractdqudq (long + long fract A) + -- Runtime Function: unsigned short accum __satfractdquha (long long + fract A) + -- Runtime Function: unsigned accum __satfractdqusa (long long fract A) + -- Runtime Function: unsigned long accum __satfractdquda (long long + fract A) + -- Runtime Function: unsigned long long accum __satfractdquta (long + long fract A) + -- Runtime Function: short fract __satfracthaqq (short accum A) + -- Runtime Function: fract __satfracthahq (short accum A) + -- Runtime Function: long fract __satfracthasq (short accum A) + -- Runtime Function: long long fract __satfracthadq (short accum A) + -- Runtime Function: accum __satfracthasa2 (short accum A) + -- Runtime Function: long accum __satfracthada2 (short accum A) + -- Runtime Function: long long accum __satfracthata2 (short accum A) + -- Runtime Function: unsigned short fract __satfracthauqq (short accum + A) + -- Runtime Function: unsigned fract __satfracthauhq (short accum A) + -- Runtime Function: unsigned long fract __satfracthausq (short accum + A) + -- Runtime Function: unsigned long long fract __satfracthaudq (short + accum A) + -- Runtime Function: unsigned short accum __satfracthauha (short accum + A) + -- Runtime Function: unsigned accum __satfracthausa (short accum A) + -- Runtime Function: unsigned long accum __satfracthauda (short accum + A) + -- Runtime Function: unsigned long long accum __satfracthauta (short + accum A) + -- Runtime Function: short fract __satfractsaqq (accum A) + -- Runtime Function: fract __satfractsahq (accum A) + -- Runtime Function: long fract __satfractsasq (accum A) + -- Runtime Function: long long fract __satfractsadq (accum A) + -- Runtime Function: short accum __satfractsaha2 (accum A) + -- Runtime Function: long accum __satfractsada2 (accum A) + -- Runtime Function: long long accum __satfractsata2 (accum A) + -- Runtime Function: unsigned short fract __satfractsauqq (accum A) + -- Runtime Function: unsigned fract __satfractsauhq (accum A) + -- Runtime Function: unsigned long fract __satfractsausq (accum A) + -- Runtime Function: unsigned long long fract __satfractsaudq (accum A) + -- Runtime Function: unsigned short accum __satfractsauha (accum A) + -- Runtime Function: unsigned accum __satfractsausa (accum A) + -- Runtime Function: unsigned long accum __satfractsauda (accum A) + -- Runtime Function: unsigned long long accum __satfractsauta (accum A) + -- Runtime Function: short fract __satfractdaqq (long accum A) + -- Runtime Function: fract __satfractdahq (long accum A) + -- Runtime Function: long fract __satfractdasq (long accum A) + -- Runtime Function: long long fract __satfractdadq (long accum A) + -- Runtime Function: short accum __satfractdaha2 (long accum A) + -- Runtime Function: accum __satfractdasa2 (long accum A) + -- Runtime Function: long long accum __satfractdata2 (long accum A) + -- Runtime Function: unsigned short fract __satfractdauqq (long accum + A) + -- Runtime Function: unsigned fract __satfractdauhq (long accum A) + -- Runtime Function: unsigned long fract __satfractdausq (long accum A) + -- Runtime Function: unsigned long long fract __satfractdaudq (long + accum A) + -- Runtime Function: unsigned short accum __satfractdauha (long accum + A) + -- Runtime Function: unsigned accum __satfractdausa (long accum A) + -- Runtime Function: unsigned long accum __satfractdauda (long accum A) + -- Runtime Function: unsigned long long accum __satfractdauta (long + accum A) + -- Runtime Function: short fract __satfracttaqq (long long accum A) + -- Runtime Function: fract __satfracttahq (long long accum A) + -- Runtime Function: long fract __satfracttasq (long long accum A) + -- Runtime Function: long long fract __satfracttadq (long long accum A) + -- Runtime Function: short accum __satfracttaha2 (long long accum A) + -- Runtime Function: accum __satfracttasa2 (long long accum A) + -- Runtime Function: long accum __satfracttada2 (long long accum A) + -- Runtime Function: unsigned short fract __satfracttauqq (long long + accum A) + -- Runtime Function: unsigned fract __satfracttauhq (long long accum A) + -- Runtime Function: unsigned long fract __satfracttausq (long long + accum A) + -- Runtime Function: unsigned long long fract __satfracttaudq (long + long accum A) + -- Runtime Function: unsigned short accum __satfracttauha (long long + accum A) + -- Runtime Function: unsigned accum __satfracttausa (long long accum A) + -- Runtime Function: unsigned long accum __satfracttauda (long long + accum A) + -- Runtime Function: unsigned long long accum __satfracttauta (long + long accum A) + -- Runtime Function: short fract __satfractuqqqq (unsigned short fract + A) + -- Runtime Function: fract __satfractuqqhq (unsigned short fract A) + -- Runtime Function: long fract __satfractuqqsq (unsigned short fract + A) + -- Runtime Function: long long fract __satfractuqqdq (unsigned short + fract A) + -- Runtime Function: short accum __satfractuqqha (unsigned short fract + A) + -- Runtime Function: accum __satfractuqqsa (unsigned short fract A) + -- Runtime Function: long accum __satfractuqqda (unsigned short fract + A) + -- Runtime Function: long long accum __satfractuqqta (unsigned short + fract A) + -- Runtime Function: unsigned fract __satfractuqquhq2 (unsigned short + fract A) + -- Runtime Function: unsigned long fract __satfractuqqusq2 (unsigned + short fract A) + -- Runtime Function: unsigned long long fract __satfractuqqudq2 + (unsigned short fract A) + -- Runtime Function: unsigned short accum __satfractuqquha (unsigned + short fract A) + -- Runtime Function: unsigned accum __satfractuqqusa (unsigned short + fract A) + -- Runtime Function: unsigned long accum __satfractuqquda (unsigned + short fract A) + -- Runtime Function: unsigned long long accum __satfractuqquta + (unsigned short fract A) + -- Runtime Function: short fract __satfractuhqqq (unsigned fract A) + -- Runtime Function: fract __satfractuhqhq (unsigned fract A) + -- Runtime Function: long fract __satfractuhqsq (unsigned fract A) + -- Runtime Function: long long fract __satfractuhqdq (unsigned fract A) + -- Runtime Function: short accum __satfractuhqha (unsigned fract A) + -- Runtime Function: accum __satfractuhqsa (unsigned fract A) + -- Runtime Function: long accum __satfractuhqda (unsigned fract A) + -- Runtime Function: long long accum __satfractuhqta (unsigned fract A) + -- Runtime Function: unsigned short fract __satfractuhquqq2 (unsigned + fract A) + -- Runtime Function: unsigned long fract __satfractuhqusq2 (unsigned + fract A) + -- Runtime Function: unsigned long long fract __satfractuhqudq2 + (unsigned fract A) + -- Runtime Function: unsigned short accum __satfractuhquha (unsigned + fract A) + -- Runtime Function: unsigned accum __satfractuhqusa (unsigned fract A) + -- Runtime Function: unsigned long accum __satfractuhquda (unsigned + fract A) + -- Runtime Function: unsigned long long accum __satfractuhquta + (unsigned fract A) + -- Runtime Function: short fract __satfractusqqq (unsigned long fract + A) + -- Runtime Function: fract __satfractusqhq (unsigned long fract A) + -- Runtime Function: long fract __satfractusqsq (unsigned long fract A) + -- Runtime Function: long long fract __satfractusqdq (unsigned long + fract A) + -- Runtime Function: short accum __satfractusqha (unsigned long fract + A) + -- Runtime Function: accum __satfractusqsa (unsigned long fract A) + -- Runtime Function: long accum __satfractusqda (unsigned long fract A) + -- Runtime Function: long long accum __satfractusqta (unsigned long + fract A) + -- Runtime Function: unsigned short fract __satfractusquqq2 (unsigned + long fract A) + -- Runtime Function: unsigned fract __satfractusquhq2 (unsigned long + fract A) + -- Runtime Function: unsigned long long fract __satfractusqudq2 + (unsigned long fract A) + -- Runtime Function: unsigned short accum __satfractusquha (unsigned + long fract A) + -- Runtime Function: unsigned accum __satfractusqusa (unsigned long + fract A) + -- Runtime Function: unsigned long accum __satfractusquda (unsigned + long fract A) + -- Runtime Function: unsigned long long accum __satfractusquta + (unsigned long fract A) + -- Runtime Function: short fract __satfractudqqq (unsigned long long + fract A) + -- Runtime Function: fract __satfractudqhq (unsigned long long fract A) + -- Runtime Function: long fract __satfractudqsq (unsigned long long + fract A) + -- Runtime Function: long long fract __satfractudqdq (unsigned long + long fract A) + -- Runtime Function: short accum __satfractudqha (unsigned long long + fract A) + -- Runtime Function: accum __satfractudqsa (unsigned long long fract A) + -- Runtime Function: long accum __satfractudqda (unsigned long long + fract A) + -- Runtime Function: long long accum __satfractudqta (unsigned long + long fract A) + -- Runtime Function: unsigned short fract __satfractudquqq2 (unsigned + long long fract A) + -- Runtime Function: unsigned fract __satfractudquhq2 (unsigned long + long fract A) + -- Runtime Function: unsigned long fract __satfractudqusq2 (unsigned + long long fract A) + -- Runtime Function: unsigned short accum __satfractudquha (unsigned + long long fract A) + -- Runtime Function: unsigned accum __satfractudqusa (unsigned long + long fract A) + -- Runtime Function: unsigned long accum __satfractudquda (unsigned + long long fract A) + -- Runtime Function: unsigned long long accum __satfractudquta + (unsigned long long fract A) + -- Runtime Function: short fract __satfractuhaqq (unsigned short accum + A) + -- Runtime Function: fract __satfractuhahq (unsigned short accum A) + -- Runtime Function: long fract __satfractuhasq (unsigned short accum + A) + -- Runtime Function: long long fract __satfractuhadq (unsigned short + accum A) + -- Runtime Function: short accum __satfractuhaha (unsigned short accum + A) + -- Runtime Function: accum __satfractuhasa (unsigned short accum A) + -- Runtime Function: long accum __satfractuhada (unsigned short accum + A) + -- Runtime Function: long long accum __satfractuhata (unsigned short + accum A) + -- Runtime Function: unsigned short fract __satfractuhauqq (unsigned + short accum A) + -- Runtime Function: unsigned fract __satfractuhauhq (unsigned short + accum A) + -- Runtime Function: unsigned long fract __satfractuhausq (unsigned + short accum A) + -- Runtime Function: unsigned long long fract __satfractuhaudq + (unsigned short accum A) + -- Runtime Function: unsigned accum __satfractuhausa2 (unsigned short + accum A) + -- Runtime Function: unsigned long accum __satfractuhauda2 (unsigned + short accum A) + -- Runtime Function: unsigned long long accum __satfractuhauta2 + (unsigned short accum A) + -- Runtime Function: short fract __satfractusaqq (unsigned accum A) + -- Runtime Function: fract __satfractusahq (unsigned accum A) + -- Runtime Function: long fract __satfractusasq (unsigned accum A) + -- Runtime Function: long long fract __satfractusadq (unsigned accum A) + -- Runtime Function: short accum __satfractusaha (unsigned accum A) + -- Runtime Function: accum __satfractusasa (unsigned accum A) + -- Runtime Function: long accum __satfractusada (unsigned accum A) + -- Runtime Function: long long accum __satfractusata (unsigned accum A) + -- Runtime Function: unsigned short fract __satfractusauqq (unsigned + accum A) + -- Runtime Function: unsigned fract __satfractusauhq (unsigned accum A) + -- Runtime Function: unsigned long fract __satfractusausq (unsigned + accum A) + -- Runtime Function: unsigned long long fract __satfractusaudq + (unsigned accum A) + -- Runtime Function: unsigned short accum __satfractusauha2 (unsigned + accum A) + -- Runtime Function: unsigned long accum __satfractusauda2 (unsigned + accum A) + -- Runtime Function: unsigned long long accum __satfractusauta2 + (unsigned accum A) + -- Runtime Function: short fract __satfractudaqq (unsigned long accum + A) + -- Runtime Function: fract __satfractudahq (unsigned long accum A) + -- Runtime Function: long fract __satfractudasq (unsigned long accum A) + -- Runtime Function: long long fract __satfractudadq (unsigned long + accum A) + -- Runtime Function: short accum __satfractudaha (unsigned long accum + A) + -- Runtime Function: accum __satfractudasa (unsigned long accum A) + -- Runtime Function: long accum __satfractudada (unsigned long accum A) + -- Runtime Function: long long accum __satfractudata (unsigned long + accum A) + -- Runtime Function: unsigned short fract __satfractudauqq (unsigned + long accum A) + -- Runtime Function: unsigned fract __satfractudauhq (unsigned long + accum A) + -- Runtime Function: unsigned long fract __satfractudausq (unsigned + long accum A) + -- Runtime Function: unsigned long long fract __satfractudaudq + (unsigned long accum A) + -- Runtime Function: unsigned short accum __satfractudauha2 (unsigned + long accum A) + -- Runtime Function: unsigned accum __satfractudausa2 (unsigned long + accum A) + -- Runtime Function: unsigned long long accum __satfractudauta2 + (unsigned long accum A) + -- Runtime Function: short fract __satfractutaqq (unsigned long long + accum A) + -- Runtime Function: fract __satfractutahq (unsigned long long accum A) + -- Runtime Function: long fract __satfractutasq (unsigned long long + accum A) + -- Runtime Function: long long fract __satfractutadq (unsigned long + long accum A) + -- Runtime Function: short accum __satfractutaha (unsigned long long + accum A) + -- Runtime Function: accum __satfractutasa (unsigned long long accum A) + -- Runtime Function: long accum __satfractutada (unsigned long long + accum A) + -- Runtime Function: long long accum __satfractutata (unsigned long + long accum A) + -- Runtime Function: unsigned short fract __satfractutauqq (unsigned + long long accum A) + -- Runtime Function: unsigned fract __satfractutauhq (unsigned long + long accum A) + -- Runtime Function: unsigned long fract __satfractutausq (unsigned + long long accum A) + -- Runtime Function: unsigned long long fract __satfractutaudq + (unsigned long long accum A) + -- Runtime Function: unsigned short accum __satfractutauha2 (unsigned + long long accum A) + -- Runtime Function: unsigned accum __satfractutausa2 (unsigned long + long accum A) + -- Runtime Function: unsigned long accum __satfractutauda2 (unsigned + long long accum A) + -- Runtime Function: short fract __satfractqiqq (signed char A) + -- Runtime Function: fract __satfractqihq (signed char A) + -- Runtime Function: long fract __satfractqisq (signed char A) + -- Runtime Function: long long fract __satfractqidq (signed char A) + -- Runtime Function: short accum __satfractqiha (signed char A) + -- Runtime Function: accum __satfractqisa (signed char A) + -- Runtime Function: long accum __satfractqida (signed char A) + -- Runtime Function: long long accum __satfractqita (signed char A) + -- Runtime Function: unsigned short fract __satfractqiuqq (signed char + A) + -- Runtime Function: unsigned fract __satfractqiuhq (signed char A) + -- Runtime Function: unsigned long fract __satfractqiusq (signed char + A) + -- Runtime Function: unsigned long long fract __satfractqiudq (signed + char A) + -- Runtime Function: unsigned short accum __satfractqiuha (signed char + A) + -- Runtime Function: unsigned accum __satfractqiusa (signed char A) + -- Runtime Function: unsigned long accum __satfractqiuda (signed char + A) + -- Runtime Function: unsigned long long accum __satfractqiuta (signed + char A) + -- Runtime Function: short fract __satfracthiqq (short A) + -- Runtime Function: fract __satfracthihq (short A) + -- Runtime Function: long fract __satfracthisq (short A) + -- Runtime Function: long long fract __satfracthidq (short A) + -- Runtime Function: short accum __satfracthiha (short A) + -- Runtime Function: accum __satfracthisa (short A) + -- Runtime Function: long accum __satfracthida (short A) + -- Runtime Function: long long accum __satfracthita (short A) + -- Runtime Function: unsigned short fract __satfracthiuqq (short A) + -- Runtime Function: unsigned fract __satfracthiuhq (short A) + -- Runtime Function: unsigned long fract __satfracthiusq (short A) + -- Runtime Function: unsigned long long fract __satfracthiudq (short A) + -- Runtime Function: unsigned short accum __satfracthiuha (short A) + -- Runtime Function: unsigned accum __satfracthiusa (short A) + -- Runtime Function: unsigned long accum __satfracthiuda (short A) + -- Runtime Function: unsigned long long accum __satfracthiuta (short A) + -- Runtime Function: short fract __satfractsiqq (int A) + -- Runtime Function: fract __satfractsihq (int A) + -- Runtime Function: long fract __satfractsisq (int A) + -- Runtime Function: long long fract __satfractsidq (int A) + -- Runtime Function: short accum __satfractsiha (int A) + -- Runtime Function: accum __satfractsisa (int A) + -- Runtime Function: long accum __satfractsida (int A) + -- Runtime Function: long long accum __satfractsita (int A) + -- Runtime Function: unsigned short fract __satfractsiuqq (int A) + -- Runtime Function: unsigned fract __satfractsiuhq (int A) + -- Runtime Function: unsigned long fract __satfractsiusq (int A) + -- Runtime Function: unsigned long long fract __satfractsiudq (int A) + -- Runtime Function: unsigned short accum __satfractsiuha (int A) + -- Runtime Function: unsigned accum __satfractsiusa (int A) + -- Runtime Function: unsigned long accum __satfractsiuda (int A) + -- Runtime Function: unsigned long long accum __satfractsiuta (int A) + -- Runtime Function: short fract __satfractdiqq (long A) + -- Runtime Function: fract __satfractdihq (long A) + -- Runtime Function: long fract __satfractdisq (long A) + -- Runtime Function: long long fract __satfractdidq (long A) + -- Runtime Function: short accum __satfractdiha (long A) + -- Runtime Function: accum __satfractdisa (long A) + -- Runtime Function: long accum __satfractdida (long A) + -- Runtime Function: long long accum __satfractdita (long A) + -- Runtime Function: unsigned short fract __satfractdiuqq (long A) + -- Runtime Function: unsigned fract __satfractdiuhq (long A) + -- Runtime Function: unsigned long fract __satfractdiusq (long A) + -- Runtime Function: unsigned long long fract __satfractdiudq (long A) + -- Runtime Function: unsigned short accum __satfractdiuha (long A) + -- Runtime Function: unsigned accum __satfractdiusa (long A) + -- Runtime Function: unsigned long accum __satfractdiuda (long A) + -- Runtime Function: unsigned long long accum __satfractdiuta (long A) + -- Runtime Function: short fract __satfracttiqq (long long A) + -- Runtime Function: fract __satfracttihq (long long A) + -- Runtime Function: long fract __satfracttisq (long long A) + -- Runtime Function: long long fract __satfracttidq (long long A) + -- Runtime Function: short accum __satfracttiha (long long A) + -- Runtime Function: accum __satfracttisa (long long A) + -- Runtime Function: long accum __satfracttida (long long A) + -- Runtime Function: long long accum __satfracttita (long long A) + -- Runtime Function: unsigned short fract __satfracttiuqq (long long A) + -- Runtime Function: unsigned fract __satfracttiuhq (long long A) + -- Runtime Function: unsigned long fract __satfracttiusq (long long A) + -- Runtime Function: unsigned long long fract __satfracttiudq (long + long A) + -- Runtime Function: unsigned short accum __satfracttiuha (long long A) + -- Runtime Function: unsigned accum __satfracttiusa (long long A) + -- Runtime Function: unsigned long accum __satfracttiuda (long long A) + -- Runtime Function: unsigned long long accum __satfracttiuta (long + long A) + -- Runtime Function: short fract __satfractsfqq (float A) + -- Runtime Function: fract __satfractsfhq (float A) + -- Runtime Function: long fract __satfractsfsq (float A) + -- Runtime Function: long long fract __satfractsfdq (float A) + -- Runtime Function: short accum __satfractsfha (float A) + -- Runtime Function: accum __satfractsfsa (float A) + -- Runtime Function: long accum __satfractsfda (float A) + -- Runtime Function: long long accum __satfractsfta (float A) + -- Runtime Function: unsigned short fract __satfractsfuqq (float A) + -- Runtime Function: unsigned fract __satfractsfuhq (float A) + -- Runtime Function: unsigned long fract __satfractsfusq (float A) + -- Runtime Function: unsigned long long fract __satfractsfudq (float A) + -- Runtime Function: unsigned short accum __satfractsfuha (float A) + -- Runtime Function: unsigned accum __satfractsfusa (float A) + -- Runtime Function: unsigned long accum __satfractsfuda (float A) + -- Runtime Function: unsigned long long accum __satfractsfuta (float A) + -- Runtime Function: short fract __satfractdfqq (double A) + -- Runtime Function: fract __satfractdfhq (double A) + -- Runtime Function: long fract __satfractdfsq (double A) + -- Runtime Function: long long fract __satfractdfdq (double A) + -- Runtime Function: short accum __satfractdfha (double A) + -- Runtime Function: accum __satfractdfsa (double A) + -- Runtime Function: long accum __satfractdfda (double A) + -- Runtime Function: long long accum __satfractdfta (double A) + -- Runtime Function: unsigned short fract __satfractdfuqq (double A) + -- Runtime Function: unsigned fract __satfractdfuhq (double A) + -- Runtime Function: unsigned long fract __satfractdfusq (double A) + -- Runtime Function: unsigned long long fract __satfractdfudq (double + A) + -- Runtime Function: unsigned short accum __satfractdfuha (double A) + -- Runtime Function: unsigned accum __satfractdfusa (double A) + -- Runtime Function: unsigned long accum __satfractdfuda (double A) + -- Runtime Function: unsigned long long accum __satfractdfuta (double + A) + The functions convert from fractional and signed non-fractionals to + fractionals, with saturation. + + -- Runtime Function: unsigned char __fractunsqqqi (short fract A) + -- Runtime Function: unsigned short __fractunsqqhi (short fract A) + -- Runtime Function: unsigned int __fractunsqqsi (short fract A) + -- Runtime Function: unsigned long __fractunsqqdi (short fract A) + -- Runtime Function: unsigned long long __fractunsqqti (short fract A) + -- Runtime Function: unsigned char __fractunshqqi (fract A) + -- Runtime Function: unsigned short __fractunshqhi (fract A) + -- Runtime Function: unsigned int __fractunshqsi (fract A) + -- Runtime Function: unsigned long __fractunshqdi (fract A) + -- Runtime Function: unsigned long long __fractunshqti (fract A) + -- Runtime Function: unsigned char __fractunssqqi (long fract A) + -- Runtime Function: unsigned short __fractunssqhi (long fract A) + -- Runtime Function: unsigned int __fractunssqsi (long fract A) + -- Runtime Function: unsigned long __fractunssqdi (long fract A) + -- Runtime Function: unsigned long long __fractunssqti (long fract A) + -- Runtime Function: unsigned char __fractunsdqqi (long long fract A) + -- Runtime Function: unsigned short __fractunsdqhi (long long fract A) + -- Runtime Function: unsigned int __fractunsdqsi (long long fract A) + -- Runtime Function: unsigned long __fractunsdqdi (long long fract A) + -- Runtime Function: unsigned long long __fractunsdqti (long long fract + A) + -- Runtime Function: unsigned char __fractunshaqi (short accum A) + -- Runtime Function: unsigned short __fractunshahi (short accum A) + -- Runtime Function: unsigned int __fractunshasi (short accum A) + -- Runtime Function: unsigned long __fractunshadi (short accum A) + -- Runtime Function: unsigned long long __fractunshati (short accum A) + -- Runtime Function: unsigned char __fractunssaqi (accum A) + -- Runtime Function: unsigned short __fractunssahi (accum A) + -- Runtime Function: unsigned int __fractunssasi (accum A) + -- Runtime Function: unsigned long __fractunssadi (accum A) + -- Runtime Function: unsigned long long __fractunssati (accum A) + -- Runtime Function: unsigned char __fractunsdaqi (long accum A) + -- Runtime Function: unsigned short __fractunsdahi (long accum A) + -- Runtime Function: unsigned int __fractunsdasi (long accum A) + -- Runtime Function: unsigned long __fractunsdadi (long accum A) + -- Runtime Function: unsigned long long __fractunsdati (long accum A) + -- Runtime Function: unsigned char __fractunstaqi (long long accum A) + -- Runtime Function: unsigned short __fractunstahi (long long accum A) + -- Runtime Function: unsigned int __fractunstasi (long long accum A) + -- Runtime Function: unsigned long __fractunstadi (long long accum A) + -- Runtime Function: unsigned long long __fractunstati (long long accum + A) + -- Runtime Function: unsigned char __fractunsuqqqi (unsigned short + fract A) + -- Runtime Function: unsigned short __fractunsuqqhi (unsigned short + fract A) + -- Runtime Function: unsigned int __fractunsuqqsi (unsigned short fract + A) + -- Runtime Function: unsigned long __fractunsuqqdi (unsigned short + fract A) + -- Runtime Function: unsigned long long __fractunsuqqti (unsigned short + fract A) + -- Runtime Function: unsigned char __fractunsuhqqi (unsigned fract A) + -- Runtime Function: unsigned short __fractunsuhqhi (unsigned fract A) + -- Runtime Function: unsigned int __fractunsuhqsi (unsigned fract A) + -- Runtime Function: unsigned long __fractunsuhqdi (unsigned fract A) + -- Runtime Function: unsigned long long __fractunsuhqti (unsigned fract + A) + -- Runtime Function: unsigned char __fractunsusqqi (unsigned long fract + A) + -- Runtime Function: unsigned short __fractunsusqhi (unsigned long + fract A) + -- Runtime Function: unsigned int __fractunsusqsi (unsigned long fract + A) + -- Runtime Function: unsigned long __fractunsusqdi (unsigned long fract + A) + -- Runtime Function: unsigned long long __fractunsusqti (unsigned long + fract A) + -- Runtime Function: unsigned char __fractunsudqqi (unsigned long long + fract A) + -- Runtime Function: unsigned short __fractunsudqhi (unsigned long long + fract A) + -- Runtime Function: unsigned int __fractunsudqsi (unsigned long long + fract A) + -- Runtime Function: unsigned long __fractunsudqdi (unsigned long long + fract A) + -- Runtime Function: unsigned long long __fractunsudqti (unsigned long + long fract A) + -- Runtime Function: unsigned char __fractunsuhaqi (unsigned short + accum A) + -- Runtime Function: unsigned short __fractunsuhahi (unsigned short + accum A) + -- Runtime Function: unsigned int __fractunsuhasi (unsigned short accum + A) + -- Runtime Function: unsigned long __fractunsuhadi (unsigned short + accum A) + -- Runtime Function: unsigned long long __fractunsuhati (unsigned short + accum A) + -- Runtime Function: unsigned char __fractunsusaqi (unsigned accum A) + -- Runtime Function: unsigned short __fractunsusahi (unsigned accum A) + -- Runtime Function: unsigned int __fractunsusasi (unsigned accum A) + -- Runtime Function: unsigned long __fractunsusadi (unsigned accum A) + -- Runtime Function: unsigned long long __fractunsusati (unsigned accum + A) + -- Runtime Function: unsigned char __fractunsudaqi (unsigned long accum + A) + -- Runtime Function: unsigned short __fractunsudahi (unsigned long + accum A) + -- Runtime Function: unsigned int __fractunsudasi (unsigned long accum + A) + -- Runtime Function: unsigned long __fractunsudadi (unsigned long accum + A) + -- Runtime Function: unsigned long long __fractunsudati (unsigned long + accum A) + -- Runtime Function: unsigned char __fractunsutaqi (unsigned long long + accum A) + -- Runtime Function: unsigned short __fractunsutahi (unsigned long long + accum A) + -- Runtime Function: unsigned int __fractunsutasi (unsigned long long + accum A) + -- Runtime Function: unsigned long __fractunsutadi (unsigned long long + accum A) + -- Runtime Function: unsigned long long __fractunsutati (unsigned long + long accum A) + -- Runtime Function: short fract __fractunsqiqq (unsigned char A) + -- Runtime Function: fract __fractunsqihq (unsigned char A) + -- Runtime Function: long fract __fractunsqisq (unsigned char A) + -- Runtime Function: long long fract __fractunsqidq (unsigned char A) + -- Runtime Function: short accum __fractunsqiha (unsigned char A) + -- Runtime Function: accum __fractunsqisa (unsigned char A) + -- Runtime Function: long accum __fractunsqida (unsigned char A) + -- Runtime Function: long long accum __fractunsqita (unsigned char A) + -- Runtime Function: unsigned short fract __fractunsqiuqq (unsigned + char A) + -- Runtime Function: unsigned fract __fractunsqiuhq (unsigned char A) + -- Runtime Function: unsigned long fract __fractunsqiusq (unsigned char + A) + -- Runtime Function: unsigned long long fract __fractunsqiudq (unsigned + char A) + -- Runtime Function: unsigned short accum __fractunsqiuha (unsigned + char A) + -- Runtime Function: unsigned accum __fractunsqiusa (unsigned char A) + -- Runtime Function: unsigned long accum __fractunsqiuda (unsigned char + A) + -- Runtime Function: unsigned long long accum __fractunsqiuta (unsigned + char A) + -- Runtime Function: short fract __fractunshiqq (unsigned short A) + -- Runtime Function: fract __fractunshihq (unsigned short A) + -- Runtime Function: long fract __fractunshisq (unsigned short A) + -- Runtime Function: long long fract __fractunshidq (unsigned short A) + -- Runtime Function: short accum __fractunshiha (unsigned short A) + -- Runtime Function: accum __fractunshisa (unsigned short A) + -- Runtime Function: long accum __fractunshida (unsigned short A) + -- Runtime Function: long long accum __fractunshita (unsigned short A) + -- Runtime Function: unsigned short fract __fractunshiuqq (unsigned + short A) + -- Runtime Function: unsigned fract __fractunshiuhq (unsigned short A) + -- Runtime Function: unsigned long fract __fractunshiusq (unsigned + short A) + -- Runtime Function: unsigned long long fract __fractunshiudq (unsigned + short A) + -- Runtime Function: unsigned short accum __fractunshiuha (unsigned + short A) + -- Runtime Function: unsigned accum __fractunshiusa (unsigned short A) + -- Runtime Function: unsigned long accum __fractunshiuda (unsigned + short A) + -- Runtime Function: unsigned long long accum __fractunshiuta (unsigned + short A) + -- Runtime Function: short fract __fractunssiqq (unsigned int A) + -- Runtime Function: fract __fractunssihq (unsigned int A) + -- Runtime Function: long fract __fractunssisq (unsigned int A) + -- Runtime Function: long long fract __fractunssidq (unsigned int A) + -- Runtime Function: short accum __fractunssiha (unsigned int A) + -- Runtime Function: accum __fractunssisa (unsigned int A) + -- Runtime Function: long accum __fractunssida (unsigned int A) + -- Runtime Function: long long accum __fractunssita (unsigned int A) + -- Runtime Function: unsigned short fract __fractunssiuqq (unsigned int + A) + -- Runtime Function: unsigned fract __fractunssiuhq (unsigned int A) + -- Runtime Function: unsigned long fract __fractunssiusq (unsigned int + A) + -- Runtime Function: unsigned long long fract __fractunssiudq (unsigned + int A) + -- Runtime Function: unsigned short accum __fractunssiuha (unsigned int + A) + -- Runtime Function: unsigned accum __fractunssiusa (unsigned int A) + -- Runtime Function: unsigned long accum __fractunssiuda (unsigned int + A) + -- Runtime Function: unsigned long long accum __fractunssiuta (unsigned + int A) + -- Runtime Function: short fract __fractunsdiqq (unsigned long A) + -- Runtime Function: fract __fractunsdihq (unsigned long A) + -- Runtime Function: long fract __fractunsdisq (unsigned long A) + -- Runtime Function: long long fract __fractunsdidq (unsigned long A) + -- Runtime Function: short accum __fractunsdiha (unsigned long A) + -- Runtime Function: accum __fractunsdisa (unsigned long A) + -- Runtime Function: long accum __fractunsdida (unsigned long A) + -- Runtime Function: long long accum __fractunsdita (unsigned long A) + -- Runtime Function: unsigned short fract __fractunsdiuqq (unsigned + long A) + -- Runtime Function: unsigned fract __fractunsdiuhq (unsigned long A) + -- Runtime Function: unsigned long fract __fractunsdiusq (unsigned long + A) + -- Runtime Function: unsigned long long fract __fractunsdiudq (unsigned + long A) + -- Runtime Function: unsigned short accum __fractunsdiuha (unsigned + long A) + -- Runtime Function: unsigned accum __fractunsdiusa (unsigned long A) + -- Runtime Function: unsigned long accum __fractunsdiuda (unsigned long + A) + -- Runtime Function: unsigned long long accum __fractunsdiuta (unsigned + long A) + -- Runtime Function: short fract __fractunstiqq (unsigned long long A) + -- Runtime Function: fract __fractunstihq (unsigned long long A) + -- Runtime Function: long fract __fractunstisq (unsigned long long A) + -- Runtime Function: long long fract __fractunstidq (unsigned long long + A) + -- Runtime Function: short accum __fractunstiha (unsigned long long A) + -- Runtime Function: accum __fractunstisa (unsigned long long A) + -- Runtime Function: long accum __fractunstida (unsigned long long A) + -- Runtime Function: long long accum __fractunstita (unsigned long long + A) + -- Runtime Function: unsigned short fract __fractunstiuqq (unsigned + long long A) + -- Runtime Function: unsigned fract __fractunstiuhq (unsigned long long + A) + -- Runtime Function: unsigned long fract __fractunstiusq (unsigned long + long A) + -- Runtime Function: unsigned long long fract __fractunstiudq (unsigned + long long A) + -- Runtime Function: unsigned short accum __fractunstiuha (unsigned + long long A) + -- Runtime Function: unsigned accum __fractunstiusa (unsigned long long + A) + -- Runtime Function: unsigned long accum __fractunstiuda (unsigned long + long A) + -- Runtime Function: unsigned long long accum __fractunstiuta (unsigned + long long A) + These functions convert from fractionals to unsigned + non-fractionals; and from unsigned non-fractionals to fractionals, + without saturation. + + -- Runtime Function: short fract __satfractunsqiqq (unsigned char A) + -- Runtime Function: fract __satfractunsqihq (unsigned char A) + -- Runtime Function: long fract __satfractunsqisq (unsigned char A) + -- Runtime Function: long long fract __satfractunsqidq (unsigned char + A) + -- Runtime Function: short accum __satfractunsqiha (unsigned char A) + -- Runtime Function: accum __satfractunsqisa (unsigned char A) + -- Runtime Function: long accum __satfractunsqida (unsigned char A) + -- Runtime Function: long long accum __satfractunsqita (unsigned char + A) + -- Runtime Function: unsigned short fract __satfractunsqiuqq (unsigned + char A) + -- Runtime Function: unsigned fract __satfractunsqiuhq (unsigned char + A) + -- Runtime Function: unsigned long fract __satfractunsqiusq (unsigned + char A) + -- Runtime Function: unsigned long long fract __satfractunsqiudq + (unsigned char A) + -- Runtime Function: unsigned short accum __satfractunsqiuha (unsigned + char A) + -- Runtime Function: unsigned accum __satfractunsqiusa (unsigned char + A) + -- Runtime Function: unsigned long accum __satfractunsqiuda (unsigned + char A) + -- Runtime Function: unsigned long long accum __satfractunsqiuta + (unsigned char A) + -- Runtime Function: short fract __satfractunshiqq (unsigned short A) + -- Runtime Function: fract __satfractunshihq (unsigned short A) + -- Runtime Function: long fract __satfractunshisq (unsigned short A) + -- Runtime Function: long long fract __satfractunshidq (unsigned short + A) + -- Runtime Function: short accum __satfractunshiha (unsigned short A) + -- Runtime Function: accum __satfractunshisa (unsigned short A) + -- Runtime Function: long accum __satfractunshida (unsigned short A) + -- Runtime Function: long long accum __satfractunshita (unsigned short + A) + -- Runtime Function: unsigned short fract __satfractunshiuqq (unsigned + short A) + -- Runtime Function: unsigned fract __satfractunshiuhq (unsigned short + A) + -- Runtime Function: unsigned long fract __satfractunshiusq (unsigned + short A) + -- Runtime Function: unsigned long long fract __satfractunshiudq + (unsigned short A) + -- Runtime Function: unsigned short accum __satfractunshiuha (unsigned + short A) + -- Runtime Function: unsigned accum __satfractunshiusa (unsigned short + A) + -- Runtime Function: unsigned long accum __satfractunshiuda (unsigned + short A) + -- Runtime Function: unsigned long long accum __satfractunshiuta + (unsigned short A) + -- Runtime Function: short fract __satfractunssiqq (unsigned int A) + -- Runtime Function: fract __satfractunssihq (unsigned int A) + -- Runtime Function: long fract __satfractunssisq (unsigned int A) + -- Runtime Function: long long fract __satfractunssidq (unsigned int A) + -- Runtime Function: short accum __satfractunssiha (unsigned int A) + -- Runtime Function: accum __satfractunssisa (unsigned int A) + -- Runtime Function: long accum __satfractunssida (unsigned int A) + -- Runtime Function: long long accum __satfractunssita (unsigned int A) + -- Runtime Function: unsigned short fract __satfractunssiuqq (unsigned + int A) + -- Runtime Function: unsigned fract __satfractunssiuhq (unsigned int A) + -- Runtime Function: unsigned long fract __satfractunssiusq (unsigned + int A) + -- Runtime Function: unsigned long long fract __satfractunssiudq + (unsigned int A) + -- Runtime Function: unsigned short accum __satfractunssiuha (unsigned + int A) + -- Runtime Function: unsigned accum __satfractunssiusa (unsigned int A) + -- Runtime Function: unsigned long accum __satfractunssiuda (unsigned + int A) + -- Runtime Function: unsigned long long accum __satfractunssiuta + (unsigned int A) + -- Runtime Function: short fract __satfractunsdiqq (unsigned long A) + -- Runtime Function: fract __satfractunsdihq (unsigned long A) + -- Runtime Function: long fract __satfractunsdisq (unsigned long A) + -- Runtime Function: long long fract __satfractunsdidq (unsigned long + A) + -- Runtime Function: short accum __satfractunsdiha (unsigned long A) + -- Runtime Function: accum __satfractunsdisa (unsigned long A) + -- Runtime Function: long accum __satfractunsdida (unsigned long A) + -- Runtime Function: long long accum __satfractunsdita (unsigned long + A) + -- Runtime Function: unsigned short fract __satfractunsdiuqq (unsigned + long A) + -- Runtime Function: unsigned fract __satfractunsdiuhq (unsigned long + A) + -- Runtime Function: unsigned long fract __satfractunsdiusq (unsigned + long A) + -- Runtime Function: unsigned long long fract __satfractunsdiudq + (unsigned long A) + -- Runtime Function: unsigned short accum __satfractunsdiuha (unsigned + long A) + -- Runtime Function: unsigned accum __satfractunsdiusa (unsigned long + A) + -- Runtime Function: unsigned long accum __satfractunsdiuda (unsigned + long A) + -- Runtime Function: unsigned long long accum __satfractunsdiuta + (unsigned long A) + -- Runtime Function: short fract __satfractunstiqq (unsigned long long + A) + -- Runtime Function: fract __satfractunstihq (unsigned long long A) + -- Runtime Function: long fract __satfractunstisq (unsigned long long + A) + -- Runtime Function: long long fract __satfractunstidq (unsigned long + long A) + -- Runtime Function: short accum __satfractunstiha (unsigned long long + A) + -- Runtime Function: accum __satfractunstisa (unsigned long long A) + -- Runtime Function: long accum __satfractunstida (unsigned long long + A) + -- Runtime Function: long long accum __satfractunstita (unsigned long + long A) + -- Runtime Function: unsigned short fract __satfractunstiuqq (unsigned + long long A) + -- Runtime Function: unsigned fract __satfractunstiuhq (unsigned long + long A) + -- Runtime Function: unsigned long fract __satfractunstiusq (unsigned + long long A) + -- Runtime Function: unsigned long long fract __satfractunstiudq + (unsigned long long A) + -- Runtime Function: unsigned short accum __satfractunstiuha (unsigned + long long A) + -- Runtime Function: unsigned accum __satfractunstiusa (unsigned long + long A) + -- Runtime Function: unsigned long accum __satfractunstiuda (unsigned + long long A) + -- Runtime Function: unsigned long long accum __satfractunstiuta + (unsigned long long A) + These functions convert from unsigned non-fractionals to + fractionals, with saturation. + + +File: gccint.info, Node: Exception handling routines, Next: Miscellaneous routines, Prev: Fixed-point fractional library routines, Up: Libgcc + +4.5 Language-independent routines for exception handling +======================================================== + +document me! + + _Unwind_DeleteException + _Unwind_Find_FDE + _Unwind_ForcedUnwind + _Unwind_GetGR + _Unwind_GetIP + _Unwind_GetLanguageSpecificData + _Unwind_GetRegionStart + _Unwind_GetTextRelBase + _Unwind_GetDataRelBase + _Unwind_RaiseException + _Unwind_Resume + _Unwind_SetGR + _Unwind_SetIP + _Unwind_FindEnclosingFunction + _Unwind_SjLj_Register + _Unwind_SjLj_Unregister + _Unwind_SjLj_RaiseException + _Unwind_SjLj_ForcedUnwind + _Unwind_SjLj_Resume + __deregister_frame + __deregister_frame_info + __deregister_frame_info_bases + __register_frame + __register_frame_info + __register_frame_info_bases + __register_frame_info_table + __register_frame_info_table_bases + __register_frame_table + + +File: gccint.info, Node: Miscellaneous routines, Prev: Exception handling routines, Up: Libgcc + +4.6 Miscellaneous runtime library routines +========================================== + +4.6.1 Cache control functions +----------------------------- + + -- Runtime Function: void __clear_cache (char *BEG, char *END) + This function clears the instruction cache between BEG and END. + +4.6.2 Split stack functions and variables +----------------------------------------- + + -- Runtime Function: void * __splitstack_find (void *SEGMENT_ARG, void + *SP, size_t LEN, void **NEXT_SEGMENT, void **NEXT_SP, void + **INITIAL_SP) + When using '-fsplit-stack', this call may be used to iterate over + the stack segments. It may be called like this: + void *next_segment = NULL; + void *next_sp = NULL; + void *initial_sp = NULL; + void *stack; + size_t stack_size; + while ((stack = __splitstack_find (next_segment, next_sp, + &stack_size, &next_segment, + &next_sp, &initial_sp)) + != NULL) + { + /* Stack segment starts at stack and is + stack_size bytes long. */ + } + + There is no way to iterate over the stack segments of a different + thread. However, what is permitted is for one thread to call this + with the SEGMENT_ARG and SP arguments NULL, to pass NEXT_SEGMENT, + NEXT_SP, and INITIAL_SP to a different thread, and then to suspend + one way or another. A different thread may run the subsequent + '__splitstack_find' iterations. Of course, this will only work if + the first thread is suspended while the second thread is calling + '__splitstack_find'. If not, the second thread could be looking at + the stack while it is changing, and anything could happen. + + -- Variable: __morestack_segments + -- Variable: __morestack_current_segment + -- Variable: __morestack_initial_sp + Internal variables used by the '-fsplit-stack' implementation. + + +File: gccint.info, Node: Languages, Next: Source Tree, Prev: Libgcc, Up: Top + +5 Language Front Ends in GCC +**************************** + +The interface to front ends for languages in GCC, and in particular the +'tree' structure (*note GENERIC::), was initially designed for C, and +many aspects of it are still somewhat biased towards C and C-like +languages. It is, however, reasonably well suited to other procedural +languages, and front ends for many such languages have been written for +GCC. + + Writing a compiler as a front end for GCC, rather than compiling +directly to assembler or generating C code which is then compiled by +GCC, has several advantages: + + * GCC front ends benefit from the support for many different target + machines already present in GCC. + * GCC front ends benefit from all the optimizations in GCC. Some of + these, such as alias analysis, may work better when GCC is + compiling directly from source code then when it is compiling from + generated C code. + * Better debugging information is generated when compiling directly + from source code than when going via intermediate generated C code. + + Because of the advantages of writing a compiler as a GCC front end, GCC +front ends have also been created for languages very different from +those for which GCC was designed, such as the declarative +logic/functional language Mercury. For these reasons, it may also be +useful to implement compilers created for specialized purposes (for +example, as part of a research project) as GCC front ends. + + +File: gccint.info, Node: Source Tree, Next: Testsuites, Prev: Languages, Up: Top + +6 Source Tree Structure and Build System +**************************************** + +This chapter describes the structure of the GCC source tree, and how GCC +is built. The user documentation for building and installing GCC is in +a separate manual (<http://gcc.gnu.org/install/>), with which it is +presumed that you are familiar. + +* Menu: + +* Configure Terms:: Configuration terminology and history. +* Top Level:: The top level source directory. +* gcc Directory:: The 'gcc' subdirectory. + + +File: gccint.info, Node: Configure Terms, Next: Top Level, Up: Source Tree + +6.1 Configure Terms and History +=============================== + +The configure and build process has a long and colorful history, and can +be confusing to anyone who doesn't know why things are the way they are. +While there are other documents which describe the configuration process +in detail, here are a few things that everyone working on GCC should +know. + + There are three system names that the build knows about: the machine +you are building on ("build"), the machine that you are building for +("host"), and the machine that GCC will produce code for ("target"). +When you configure GCC, you specify these with '--build=', '--host=', +and '--target='. + + Specifying the host without specifying the build should be avoided, as +'configure' may (and once did) assume that the host you specify is also +the build, which may not be true. + + If build, host, and target are all the same, this is called a "native". +If build and host are the same but target is different, this is called a +"cross". If build, host, and target are all different this is called a +"canadian" (for obscure reasons dealing with Canada's political party +and the background of the person working on the build at that time). If +host and target are the same, but build is different, you are using a +cross-compiler to build a native for a different system. Some people +call this a "host-x-host", "crossed native", or "cross-built native". +If build and target are the same, but host is different, you are using a +cross compiler to build a cross compiler that produces code for the +machine you're building on. This is rare, so there is no common way of +describing it. There is a proposal to call this a "crossback". + + If build and host are the same, the GCC you are building will also be +used to build the target libraries (like 'libstdc++'). If build and +host are different, you must have already built and installed a cross +compiler that will be used to build the target libraries (if you +configured with '--target=foo-bar', this compiler will be called +'foo-bar-gcc'). + + In the case of target libraries, the machine you're building for is the +machine you specified with '--target'. So, build is the machine you're +building on (no change there), host is the machine you're building for +(the target libraries are built for the target, so host is the target +you specified), and target doesn't apply (because you're not building a +compiler, you're building libraries). The configure/make process will +adjust these variables as needed. It also sets '$with_cross_host' to +the original '--host' value in case you need it. + + The 'libiberty' support library is built up to three times: once for +the host, once for the target (even if they are the same), and once for +the build if build and host are different. This allows it to be used by +all programs which are generated in the course of the build process. + + +File: gccint.info, Node: Top Level, Next: gcc Directory, Prev: Configure Terms, Up: Source Tree + +6.2 Top Level Source Directory +============================== + +The top level source directory in a GCC distribution contains several +files and directories that are shared with other software distributions +such as that of GNU Binutils. It also contains several subdirectories +that contain parts of GCC and its runtime libraries: + +'boehm-gc' + The Boehm conservative garbage collector, used as part of the Java + runtime library. + +'config' + Autoconf macros and Makefile fragments used throughout the tree. + +'contrib' + Contributed scripts that may be found useful in conjunction with + GCC. One of these, 'contrib/texi2pod.pl', is used to generate man + pages from Texinfo manuals as part of the GCC build process. + +'fixincludes' + The support for fixing system headers to work with GCC. See + 'fixincludes/README' for more information. The headers fixed by + this mechanism are installed in 'LIBSUBDIR/include-fixed'. Along + with those headers, 'README-fixinc' is also installed, as + 'LIBSUBDIR/include-fixed/README'. + +'gcc' + The main sources of GCC itself (except for runtime libraries), + including optimizers, support for different target architectures, + language front ends, and testsuites. *Note The 'gcc' Subdirectory: + gcc Directory, for details. + +'gnattools' + Support tools for GNAT. + +'include' + Headers for the 'libiberty' library. + +'intl' + GNU 'libintl', from GNU 'gettext', for systems which do not include + it in 'libc'. + +'libada' + The Ada runtime library. + +'libatomic' + The runtime support library for atomic operations (e.g. for + '__sync' and '__atomic'). + +'libcpp' + The C preprocessor library. + +'libdecnumber' + The Decimal Float support library. + +'libffi' + The 'libffi' library, used as part of the Java runtime library. + +'libgcc' + The GCC runtime library. + +'libgfortran' + The Fortran runtime library. + +'libgo' + The Go runtime library. The bulk of this library is mirrored from + the master Go repository (http://code.google.com/p/go/). + +'libgomp' + The GNU OpenMP runtime library. + +'libiberty' + The 'libiberty' library, used for portability and for some + generally useful data structures and algorithms. *Note + Introduction: (libiberty)Top, for more information about this + library. + +'libitm' + The runtime support library for transactional memory. + +'libjava' + The Java runtime library. + +'libobjc' + The Objective-C and Objective-C++ runtime library. + +'libquadmath' + The runtime support library for quad-precision math operations. + +'libssp' + The Stack protector runtime library. + +'libstdc++-v3' + The C++ runtime library. + +'lto-plugin' + Plugin used by the linker if link-time optimizations are enabled. + +'maintainer-scripts' + Scripts used by the 'gccadmin' account on 'gcc.gnu.org'. + +'zlib' + The 'zlib' compression library, used by the Java front end, as part + of the Java runtime library, and for compressing and uncompressing + GCC's intermediate language in LTO object files. + + The build system in the top level directory, including how recursion +into subdirectories works and how building runtime libraries for +multilibs is handled, is documented in a separate manual, included with +GNU Binutils. *Note GNU configure and build system: (configure)Top, for +details. + + +File: gccint.info, Node: gcc Directory, Prev: Top Level, Up: Source Tree + +6.3 The 'gcc' Subdirectory +========================== + +The 'gcc' directory contains many files that are part of the C sources +of GCC, other files used as part of the configuration and build process, +and subdirectories including documentation and a testsuite. The files +that are sources of GCC are documented in a separate chapter. *Note +Passes and Files of the Compiler: Passes. + +* Menu: + +* Subdirectories:: Subdirectories of 'gcc'. +* Configuration:: The configuration process, and the files it uses. +* Build:: The build system in the 'gcc' directory. +* Makefile:: Targets in 'gcc/Makefile'. +* Library Files:: Library source files and headers under 'gcc/'. +* Headers:: Headers installed by GCC. +* Documentation:: Building documentation in GCC. +* Front End:: Anatomy of a language front end. +* Back End:: Anatomy of a target back end. + + +File: gccint.info, Node: Subdirectories, Next: Configuration, Up: gcc Directory + +6.3.1 Subdirectories of 'gcc' +----------------------------- + +The 'gcc' directory contains the following subdirectories: + +'LANGUAGE' + Subdirectories for various languages. Directories containing a + file 'config-lang.in' are language subdirectories. The contents of + the subdirectories 'c' (for C), 'cp' (for C++), 'objc' (for + Objective-C), 'objcp' (for Objective-C++), and 'lto' (for LTO) are + documented in this manual (*note Passes and Files of the Compiler: + Passes.); those for other languages are not. *Note Anatomy of a + Language Front End: Front End, for details of the files in these + directories. + +'common' + Source files shared between the compiler drivers (such as 'gcc') + and the compilers proper (such as 'cc1'). If an architecture + defines target hooks shared between those places, it also has a + subdirectory in 'common/config'. *Note Target Structure::. + +'config' + Configuration files for supported architectures and operating + systems. *Note Anatomy of a Target Back End: Back End, for details + of the files in this directory. + +'doc' + Texinfo documentation for GCC, together with automatically + generated man pages and support for converting the installation + manual to HTML. *Note Documentation::. + +'ginclude' + System headers installed by GCC, mainly those required by the C + standard of freestanding implementations. *Note Headers Installed + by GCC: Headers, for details of when these and other headers are + installed. + +'po' + Message catalogs with translations of messages produced by GCC into + various languages, 'LANGUAGE.po'. This directory also contains + 'gcc.pot', the template for these message catalogues, 'exgettext', + a wrapper around 'gettext' to extract the messages from the GCC + sources and create 'gcc.pot', which is run by 'make gcc.pot', and + 'EXCLUDES', a list of files from which messages should not be + extracted. + +'testsuite' + The GCC testsuites (except for those for runtime libraries). *Note + Testsuites::. + + +File: gccint.info, Node: Configuration, Next: Build, Prev: Subdirectories, Up: gcc Directory + +6.3.2 Configuration in the 'gcc' Directory +------------------------------------------ + +The 'gcc' directory is configured with an Autoconf-generated script +'configure'. The 'configure' script is generated from 'configure.ac' +and 'aclocal.m4'. From the files 'configure.ac' and 'acconfig.h', +Autoheader generates the file 'config.in'. The file 'cstamp-h.in' is +used as a timestamp. + +* Menu: + +* Config Fragments:: Scripts used by 'configure'. +* System Config:: The 'config.build', 'config.host', and + 'config.gcc' files. +* Configuration Files:: Files created by running 'configure'. + + +File: gccint.info, Node: Config Fragments, Next: System Config, Up: Configuration + +6.3.2.1 Scripts Used by 'configure' +................................... + +'configure' uses some other scripts to help in its work: + + * The standard GNU 'config.sub' and 'config.guess' files, kept in the + top level directory, are used. + + * The file 'config.gcc' is used to handle configuration specific to + the particular target machine. The file 'config.build' is used to + handle configuration specific to the particular build machine. The + file 'config.host' is used to handle configuration specific to the + particular host machine. (In general, these should only be used + for features that cannot reasonably be tested in Autoconf feature + tests.) *Note The 'config.build'; 'config.host'; and 'config.gcc' + Files: System Config, for details of the contents of these files. + + * Each language subdirectory has a file 'LANGUAGE/config-lang.in' + that is used for front-end-specific configuration. *Note The Front + End 'config-lang.in' File: Front End Config, for details of this + file. + + * A helper script 'configure.frag' is used as part of creating the + output of 'configure'. + + +File: gccint.info, Node: System Config, Next: Configuration Files, Prev: Config Fragments, Up: Configuration + +6.3.2.2 The 'config.build'; 'config.host'; and 'config.gcc' Files +................................................................. + +The 'config.build' file contains specific rules for particular systems +which GCC is built on. This should be used as rarely as possible, as +the behavior of the build system can always be detected by autoconf. + + The 'config.host' file contains specific rules for particular systems +which GCC will run on. This is rarely needed. + + The 'config.gcc' file contains specific rules for particular systems +which GCC will generate code for. This is usually needed. + + Each file has a list of the shell variables it sets, with descriptions, +at the top of the file. + + FIXME: document the contents of these files, and what variables should +be set to control build, host and target configuration. + + +File: gccint.info, Node: Configuration Files, Prev: System Config, Up: Configuration + +6.3.2.3 Files Created by 'configure' +.................................... + +Here we spell out what files will be set up by 'configure' in the 'gcc' +directory. Some other files are created as temporary files in the +configuration process, and are not used in the subsequent build; these +are not documented. + + * 'Makefile' is constructed from 'Makefile.in', together with the + host and target fragments (*note Makefile Fragments: Fragments.) + 't-TARGET' and 'x-HOST' from 'config', if any, and language + Makefile fragments 'LANGUAGE/Make-lang.in'. + * 'auto-host.h' contains information about the host machine + determined by 'configure'. If the host machine is different from + the build machine, then 'auto-build.h' is also created, containing + such information about the build machine. + * 'config.status' is a script that may be run to recreate the current + configuration. + * 'configargs.h' is a header containing details of the arguments + passed to 'configure' to configure GCC, and of the thread model + used. + * 'cstamp-h' is used as a timestamp. + * If a language 'config-lang.in' file (*note The Front End + 'config-lang.in' File: Front End Config.) sets 'outputs', then the + files listed in 'outputs' there are also generated. + + The following configuration headers are created from the Makefile, +using 'mkconfig.sh', rather than directly by 'configure'. 'config.h', +'bconfig.h' and 'tconfig.h' all contain the 'xm-MACHINE.h' header, if +any, appropriate to the host, build and target machines respectively, +the configuration headers for the target, and some definitions; for the +host and build machines, these include the autoconfigured headers +generated by 'configure'. The other configuration headers are +determined by 'config.gcc'. They also contain the typedefs for 'rtx', +'rtvec' and 'tree'. + + * 'config.h', for use in programs that run on the host machine. + * 'bconfig.h', for use in programs that run on the build machine. + * 'tconfig.h', for use in programs and libraries for the target + machine. + * 'tm_p.h', which includes the header 'MACHINE-protos.h' that + contains prototypes for functions in the target 'MACHINE.c' file. + The header 'MACHINE-protos.h' can include prototypes of functions + that use rtl and tree data structures inside appropriate '#ifdef + RTX_CODE' and '#ifdef TREE_CODE' conditional code segements. The + 'MACHINE-protos.h' is included after the 'rtl.h' and/or 'tree.h' + would have been included. The 'tm_p.h' also includes the header + 'tm-preds.h' which is generated by 'genpreds' program during the + build to define the declarations and inline functions for the + predicate functions. + + +File: gccint.info, Node: Build, Next: Makefile, Prev: Configuration, Up: gcc Directory + +6.3.3 Build System in the 'gcc' Directory +----------------------------------------- + +FIXME: describe the build system, including what is built in what +stages. Also list the various source files that are used in the build +process but aren't source files of GCC itself and so aren't documented +below (*note Passes::). + + +File: gccint.info, Node: Makefile, Next: Library Files, Prev: Build, Up: gcc Directory + +6.3.4 Makefile Targets +---------------------- + +These targets are available from the 'gcc' directory: + +'all' + This is the default target. Depending on what your + build/host/target configuration is, it coordinates all the things + that need to be built. + +'doc' + Produce info-formatted documentation and man pages. Essentially it + calls 'make man' and 'make info'. + +'dvi' + Produce DVI-formatted documentation. + +'pdf' + Produce PDF-formatted documentation. + +'html' + Produce HTML-formatted documentation. + +'man' + Generate man pages. + +'info' + Generate info-formatted pages. + +'mostlyclean' + Delete the files made while building the compiler. + +'clean' + That, and all the other files built by 'make all'. + +'distclean' + That, and all the files created by 'configure'. + +'maintainer-clean' + Distclean plus any file that can be generated from other files. + Note that additional tools may be required beyond what is normally + needed to build GCC. + +'srcextra' + Generates files in the source directory that are not + version-controlled but should go into a release tarball. + +'srcinfo' +'srcman' + Copies the info-formatted and manpage documentation into the source + directory usually for the purpose of generating a release tarball. + +'install' + Installs GCC. + +'uninstall' + Deletes installed files, though this is not supported. + +'check' + Run the testsuite. This creates a 'testsuite' subdirectory that + has various '.sum' and '.log' files containing the results of the + testing. You can run subsets with, for example, 'make check-gcc'. + You can specify specific tests by setting 'RUNTESTFLAGS' to be the + name of the '.exp' file, optionally followed by (for some tests) an + equals and a file wildcard, like: + + make check-gcc RUNTESTFLAGS="execute.exp=19980413-*" + + Note that running the testsuite may require additional tools be + installed, such as Tcl or DejaGnu. + + The toplevel tree from which you start GCC compilation is not the GCC +directory, but rather a complex Makefile that coordinates the various +steps of the build, including bootstrapping the compiler and using the +new compiler to build target libraries. + + When GCC is configured for a native configuration, the default action +for 'make' is to do a full three-stage bootstrap. This means that GCC +is built three times--once with the native compiler, once with the +native-built compiler it just built, and once with the compiler it built +the second time. In theory, the last two should produce the same +results, which 'make compare' can check. Each stage is configured +separately and compiled into a separate directory, to minimize problems +due to ABI incompatibilities between the native compiler and GCC. + + If you do a change, rebuilding will also start from the first stage and +"bubble" up the change through the three stages. Each stage is taken +from its build directory (if it had been built previously), rebuilt, and +copied to its subdirectory. This will allow you to, for example, +continue a bootstrap after fixing a bug which causes the stage2 build to +crash. It does not provide as good coverage of the compiler as +bootstrapping from scratch, but it ensures that the new code is +syntactically correct (e.g., that you did not use GCC extensions by +mistake), and avoids spurious bootstrap comparison failures(1). + + Other targets available from the top level include: + +'bootstrap-lean' + Like 'bootstrap', except that the various stages are removed once + they're no longer needed. This saves disk space. + +'bootstrap2' +'bootstrap2-lean' + Performs only the first two stages of bootstrap. Unlike a + three-stage bootstrap, this does not perform a comparison to test + that the compiler is running properly. Note that the disk space + required by a "lean" bootstrap is approximately independent of the + number of stages. + +'stageN-bubble (N = 1...4, profile, feedback)' + Rebuild all the stages up to N, with the appropriate flags, + "bubbling" the changes as described above. + +'all-stageN (N = 1...4, profile, feedback)' + Assuming that stage N has already been built, rebuild it with the + appropriate flags. This is rarely needed. + +'cleanstrap' + Remove everything ('make clean') and rebuilds ('make bootstrap'). + +'compare' + Compares the results of stages 2 and 3. This ensures that the + compiler is running properly, since it should produce the same + object files regardless of how it itself was compiled. + +'profiledbootstrap' + Builds a compiler with profiling feedback information. In this + case, the second and third stages are named 'profile' and + 'feedback', respectively. For more information, see *note Building + with profile feedback: (gccinstall)Building. + +'restrap' + Restart a bootstrap, so that everything that was not built with the + system compiler is rebuilt. + +'stageN-start (N = 1...4, profile, feedback)' + For each package that is bootstrapped, rename directories so that, + for example, 'gcc' points to the stageN GCC, compiled with the + stageN-1 GCC(2). + + You will invoke this target if you need to test or debug the stageN + GCC. If you only need to execute GCC (but you need not run 'make' + either to rebuild it or to run test suites), you should be able to + work directly in the 'stageN-gcc' directory. This makes it easier + to debug multiple stages in parallel. + +'stage' + For each package that is bootstrapped, relocate its build directory + to indicate its stage. For example, if the 'gcc' directory points + to the stage2 GCC, after invoking this target it will be renamed to + 'stage2-gcc'. + + If you wish to use non-default GCC flags when compiling the stage2 and +stage3 compilers, set 'BOOT_CFLAGS' on the command line when doing +'make'. + + Usually, the first stage only builds the languages that the compiler is +written in: typically, C and maybe Ada. If you are debugging a +miscompilation of a different stage2 front-end (for example, of the +Fortran front-end), you may want to have front-ends for other languages +in the first stage as well. To do so, set 'STAGE1_LANGUAGES' on the +command line when doing 'make'. + + For example, in the aforementioned scenario of debugging a Fortran +front-end miscompilation caused by the stage1 compiler, you may need a +command like + + make stage2-bubble STAGE1_LANGUAGES=c,fortran + + Alternatively, you can use per-language targets to build and test +languages that are not enabled by default in stage1. For example, 'make +f951' will build a Fortran compiler even in the stage1 build directory. + + ---------- Footnotes ---------- + + (1) Except if the compiler was buggy and miscompiled some of the +files that were not modified. In this case, it's best to use 'make +restrap'. + + (2) Customarily, the system compiler is also termed the 'stage0' GCC. + + +File: gccint.info, Node: Library Files, Next: Headers, Prev: Makefile, Up: gcc Directory + +6.3.5 Library Source Files and Headers under the 'gcc' Directory +---------------------------------------------------------------- + +FIXME: list here, with explanation, all the C source files and headers +under the 'gcc' directory that aren't built into the GCC executable but +rather are part of runtime libraries and object files, such as +'crtstuff.c' and 'unwind-dw2.c'. *Note Headers Installed by GCC: +Headers, for more information about the 'ginclude' directory. + + +File: gccint.info, Node: Headers, Next: Documentation, Prev: Library Files, Up: gcc Directory + +6.3.6 Headers Installed by GCC +------------------------------ + +In general, GCC expects the system C library to provide most of the +headers to be used with it. However, GCC will fix those headers if +necessary to make them work with GCC, and will install some headers +required of freestanding implementations. These headers are installed +in 'LIBSUBDIR/include'. Headers for non-C runtime libraries are also +installed by GCC; these are not documented here. (FIXME: document them +somewhere.) + + Several of the headers GCC installs are in the 'ginclude' directory. +These headers, 'iso646.h', 'stdarg.h', 'stdbool.h', and 'stddef.h', are +installed in 'LIBSUBDIR/include', unless the target Makefile fragment +(*note Target Fragment::) overrides this by setting 'USER_H'. + + In addition to these headers and those generated by fixing system +headers to work with GCC, some other headers may also be installed in +'LIBSUBDIR/include'. 'config.gcc' may set 'extra_headers'; this +specifies additional headers under 'config' to be installed on some +systems. + + GCC installs its own version of '<float.h>', from 'ginclude/float.h'. +This is done to cope with command-line options that change the +representation of floating point numbers. + + GCC also installs its own version of '<limits.h>'; this is generated +from 'glimits.h', together with 'limitx.h' and 'limity.h' if the system +also has its own version of '<limits.h>'. (GCC provides its own header +because it is required of ISO C freestanding implementations, but needs +to include the system header from its own header as well because other +standards such as POSIX specify additional values to be defined in +'<limits.h>'.) The system's '<limits.h>' header is used via +'LIBSUBDIR/include/syslimits.h', which is copied from 'gsyslimits.h' if +it does not need fixing to work with GCC; if it needs fixing, +'syslimits.h' is the fixed copy. + + GCC can also install '<tgmath.h>'. It will do this when 'config.gcc' +sets 'use_gcc_tgmath' to 'yes'. + + +File: gccint.info, Node: Documentation, Next: Front End, Prev: Headers, Up: gcc Directory + +6.3.7 Building Documentation +---------------------------- + +The main GCC documentation is in the form of manuals in Texinfo format. +These are installed in Info format; DVI versions may be generated by +'make dvi', PDF versions by 'make pdf', and HTML versions by 'make +html'. In addition, some man pages are generated from the Texinfo +manuals, there are some other text files with miscellaneous +documentation, and runtime libraries have their own documentation +outside the 'gcc' directory. FIXME: document the documentation for +runtime libraries somewhere. + +* Menu: + +* Texinfo Manuals:: GCC manuals in Texinfo format. +* Man Page Generation:: Generating man pages from Texinfo manuals. +* Miscellaneous Docs:: Miscellaneous text files with documentation. + + +File: gccint.info, Node: Texinfo Manuals, Next: Man Page Generation, Up: Documentation + +6.3.7.1 Texinfo Manuals +....................... + +The manuals for GCC as a whole, and the C and C++ front ends, are in +files 'doc/*.texi'. Other front ends have their own manuals in files +'LANGUAGE/*.texi'. Common files 'doc/include/*.texi' are provided which +may be included in multiple manuals; the following files are in +'doc/include': + +'fdl.texi' + The GNU Free Documentation License. +'funding.texi' + The section "Funding Free Software". +'gcc-common.texi' + Common definitions for manuals. +'gpl_v3.texi' + The GNU General Public License. +'texinfo.tex' + A copy of 'texinfo.tex' known to work with the GCC manuals. + + DVI-formatted manuals are generated by 'make dvi', which uses +'texi2dvi' (via the Makefile macro '$(TEXI2DVI)'). PDF-formatted +manuals are generated by 'make pdf', which uses 'texi2pdf' (via the +Makefile macro '$(TEXI2PDF)'). HTML formatted manuals are generated by +'make html'. Info manuals are generated by 'make info' (which is run as +part of a bootstrap); this generates the manuals in the source +directory, using 'makeinfo' via the Makefile macro '$(MAKEINFO)', and +they are included in release distributions. + + Manuals are also provided on the GCC web site, in both HTML and +PostScript forms. This is done via the script +'maintainer-scripts/update_web_docs_svn'. Each manual to be provided +online must be listed in the definition of 'MANUALS' in that file; a +file 'NAME.texi' must only appear once in the source tree, and the +output manual must have the same name as the source file. (However, +other Texinfo files, included in manuals but not themselves the root +files of manuals, may have names that appear more than once in the +source tree.) The manual file 'NAME.texi' should only include other +files in its own directory or in 'doc/include'. HTML manuals will be +generated by 'makeinfo --html', PostScript manuals by 'texi2dvi' and +'dvips', and PDF manuals by 'texi2pdf'. All Texinfo files that are +parts of manuals must be version-controlled, even if they are generated +files, for the generation of online manuals to work. + + The installation manual, 'doc/install.texi', is also provided on the +GCC web site. The HTML version is generated by the script +'doc/install.texi2html'. + + +File: gccint.info, Node: Man Page Generation, Next: Miscellaneous Docs, Prev: Texinfo Manuals, Up: Documentation + +6.3.7.2 Man Page Generation +........................... + +Because of user demand, in addition to full Texinfo manuals, man pages +are provided which contain extracts from those manuals. These man pages +are generated from the Texinfo manuals using 'contrib/texi2pod.pl' and +'pod2man'. (The man page for 'g++', 'cp/g++.1', just contains a '.so' +reference to 'gcc.1', but all the other man pages are generated from +Texinfo manuals.) + + Because many systems may not have the necessary tools installed to +generate the man pages, they are only generated if the 'configure' +script detects that recent enough tools are installed, and the Makefiles +allow generating man pages to fail without aborting the build. Man +pages are also included in release distributions. They are generated in +the source directory. + + Magic comments in Texinfo files starting '@c man' control what parts of +a Texinfo file go into a man page. Only a subset of Texinfo is +supported by 'texi2pod.pl', and it may be necessary to add support for +more Texinfo features to this script when generating new man pages. To +improve the man page output, some special Texinfo macros are provided in +'doc/include/gcc-common.texi' which 'texi2pod.pl' understands: + +'@gcctabopt' + Use in the form '@table @gcctabopt' for tables of options, where + for printed output the effect of '@code' is better than that of + '@option' but for man page output a different effect is wanted. +'@gccoptlist' + Use for summary lists of options in manuals. +'@gol' + Use at the end of each line inside '@gccoptlist'. This is + necessary to avoid problems with differences in how the + '@gccoptlist' macro is handled by different Texinfo formatters. + + FIXME: describe the 'texi2pod.pl' input language and magic comments in +more detail. + + +File: gccint.info, Node: Miscellaneous Docs, Prev: Man Page Generation, Up: Documentation + +6.3.7.3 Miscellaneous Documentation +................................... + +In addition to the formal documentation that is installed by GCC, there +are several other text files in the 'gcc' subdirectory with +miscellaneous documentation: + +'ABOUT-GCC-NLS' + Notes on GCC's Native Language Support. FIXME: this should be part + of this manual rather than a separate file. +'ABOUT-NLS' + Notes on the Free Translation Project. +'COPYING' +'COPYING3' + The GNU General Public License, Versions 2 and 3. +'COPYING.LIB' +'COPYING3.LIB' + The GNU Lesser General Public License, Versions 2.1 and 3. +'*ChangeLog*' +'*/ChangeLog*' + Change log files for various parts of GCC. +'LANGUAGES' + Details of a few changes to the GCC front-end interface. FIXME: + the information in this file should be part of general + documentation of the front-end interface in this manual. +'ONEWS' + Information about new features in old versions of GCC. (For recent + versions, the information is on the GCC web site.) +'README.Portability' + Information about portability issues when writing code in GCC. + FIXME: why isn't this part of this manual or of the GCC Coding + Conventions? + + FIXME: document such files in subdirectories, at least 'config', 'c', +'cp', 'objc', 'testsuite'. + + +File: gccint.info, Node: Front End, Next: Back End, Prev: Documentation, Up: gcc Directory + +6.3.8 Anatomy of a Language Front End +------------------------------------- + +A front end for a language in GCC has the following parts: + + * A directory 'LANGUAGE' under 'gcc' containing source files for that + front end. *Note The Front End 'LANGUAGE' Directory: Front End + Directory, for details. + * A mention of the language in the list of supported languages in + 'gcc/doc/install.texi'. + * A mention of the name under which the language's runtime library is + recognized by '--enable-shared=PACKAGE' in the documentation of + that option in 'gcc/doc/install.texi'. + * A mention of any special prerequisites for building the front end + in the documentation of prerequisites in 'gcc/doc/install.texi'. + * Details of contributors to that front end in + 'gcc/doc/contrib.texi'. If the details are in that front end's own + manual then there should be a link to that manual's list in + 'contrib.texi'. + * Information about support for that language in + 'gcc/doc/frontends.texi'. + * Information about standards for that language, and the front end's + support for them, in 'gcc/doc/standards.texi'. This may be a link + to such information in the front end's own manual. + * Details of source file suffixes for that language and '-x LANG' + options supported, in 'gcc/doc/invoke.texi'. + * Entries in 'default_compilers' in 'gcc.c' for source file suffixes + for that language. + * Preferably testsuites, which may be under 'gcc/testsuite' or + runtime library directories. FIXME: document somewhere how to + write testsuite harnesses. + * Probably a runtime library for the language, outside the 'gcc' + directory. FIXME: document this further. + * Details of the directories of any runtime libraries in + 'gcc/doc/sourcebuild.texi'. + * Check targets in 'Makefile.def' for the top-level 'Makefile' to + check just the compiler or the compiler and runtime library for the + language. + + If the front end is added to the official GCC source repository, the +following are also necessary: + + * At least one Bugzilla component for bugs in that front end and + runtime libraries. This category needs to be added to the Bugzilla + database. + * Normally, one or more maintainers of that front end listed in + 'MAINTAINERS'. + * Mentions on the GCC web site in 'index.html' and 'frontends.html', + with any relevant links on 'readings.html'. (Front ends that are + not an official part of GCC may also be listed on 'frontends.html', + with relevant links.) + * A news item on 'index.html', and possibly an announcement on the + <gcc-announce@gcc.gnu.org> mailing list. + * The front end's manuals should be mentioned in + 'maintainer-scripts/update_web_docs_svn' (*note Texinfo Manuals::) + and the online manuals should be linked to from + 'onlinedocs/index.html'. + * Any old releases or CVS repositories of the front end, before its + inclusion in GCC, should be made available on the GCC FTP site + <ftp://gcc.gnu.org/pub/gcc/old-releases/>. + * The release and snapshot script 'maintainer-scripts/gcc_release' + should be updated to generate appropriate tarballs for this front + end. + * If this front end includes its own version files that include the + current date, 'maintainer-scripts/update_version' should be updated + accordingly. + +* Menu: + +* Front End Directory:: The front end 'LANGUAGE' directory. +* Front End Config:: The front end 'config-lang.in' file. +* Front End Makefile:: The front end 'Make-lang.in' file. + + +File: gccint.info, Node: Front End Directory, Next: Front End Config, Up: Front End + +6.3.8.1 The Front End 'LANGUAGE' Directory +.......................................... + +A front end 'LANGUAGE' directory contains the source files of that front +end (but not of any runtime libraries, which should be outside the 'gcc' +directory). This includes documentation, and possibly some subsidiary +programs built alongside the front end. Certain files are special and +other parts of the compiler depend on their names: + +'config-lang.in' + This file is required in all language subdirectories. *Note The + Front End 'config-lang.in' File: Front End Config, for details of + its contents +'Make-lang.in' + This file is required in all language subdirectories. *Note The + Front End 'Make-lang.in' File: Front End Makefile, for details of + its contents. +'lang.opt' + This file registers the set of switches that the front end accepts + on the command line, and their '--help' text. *Note Options::. +'lang-specs.h' + This file provides entries for 'default_compilers' in 'gcc.c' which + override the default of giving an error that a compiler for that + language is not installed. +'LANGUAGE-tree.def' + This file, which need not exist, defines any language-specific tree + codes. + + +File: gccint.info, Node: Front End Config, Next: Front End Makefile, Prev: Front End Directory, Up: Front End + +6.3.8.2 The Front End 'config-lang.in' File +........................................... + +Each language subdirectory contains a 'config-lang.in' file. This file +is a shell script that may define some variables describing the +language: + +'language' + This definition must be present, and gives the name of the language + for some purposes such as arguments to '--enable-languages'. +'lang_requires' + If defined, this variable lists (space-separated) language front + ends other than C that this front end requires to be enabled (with + the names given being their 'language' settings). For example, the + Java front end depends on the C++ front end, so sets + 'lang_requires=c++'. +'subdir_requires' + If defined, this variable lists (space-separated) front end + directories other than C that this front end requires to be + present. For example, the Objective-C++ front end uses source + files from the C++ and Objective-C front ends, so sets + 'subdir_requires="cp objc"'. +'target_libs' + If defined, this variable lists (space-separated) targets in the + top level 'Makefile' to build the runtime libraries for this + language, such as 'target-libobjc'. +'lang_dirs' + If defined, this variable lists (space-separated) top level + directories (parallel to 'gcc'), apart from the runtime libraries, + that should not be configured if this front end is not built. +'build_by_default' + If defined to 'no', this language front end is not built unless + enabled in a '--enable-languages' argument. Otherwise, front ends + are built by default, subject to any special logic in + 'configure.ac' (as is present to disable the Ada front end if the + Ada compiler is not already installed). +'boot_language' + If defined to 'yes', this front end is built in stage1 of the + bootstrap. This is only relevant to front ends written in their + own languages. +'compilers' + If defined, a space-separated list of compiler executables that + will be run by the driver. The names here will each end with + '\$(exeext)'. +'outputs' + If defined, a space-separated list of files that should be + generated by 'configure' substituting values in them. This + mechanism can be used to create a file 'LANGUAGE/Makefile' from + 'LANGUAGE/Makefile.in', but this is deprecated, building everything + from the single 'gcc/Makefile' is preferred. +'gtfiles' + If defined, a space-separated list of files that should be scanned + by 'gengtype.c' to generate the garbage collection tables and + routines for this language. This excludes the files that are + common to all front ends. *Note Type Information::. + + +File: gccint.info, Node: Front End Makefile, Prev: Front End Config, Up: Front End + +6.3.8.3 The Front End 'Make-lang.in' File +......................................... + +Each language subdirectory contains a 'Make-lang.in' file. It contains +targets 'LANG.HOOK' (where 'LANG' is the setting of 'language' in +'config-lang.in') for the following values of 'HOOK', and any other +Makefile rules required to build those targets (which may if necessary +use other Makefiles specified in 'outputs' in 'config-lang.in', although +this is deprecated). It also adds any testsuite targets that can use +the standard rule in 'gcc/Makefile.in' to the variable 'lang_checks'. + +'all.cross' +'start.encap' +'rest.encap' + FIXME: exactly what goes in each of these targets? +'tags' + Build an 'etags' 'TAGS' file in the language subdirectory in the + source tree. +'info' + Build info documentation for the front end, in the build directory. + This target is only called by 'make bootstrap' if a suitable + version of 'makeinfo' is available, so does not need to check for + this, and should fail if an error occurs. +'dvi' + Build DVI documentation for the front end, in the build directory. + This should be done using '$(TEXI2DVI)', with appropriate '-I' + arguments pointing to directories of included files. +'pdf' + Build PDF documentation for the front end, in the build directory. + This should be done using '$(TEXI2PDF)', with appropriate '-I' + arguments pointing to directories of included files. +'html' + Build HTML documentation for the front end, in the build directory. +'man' + Build generated man pages for the front end from Texinfo manuals + (*note Man Page Generation::), in the build directory. This target + is only called if the necessary tools are available, but should + ignore errors so as not to stop the build if errors occur; man + pages are optional and the tools involved may be installed in a + broken way. +'install-common' + Install everything that is part of the front end, apart from the + compiler executables listed in 'compilers' in 'config-lang.in'. +'install-info' + Install info documentation for the front end, if it is present in + the source directory. This target should have dependencies on info + files that should be installed. +'install-man' + Install man pages for the front end. This target should ignore + errors. +'install-plugin' + Install headers needed for plugins. +'srcextra' + Copies its dependencies into the source directory. This generally + should be used for generated files such as Bison output files which + are not version-controlled, but should be included in any release + tarballs. This target will be executed during a bootstrap if + '--enable-generated-files-in-srcdir' was specified as a 'configure' + option. +'srcinfo' +'srcman' + Copies its dependencies into the source directory. These targets + will be executed during a bootstrap if + '--enable-generated-files-in-srcdir' was specified as a 'configure' + option. +'uninstall' + Uninstall files installed by installing the compiler. This is + currently documented not to be supported, so the hook need not do + anything. +'mostlyclean' +'clean' +'distclean' +'maintainer-clean' + The language parts of the standard GNU '*clean' targets. *Note + Standard Targets for Users: (standards)Standard Targets, for + details of the standard targets. For GCC, 'maintainer-clean' + should delete all generated files in the source directory that are + not version-controlled, but should not delete anything that is. + + 'Make-lang.in' must also define a variable 'LANG_OBJS' to a list of +host object files that are used by that language. + + +File: gccint.info, Node: Back End, Prev: Front End, Up: gcc Directory + +6.3.9 Anatomy of a Target Back End +---------------------------------- + +A back end for a target architecture in GCC has the following parts: + + * A directory 'MACHINE' under 'gcc/config', containing a machine + description 'MACHINE.md' file (*note Machine Descriptions: Machine + Desc.), header files 'MACHINE.h' and 'MACHINE-protos.h' and a + source file 'MACHINE.c' (*note Target Description Macros and + Functions: Target Macros.), possibly a target Makefile fragment + 't-MACHINE' (*note The Target Makefile Fragment: Target Fragment.), + and maybe some other files. The names of these files may be + changed from the defaults given by explicit specifications in + 'config.gcc'. + * If necessary, a file 'MACHINE-modes.def' in the 'MACHINE' + directory, containing additional machine modes to represent + condition codes. *Note Condition Code::, for further details. + * An optional 'MACHINE.opt' file in the 'MACHINE' directory, + containing a list of target-specific options. You can also add + other option files using the 'extra_options' variable in + 'config.gcc'. *Note Options::. + * Entries in 'config.gcc' (*note The 'config.gcc' File: System + Config.) for the systems with this target architecture. + * Documentation in 'gcc/doc/invoke.texi' for any command-line options + supported by this target (*note Run-time Target Specification: + Run-time Target.). This means both entries in the summary table of + options and details of the individual options. + * Documentation in 'gcc/doc/extend.texi' for any target-specific + attributes supported (*note Defining target-specific uses of + '__attribute__': Target Attributes.), including where the same + attribute is already supported on some targets, which are + enumerated in the manual. + * Documentation in 'gcc/doc/extend.texi' for any target-specific + pragmas supported. + * Documentation in 'gcc/doc/extend.texi' of any target-specific + built-in functions supported. + * Documentation in 'gcc/doc/extend.texi' of any target-specific + format checking styles supported. + * Documentation in 'gcc/doc/md.texi' of any target-specific + constraint letters (*note Constraints for Particular Machines: + Machine Constraints.). + * A note in 'gcc/doc/contrib.texi' under the person or people who + contributed the target support. + * Entries in 'gcc/doc/install.texi' for all target triplets supported + with this target architecture, giving details of any special notes + about installation for this target, or saying that there are no + special notes if there are none. + * Possibly other support outside the 'gcc' directory for runtime + libraries. FIXME: reference docs for this. The 'libstdc++' + porting manual needs to be installed as info for this to work, or + to be a chapter of this manual. + + If the back end is added to the official GCC source repository, the +following are also necessary: + + * An entry for the target architecture in 'readings.html' on the GCC + web site, with any relevant links. + * Details of the properties of the back end and target architecture + in 'backends.html' on the GCC web site. + * A news item about the contribution of support for that target + architecture, in 'index.html' on the GCC web site. + * Normally, one or more maintainers of that target listed in + 'MAINTAINERS'. Some existing architectures may be unmaintained, + but it would be unusual to add support for a target that does not + have a maintainer when support is added. + * Target triplets covering all 'config.gcc' stanzas for the target, + in the list in 'contrib/config-list.mk'. + + +File: gccint.info, Node: Testsuites, Next: Options, Prev: Source Tree, Up: Top + +7 Testsuites +************ + +GCC contains several testsuites to help maintain compiler quality. Most +of the runtime libraries and language front ends in GCC have testsuites. +Currently only the C language testsuites are documented here; FIXME: +document the others. + +* Menu: + +* Test Idioms:: Idioms used in testsuite code. +* Test Directives:: Directives used within DejaGnu tests. +* Ada Tests:: The Ada language testsuites. +* C Tests:: The C language testsuites. +* libgcj Tests:: The Java library testsuites. +* LTO Testing:: Support for testing link-time optimizations. +* gcov Testing:: Support for testing gcov. +* profopt Testing:: Support for testing profile-directed optimizations. +* compat Testing:: Support for testing binary compatibility. +* Torture Tests:: Support for torture testing using multiple options. + + +File: gccint.info, Node: Test Idioms, Next: Test Directives, Up: Testsuites + +7.1 Idioms Used in Testsuite Code +================================= + +In general, C testcases have a trailing '-N.c', starting with '-1.c', in +case other testcases with similar names are added later. If the test is +a test of some well-defined feature, it should have a name referring to +that feature such as 'FEATURE-1.c'. If it does not test a well-defined +feature but just happens to exercise a bug somewhere in the compiler, +and a bug report has been filed for this bug in the GCC bug database, +'prBUG-NUMBER-1.c' is the appropriate form of name. Otherwise (for +miscellaneous bugs not filed in the GCC bug database), and previously +more generally, test cases are named after the date on which they were +added. This allows people to tell at a glance whether a test failure is +because of a recently found bug that has not yet been fixed, or whether +it may be a regression, but does not give any other information about +the bug or where discussion of it may be found. Some other language +testsuites follow similar conventions. + + In the 'gcc.dg' testsuite, it is often necessary to test that an error +is indeed a hard error and not just a warning--for example, where it is +a constraint violation in the C standard, which must become an error +with '-pedantic-errors'. The following idiom, where the first line +shown is line LINE of the file and the line that generates the error, is +used for this: + + /* { dg-bogus "warning" "warning in place of error" } */ + /* { dg-error "REGEXP" "MESSAGE" { target *-*-* } LINE } */ + + It may be necessary to check that an expression is an integer constant +expression and has a certain value. To check that 'E' has value 'V', an +idiom similar to the following is used: + + char x[((E) == (V) ? 1 : -1)]; + + In 'gcc.dg' tests, '__typeof__' is sometimes used to make assertions +about the types of expressions. See, for example, +'gcc.dg/c99-condexpr-1.c'. The more subtle uses depend on the exact +rules for the types of conditional expressions in the C standard; see, +for example, 'gcc.dg/c99-intconst-1.c'. + + It is useful to be able to test that optimizations are being made +properly. This cannot be done in all cases, but it can be done where +the optimization will lead to code being optimized away (for example, +where flow analysis or alias analysis should show that certain code +cannot be called) or to functions not being called because they have +been expanded as built-in functions. Such tests go in +'gcc.c-torture/execute'. Where code should be optimized away, a call to +a nonexistent function such as 'link_failure ()' may be inserted; a +definition + + #ifndef __OPTIMIZE__ + void + link_failure (void) + { + abort (); + } + #endif + +will also be needed so that linking still succeeds when the test is run +without optimization. When all calls to a built-in function should have +been optimized and no calls to the non-built-in version of the function +should remain, that function may be defined as 'static' to call 'abort +()' (although redeclaring a function as static may not work on all +targets). + + All testcases must be portable. Target-specific testcases must have +appropriate code to avoid causing failures on unsupported systems; +unfortunately, the mechanisms for this differ by directory. + + FIXME: discuss non-C testsuites here. + + +File: gccint.info, Node: Test Directives, Next: Ada Tests, Prev: Test Idioms, Up: Testsuites + +7.2 Directives used within DejaGnu tests +======================================== + +* Menu: + +* Directives:: Syntax and descriptions of test directives. +* Selectors:: Selecting targets to which a test applies. +* Effective-Target Keywords:: Keywords describing target attributes. +* Add Options:: Features for 'dg-add-options' +* Require Support:: Variants of 'dg-require-SUPPORT' +* Final Actions:: Commands for use in 'dg-final' + + +File: gccint.info, Node: Directives, Next: Selectors, Up: Test Directives + +7.2.1 Syntax and Descriptions of test directives +------------------------------------------------ + +Test directives appear within comments in a test source file and begin +with 'dg-'. Some of these are defined within DejaGnu and others are +local to the GCC testsuite. + + The order in which test directives appear in a test can be important: +directives local to GCC sometimes override information used by the +DejaGnu directives, which know nothing about the GCC directives, so the +DejaGnu directives must precede GCC directives. + + Several test directives include selectors (*note Selectors::) which are +usually preceded by the keyword 'target' or 'xfail'. + +7.2.1.1 Specify how to build the test +..................................... + +'{ dg-do DO-WHAT-KEYWORD [{ target/xfail SELECTOR }] }' + DO-WHAT-KEYWORD specifies how the test is compiled and whether it + is executed. It is one of: + + 'preprocess' + Compile with '-E' to run only the preprocessor. + 'compile' + Compile with '-S' to produce an assembly code file. + 'assemble' + Compile with '-c' to produce a relocatable object file. + 'link' + Compile, assemble, and link to produce an executable file. + 'run' + Produce and run an executable file, which is expected to + return an exit code of 0. + + The default is 'compile'. That can be overridden for a set of + tests by redefining 'dg-do-what-default' within the '.exp' file for + those tests. + + If the directive includes the optional '{ target SELECTOR }' then + the test is skipped unless the target system matches the SELECTOR. + + If DO-WHAT-KEYWORD is 'run' and the directive includes the optional + '{ xfail SELECTOR }' and the selector is met then the test is + expected to fail. The 'xfail' clause is ignored for other values + of DO-WHAT-KEYWORD; those tests can use directive 'dg-xfail-if'. + +7.2.1.2 Specify additional compiler options +........................................... + +'{ dg-options OPTIONS [{ target SELECTOR }] }' + This DejaGnu directive provides a list of compiler options, to be + used if the target system matches SELECTOR, that replace the + default options used for this set of tests. + +'{ dg-add-options FEATURE ... }' + Add any compiler options that are needed to access certain + features. This directive does nothing on targets that enable the + features by default, or that don't provide them at all. It must + come after all 'dg-options' directives. For supported values of + FEATURE see *note Add Options::. + +'{ dg-additional-options OPTIONS [{ target SELECTOR }] }' + This directive provides a list of compiler options, to be used if + the target system matches SELECTOR, that are added to the default + options used for this set of tests. + +7.2.1.3 Modify the test timeout value +..................................... + +The normal timeout limit, in seconds, is found by searching the +following in order: + + * the value defined by an earlier 'dg-timeout' directive in the test + + * variable TOOL_TIMEOUT defined by the set of tests + + * GCC,TIMEOUT set in the target board + + * 300 + +'{ dg-timeout N [{target SELECTOR }] }' + Set the time limit for the compilation and for the execution of the + test to the specified number of seconds. + +'{ dg-timeout-factor X [{ target SELECTOR }] }' + Multiply the normal time limit for compilation and execution of the + test by the specified floating-point factor. + +7.2.1.4 Skip a test for some targets +.................................... + +'{ dg-skip-if COMMENT { SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]] }' + Arguments INCLUDE-OPTS and EXCLUDE-OPTS are lists in which each + element is a string of zero or more GCC options. Skip the test if + all of the following conditions are met: + * the test system is included in SELECTOR + + * for at least one of the option strings in INCLUDE-OPTS, every + option from that string is in the set of options with which + the test would be compiled; use '"*"' for an INCLUDE-OPTS list + that matches any options; that is the default if INCLUDE-OPTS + is not specified + + * for each of the option strings in EXCLUDE-OPTS, at least one + option from that string is not in the set of options with + which the test would be compiled; use '""' for an empty + EXCLUDE-OPTS list; that is the default if EXCLUDE-OPTS is not + specified + + For example, to skip a test if option '-Os' is present: + + /* { dg-skip-if "" { *-*-* } { "-Os" } { "" } } */ + + To skip a test if both options '-O2' and '-g' are present: + + /* { dg-skip-if "" { *-*-* } { "-O2 -g" } { "" } } */ + + To skip a test if either '-O2' or '-O3' is present: + + /* { dg-skip-if "" { *-*-* } { "-O2" "-O3" } { "" } } */ + + To skip a test unless option '-Os' is present: + + /* { dg-skip-if "" { *-*-* } { "*" } { "-Os" } } */ + + To skip a test if either '-O2' or '-O3' is used with '-g' but not + if '-fpic' is also present: + + /* { dg-skip-if "" { *-*-* } { "-O2 -g" "-O3 -g" } { "-fpic" } } */ + +'{ dg-require-effective-target KEYWORD [{ SELECTOR }] }' + Skip the test if the test target, including current multilib flags, + is not covered by the effective-target keyword. If the directive + includes the optional '{ SELECTOR }' then the effective-target test + is only performed if the target system matches the SELECTOR. This + directive must appear after any 'dg-do' directive in the test and + before any 'dg-additional-sources' directive. *Note + Effective-Target Keywords::. + +'{ dg-require-SUPPORT args }' + Skip the test if the target does not provide the required support. + These directives must appear after any 'dg-do' directive in the + test and before any 'dg-additional-sources' directive. They + require at least one argument, which can be an empty string if the + specific procedure does not examine the argument. *Note Require + Support::, for a complete list of these directives. + +7.2.1.5 Expect a test to fail for some targets +.............................................. + +'{ dg-xfail-if COMMENT { SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]] }' + Expect the test to fail if the conditions (which are the same as + for 'dg-skip-if') are met. This does not affect the execute step. + +'{ dg-xfail-run-if COMMENT { SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]] }' + Expect the execute step of a test to fail if the conditions (which + are the same as for 'dg-skip-if') are met. + +7.2.1.6 Expect the test executable to fail +.......................................... + +'{ dg-shouldfail COMMENT [{ SELECTOR } [{ INCLUDE-OPTS } [{ EXCLUDE-OPTS }]]] }' + Expect the test executable to return a nonzero exit status if the + conditions (which are the same as for 'dg-skip-if') are met. + +7.2.1.7 Verify compiler messages +................................ + +'{ dg-error REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }' + This DejaGnu directive appears on a source line that is expected to + get an error message, or else specifies the source line associated + with the message. If there is no message for that line or if the + text of that message is not matched by REGEXP then the check fails + and COMMENT is included in the 'FAIL' message. The check does not + look for the string 'error' unless it is part of REGEXP. + +'{ dg-warning REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }' + This DejaGnu directive appears on a source line that is expected to + get a warning message, or else specifies the source line associated + with the message. If there is no message for that line or if the + text of that message is not matched by REGEXP then the check fails + and COMMENT is included in the 'FAIL' message. The check does not + look for the string 'warning' unless it is part of REGEXP. + +'{ dg-message REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }' + The line is expected to get a message other than an error or + warning. If there is no message for that line or if the text of + that message is not matched by REGEXP then the check fails and + COMMENT is included in the 'FAIL' message. + +'{ dg-bogus REGEXP [COMMENT [{ target/xfail SELECTOR } [LINE] }]] }' + This DejaGnu directive appears on a source line that should not get + a message matching REGEXP, or else specifies the source line + associated with the bogus message. It is usually used with 'xfail' + to indicate that the message is a known problem for a particular + set of targets. + +'{ dg-excess-errors COMMENT [{ target/xfail SELECTOR }] }' + This DejaGnu directive indicates that the test is expected to fail + due to compiler messages that are not handled by 'dg-error', + 'dg-warning' or 'dg-bogus'. For this directive 'xfail' has the + same effect as 'target'. + +'{ dg-prune-output REGEXP }' + Prune messages matching REGEXP from the test output. + +7.2.1.8 Verify output of the test executable +............................................ + +'{ dg-output REGEXP [{ target/xfail SELECTOR }] }' + This DejaGnu directive compares REGEXP to the combined output that + the test executable writes to 'stdout' and 'stderr'. + +7.2.1.9 Specify additional files for a test +........................................... + +'{ dg-additional-files "FILELIST" }' + Specify additional files, other than source files, that must be + copied to the system where the compiler runs. + +'{ dg-additional-sources "FILELIST" }' + Specify additional source files to appear in the compile line + following the main test file. + +7.2.1.10 Add checks at the end of a test +........................................ + +'{ dg-final { LOCAL-DIRECTIVE } }' + This DejaGnu directive is placed within a comment anywhere in the + source file and is processed after the test has been compiled and + run. Multiple 'dg-final' commands are processed in the order in + which they appear in the source file. *Note Final Actions::, for a + list of directives that can be used within 'dg-final'. + + +File: gccint.info, Node: Selectors, Next: Effective-Target Keywords, Prev: Directives, Up: Test Directives + +7.2.2 Selecting targets to which a test applies +----------------------------------------------- + +Several test directives include SELECTORs to limit the targets for which +a test is run or to declare that a test is expected to fail on +particular targets. + + A selector is: + * one or more target triplets, possibly including wildcard + characters; use '*-*-*' to match any target + * a single effective-target keyword (*note Effective-Target + Keywords::) + * a logical expression + + Depending on the context, the selector specifies whether a test is +skipped and reported as unsupported or is expected to fail. A context +that allows either 'target' or 'xfail' also allows '{ target SELECTOR1 +xfail SELECTOR2 }' to skip the test for targets that don't match +SELECTOR1 and the test to fail for targets that match SELECTOR2. + + A selector expression appears within curly braces and uses a single +logical operator: one of '!', '&&', or '||'. An operand is another +selector expression, an effective-target keyword, a single target +triplet, or a list of target triplets within quotes or curly braces. +For example: + + { target { ! "hppa*-*-* ia64*-*-*" } } + { target { powerpc*-*-* && lp64 } } + { xfail { lp64 || vect_no_align } } + + +File: gccint.info, Node: Effective-Target Keywords, Next: Add Options, Prev: Selectors, Up: Test Directives + +7.2.3 Keywords describing target attributes +------------------------------------------- + +Effective-target keywords identify sets of targets that support +particular functionality. They are used to limit tests to be run only +for particular targets, or to specify that particular sets of targets +are expected to fail some tests. + + Effective-target keywords are defined in 'lib/target-supports.exp' in +the GCC testsuite, with the exception of those that are documented as +being local to a particular test directory. + + The 'effective target' takes into account all of the compiler options +with which the test will be compiled, including the multilib options. +By convention, keywords ending in '_nocache' can also include options +specified for the particular test in an earlier 'dg-options' or +'dg-add-options' directive. + +7.2.3.1 Data type sizes +....................... + +'ilp32' + Target has 32-bit 'int', 'long', and pointers. + +'lp64' + Target has 32-bit 'int', 64-bit 'long' and pointers. + +'llp64' + Target has 32-bit 'int' and 'long', 64-bit 'long long' and + pointers. + +'double64' + Target has 64-bit 'double'. + +'double64plus' + Target has 'double' that is 64 bits or longer. + +'int32plus' + Target has 'int' that is at 32 bits or longer. + +'int16' + Target has 'int' that is 16 bits or shorter. + +'long_neq_int' + Target has 'int' and 'long' with different sizes. + +'large_double' + Target supports 'double' that is longer than 'float'. + +'large_long_double' + Target supports 'long double' that is longer than 'double'. + +'ptr32plus' + Target has pointers that are 32 bits or longer. + +'size32plus' + Target supports array and structure sizes that are 32 bits or + longer. + +'4byte_wchar_t' + Target has 'wchar_t' that is at least 4 bytes. + +7.2.3.2 Fortran-specific attributes +................................... + +'fortran_integer_16' + Target supports Fortran 'integer' that is 16 bytes or longer. + +'fortran_large_int' + Target supports Fortran 'integer' kinds larger than 'integer(8)'. + +'fortran_large_real' + Target supports Fortran 'real' kinds larger than 'real(8)'. + +7.2.3.3 Vector-specific attributes +.................................. + +'vect_condition' + Target supports vector conditional operations. + +'vect_double' + Target supports hardware vectors of 'double'. + +'vect_float' + Target supports hardware vectors of 'float'. + +'vect_int' + Target supports hardware vectors of 'int'. + +'vect_long' + Target supports hardware vectors of 'long'. + +'vect_long_long' + Target supports hardware vectors of 'long long'. + +'vect_aligned_arrays' + Target aligns arrays to vector alignment boundary. + +'vect_hw_misalign' + Target supports a vector misalign access. + +'vect_no_align' + Target does not support a vector alignment mechanism. + +'vect_no_int_max' + Target does not support a vector max instruction on 'int'. + +'vect_no_int_add' + Target does not support a vector add instruction on 'int'. + +'vect_no_bitwise' + Target does not support vector bitwise instructions. + +'vect_char_mult' + Target supports 'vector char' multiplication. + +'vect_short_mult' + Target supports 'vector short' multiplication. + +'vect_int_mult' + Target supports 'vector int' multiplication. + +'vect_extract_even_odd' + Target supports vector even/odd element extraction. + +'vect_extract_even_odd_wide' + Target supports vector even/odd element extraction of vectors with + elements 'SImode' or larger. + +'vect_interleave' + Target supports vector interleaving. + +'vect_strided' + Target supports vector interleaving and extract even/odd. + +'vect_strided_wide' + Target supports vector interleaving and extract even/odd for wide + element types. + +'vect_perm' + Target supports vector permutation. + +'vect_shift' + Target supports a hardware vector shift operation. + +'vect_widen_sum_hi_to_si' + Target supports a vector widening summation of 'short' operands + into 'int' results, or can promote (unpack) from 'short' to 'int'. + +'vect_widen_sum_qi_to_hi' + Target supports a vector widening summation of 'char' operands into + 'short' results, or can promote (unpack) from 'char' to 'short'. + +'vect_widen_sum_qi_to_si' + Target supports a vector widening summation of 'char' operands into + 'int' results. + +'vect_widen_mult_qi_to_hi' + Target supports a vector widening multiplication of 'char' operands + into 'short' results, or can promote (unpack) from 'char' to + 'short' and perform non-widening multiplication of 'short'. + +'vect_widen_mult_hi_to_si' + Target supports a vector widening multiplication of 'short' + operands into 'int' results, or can promote (unpack) from 'short' + to 'int' and perform non-widening multiplication of 'int'. + +'vect_widen_mult_si_to_di_pattern' + Target supports a vector widening multiplication of 'int' operands + into 'long' results. + +'vect_sdot_qi' + Target supports a vector dot-product of 'signed char'. + +'vect_udot_qi' + Target supports a vector dot-product of 'unsigned char'. + +'vect_sdot_hi' + Target supports a vector dot-product of 'signed short'. + +'vect_udot_hi' + Target supports a vector dot-product of 'unsigned short'. + +'vect_pack_trunc' + Target supports a vector demotion (packing) of 'short' to 'char' + and from 'int' to 'short' using modulo arithmetic. + +'vect_unpack' + Target supports a vector promotion (unpacking) of 'char' to 'short' + and from 'char' to 'int'. + +'vect_intfloat_cvt' + Target supports conversion from 'signed int' to 'float'. + +'vect_uintfloat_cvt' + Target supports conversion from 'unsigned int' to 'float'. + +'vect_floatint_cvt' + Target supports conversion from 'float' to 'signed int'. + +'vect_floatuint_cvt' + Target supports conversion from 'float' to 'unsigned int'. + +7.2.3.4 Thread Local Storage attributes +....................................... + +'tls' + Target supports thread-local storage. + +'tls_native' + Target supports native (rather than emulated) thread-local storage. + +'tls_runtime' + Test system supports executing TLS executables. + +7.2.3.5 Decimal floating point attributes +......................................... + +'dfp' + Targets supports compiling decimal floating point extension to C. + +'dfp_nocache' + Including the options used to compile this particular test, the + target supports compiling decimal floating point extension to C. + +'dfprt' + Test system can execute decimal floating point tests. + +'dfprt_nocache' + Including the options used to compile this particular test, the + test system can execute decimal floating point tests. + +'hard_dfp' + Target generates decimal floating point instructions with current + options. + +7.2.3.6 ARM-specific attributes +............................... + +'arm32' + ARM target generates 32-bit code. + +'arm_eabi' + ARM target adheres to the ABI for the ARM Architecture. + +'arm_hf_eabi' + ARM target adheres to the VFP and Advanced SIMD Register Arguments + variant of the ABI for the ARM Architecture (as selected with + '-mfloat-abi=hard'). + +'arm_hard_vfp_ok' + ARM target supports '-mfpu=vfp -mfloat-abi=hard'. Some multilibs + may be incompatible with these options. + +'arm_iwmmxt_ok' + ARM target supports '-mcpu=iwmmxt'. Some multilibs may be + incompatible with this option. + +'arm_neon' + ARM target supports generating NEON instructions. + +'arm_neon_hw' + Test system supports executing NEON instructions. + +'arm_neonv2_hw' + Test system supports executing NEON v2 instructions. + +'arm_neon_ok' + ARM Target supports '-mfpu=neon -mfloat-abi=softfp' or compatible + options. Some multilibs may be incompatible with these options. + +'arm_neonv2_ok' + ARM Target supports '-mfpu=neon-vfpv4 -mfloat-abi=softfp' or + compatible options. Some multilibs may be incompatible with these + options. + +'arm_neon_fp16_ok' + ARM Target supports '-mfpu=neon-fp16 -mfloat-abi=softfp' or + compatible options. Some multilibs may be incompatible with these + options. + +'arm_thumb1_ok' + ARM target generates Thumb-1 code for '-mthumb'. + +'arm_thumb2_ok' + ARM target generates Thumb-2 code for '-mthumb'. + +'arm_vfp_ok' + ARM target supports '-mfpu=vfp -mfloat-abi=softfp'. Some multilibs + may be incompatible with these options. + +'arm_vfp3_ok' + ARM target supports '-mfpu=vfp3 -mfloat-abi=softfp'. Some + multilibs may be incompatible with these options. + +'arm_v8_vfp_ok' + ARM target supports '-mfpu=fp-armv8 -mfloat-abi=softfp'. Some + multilibs may be incompatible with these options. + +'arm_v8_neon_ok' + ARM target supports '-mfpu=neon-fp-armv8 -mfloat-abi=softfp'. Some + multilibs may be incompatible with these options. + +'arm_prefer_ldrd_strd' + ARM target prefers 'LDRD' and 'STRD' instructions over 'LDM' and + 'STM' instructions. + +7.2.3.7 MIPS-specific attributes +................................ + +'mips64' + MIPS target supports 64-bit instructions. + +'nomips16' + MIPS target does not produce MIPS16 code. + +'mips16_attribute' + MIPS target can generate MIPS16 code. + +'mips_loongson' + MIPS target is a Loongson-2E or -2F target using an ABI that + supports the Loongson vector modes. + +'mips_newabi_large_long_double' + MIPS target supports 'long double' larger than 'double' when using + the new ABI. + +'mpaired_single' + MIPS target supports '-mpaired-single'. + +7.2.3.8 PowerPC-specific attributes +................................... + +'powerpc64' + Test system supports executing 64-bit instructions. + +'powerpc_altivec' + PowerPC target supports AltiVec. + +'powerpc_altivec_ok' + PowerPC target supports '-maltivec'. + +'powerpc_fprs' + PowerPC target supports floating-point registers. + +'powerpc_hard_double' + PowerPC target supports hardware double-precision floating-point. + +'powerpc_ppu_ok' + PowerPC target supports '-mcpu=cell'. + +'powerpc_spe' + PowerPC target supports PowerPC SPE. + +'powerpc_spe_nocache' + Including the options used to compile this particular test, the + PowerPC target supports PowerPC SPE. + +'powerpc_spu' + PowerPC target supports PowerPC SPU. + +'spu_auto_overlay' + SPU target has toolchain that supports automatic overlay + generation. + +'powerpc_vsx_ok' + PowerPC target supports '-mvsx'. + +'powerpc_405_nocache' + Including the options used to compile this particular test, the + PowerPC target supports PowerPC 405. + +'vmx_hw' + PowerPC target supports executing AltiVec instructions. + +7.2.3.9 Other hardware attributes +................................. + +'avx' + Target supports compiling 'avx' instructions. + +'avx_runtime' + Target supports the execution of 'avx' instructions. + +'cell_hw' + Test system can execute AltiVec and Cell PPU instructions. + +'coldfire_fpu' + Target uses a ColdFire FPU. + +'hard_float' + Target supports FPU instructions. + +'sse' + Target supports compiling 'sse' instructions. + +'sse_runtime' + Target supports the execution of 'sse' instructions. + +'sse2' + Target supports compiling 'sse2' instructions. + +'sse2_runtime' + Target supports the execution of 'sse2' instructions. + +'sync_char_short' + Target supports atomic operations on 'char' and 'short'. + +'sync_int_long' + Target supports atomic operations on 'int' and 'long'. + +'ultrasparc_hw' + Test environment appears to run executables on a simulator that + accepts only 'EM_SPARC' executables and chokes on 'EM_SPARC32PLUS' + or 'EM_SPARCV9' executables. + +'vect_cmdline_needed' + Target requires a command line argument to enable a SIMD + instruction set. + +7.2.3.10 Environment attributes +............................... + +'c' + The language for the compiler under test is C. + +'c++' + The language for the compiler under test is C++. + +'c99_runtime' + Target provides a full C99 runtime. + +'correct_iso_cpp_string_wchar_protos' + Target 'string.h' and 'wchar.h' headers provide C++ required + overloads for 'strchr' etc. functions. + +'dummy_wcsftime' + Target uses a dummy 'wcsftime' function that always returns zero. + +'fd_truncate' + Target can truncate a file from a file descriptor, as used by + 'libgfortran/io/unix.c:fd_truncate'; i.e. 'ftruncate' or 'chsize'. + +'freestanding' + Target is 'freestanding' as defined in section 4 of the C99 + standard. Effectively, it is a target which supports no extra + headers or libraries other than what is considered essential. + +'init_priority' + Target supports constructors with initialization priority + arguments. + +'inttypes_types' + Target has the basic signed and unsigned types in 'inttypes.h'. + This is for tests that GCC's notions of these types agree with + those in the header, as some systems have only 'inttypes.h'. + +'lax_strtofp' + Target might have errors of a few ULP in string to floating-point + conversion functions and overflow is not always detected correctly + by those functions. + +'mmap' + Target supports 'mmap'. + +'newlib' + Target supports Newlib. + +'pow10' + Target provides 'pow10' function. + +'pthread' + Target can compile using 'pthread.h' with no errors or warnings. + +'pthread_h' + Target has 'pthread.h'. + +'run_expensive_tests' + Expensive testcases (usually those that consume excessive amounts + of CPU time) should be run on this target. This can be enabled by + setting the 'GCC_TEST_RUN_EXPENSIVE' environment variable to a + non-empty string. + +'simulator' + Test system runs executables on a simulator (i.e. slowly) rather + than hardware (i.e. fast). + +'stdint_types' + Target has the basic signed and unsigned C types in 'stdint.h'. + This will be obsolete when GCC ensures a working 'stdint.h' for all + targets. + +'trampolines' + Target supports trampolines. + +'uclibc' + Target supports uClibc. + +'unwrapped' + Target does not use a status wrapper. + +'vxworks_kernel' + Target is a VxWorks kernel. + +'vxworks_rtp' + Target is a VxWorks RTP. + +'wchar' + Target supports wide characters. + +7.2.3.11 Other attributes +......................... + +'automatic_stack_alignment' + Target supports automatic stack alignment. + +'cxa_atexit' + Target uses '__cxa_atexit'. + +'default_packed' + Target has packed layout of structure members by default. + +'fgraphite' + Target supports Graphite optimizations. + +'fixed_point' + Target supports fixed-point extension to C. + +'fopenmp' + Target supports OpenMP via '-fopenmp'. + +'fpic' + Target supports '-fpic' and '-fPIC'. + +'freorder' + Target supports '-freorder-blocks-and-partition'. + +'fstack_protector' + Target supports '-fstack-protector'. + +'gas' + Target uses GNU 'as'. + +'gc_sections' + Target supports '--gc-sections'. + +'gld' + Target uses GNU 'ld'. + +'keeps_null_pointer_checks' + Target keeps null pointer checks, either due to the use of + '-fno-delete-null-pointer-checks' or hardwired into the target. + +'lto' + Compiler has been configured to support link-time optimization + (LTO). + +'naked_functions' + Target supports the 'naked' function attribute. + +'named_sections' + Target supports named sections. + +'natural_alignment_32' + Target uses natural alignment (aligned to type size) for types of + 32 bits or less. + +'target_natural_alignment_64' + Target uses natural alignment (aligned to type size) for types of + 64 bits or less. + +'nonpic' + Target does not generate PIC by default. + +'pcc_bitfield_type_matters' + Target defines 'PCC_BITFIELD_TYPE_MATTERS'. + +'pe_aligned_commons' + Target supports '-mpe-aligned-commons'. + +'pie' + Target supports '-pie', '-fpie' and '-fPIE'. + +'section_anchors' + Target supports section anchors. + +'short_enums' + Target defaults to short enums. + +'static' + Target supports '-static'. + +'static_libgfortran' + Target supports statically linking 'libgfortran'. + +'string_merging' + Target supports merging string constants at link time. + +'ucn' + Target supports compiling and assembling UCN. + +'ucn_nocache' + Including the options used to compile this particular test, the + target supports compiling and assembling UCN. + +'unaligned_stack' + Target does not guarantee that its 'STACK_BOUNDARY' is greater than + or equal to the required vector alignment. + +'vector_alignment_reachable' + Vector alignment is reachable for types of 32 bits or less. + +'vector_alignment_reachable_for_64bit' + Vector alignment is reachable for types of 64 bits or less. + +'wchar_t_char16_t_compatible' + Target supports 'wchar_t' that is compatible with 'char16_t'. + +'wchar_t_char32_t_compatible' + Target supports 'wchar_t' that is compatible with 'char32_t'. + +7.2.3.12 Local to tests in 'gcc.target/i386' +............................................ + +'3dnow' + Target supports compiling '3dnow' instructions. + +'aes' + Target supports compiling 'aes' instructions. + +'fma4' + Target supports compiling 'fma4' instructions. + +'ms_hook_prologue' + Target supports attribute 'ms_hook_prologue'. + +'pclmul' + Target supports compiling 'pclmul' instructions. + +'sse3' + Target supports compiling 'sse3' instructions. + +'sse4' + Target supports compiling 'sse4' instructions. + +'sse4a' + Target supports compiling 'sse4a' instructions. + +'ssse3' + Target supports compiling 'ssse3' instructions. + +'vaes' + Target supports compiling 'vaes' instructions. + +'vpclmul' + Target supports compiling 'vpclmul' instructions. + +'xop' + Target supports compiling 'xop' instructions. + +7.2.3.13 Local to tests in 'gcc.target/spu/ea' +.............................................. + +'ealib' + Target '__ea' library functions are available. + +7.2.3.14 Local to tests in 'gcc.test-framework' +............................................... + +'no' + Always returns 0. + +'yes' + Always returns 1. + + +File: gccint.info, Node: Add Options, Next: Require Support, Prev: Effective-Target Keywords, Up: Test Directives + +7.2.4 Features for 'dg-add-options' +----------------------------------- + +The supported values of FEATURE for directive 'dg-add-options' are: + +'arm_neon' + NEON support. Only ARM targets support this feature, and only then + in certain modes; see the *note arm_neon_ok effective target + keyword: arm_neon_ok. + +'arm_neon_fp16' + NEON and half-precision floating point support. Only ARM targets + support this feature, and only then in certain modes; see the *note + arm_neon_fp16_ok effective target keyword: arm_neon_ok. + +'arm_vfp3' + arm vfp3 floating point support; see the *note arm_vfp3_ok + effective target keyword: arm_vfp3_ok. + +'bind_pic_locally' + Add the target-specific flags needed to enable functions to bind + locally when using pic/PIC passes in the testsuite. + +'c99_runtime' + Add the target-specific flags needed to access the C99 runtime. + +'ieee' + Add the target-specific flags needed to enable full IEEE compliance + mode. + +'mips16_attribute' + 'mips16' function attributes. Only MIPS targets support this + feature, and only then in certain modes. + +'tls' + Add the target-specific flags needed to use thread-local storage. + + +File: gccint.info, Node: Require Support, Next: Final Actions, Prev: Add Options, Up: Test Directives + +7.2.5 Variants of 'dg-require-SUPPORT' +-------------------------------------- + +A few of the 'dg-require' directives take arguments. + +'dg-require-iconv CODESET' + Skip the test if the target does not support iconv. CODESET is the + codeset to convert to. + +'dg-require-profiling PROFOPT' + Skip the test if the target does not support profiling with option + PROFOPT. + +'dg-require-visibility VIS' + Skip the test if the target does not support the 'visibility' + attribute. If VIS is '""', support for 'visibility("hidden")' is + checked, for 'visibility("VIS")' otherwise. + + The original 'dg-require' directives were defined before there was +support for effective-target keywords. The directives that do not take +arguments could be replaced with effective-target keywords. + +'dg-require-alias ""' + Skip the test if the target does not support the 'alias' attribute. + +'dg-require-ascii-locale ""' + Skip the test if the host does not support an ASCII locale. + +'dg-require-compat-dfp ""' + Skip this test unless both compilers in a 'compat' testsuite + support decimal floating point. + +'dg-require-cxa-atexit ""' + Skip the test if the target does not support '__cxa_atexit'. This + is equivalent to 'dg-require-effective-target cxa_atexit'. + +'dg-require-dll ""' + Skip the test if the target does not support DLL attributes. + +'dg-require-fork ""' + Skip the test if the target does not support 'fork'. + +'dg-require-gc-sections ""' + Skip the test if the target's linker does not support the + '--gc-sections' flags. This is equivalent to + 'dg-require-effective-target gc-sections'. + +'dg-require-host-local ""' + Skip the test if the host is remote, rather than the same as the + build system. Some tests are incompatible with DejaGnu's handling + of remote hosts, which involves copying the source file to the host + and compiling it with a relative path and "'-o a.out'". + +'dg-require-mkfifo ""' + Skip the test if the target does not support 'mkfifo'. + +'dg-require-named-sections ""' + Skip the test is the target does not support named sections. This + is equivalent to 'dg-require-effective-target named_sections'. + +'dg-require-weak ""' + Skip the test if the target does not support weak symbols. + +'dg-require-weak-override ""' + Skip the test if the target does not support overriding weak + symbols. + + +File: gccint.info, Node: Final Actions, Prev: Require Support, Up: Test Directives + +7.2.6 Commands for use in 'dg-final' +------------------------------------ + +The GCC testsuite defines the following directives to be used within +'dg-final'. + +7.2.6.1 Scan a particular file +.............................. + +'scan-file FILENAME REGEXP [{ target/xfail SELECTOR }]' + Passes if REGEXP matches text in FILENAME. +'scan-file-not FILENAME REGEXP [{ target/xfail SELECTOR }]' + Passes if REGEXP does not match text in FILENAME. +'scan-module MODULE REGEXP [{ target/xfail SELECTOR }]' + Passes if REGEXP matches in Fortran module MODULE. + +7.2.6.2 Scan the assembly output +................................ + +'scan-assembler REGEX [{ target/xfail SELECTOR }]' + Passes if REGEX matches text in the test's assembler output. + +'scan-assembler-not REGEX [{ target/xfail SELECTOR }]' + Passes if REGEX does not match text in the test's assembler output. + +'scan-assembler-times REGEX NUM [{ target/xfail SELECTOR }]' + Passes if REGEX is matched exactly NUM times in the test's + assembler output. + +'scan-assembler-dem REGEX [{ target/xfail SELECTOR }]' + Passes if REGEX matches text in the test's demangled assembler + output. + +'scan-assembler-dem-not REGEX [{ target/xfail SELECTOR }]' + Passes if REGEX does not match text in the test's demangled + assembler output. + +'scan-hidden SYMBOL [{ target/xfail SELECTOR }]' + Passes if SYMBOL is defined as a hidden symbol in the test's + assembly output. + +'scan-not-hidden SYMBOL [{ target/xfail SELECTOR }]' + Passes if SYMBOL is not defined as a hidden symbol in the test's + assembly output. + +7.2.6.3 Scan optimization dump files +.................................... + +These commands are available for KIND of 'tree', 'rtl', and 'ipa'. + +'scan-KIND-dump REGEX SUFFIX [{ target/xfail SELECTOR }]' + Passes if REGEX matches text in the dump file with suffix SUFFIX. + +'scan-KIND-dump-not REGEX SUFFIX [{ target/xfail SELECTOR }]' + Passes if REGEX does not match text in the dump file with suffix + SUFFIX. + +'scan-KIND-dump-times REGEX NUM SUFFIX [{ target/xfail SELECTOR }]' + Passes if REGEX is found exactly NUM times in the dump file with + suffix SUFFIX. + +'scan-KIND-dump-dem REGEX SUFFIX [{ target/xfail SELECTOR }]' + Passes if REGEX matches demangled text in the dump file with suffix + SUFFIX. + +'scan-KIND-dump-dem-not REGEX SUFFIX [{ target/xfail SELECTOR }]' + Passes if REGEX does not match demangled text in the dump file with + suffix SUFFIX. + +7.2.6.4 Verify that an output files exists or not +................................................. + +'output-exists [{ target/xfail SELECTOR }]' + Passes if compiler output file exists. + +'output-exists-not [{ target/xfail SELECTOR }]' + Passes if compiler output file does not exist. + +7.2.6.5 Check for LTO tests +........................... + +'scan-symbol REGEXP [{ target/xfail SELECTOR }]' + Passes if the pattern is present in the final executable. + +7.2.6.6 Checks for 'gcov' tests +............................... + +'run-gcov SOURCEFILE' + Check line counts in 'gcov' tests. + +'run-gcov [branches] [calls] { OPTS SOURCEFILE }' + Check branch and/or call counts, in addition to line counts, in + 'gcov' tests. + +7.2.6.7 Clean up generated test files +..................................... + +'cleanup-coverage-files' + Removes coverage data files generated for this test. + +'cleanup-ipa-dump SUFFIX' + Removes IPA dump files generated for this test. + +'cleanup-modules "LIST-OF-EXTRA-MODULES"' + Removes Fortran module files generated for this test, excluding the + module names listed in keep-modules. Cleaning up module files is + usually done automatically by the testsuite by looking at the + source files and removing the modules after the test has been + executed. + module MoD1 + end module MoD1 + module Mod2 + end module Mod2 + module moD3 + end module moD3 + module mod4 + end module mod4 + ! { dg-final { cleanup-modules "mod1 mod2" } } ! redundant + ! { dg-final { keep-modules "mod3 mod4" } } + +'keep-modules "LIST-OF-MODULES-NOT-TO-DELETE"' + Whitespace separated list of module names that should not be + deleted by cleanup-modules. If the list of modules is empty, all + modules defined in this file are kept. + module maybe_unneeded + end module maybe_unneeded + module keep1 + end module keep1 + module keep2 + end module keep2 + ! { dg-final { keep-modules "keep1 keep2" } } ! just keep these two + ! { dg-final { keep-modules "" } } ! keep all + +'cleanup-profile-file' + Removes profiling files generated for this test. + +'cleanup-repo-files' + Removes files generated for this test for '-frepo'. + +'cleanup-rtl-dump SUFFIX' + Removes RTL dump files generated for this test. + +'cleanup-saved-temps' + Removes files for the current test which were kept for + '-save-temps'. + +'cleanup-tree-dump SUFFIX' + Removes tree dump files matching SUFFIX which were generated for + this test. + + +File: gccint.info, Node: Ada Tests, Next: C Tests, Prev: Test Directives, Up: Testsuites + +7.3 Ada Language Testsuites +=========================== + +The Ada testsuite includes executable tests from the ACATS testsuite, +publicly available at <http://www.ada-auth.org/acats.html>. + + These tests are integrated in the GCC testsuite in the 'ada/acats' +directory, and enabled automatically when running 'make check', assuming +the Ada language has been enabled when configuring GCC. + + You can also run the Ada testsuite independently, using 'make +check-ada', or run a subset of the tests by specifying which chapter to +run, e.g.: + + $ make check-ada CHAPTERS="c3 c9" + + The tests are organized by directory, each directory corresponding to a +chapter of the Ada Reference Manual. So for example, 'c9' corresponds +to chapter 9, which deals with tasking features of the language. + + There is also an extra chapter called 'gcc' containing a template for +creating new executable tests, although this is deprecated in favor of +the 'gnat.dg' testsuite. + + The tests are run using two 'sh' scripts: 'run_acats' and 'run_all.sh'. +To run the tests using a simulator or a cross target, see the small +customization section at the top of 'run_all.sh'. + + These tests are run using the build tree: they can be run without doing +a 'make install'. + + +File: gccint.info, Node: C Tests, Next: libgcj Tests, Prev: Ada Tests, Up: Testsuites + +7.4 C Language Testsuites +========================= + +GCC contains the following C language testsuites, in the 'gcc/testsuite' +directory: + +'gcc.dg' + This contains tests of particular features of the C compiler, using + the more modern 'dg' harness. Correctness tests for various + compiler features should go here if possible. + + Magic comments determine whether the file is preprocessed, + compiled, linked or run. In these tests, error and warning message + texts are compared against expected texts or regular expressions + given in comments. These tests are run with the options '-ansi + -pedantic' unless other options are given in the test. Except as + noted below they are not run with multiple optimization options. +'gcc.dg/compat' + This subdirectory contains tests for binary compatibility using + 'lib/compat.exp', which in turn uses the language-independent + support (*note Support for testing binary compatibility: compat + Testing.). +'gcc.dg/cpp' + This subdirectory contains tests of the preprocessor. +'gcc.dg/debug' + This subdirectory contains tests for debug formats. Tests in this + subdirectory are run for each debug format that the compiler + supports. +'gcc.dg/format' + This subdirectory contains tests of the '-Wformat' format checking. + Tests in this directory are run with and without '-DWIDE'. +'gcc.dg/noncompile' + This subdirectory contains tests of code that should not compile + and does not need any special compilation options. They are run + with multiple optimization options, since sometimes invalid code + crashes the compiler with optimization. +'gcc.dg/special' + FIXME: describe this. + +'gcc.c-torture' + This contains particular code fragments which have historically + broken easily. These tests are run with multiple optimization + options, so tests for features which only break at some + optimization levels belong here. This also contains tests to check + that certain optimizations occur. It might be worthwhile to + separate the correctness tests cleanly from the code quality tests, + but it hasn't been done yet. + +'gcc.c-torture/compat' + FIXME: describe this. + + This directory should probably not be used for new tests. +'gcc.c-torture/compile' + This testsuite contains test cases that should compile, but do not + need to link or run. These test cases are compiled with several + different combinations of optimization options. All warnings are + disabled for these test cases, so this directory is not suitable if + you wish to test for the presence or absence of compiler warnings. + While special options can be set, and tests disabled on specific + platforms, by the use of '.x' files, mostly these test cases should + not contain platform dependencies. FIXME: discuss how defines such + as 'NO_LABEL_VALUES' and 'STACK_SIZE' are used. +'gcc.c-torture/execute' + This testsuite contains test cases that should compile, link and + run; otherwise the same comments as for 'gcc.c-torture/compile' + apply. +'gcc.c-torture/execute/ieee' + This contains tests which are specific to IEEE floating point. +'gcc.c-torture/unsorted' + FIXME: describe this. + + This directory should probably not be used for new tests. +'gcc.misc-tests' + This directory contains C tests that require special handling. + Some of these tests have individual expect files, and others share + special-purpose expect files: + + 'bprob*.c' + Test '-fbranch-probabilities' using + 'gcc.misc-tests/bprob.exp', which in turn uses the generic, + language-independent framework (*note Support for testing + profile-directed optimizations: profopt Testing.). + + 'gcov*.c' + Test 'gcov' output using 'gcov.exp', which in turn uses the + language-independent support (*note Support for testing gcov: + gcov Testing.). + + 'i386-pf-*.c' + Test i386-specific support for data prefetch using + 'i386-prefetch.exp'. + +'gcc.test-framework' + 'dg-*.c' + Test the testsuite itself using + 'gcc.test-framework/test-framework.exp'. + + FIXME: merge in 'testsuite/README.gcc' and discuss the format of test +cases and magic comments more. + + +File: gccint.info, Node: libgcj Tests, Next: LTO Testing, Prev: C Tests, Up: Testsuites + +7.5 The Java library testsuites. +================================ + +Runtime tests are executed via 'make check' in the +'TARGET/libjava/testsuite' directory in the build tree. Additional +runtime tests can be checked into this testsuite. + + Regression testing of the core packages in libgcj is also covered by +the Mauve testsuite. The Mauve Project develops tests for the Java +Class Libraries. These tests are run as part of libgcj testing by +placing the Mauve tree within the libjava testsuite sources at +'libjava/testsuite/libjava.mauve/mauve', or by specifying the location +of that tree when invoking 'make', as in 'make MAUVEDIR=~/mauve check'. + + To detect regressions, a mechanism in 'mauve.exp' compares the failures +for a test run against the list of expected failures in +'libjava/testsuite/libjava.mauve/xfails' from the source hierarchy. +Update this file when adding new failing tests to Mauve, or when fixing +bugs in libgcj that had caused Mauve test failures. + + We encourage developers to contribute test cases to Mauve. + + +File: gccint.info, Node: LTO Testing, Next: gcov Testing, Prev: libgcj Tests, Up: Testsuites + +7.6 Support for testing link-time optimizations +=============================================== + +Tests for link-time optimizations usually require multiple source files +that are compiled separately, perhaps with different sets of options. +There are several special-purpose test directives used for these tests. + +'{ dg-lto-do DO-WHAT-KEYWORD }' + DO-WHAT-KEYWORD specifies how the test is compiled and whether it + is executed. It is one of: + + 'assemble' + Compile with '-c' to produce a relocatable object file. + 'link' + Compile, assemble, and link to produce an executable file. + 'run' + Produce and run an executable file, which is expected to + return an exit code of 0. + + The default is 'assemble'. That can be overridden for a set of + tests by redefining 'dg-do-what-default' within the '.exp' file for + those tests. + + Unlike 'dg-do', 'dg-lto-do' does not support an optional 'target' + or 'xfail' list. Use 'dg-skip-if', 'dg-xfail-if', or + 'dg-xfail-run-if'. + +'{ dg-lto-options { { OPTIONS } [{ OPTIONS }] } [{ target SELECTOR }]}' + This directive provides a list of one or more sets of compiler + options to override LTO_OPTIONS. Each test will be compiled and + run with each of these sets of options. + +'{ dg-extra-ld-options OPTIONS [{ target SELECTOR }]}' + This directive adds OPTIONS to the linker options used. + +'{ dg-suppress-ld-options OPTIONS [{ target SELECTOR }]}' + This directive removes OPTIONS from the set of linker options used. + + +File: gccint.info, Node: gcov Testing, Next: profopt Testing, Prev: LTO Testing, Up: Testsuites + +7.7 Support for testing 'gcov' +============================== + +Language-independent support for testing 'gcov', and for checking that +branch profiling produces expected values, is provided by the expect +file 'lib/gcov.exp'. 'gcov' tests also rely on procedures in +'lib/gcc-dg.exp' to compile and run the test program. A typical 'gcov' +test contains the following DejaGnu commands within comments: + + { dg-options "-fprofile-arcs -ftest-coverage" } + { dg-do run { target native } } + { dg-final { run-gcov sourcefile } } + + Checks of 'gcov' output can include line counts, branch percentages, +and call return percentages. All of these checks are requested via +commands that appear in comments in the test's source file. Commands to +check line counts are processed by default. Commands to check branch +percentages and call return percentages are processed if the 'run-gcov' +command has arguments 'branches' or 'calls', respectively. For example, +the following specifies checking both, as well as passing '-b' to +'gcov': + + { dg-final { run-gcov branches calls { -b sourcefile } } } + + A line count command appears within a comment on the source line that +is expected to get the specified count and has the form 'count(CNT)'. A +test should only check line counts for lines that will get the same +count for any architecture. + + Commands to check branch percentages ('branch') and call return +percentages ('returns') are very similar to each other. A beginning +command appears on or before the first of a range of lines that will +report the percentage, and the ending command follows that range of +lines. The beginning command can include a list of percentages, all of +which are expected to be found within the range. A range is terminated +by the next command of the same kind. A command 'branch(end)' or +'returns(end)' marks the end of a range without starting a new one. For +example: + + if (i > 10 && j > i && j < 20) /* branch(27 50 75) */ + /* branch(end) */ + foo (i, j); + + For a call return percentage, the value specified is the percentage of +calls reported to return. For a branch percentage, the value is either +the expected percentage or 100 minus that value, since the direction of +a branch can differ depending on the target or the optimization level. + + Not all branches and calls need to be checked. A test should not check +for branches that might be optimized away or replaced with predicated +instructions. Don't check for calls inserted by the compiler or ones +that might be inlined or optimized away. + + A single test can check for combinations of line counts, branch +percentages, and call return percentages. The command to check a line +count must appear on the line that will report that count, but commands +to check branch percentages and call return percentages can bracket the +lines that report them. + + +File: gccint.info, Node: profopt Testing, Next: compat Testing, Prev: gcov Testing, Up: Testsuites + +7.8 Support for testing profile-directed optimizations +====================================================== + +The file 'profopt.exp' provides language-independent support for +checking correct execution of a test built with profile-directed +optimization. This testing requires that a test program be built and +executed twice. The first time it is compiled to generate profile data, +and the second time it is compiled to use the data that was generated +during the first execution. The second execution is to verify that the +test produces the expected results. + + To check that the optimization actually generated better code, a test +can be built and run a third time with normal optimizations to verify +that the performance is better with the profile-directed optimizations. +'profopt.exp' has the beginnings of this kind of support. + + 'profopt.exp' provides generic support for profile-directed +optimizations. Each set of tests that uses it provides information +about a specific optimization: + +'tool' + tool being tested, e.g., 'gcc' + +'profile_option' + options used to generate profile data + +'feedback_option' + options used to optimize using that profile data + +'prof_ext' + suffix of profile data files + +'PROFOPT_OPTIONS' + list of options with which to run each test, similar to the lists + for torture tests + +'{ dg-final-generate { LOCAL-DIRECTIVE } }' + This directive is similar to 'dg-final', but the LOCAL-DIRECTIVE is + run after the generation of profile data. + +'{ dg-final-use { LOCAL-DIRECTIVE } }' + The LOCAL-DIRECTIVE is run after the profile data have been used. + + +File: gccint.info, Node: compat Testing, Next: Torture Tests, Prev: profopt Testing, Up: Testsuites + +7.9 Support for testing binary compatibility +============================================ + +The file 'compat.exp' provides language-independent support for binary +compatibility testing. It supports testing interoperability of two +compilers that follow the same ABI, or of multiple sets of compiler +options that should not affect binary compatibility. It is intended to +be used for testsuites that complement ABI testsuites. + + A test supported by this framework has three parts, each in a separate +source file: a main program and two pieces that interact with each other +to split up the functionality being tested. + +'TESTNAME_main.SUFFIX' + Contains the main program, which calls a function in file + 'TESTNAME_x.SUFFIX'. + +'TESTNAME_x.SUFFIX' + Contains at least one call to a function in 'TESTNAME_y.SUFFIX'. + +'TESTNAME_y.SUFFIX' + Shares data with, or gets arguments from, 'TESTNAME_x.SUFFIX'. + + Within each test, the main program and one functional piece are +compiled by the GCC under test. The other piece can be compiled by an +alternate compiler. If no alternate compiler is specified, then all +three source files are all compiled by the GCC under test. You can +specify pairs of sets of compiler options. The first element of such a +pair specifies options used with the GCC under test, and the second +element of the pair specifies options used with the alternate compiler. +Each test is compiled with each pair of options. + + 'compat.exp' defines default pairs of compiler options. These can be +overridden by defining the environment variable 'COMPAT_OPTIONS' as: + + COMPAT_OPTIONS="[list [list {TST1} {ALT1}] + ...[list {TSTN} {ALTN}]]" + + where TSTI and ALTI are lists of options, with TSTI used by the +compiler under test and ALTI used by the alternate compiler. For +example, with '[list [list {-g -O0} {-O3}] [list {-fpic} {-fPIC -O2}]]', +the test is first built with '-g -O0' by the compiler under test and +with '-O3' by the alternate compiler. The test is built a second time +using '-fpic' by the compiler under test and '-fPIC -O2' by the +alternate compiler. + + An alternate compiler is specified by defining an environment variable +to be the full pathname of an installed compiler; for C define +'ALT_CC_UNDER_TEST', and for C++ define 'ALT_CXX_UNDER_TEST'. These +will be written to the 'site.exp' file used by DejaGnu. The default is +to build each test with the compiler under test using the first of each +pair of compiler options from 'COMPAT_OPTIONS'. When +'ALT_CC_UNDER_TEST' or 'ALT_CXX_UNDER_TEST' is 'same', each test is +built using the compiler under test but with combinations of the options +from 'COMPAT_OPTIONS'. + + To run only the C++ compatibility suite using the compiler under test +and another version of GCC using specific compiler options, do the +following from 'OBJDIR/gcc': + + rm site.exp + make -k \ + ALT_CXX_UNDER_TEST=${alt_prefix}/bin/g++ \ + COMPAT_OPTIONS="LISTS AS SHOWN ABOVE" \ + check-c++ \ + RUNTESTFLAGS="compat.exp" + + A test that fails when the source files are compiled with different +compilers, but passes when the files are compiled with the same +compiler, demonstrates incompatibility of the generated code or runtime +support. A test that fails for the alternate compiler but passes for +the compiler under test probably tests for a bug that was fixed in the +compiler under test but is present in the alternate compiler. + + The binary compatibility tests support a small number of test framework +commands that appear within comments in a test file. + +'dg-require-*' + These commands can be used in 'TESTNAME_main.SUFFIX' to skip the + test if specific support is not available on the target. + +'dg-options' + The specified options are used for compiling this particular source + file, appended to the options from 'COMPAT_OPTIONS'. When this + command appears in 'TESTNAME_main.SUFFIX' the options are also used + to link the test program. + +'dg-xfail-if' + This command can be used in a secondary source file to specify that + compilation is expected to fail for particular options on + particular targets. + + +File: gccint.info, Node: Torture Tests, Prev: compat Testing, Up: Testsuites + +7.10 Support for torture testing using multiple options +======================================================= + +Throughout the compiler testsuite there are several directories whose +tests are run multiple times, each with a different set of options. +These are known as torture tests. 'lib/torture-options.exp' defines +procedures to set up these lists: + +'torture-init' + Initialize use of torture lists. +'set-torture-options' + Set lists of torture options to use for tests with and without + loops. Optionally combine a set of torture options with a set of + other options, as is done with Objective-C runtime options. +'torture-finish' + Finalize use of torture lists. + + The '.exp' file for a set of tests that use torture options must +include calls to these three procedures if: + + * It calls 'gcc-dg-runtest' and overrides DG_TORTURE_OPTIONS. + + * It calls ${TOOL}'-torture' or ${TOOL}'-torture-execute', where TOOL + is 'c', 'fortran', or 'objc'. + + * It calls 'dg-pch'. + + It is not necessary for a '.exp' file that calls 'gcc-dg-runtest' to +call the torture procedures if the tests should use the list in +DG_TORTURE_OPTIONS defined in 'gcc-dg.exp'. + + Most uses of torture options can override the default lists by defining +TORTURE_OPTIONS or add to the default list by defining +ADDITIONAL_TORTURE_OPTIONS. Define these in a '.dejagnurc' file or add +them to the 'site.exp' file; for example + + set ADDITIONAL_TORTURE_OPTIONS [list \ + { -O2 -ftree-loop-linear } \ + { -O2 -fpeel-loops } ] + + +File: gccint.info, Node: Options, Next: Passes, Prev: Testsuites, Up: Top + +8 Option specification files +**************************** + +Most GCC command-line options are described by special option definition +files, the names of which conventionally end in '.opt'. This chapter +describes the format of these files. + +* Menu: + +* Option file format:: The general layout of the files +* Option properties:: Supported option properties + + +File: gccint.info, Node: Option file format, Next: Option properties, Up: Options + +8.1 Option file format +====================== + +Option files are a simple list of records in which each field occupies +its own line and in which the records themselves are separated by blank +lines. Comments may appear on their own line anywhere within the file +and are preceded by semicolons. Whitespace is allowed before the +semicolon. + + The files can contain the following types of record: + + * A language definition record. These records have two fields: the + string 'Language' and the name of the language. Once a language + has been declared in this way, it can be used as an option + property. *Note Option properties::. + + * A target specific save record to save additional information. + These records have two fields: the string 'TargetSave', and a + declaration type to go in the 'cl_target_option' structure. + + * A variable record to define a variable used to store option + information. These records have two fields: the string 'Variable', + and a declaration of the type and name of the variable, optionally + with an initializer (but without any trailing ';'). These records + may be used for variables used for many options where declaring the + initializer in a single option definition record, or duplicating it + in many records, would be inappropriate, or for variables set in + option handlers rather than referenced by 'Var' properties. + + * A variable record to define a variable used to store option + information. These records have two fields: the string + 'TargetVariable', and a declaration of the type and name of the + variable, optionally with an initializer (but without any trailing + ';'). 'TargetVariable' is a combination of 'Variable' and + 'TargetSave' records in that the variable is defined in the + 'gcc_options' structure, but these variables are also stored in the + 'cl_target_option' structure. The variables are saved in the + target save code and restored in the target restore code. + + * A variable record to record any additional files that the + 'options.h' file should include. This is useful to provide + enumeration or structure definitions needed for target variables. + These records have two fields: the string 'HeaderInclude' and the + name of the include file. + + * A variable record to record any additional files that the + 'options.c' or 'options-save.c' file should include. This is + useful to provide inline functions needed for target variables + and/or '#ifdef' sequences to properly set up the initialization. + These records have two fields: the string 'SourceInclude' and the + name of the include file. + + * An enumeration record to define a set of strings that may be used + as arguments to an option or options. These records have three + fields: the string 'Enum', a space-separated list of properties and + help text used to describe the set of strings in '--help' output. + Properties use the same format as option properties; the following + are valid: + 'Name(NAME)' + This property is required; NAME must be a name (suitable for + use in C identifiers) used to identify the set of strings in + 'Enum' option properties. + + 'Type(TYPE)' + This property is required; TYPE is the C type for variables + set by options using this enumeration together with 'Var'. + + 'UnknownError(MESSAGE)' + The message MESSAGE will be used as an error message if the + argument is invalid; for enumerations without 'UnknownError', + a generic error message is used. MESSAGE should contain a + single '%qs' format, which will be used to format the invalid + argument. + + * An enumeration value record to define one of the strings in a set + given in an 'Enum' record. These records have two fields: the + string 'EnumValue' and a space-separated list of properties. + Properties use the same format as option properties; the following + are valid: + 'Enum(NAME)' + This property is required; NAME says which 'Enum' record this + 'EnumValue' record corresponds to. + + 'String(STRING)' + This property is required; STRING is the string option + argument being described by this record. + + 'Value(VALUE)' + This property is required; it says what value (representable + as 'int') should be used for the given string. + + 'Canonical' + This property is optional. If present, it says the present + string is the canonical one among all those with the given + value. Other strings yielding that value will be mapped to + this one so specs do not need to handle them. + + 'DriverOnly' + This property is optional. If present, the present string + will only be accepted by the driver. This is used for cases + such as '-march=native' that are processed by the driver so + that 'gcc -v' shows how the options chosen depended on the + system on which the compiler was run. + + * An option definition record. These records have the following + fields: + 1. the name of the option, with the leading "-" removed + 2. a space-separated list of option properties (*note Option + properties::) + 3. the help text to use for '--help' (omitted if the second field + contains the 'Undocumented' property). + + By default, all options beginning with "f", "W" or "m" are + implicitly assumed to take a "no-" form. This form should not be + listed separately. If an option beginning with one of these + letters does not have a "no-" form, you can use the + 'RejectNegative' property to reject it. + + The help text is automatically line-wrapped before being displayed. + Normally the name of the option is printed on the left-hand side of + the output and the help text is printed on the right. However, if + the help text contains a tab character, the text to the left of the + tab is used instead of the option's name and the text to the right + of the tab forms the help text. This allows you to elaborate on + what type of argument the option takes. + + * A target mask record. These records have one field of the form + 'Mask(X)'. The options-processing script will automatically + allocate a bit in 'target_flags' (*note Run-time Target::) for each + mask name X and set the macro 'MASK_X' to the appropriate bitmask. + It will also declare a 'TARGET_X' macro that has the value 1 when + bit 'MASK_X' is set and 0 otherwise. + + They are primarily intended to declare target masks that are not + associated with user options, either because these masks represent + internal switches or because the options are not available on all + configurations and yet the masks always need to be defined. + + +File: gccint.info, Node: Option properties, Prev: Option file format, Up: Options + +8.2 Option properties +===================== + +The second field of an option record can specify any of the following +properties. When an option takes an argument, it is enclosed in +parentheses following the option property name. The parser that handles +option files is quite simplistic, and will be tricked by any nested +parentheses within the argument text itself; in this case, the entire +option argument can be wrapped in curly braces within the parentheses to +demarcate it, e.g.: + + Condition({defined (USE_CYGWIN_LIBSTDCXX_WRAPPERS)}) + +'Common' + The option is available for all languages and targets. + +'Target' + The option is available for all languages but is target-specific. + +'Driver' + The option is handled by the compiler driver using code not shared + with the compilers proper ('cc1' etc.). + +'LANGUAGE' + The option is available when compiling for the given language. + + It is possible to specify several different languages for the same + option. Each LANGUAGE must have been declared by an earlier + 'Language' record. *Note Option file format::. + +'RejectDriver' + The option is only handled by the compilers proper ('cc1' etc.) and + should not be accepted by the driver. + +'RejectNegative' + The option does not have a "no-" form. All options beginning with + "f", "W" or "m" are assumed to have a "no-" form unless this + property is used. + +'Negative(OTHERNAME)' + The option will turn off another option OTHERNAME, which is the + option name with the leading "-" removed. This chain action will + propagate through the 'Negative' property of the option to be + turned off. + + As a consequence, if you have a group of mutually-exclusive + options, their 'Negative' properties should form a circular chain. + For example, if options '-A', '-B' and '-C' are mutually exclusive, + their respective 'Negative' properties should be 'Negative(B)', + 'Negative(C)' and 'Negative(A)'. + +'Joined' +'Separate' + The option takes a mandatory argument. 'Joined' indicates that the + option and argument can be included in the same 'argv' entry (as + with '-mflush-func=NAME', for example). 'Separate' indicates that + the option and argument can be separate 'argv' entries (as with + '-o'). An option is allowed to have both of these properties. + +'JoinedOrMissing' + The option takes an optional argument. If the argument is given, + it will be part of the same 'argv' entry as the option itself. + + This property cannot be used alongside 'Joined' or 'Separate'. + +'MissingArgError(MESSAGE)' + For an option marked 'Joined' or 'Separate', the message MESSAGE + will be used as an error message if the mandatory argument is + missing; for options without 'MissingArgError', a generic error + message is used. MESSAGE should contain a single '%qs' format, + which will be used to format the name of the option passed. + +'Args(N)' + For an option marked 'Separate', indicate that it takes N + arguments. The default is 1. + +'UInteger' + The option's argument is a non-negative integer. The option parser + will check and convert the argument before passing it to the + relevant option handler. 'UInteger' should also be used on options + like '-falign-loops' where both '-falign-loops' and + '-falign-loops'=N are supported to make sure the saved options are + given a full integer. + +'ToLower' + The option's argument should be converted to lowercase as part of + putting it in canonical form, and before comparing with the strings + indicated by any 'Enum' property. + +'NoDriverArg' + For an option marked 'Separate', the option only takes an argument + in the compiler proper, not in the driver. This is for + compatibility with existing options that are used both directly and + via '-Wp,'; new options should not have this property. + +'Var(VAR)' + The state of this option should be stored in variable VAR (actually + a macro for 'global_options.x_VAR'). The way that the state is + stored depends on the type of option: + + * If the option uses the 'Mask' or 'InverseMask' properties, VAR + is the integer variable that contains the mask. + + * If the option is a normal on/off switch, VAR is an integer + variable that is nonzero when the option is enabled. The + options parser will set the variable to 1 when the positive + form of the option is used and 0 when the "no-" form is used. + + * If the option takes an argument and has the 'UInteger' + property, VAR is an integer variable that stores the value of + the argument. + + * If the option takes an argument and has the 'Enum' property, + VAR is a variable (type given in the 'Type' property of the + 'Enum' record whose 'Name' property has the same argument as + the 'Enum' property of this option) that stores the value of + the argument. + + * If the option has the 'Defer' property, VAR is a pointer to a + 'VEC(cl_deferred_option,heap)' that stores the option for + later processing. (VAR is declared with type 'void *' and + needs to be cast to 'VEC(cl_deferred_option,heap)' before + use.) + + * Otherwise, if the option takes an argument, VAR is a pointer + to the argument string. The pointer will be null if the + argument is optional and wasn't given. + + The option-processing script will usually zero-initialize VAR. You + can modify this behavior using 'Init'. + +'Var(VAR, SET)' + The option controls an integer variable VAR and is active when VAR + equals SET. The option parser will set VAR to SET when the + positive form of the option is used and '!SET' when the "no-" form + is used. + + VAR is declared in the same way as for the single-argument form + described above. + +'Init(VALUE)' + The variable specified by the 'Var' property should be statically + initialized to VALUE. If more than one option using the same + variable specifies 'Init', all must specify the same initializer. + +'Mask(NAME)' + The option is associated with a bit in the 'target_flags' variable + (*note Run-time Target::) and is active when that bit is set. You + may also specify 'Var' to select a variable other than + 'target_flags'. + + The options-processing script will automatically allocate a unique + bit for the option. If the option is attached to 'target_flags', + the script will set the macro 'MASK_NAME' to the appropriate + bitmask. It will also declare a 'TARGET_NAME' macro that has the + value 1 when the option is active and 0 otherwise. If you use + 'Var' to attach the option to a different variable, the bitmask + macro with be called 'OPTION_MASK_NAME'. + +'InverseMask(OTHERNAME)' +'InverseMask(OTHERNAME, THISNAME)' + The option is the inverse of another option that has the + 'Mask(OTHERNAME)' property. If THISNAME is given, the + options-processing script will declare a 'TARGET_THISNAME' macro + that is 1 when the option is active and 0 otherwise. + +'Enum(NAME)' + The option's argument is a string from the set of strings + associated with the corresponding 'Enum' record. The string is + checked and converted to the integer specified in the corresponding + 'EnumValue' record before being passed to option handlers. + +'Defer' + The option should be stored in a vector, specified with 'Var', for + later processing. + +'Alias(OPT)' +'Alias(OPT, ARG)' +'Alias(OPT, POSARG, NEGARG)' + The option is an alias for '-OPT' (or the negative form of that + option, depending on 'NegativeAlias'). In the first form, any + argument passed to the alias is considered to be passed to '-OPT', + and '-OPT' is considered to be negated if the alias is used in + negated form. In the second form, the alias may not be negated or + have an argument, and POSARG is considered to be passed as an + argument to '-OPT'. In the third form, the alias may not have an + argument, if the alias is used in the positive form then POSARG is + considered to be passed to '-OPT', and if the alias is used in the + negative form then NEGARG is considered to be passed to '-OPT'. + + Aliases should not specify 'Var' or 'Mask' or 'UInteger'. Aliases + should normally specify the same languages as the target of the + alias; the flags on the target will be used to determine any + diagnostic for use of an option for the wrong language, while those + on the alias will be used to identify what command-line text is the + option and what text is any argument to that option. + + When an 'Alias' definition is used for an option, driver specs do + not need to handle it and no 'OPT_' enumeration value is defined + for it; only the canonical form of the option will be seen in those + places. + +'NegativeAlias' + For an option marked with 'Alias(OPT)', the option is considered to + be an alias for the positive form of '-OPT' if negated and for the + negative form of '-OPT' if not negated. 'NegativeAlias' may not be + used with the forms of 'Alias' taking more than one argument. + +'Ignore' + This option is ignored apart from printing any warning specified + using 'Warn'. The option will not be seen by specs and no 'OPT_' + enumeration value is defined for it. + +'SeparateAlias' + For an option marked with 'Joined', 'Separate' and 'Alias', the + option only acts as an alias when passed a separate argument; with + a joined argument it acts as a normal option, with an 'OPT_' + enumeration value. This is for compatibility with the Java '-d' + option and should not be used for new options. + +'Warn(MESSAGE)' + If this option is used, output the warning MESSAGE. MESSAGE is a + format string, either taking a single operand with a '%qs' format + which is the option name, or not taking any operands, which is + passed to the 'warning' function. If an alias is marked 'Warn', + the target of the alias must not also be marked 'Warn'. + +'Report' + The state of the option should be printed by '-fverbose-asm'. + +'Warning' + This is a warning option and should be shown as such in '--help' + output. This flag does not currently affect anything other than + '--help'. + +'Optimization' + This is an optimization option. It should be shown as such in + '--help' output, and any associated variable named using 'Var' + should be saved and restored when the optimization level is changed + with 'optimize' attributes. + +'Undocumented' + The option is deliberately missing documentation and should not be + included in the '--help' output. + +'Condition(COND)' + The option should only be accepted if preprocessor condition COND + is true. Note that any C declarations associated with the option + will be present even if COND is false; COND simply controls whether + the option is accepted and whether it is printed in the '--help' + output. + +'Save' + Build the 'cl_target_option' structure to hold a copy of the + option, add the functions 'cl_target_option_save' and + 'cl_target_option_restore' to save and restore the options. + +'SetByCombined' + The option may also be set by a combined option such as + '-ffast-math'. This causes the 'gcc_options' struct to have a + field 'frontend_set_NAME', where 'NAME' is the name of the field + holding the value of this option (without the leading 'x_'). This + gives the front end a way to indicate that the value has been set + explicitly and should not be changed by the combined option. For + example, some front ends use this to prevent '-ffast-math' and + '-fno-fast-math' from changing the value of '-fmath-errno' for + languages that do not use 'errno'. + +'EnabledBy(OPT)' +'EnabledBy(OPT && OPT2)' + If not explicitly set, the option is set to the value of '-OPT'. + The second form specifies that the option is only set if both OPT + and OPT2 are set. + +'LangEnabledBy(LANGUAGE, OPT)' +'LangEnabledBy(LANGUAGE, OPT, POSARG, NEGARG)' + When compiling for the given language, the option is set to the + value of '-OPT', if not explicitly set. In the second form, if OPT + is used in the positive form then POSARG is considered to be passed + to the option, and if OPT is used in the negative form then NEGARG + is considered to be passed to the option. It is possible to + specify several different languages. Each LANGUAGE must have been + declared by an earlier 'Language' record. *Note Option file + format::. + +'NoDWARFRecord' + The option is omitted from the producer string written by + '-grecord-gcc-switches'. + +'PchIgnore' + Even if this is a target option, this option will not be recorded / + compared to determine if a precompiled header file matches. + + +File: gccint.info, Node: Passes, Next: GENERIC, Prev: Options, Up: Top + +9 Passes and Files of the Compiler +********************************** + +This chapter is dedicated to giving an overview of the optimization and +code generation passes of the compiler. In the process, it describes +some of the language front end interface, though this description is no +where near complete. + +* Menu: + +* Parsing pass:: The language front end turns text into bits. +* Cilk Plus Transformation:: Transform Cilk Plus Code to equivalent C/C++. +* Gimplification pass:: The bits are turned into something we can optimize. +* Pass manager:: Sequencing the optimization passes. +* Tree SSA passes:: Optimizations on a high-level representation. +* RTL passes:: Optimizations on a low-level representation. +* Optimization info:: Dumping optimization information from passes. + + +File: gccint.info, Node: Parsing pass, Next: Cilk Plus Transformation, Up: Passes + +9.1 Parsing pass +================ + +The language front end is invoked only once, via +'lang_hooks.parse_file', to parse the entire input. The language front +end may use any intermediate language representation deemed appropriate. +The C front end uses GENERIC trees (*note GENERIC::), plus a double +handful of language specific tree codes defined in 'c-common.def'. The +Fortran front end uses a completely different private representation. + + At some point the front end must translate the representation used in +the front end to a representation understood by the language-independent +portions of the compiler. Current practice takes one of two forms. The +C front end manually invokes the gimplifier (*note GIMPLE::) on each +function, and uses the gimplifier callbacks to convert the +language-specific tree nodes directly to GIMPLE before passing the +function off to be compiled. The Fortran front end converts from a +private representation to GENERIC, which is later lowered to GIMPLE when +the function is compiled. Which route to choose probably depends on how +well GENERIC (plus extensions) can be made to match up with the source +language and necessary parsing data structures. + + BUG: Gimplification must occur before nested function lowering, and +nested function lowering must be done by the front end before passing +the data off to cgraph. + + TODO: Cgraph should control nested function lowering. It would only be +invoked when it is certain that the outer-most function is used. + + TODO: Cgraph needs a gimplify_function callback. It should be invoked +when (1) it is certain that the function is used, (2) warning flags +specified by the user require some amount of compilation in order to +honor, (3) the language indicates that semantic analysis is not complete +until gimplification occurs. Hum... this sounds overly complicated. +Perhaps we should just have the front end gimplify always; in most cases +it's only one function call. + + The front end needs to pass all function definitions and top level +declarations off to the middle-end so that they can be compiled and +emitted to the object file. For a simple procedural language, it is +usually most convenient to do this as each top level declaration or +definition is seen. There is also a distinction to be made between +generating functional code and generating complete debug information. +The only thing that is absolutely required for functional code is that +function and data _definitions_ be passed to the middle-end. For +complete debug information, function, data and type declarations should +all be passed as well. + + In any case, the front end needs each complete top-level function or +data declaration, and each data definition should be passed to +'rest_of_decl_compilation'. Each complete type definition should be +passed to 'rest_of_type_compilation'. Each function definition should +be passed to 'cgraph_finalize_function'. + + TODO: I know rest_of_compilation currently has all sorts of RTL +generation semantics. I plan to move all code generation bits (both +Tree and RTL) to compile_function. Should we hide cgraph from the front +ends and move back to rest_of_compilation as the official interface? +Possibly we should rename all three interfaces such that the names match +in some meaningful way and that is more descriptive than "rest_of". + + The middle-end will, at its option, emit the function and data +definitions immediately or queue them for later processing. + + +File: gccint.info, Node: Cilk Plus Transformation, Next: Gimplification pass, Prev: Parsing pass, Up: Passes + +9.2 Cilk Plus Transformation +============================ + +If Cilk Plus generation (flag '-fcilkplus') is enabled, all the Cilk +Plus code is transformed into equivalent C and C++ functions. Majority +of this transformation occurs toward the end of the parsing and right +before the gimplification pass. + + These are the major components to the Cilk Plus language extension: + * Array Notations: During parsing phase, all the array notation + specific information is stored in 'ARRAY_NOTATION_REF' tree using + the function 'c_parser_array_notation'. During the end of parsing, + we check the entire function to see if there are any array notation + specific code (using the function 'contains_array_notation_expr'). + If this function returns true, then we expand them using either + 'expand_array_notation_exprs' or 'build_array_notation_expr'. For + the cases where array notations are inside conditions, they are + transformed using the function 'fix_conditional_array_notations'. + The C language-specific routines are located in + 'c/c-array-notation.c' and the equivalent C++ routines are in the + file 'cp/cp-array-notation.c'. Common routines such as functions + to initialize built-in functions are stored in + 'array-notation-common.c'. + + * Cilk keywords: + * '_Cilk_spawn': The '_Cilk_spawn' keyword is parsed and the + function it contains is marked as a spawning function. The + spawning function is called the spawner. At the end of the + parsing phase, appropriate built-in functions are added to the + spawner that are defined in the Cilk runtime. The appropriate + locations of these functions, and the internal structures are + detailed in 'cilk_init_builtins' in the file 'cilk-common.c'. + The pointers to Cilk functions and fields of internal + structures are described in 'cilk.h'. The built-in functions + are described in 'cilk-builtins.def'. + + During gimplification, a new "spawn-helper" function is + created. The spawned function is replaced with a spawn helper + function in the spawner. The spawned function-call is moved + into the spawn helper. The main function that does these + transformations is 'gimplify_cilk_spawn' in 'c-family/cilk.c'. + In the spawn-helper, the gimplification function + 'gimplify_call_expr', inserts a function call + '__cilkrts_detach'. This function is expanded by + 'builtin_expand_cilk_detach' located in 'c-family/cilk.c'. + + * '_Cilk_sync': '_Cilk_sync' is parsed like a keyword. During + gimplification, the function 'gimplify_cilk_sync' in + 'c-family/cilk.c', will replace this keyword with a set of + functions that are stored in the Cilk runtime. One of the + internal functions inserted during gimplification, + '__cilkrts_pop_frame' must be expanded by the compiler and is + done by 'builtin_expand_cilk_pop_frame' in 'cilk-common.c'. + + Documentation about Cilk Plus and language specification is provided +under the "Learn" section in <http://www.cilkplus.org/>. It is worth +mentioning that the current implementation follows ABI 1.1. + + +File: gccint.info, Node: Gimplification pass, Next: Pass manager, Prev: Cilk Plus Transformation, Up: Passes + +9.3 Gimplification pass +======================= + +"Gimplification" is a whimsical term for the process of converting the +intermediate representation of a function into the GIMPLE language +(*note GIMPLE::). The term stuck, and so words like "gimplification", +"gimplify", "gimplifier" and the like are sprinkled throughout this +section of code. + + While a front end may certainly choose to generate GIMPLE directly if +it chooses, this can be a moderately complex process unless the +intermediate language used by the front end is already fairly simple. +Usually it is easier to generate GENERIC trees plus extensions and let +the language-independent gimplifier do most of the work. + + The main entry point to this pass is 'gimplify_function_tree' located +in 'gimplify.c'. From here we process the entire function gimplifying +each statement in turn. The main workhorse for this pass is +'gimplify_expr'. Approximately everything passes through here at least +once, and it is from here that we invoke the 'lang_hooks.gimplify_expr' +callback. + + The callback should examine the expression in question and return +'GS_UNHANDLED' if the expression is not a language specific construct +that requires attention. Otherwise it should alter the expression in +some way to such that forward progress is made toward producing valid +GIMPLE. If the callback is certain that the transformation is complete +and the expression is valid GIMPLE, it should return 'GS_ALL_DONE'. +Otherwise it should return 'GS_OK', which will cause the expression to +be processed again. If the callback encounters an error during the +transformation (because the front end is relying on the gimplification +process to finish semantic checks), it should return 'GS_ERROR'. + + +File: gccint.info, Node: Pass manager, Next: Tree SSA passes, Prev: Gimplification pass, Up: Passes + +9.4 Pass manager +================ + +The pass manager is located in 'passes.c', 'tree-optimize.c' and +'tree-pass.h'. It processes passes as described in 'passes.def'. Its +job is to run all of the individual passes in the correct order, and +take care of standard bookkeeping that applies to every pass. + + The theory of operation is that each pass defines a structure that +represents everything we need to know about that pass--when it should be +run, how it should be run, what intermediate language form or +on-the-side data structures it needs. We register the pass to be run in +some particular order, and the pass manager arranges for everything to +happen in the correct order. + + The actuality doesn't completely live up to the theory at present. +Command-line switches and 'timevar_id_t' enumerations must still be +defined elsewhere. The pass manager validates constraints but does not +attempt to (re-)generate data structures or lower intermediate language +form based on the requirements of the next pass. Nevertheless, what is +present is useful, and a far sight better than nothing at all. + + Each pass should have a unique name. Each pass may have its own dump +file (for GCC debugging purposes). Passes with a name starting with a +star do not dump anything. Sometimes passes are supposed to share a +dump file / option name. To still give these unique names, you can use +a prefix that is delimited by a space from the part that is used for the +dump file / option name. E.g. When the pass name is "ud dce", the name +used for dump file/options is "dce". + + TODO: describe the global variables set up by the pass manager, and a +brief description of how a new pass should use it. I need to look at +what info RTL passes use first... + + +File: gccint.info, Node: Tree SSA passes, Next: RTL passes, Prev: Pass manager, Up: Passes + +9.5 Tree SSA passes +=================== + +The following briefly describes the Tree optimization passes that are +run after gimplification and what source files they are located in. + + * Remove useless statements + + This pass is an extremely simple sweep across the gimple code in + which we identify obviously dead code and remove it. Here we do + things like simplify 'if' statements with constant conditions, + remove exception handling constructs surrounding code that + obviously cannot throw, remove lexical bindings that contain no + variables, and other assorted simplistic cleanups. The idea is to + get rid of the obvious stuff quickly rather than wait until later + when it's more work to get rid of it. This pass is located in + 'tree-cfg.c' and described by 'pass_remove_useless_stmts'. + + * OpenMP lowering + + If OpenMP generation ('-fopenmp') is enabled, this pass lowers + OpenMP constructs into GIMPLE. + + Lowering of OpenMP constructs involves creating replacement + expressions for local variables that have been mapped using data + sharing clauses, exposing the control flow of most synchronization + directives and adding region markers to facilitate the creation of + the control flow graph. The pass is located in 'omp-low.c' and is + described by 'pass_lower_omp'. + + * OpenMP expansion + + If OpenMP generation ('-fopenmp') is enabled, this pass expands + parallel regions into their own functions to be invoked by the + thread library. The pass is located in 'omp-low.c' and is + described by 'pass_expand_omp'. + + * Lower control flow + + This pass flattens 'if' statements ('COND_EXPR') and moves lexical + bindings ('BIND_EXPR') out of line. After this pass, all 'if' + statements will have exactly two 'goto' statements in its 'then' + and 'else' arms. Lexical binding information for each statement + will be found in 'TREE_BLOCK' rather than being inferred from its + position under a 'BIND_EXPR'. This pass is found in 'gimple-low.c' + and is described by 'pass_lower_cf'. + + * Lower exception handling control flow + + This pass decomposes high-level exception handling constructs + ('TRY_FINALLY_EXPR' and 'TRY_CATCH_EXPR') into a form that + explicitly represents the control flow involved. After this pass, + 'lookup_stmt_eh_region' will return a non-negative number for any + statement that may have EH control flow semantics; examine + 'tree_can_throw_internal' or 'tree_can_throw_external' for exact + semantics. Exact control flow may be extracted from + 'foreach_reachable_handler'. The EH region nesting tree is defined + in 'except.h' and built in 'except.c'. The lowering pass itself is + in 'tree-eh.c' and is described by 'pass_lower_eh'. + + * Build the control flow graph + + This pass decomposes a function into basic blocks and creates all + of the edges that connect them. It is located in 'tree-cfg.c' and + is described by 'pass_build_cfg'. + + * Find all referenced variables + + This pass walks the entire function and collects an array of all + variables referenced in the function, 'referenced_vars'. The index + at which a variable is found in the array is used as a UID for the + variable within this function. This data is needed by the SSA + rewriting routines. The pass is located in 'tree-dfa.c' and is + described by 'pass_referenced_vars'. + + * Enter static single assignment form + + This pass rewrites the function such that it is in SSA form. After + this pass, all 'is_gimple_reg' variables will be referenced by + 'SSA_NAME', and all occurrences of other variables will be + annotated with 'VDEFS' and 'VUSES'; PHI nodes will have been + inserted as necessary for each basic block. This pass is located + in 'tree-ssa.c' and is described by 'pass_build_ssa'. + + * Warn for uninitialized variables + + This pass scans the function for uses of 'SSA_NAME's that are fed + by default definition. For non-parameter variables, such uses are + uninitialized. The pass is run twice, before and after + optimization (if turned on). In the first pass we only warn for + uses that are positively uninitialized; in the second pass we warn + for uses that are possibly uninitialized. The pass is located in + 'tree-ssa.c' and is defined by 'pass_early_warn_uninitialized' and + 'pass_late_warn_uninitialized'. + + * Dead code elimination + + This pass scans the function for statements without side effects + whose result is unused. It does not do memory life analysis, so + any value that is stored in memory is considered used. The pass is + run multiple times throughout the optimization process. It is + located in 'tree-ssa-dce.c' and is described by 'pass_dce'. + + * Dominator optimizations + + This pass performs trivial dominator-based copy and constant + propagation, expression simplification, and jump threading. It is + run multiple times throughout the optimization process. It is + located in 'tree-ssa-dom.c' and is described by 'pass_dominator'. + + * Forward propagation of single-use variables + + This pass attempts to remove redundant computation by substituting + variables that are used once into the expression that uses them and + seeing if the result can be simplified. It is located in + 'tree-ssa-forwprop.c' and is described by 'pass_forwprop'. + + * Copy Renaming + + This pass attempts to change the name of compiler temporaries + involved in copy operations such that SSA->normal can coalesce the + copy away. When compiler temporaries are copies of user variables, + it also renames the compiler temporary to the user variable + resulting in better use of user symbols. It is located in + 'tree-ssa-copyrename.c' and is described by 'pass_copyrename'. + + * PHI node optimizations + + This pass recognizes forms of PHI inputs that can be represented as + conditional expressions and rewrites them into straight line code. + It is located in 'tree-ssa-phiopt.c' and is described by + 'pass_phiopt'. + + * May-alias optimization + + This pass performs a flow sensitive SSA-based points-to analysis. + The resulting may-alias, must-alias, and escape analysis + information is used to promote variables from in-memory addressable + objects to non-aliased variables that can be renamed into SSA form. + We also update the 'VDEF'/'VUSE' memory tags for non-renameable + aggregates so that we get fewer false kills. The pass is located + in 'tree-ssa-alias.c' and is described by 'pass_may_alias'. + + Interprocedural points-to information is located in + 'tree-ssa-structalias.c' and described by 'pass_ipa_pta'. + + * Profiling + + This pass rewrites the function in order to collect runtime block + and value profiling data. Such data may be fed back into the + compiler on a subsequent run so as to allow optimization based on + expected execution frequencies. The pass is located in 'predict.c' + and is described by 'pass_profile'. + + * Lower complex arithmetic + + This pass rewrites complex arithmetic operations into their + component scalar arithmetic operations. The pass is located in + 'tree-complex.c' and is described by 'pass_lower_complex'. + + * Scalar replacement of aggregates + + This pass rewrites suitable non-aliased local aggregate variables + into a set of scalar variables. The resulting scalar variables are + rewritten into SSA form, which allows subsequent optimization + passes to do a significantly better job with them. The pass is + located in 'tree-sra.c' and is described by 'pass_sra'. + + * Dead store elimination + + This pass eliminates stores to memory that are subsequently + overwritten by another store, without any intervening loads. The + pass is located in 'tree-ssa-dse.c' and is described by 'pass_dse'. + + * Tail recursion elimination + + This pass transforms tail recursion into a loop. It is located in + 'tree-tailcall.c' and is described by 'pass_tail_recursion'. + + * Forward store motion + + This pass sinks stores and assignments down the flowgraph closer to + their use point. The pass is located in 'tree-ssa-sink.c' and is + described by 'pass_sink_code'. + + * Partial redundancy elimination + + This pass eliminates partially redundant computations, as well as + performing load motion. The pass is located in 'tree-ssa-pre.c' + and is described by 'pass_pre'. + + Just before partial redundancy elimination, if + '-funsafe-math-optimizations' is on, GCC tries to convert divisions + to multiplications by the reciprocal. The pass is located in + 'tree-ssa-math-opts.c' and is described by 'pass_cse_reciprocal'. + + * Full redundancy elimination + + This is a simpler form of PRE that only eliminates redundancies + that occur on all paths. It is located in 'tree-ssa-pre.c' and + described by 'pass_fre'. + + * Loop optimization + + The main driver of the pass is placed in 'tree-ssa-loop.c' and + described by 'pass_loop'. + + The optimizations performed by this pass are: + + Loop invariant motion. This pass moves only invariants that would + be hard to handle on RTL level (function calls, operations that + expand to nontrivial sequences of insns). With '-funswitch-loops' + it also moves operands of conditions that are invariant out of the + loop, so that we can use just trivial invariantness analysis in + loop unswitching. The pass also includes store motion. The pass + is implemented in 'tree-ssa-loop-im.c'. + + Canonical induction variable creation. This pass creates a simple + counter for number of iterations of the loop and replaces the exit + condition of the loop using it, in case when a complicated analysis + is necessary to determine the number of iterations. Later + optimizations then may determine the number easily. The pass is + implemented in 'tree-ssa-loop-ivcanon.c'. + + Induction variable optimizations. This pass performs standard + induction variable optimizations, including strength reduction, + induction variable merging and induction variable elimination. The + pass is implemented in 'tree-ssa-loop-ivopts.c'. + + Loop unswitching. This pass moves the conditional jumps that are + invariant out of the loops. To achieve this, a duplicate of the + loop is created for each possible outcome of conditional jump(s). + The pass is implemented in 'tree-ssa-loop-unswitch.c'. This pass + should eventually replace the RTL level loop unswitching in + 'loop-unswitch.c', but currently the RTL level pass is not + completely redundant yet due to deficiencies in tree level alias + analysis. + + The optimizations also use various utility functions contained in + 'tree-ssa-loop-manip.c', 'cfgloop.c', 'cfgloopanal.c' and + 'cfgloopmanip.c'. + + Vectorization. This pass transforms loops to operate on vector + types instead of scalar types. Data parallelism across loop + iterations is exploited to group data elements from consecutive + iterations into a vector and operate on them in parallel. + Depending on available target support the loop is conceptually + unrolled by a factor 'VF' (vectorization factor), which is the + number of elements operated upon in parallel in each iteration, and + the 'VF' copies of each scalar operation are fused to form a vector + operation. Additional loop transformations such as peeling and + versioning may take place to align the number of iterations, and to + align the memory accesses in the loop. The pass is implemented in + 'tree-vectorizer.c' (the main driver), 'tree-vect-loop.c' and + 'tree-vect-loop-manip.c' (loop specific parts and general loop + utilities), 'tree-vect-slp' (loop-aware SLP functionality), + 'tree-vect-stmts.c' and 'tree-vect-data-refs.c'. Analysis of data + references is in 'tree-data-ref.c'. + + SLP Vectorization. This pass performs vectorization of + straight-line code. The pass is implemented in 'tree-vectorizer.c' + (the main driver), 'tree-vect-slp.c', 'tree-vect-stmts.c' and + 'tree-vect-data-refs.c'. + + Autoparallelization. This pass splits the loop iteration space to + run into several threads. The pass is implemented in + 'tree-parloops.c'. + + Graphite is a loop transformation framework based on the polyhedral + model. Graphite stands for Gimple Represented as Polyhedra. The + internals of this infrastructure are documented in + <http://gcc.gnu.org/wiki/Graphite>. The passes working on this + representation are implemented in the various 'graphite-*' files. + + * Tree level if-conversion for vectorizer + + This pass applies if-conversion to simple loops to help vectorizer. + We identify if convertible loops, if-convert statements and merge + basic blocks in one big block. The idea is to present loop in such + form so that vectorizer can have one to one mapping between + statements and available vector operations. This pass is located + in 'tree-if-conv.c' and is described by 'pass_if_conversion'. + + * Conditional constant propagation + + This pass relaxes a lattice of values in order to identify those + that must be constant even in the presence of conditional branches. + The pass is located in 'tree-ssa-ccp.c' and is described by + 'pass_ccp'. + + A related pass that works on memory loads and stores, and not just + register values, is located in 'tree-ssa-ccp.c' and described by + 'pass_store_ccp'. + + * Conditional copy propagation + + This is similar to constant propagation but the lattice of values + is the "copy-of" relation. It eliminates redundant copies from the + code. The pass is located in 'tree-ssa-copy.c' and described by + 'pass_copy_prop'. + + A related pass that works on memory copies, and not just register + copies, is located in 'tree-ssa-copy.c' and described by + 'pass_store_copy_prop'. + + * Value range propagation + + This transformation is similar to constant propagation but instead + of propagating single constant values, it propagates known value + ranges. The implementation is based on Patterson's range + propagation algorithm (Accurate Static Branch Prediction by Value + Range Propagation, J. R. C. Patterson, PLDI '95). In contrast to + Patterson's algorithm, this implementation does not propagate + branch probabilities nor it uses more than a single range per SSA + name. This means that the current implementation cannot be used + for branch prediction (though adapting it would not be difficult). + The pass is located in 'tree-vrp.c' and is described by 'pass_vrp'. + + * Folding built-in functions + + This pass simplifies built-in functions, as applicable, with + constant arguments or with inferable string lengths. It is located + in 'tree-ssa-ccp.c' and is described by 'pass_fold_builtins'. + + * Split critical edges + + This pass identifies critical edges and inserts empty basic blocks + such that the edge is no longer critical. The pass is located in + 'tree-cfg.c' and is described by 'pass_split_crit_edges'. + + * Control dependence dead code elimination + + This pass is a stronger form of dead code elimination that can + eliminate unnecessary control flow statements. It is located in + 'tree-ssa-dce.c' and is described by 'pass_cd_dce'. + + * Tail call elimination + + This pass identifies function calls that may be rewritten into + jumps. No code transformation is actually applied here, but the + data and control flow problem is solved. The code transformation + requires target support, and so is delayed until RTL. In the + meantime 'CALL_EXPR_TAILCALL' is set indicating the possibility. + The pass is located in 'tree-tailcall.c' and is described by + 'pass_tail_calls'. The RTL transformation is handled by + 'fixup_tail_calls' in 'calls.c'. + + * Warn for function return without value + + For non-void functions, this pass locates return statements that do + not specify a value and issues a warning. Such a statement may + have been injected by falling off the end of the function. This + pass is run last so that we have as much time as possible to prove + that the statement is not reachable. It is located in 'tree-cfg.c' + and is described by 'pass_warn_function_return'. + + * Leave static single assignment form + + This pass rewrites the function such that it is in normal form. At + the same time, we eliminate as many single-use temporaries as + possible, so the intermediate language is no longer GIMPLE, but + GENERIC. The pass is located in 'tree-outof-ssa.c' and is + described by 'pass_del_ssa'. + + * Merge PHI nodes that feed into one another + + This is part of the CFG cleanup passes. It attempts to join PHI + nodes from a forwarder CFG block into another block with PHI nodes. + The pass is located in 'tree-cfgcleanup.c' and is described by + 'pass_merge_phi'. + + * Return value optimization + + If a function always returns the same local variable, and that + local variable is an aggregate type, then the variable is replaced + with the return value for the function (i.e., the function's + DECL_RESULT). This is equivalent to the C++ named return value + optimization applied to GIMPLE. The pass is located in + 'tree-nrv.c' and is described by 'pass_nrv'. + + * Return slot optimization + + If a function returns a memory object and is called as 'var = + foo()', this pass tries to change the call so that the address of + 'var' is sent to the caller to avoid an extra memory copy. This + pass is located in 'tree-nrv.c' and is described by + 'pass_return_slot'. + + * Optimize calls to '__builtin_object_size' + + This is a propagation pass similar to CCP that tries to remove + calls to '__builtin_object_size' when the size of the object can be + computed at compile-time. This pass is located in + 'tree-object-size.c' and is described by 'pass_object_sizes'. + + * Loop invariant motion + + This pass removes expensive loop-invariant computations out of + loops. The pass is located in 'tree-ssa-loop.c' and described by + 'pass_lim'. + + * Loop nest optimizations + + This is a family of loop transformations that works on loop nests. + It includes loop interchange, scaling, skewing and reversal and + they are all geared to the optimization of data locality in array + traversals and the removal of dependencies that hamper + optimizations such as loop parallelization and vectorization. The + pass is located in 'tree-loop-linear.c' and described by + 'pass_linear_transform'. + + * Removal of empty loops + + This pass removes loops with no code in them. The pass is located + in 'tree-ssa-loop-ivcanon.c' and described by 'pass_empty_loop'. + + * Unrolling of small loops + + This pass completely unrolls loops with few iterations. The pass + is located in 'tree-ssa-loop-ivcanon.c' and described by + 'pass_complete_unroll'. + + * Predictive commoning + + This pass makes the code reuse the computations from the previous + iterations of the loops, especially loads and stores to memory. It + does so by storing the values of these computations to a bank of + temporary variables that are rotated at the end of loop. To avoid + the need for this rotation, the loop is then unrolled and the + copies of the loop body are rewritten to use the appropriate + version of the temporary variable. This pass is located in + 'tree-predcom.c' and described by 'pass_predcom'. + + * Array prefetching + + This pass issues prefetch instructions for array references inside + loops. The pass is located in 'tree-ssa-loop-prefetch.c' and + described by 'pass_loop_prefetch'. + + * Reassociation + + This pass rewrites arithmetic expressions to enable optimizations + that operate on them, like redundancy elimination and + vectorization. The pass is located in 'tree-ssa-reassoc.c' and + described by 'pass_reassoc'. + + * Optimization of 'stdarg' functions + + This pass tries to avoid the saving of register arguments into the + stack on entry to 'stdarg' functions. If the function doesn't use + any 'va_start' macros, no registers need to be saved. If + 'va_start' macros are used, the 'va_list' variables don't escape + the function, it is only necessary to save registers that will be + used in 'va_arg' macros. For instance, if 'va_arg' is only used + with integral types in the function, floating point registers don't + need to be saved. This pass is located in 'tree-stdarg.c' and + described by 'pass_stdarg'. + + +File: gccint.info, Node: RTL passes, Next: Optimization info, Prev: Tree SSA passes, Up: Passes + +9.6 RTL passes +============== + +The following briefly describes the RTL generation and optimization +passes that are run after the Tree optimization passes. + + * RTL generation + + The source files for RTL generation include 'stmt.c', 'calls.c', + 'expr.c', 'explow.c', 'expmed.c', 'function.c', 'optabs.c' and + 'emit-rtl.c'. Also, the file 'insn-emit.c', generated from the + machine description by the program 'genemit', is used in this pass. + The header file 'expr.h' is used for communication within this + pass. + + The header files 'insn-flags.h' and 'insn-codes.h', generated from + the machine description by the programs 'genflags' and 'gencodes', + tell this pass which standard names are available for use and which + patterns correspond to them. + + * Generation of exception landing pads + + This pass generates the glue that handles communication between the + exception handling library routines and the exception handlers + within the function. Entry points in the function that are invoked + by the exception handling library are called "landing pads". The + code for this pass is located in 'except.c'. + + * Control flow graph cleanup + + This pass removes unreachable code, simplifies jumps to next, jumps + to jump, jumps across jumps, etc. The pass is run multiple times. + For historical reasons, it is occasionally referred to as the "jump + optimization pass". The bulk of the code for this pass is in + 'cfgcleanup.c', and there are support routines in 'cfgrtl.c' and + 'jump.c'. + + * Forward propagation of single-def values + + This pass attempts to remove redundant computation by substituting + variables that come from a single definition, and seeing if the + result can be simplified. It performs copy propagation and + addressing mode selection. The pass is run twice, with values + being propagated into loops only on the second run. The code is + located in 'fwprop.c'. + + * Common subexpression elimination + + This pass removes redundant computation within basic blocks, and + optimizes addressing modes based on cost. The pass is run twice. + The code for this pass is located in 'cse.c'. + + * Global common subexpression elimination + + This pass performs two different types of GCSE depending on whether + you are optimizing for size or not (LCM based GCSE tends to + increase code size for a gain in speed, while Morel-Renvoise based + GCSE does not). When optimizing for size, GCSE is done using + Morel-Renvoise Partial Redundancy Elimination, with the exception + that it does not try to move invariants out of loops--that is left + to the loop optimization pass. If MR PRE GCSE is done, code + hoisting (aka unification) is also done, as well as load motion. + If you are optimizing for speed, LCM (lazy code motion) based GCSE + is done. LCM is based on the work of Knoop, Ruthing, and Steffen. + LCM based GCSE also does loop invariant code motion. We also + perform load and store motion when optimizing for speed. + Regardless of which type of GCSE is used, the GCSE pass also + performs global constant and copy propagation. The source file for + this pass is 'gcse.c', and the LCM routines are in 'lcm.c'. + + * Loop optimization + + This pass performs several loop related optimizations. The source + files 'cfgloopanal.c' and 'cfgloopmanip.c' contain generic loop + analysis and manipulation code. Initialization and finalization of + loop structures is handled by 'loop-init.c'. A loop invariant + motion pass is implemented in 'loop-invariant.c'. Basic block + level optimizations--unrolling, peeling and unswitching loops-- are + implemented in 'loop-unswitch.c' and 'loop-unroll.c'. Replacing of + the exit condition of loops by special machine-dependent + instructions is handled by 'loop-doloop.c'. + + * Jump bypassing + + This pass is an aggressive form of GCSE that transforms the control + flow graph of a function by propagating constants into conditional + branch instructions. The source file for this pass is 'gcse.c'. + + * If conversion + + This pass attempts to replace conditional branches and surrounding + assignments with arithmetic, boolean value producing comparison + instructions, and conditional move instructions. In the very last + invocation after reload/LRA, it will generate predicated + instructions when supported by the target. The code is located in + 'ifcvt.c'. + + * Web construction + + This pass splits independent uses of each pseudo-register. This + can improve effect of the other transformation, such as CSE or + register allocation. The code for this pass is located in 'web.c'. + + * Instruction combination + + This pass attempts to combine groups of two or three instructions + that are related by data flow into single instructions. It + combines the RTL expressions for the instructions by substitution, + simplifies the result using algebra, and then attempts to match the + result against the machine description. The code is located in + 'combine.c'. + + * Mode switching optimization + + This pass looks for instructions that require the processor to be + in a specific "mode" and minimizes the number of mode changes + required to satisfy all users. What these modes are, and what they + apply to are completely target-specific. The code for this pass is + located in 'mode-switching.c'. + + * Modulo scheduling + + This pass looks at innermost loops and reorders their instructions + by overlapping different iterations. Modulo scheduling is + performed immediately before instruction scheduling. The code for + this pass is located in 'modulo-sched.c'. + + * Instruction scheduling + + This pass looks for instructions whose output will not be available + by the time that it is used in subsequent instructions. Memory + loads and floating point instructions often have this behavior on + RISC machines. It re-orders instructions within a basic block to + try to separate the definition and use of items that otherwise + would cause pipeline stalls. This pass is performed twice, before + and after register allocation. The code for this pass is located + in 'haifa-sched.c', 'sched-deps.c', 'sched-ebb.c', 'sched-rgn.c' + and 'sched-vis.c'. + + * Register allocation + + These passes make sure that all occurrences of pseudo registers are + eliminated, either by allocating them to a hard register, replacing + them by an equivalent expression (e.g. a constant) or by placing + them on the stack. This is done in several subpasses: + + * The integrated register allocator (IRA). It is called + integrated because coalescing, register live range splitting, + and hard register preferencing are done on-the-fly during + coloring. It also has better integration with the reload/LRA + pass. Pseudo-registers spilled by the allocator or the + reload/LRA have still a chance to get hard-registers if the + reload/LRA evicts some pseudo-registers from hard-registers. + The allocator helps to choose better pseudos for spilling + based on their live ranges and to coalesce stack slots + allocated for the spilled pseudo-registers. IRA is a regional + register allocator which is transformed into Chaitin-Briggs + allocator if there is one region. By default, IRA chooses + regions using register pressure but the user can force it to + use one region or regions corresponding to all loops. + + Source files of the allocator are 'ira.c', 'ira-build.c', + 'ira-costs.c', 'ira-conflicts.c', 'ira-color.c', 'ira-emit.c', + 'ira-lives', plus header files 'ira.h' and 'ira-int.h' used + for the communication between the allocator and the rest of + the compiler and between the IRA files. + + * Reloading. This pass renumbers pseudo registers with the + hardware registers numbers they were allocated. Pseudo + registers that did not get hard registers are replaced with + stack slots. Then it finds instructions that are invalid + because a value has failed to end up in a register, or has + ended up in a register of the wrong kind. It fixes up these + instructions by reloading the problematical values temporarily + into registers. Additional instructions are generated to do + the copying. + + The reload pass also optionally eliminates the frame pointer + and inserts instructions to save and restore call-clobbered + registers around calls. + + Source files are 'reload.c' and 'reload1.c', plus the header + 'reload.h' used for communication between them. + + * This pass is a modern replacement of the reload pass. Source + files are 'lra.c', 'lra-assign.c', 'lra-coalesce.c', + 'lra-constraints.c', 'lra-eliminations.c', 'lra-equivs.c', + 'lra-lives.c', 'lra-saves.c', 'lra-spills.c', the header + 'lra-int.h' used for communication between them, and the + header 'lra.h' used for communication between LRA and the rest + of compiler. + + Unlike the reload pass, intermediate LRA decisions are + reflected in RTL as much as possible. This reduces the number + of target-dependent macros and hooks, leaving instruction + constraints as the primary source of control. + + LRA is run on targets for which TARGET_LRA_P returns true. + + * Basic block reordering + + This pass implements profile guided code positioning. If profile + information is not available, various types of static analysis are + performed to make the predictions normally coming from the profile + feedback (IE execution frequency, branch probability, etc). It is + implemented in the file 'bb-reorder.c', and the various prediction + routines are in 'predict.c'. + + * Variable tracking + + This pass computes where the variables are stored at each position + in code and generates notes describing the variable locations to + RTL code. The location lists are then generated according to these + notes to debug information if the debugging information format + supports location lists. The code is located in 'var-tracking.c'. + + * Delayed branch scheduling + + This optional pass attempts to find instructions that can go into + the delay slots of other instructions, usually jumps and calls. + The code for this pass is located in 'reorg.c'. + + * Branch shortening + + On many RISC machines, branch instructions have a limited range. + Thus, longer sequences of instructions must be used for long + branches. In this pass, the compiler figures out what how far each + instruction will be from each other instruction, and therefore + whether the usual instructions, or the longer sequences, must be + used for each branch. The code for this pass is located in + 'final.c'. + + * Register-to-stack conversion + + Conversion from usage of some hard registers to usage of a register + stack may be done at this point. Currently, this is supported only + for the floating-point registers of the Intel 80387 coprocessor. + The code for this pass is located in 'reg-stack.c'. + + * Final + + This pass outputs the assembler code for the function. The source + files are 'final.c' plus 'insn-output.c'; the latter is generated + automatically from the machine description by the tool 'genoutput'. + The header file 'conditions.h' is used for communication between + these files. + + * Debugging information output + + This is run after final because it must output the stack slot + offsets for pseudo registers that did not get hard registers. + Source files are 'dbxout.c' for DBX symbol table format, 'sdbout.c' + for SDB symbol table format, 'dwarfout.c' for DWARF symbol table + format, files 'dwarf2out.c' and 'dwarf2asm.c' for DWARF2 symbol + table format, and 'vmsdbgout.c' for VMS debug symbol table format. + + +File: gccint.info, Node: Optimization info, Prev: RTL passes, Up: Passes + +9.7 Optimization info +===================== + +This section is describes dump infrastructure which is common to both +pass dumps as well as optimization dumps. The goal for this +infrastructure is to provide both gcc developers and users detailed +information about various compiler transformations and optimizations. + +* Menu: + +* Dump setup:: Setup of optimization dumps. +* Optimization groups:: Groups made up of optimization passes. +* Dump files and streams:: Dump output file names and streams. +* Dump output verbosity:: How much information to dump. +* Dump types:: Various types of dump functions. +* Dump examples:: Sample usage. + + +File: gccint.info, Node: Dump setup, Next: Optimization groups, Up: Optimization info + +9.7.1 Dump setup +---------------- + +A dump_manager class is defined in 'dumpfile.h'. Various passes +register dumping pass-specific information via 'dump_register' in +'passes.c'. During the registration, an optimization pass can select +its optimization group (*note Optimization groups::). After that +optimization information corresponding to the entire group (presumably +from multiple passes) can be output via command-line switches. Note +that if a pass does not fit into any of the pre-defined groups, it can +select 'OPTGROUP_NONE'. + + Note that in general, a pass need not know its dump output file name, +whether certain flags are enabled, etc. However, for legacy reasons, +passes could also call 'dump_begin' which returns a stream in case the +particular pass has optimization dumps enabled. A pass could call +'dump_end' when the dump has ended. These methods should go away once +all the passes are converted to use the new dump infrastructure. + + The recommended way to setup the dump output is via 'dump_start' and +'dump_end'. + + +File: gccint.info, Node: Optimization groups, Next: Dump files and streams, Prev: Dump setup, Up: Optimization info + +9.7.2 Optimization groups +------------------------- + +The optimization passes are grouped into several categories. Currently +defined categories in 'dumpfile.h' are + +'OPTGROUP_IPA' + IPA optimization passes. Enabled by '-ipa' + +'OPTGROUP_LOOP' + Loop optimization passes. Enabled by '-loop'. + +'OPTGROUP_INLINE' + Inlining passes. Enabled by '-inline'. + +'OPTGROUP_VEC' + Vectorization passes. Enabled by '-vec'. + +'OPTGROUP_OTHER' + All other optimization passes which do not fall into one of the + above. + +'OPTGROUP_ALL' + All optimization passes. Enabled by '-all'. + + By using groups a user could selectively enable optimization +information only for a group of passes. By default, the optimization +information for all the passes is dumped. + + +File: gccint.info, Node: Dump files and streams, Next: Dump output verbosity, Prev: Optimization groups, Up: Optimization info + +9.7.3 Dump files and streams +---------------------------- + +There are two separate output streams available for outputting +optimization information from passes. Note that both these streams +accept 'stderr' and 'stdout' as valid streams and thus it is possible to +dump output to standard output or error. This is specially handy for +outputting all available information in a single file by redirecting +'stderr'. + +'pstream' + This stream is for pass-specific dump output. For example, + '-fdump-tree-vect=foo.v' dumps tree vectorization pass output into + the given file name 'foo.v'. If the file name is not provided, the + default file name is based on the source file and pass number. + Note that one could also use special file names 'stdout' and + 'stderr' for dumping to standard output and standard error + respectively. + +'alt_stream' + This steam is used for printing optimization specific output in + response to the '-fopt-info'. Again a file name can be given. If + the file name is not given, it defaults to 'stderr'. + + +File: gccint.info, Node: Dump output verbosity, Next: Dump types, Prev: Dump files and streams, Up: Optimization info + +9.7.4 Dump output verbosity +--------------------------- + +The dump verbosity has the following options + +'optimized' + Print information when an optimization is successfully applied. It + is up to a pass to decide which information is relevant. For + example, the vectorizer passes print the source location of loops + which got successfully vectorized. + +'missed' + Print information about missed optimizations. Individual passes + control which information to include in the output. For example, + + gcc -O2 -ftree-vectorize -fopt-info-vec-missed + + will print information about missed optimization opportunities from + vectorization passes on stderr. + +'note' + Print verbose information about optimizations, such as certain + transformations, more detailed messages about decisions etc. + +'all' + Print detailed optimization information. This includes OPTIMIZED, + MISSED, and NOTE. + + +File: gccint.info, Node: Dump types, Next: Dump examples, Prev: Dump output verbosity, Up: Optimization info + +9.7.5 Dump types +---------------- + +'dump_printf' + + This is a generic method for doing formatted output. It takes an + additional argument 'dump_kind' which signifies the type of dump. + This method outputs information only when the dumps are enabled for + this particular 'dump_kind'. Note that the caller doesn't need to + know if the particular dump is enabled or not, or even the file + name. The caller only needs to decide which dump output + information is relevant, and under what conditions. This + determines the associated flags. + + Consider the following example from 'loop-unroll.c' where an + informative message about a loop (along with its location) is + printed when any of the following flags is enabled + + - optimization messages + - RTL dumps + - detailed dumps + + int report_flags = MSG_OPTIMIZED_LOCATIONS | TDF_RTL | TDF_DETAILS; + dump_printf_loc (report_flags, locus, + "loop turned into non-loop; it never loops.\n"); + +'dump_basic_block' + Output basic block. +'dump_generic_expr' + Output generic expression. +'dump_gimple_stmt' + Output gimple statement. + + Note that the above methods also have variants prefixed with + '_loc', such as 'dump_printf_loc', which are similar except they + also output the source location information. + + +File: gccint.info, Node: Dump examples, Prev: Dump types, Up: Optimization info + +9.7.6 Dump examples +------------------- + + gcc -O3 -fopt-info-missed=missed.all + + outputs missed optimization report from all the passes into +'missed.all'. + + As another example, + gcc -O3 -fopt-info-inline-optimized-missed=inline.txt + + will output information about missed optimizations as well as optimized +locations from all the inlining passes into 'inline.txt'. + + If the FILENAME is provided, then the dumps from all the applicable +optimizations are concatenated into the 'filename'. Otherwise the dump +is output onto 'stderr'. If OPTIONS is omitted, it defaults to +'all-all', which means dump all available optimization info from all the +passes. In the following example, all optimization info is output on to +'stderr'. + + gcc -O3 -fopt-info + + Note that '-fopt-info-vec-missed' behaves the same as +'-fopt-info-missed-vec'. + + As another example, consider + + gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt + + Here the two output file names 'vec.miss' and 'loop.opt' are in +conflict since only one output file is allowed. In this case, only the +first option takes effect and the subsequent options are ignored. Thus +only the 'vec.miss' is produced which containts dumps from the +vectorizer about missed opportunities. + + +File: gccint.info, Node: GENERIC, Next: GIMPLE, Prev: Passes, Up: Top + +10 GENERIC +********** + +The purpose of GENERIC is simply to provide a language-independent way +of representing an entire function in trees. To this end, it was +necessary to add a few new tree codes to the back end, but almost +everything was already there. If you can express it with the codes in +'gcc/tree.def', it's GENERIC. + + Early on, there was a great deal of debate about how to think about +statements in a tree IL. In GENERIC, a statement is defined as any +expression whose value, if any, is ignored. A statement will always +have 'TREE_SIDE_EFFECTS' set (or it will be discarded), but a +non-statement expression may also have side effects. A 'CALL_EXPR', for +instance. + + It would be possible for some local optimizations to work on the +GENERIC form of a function; indeed, the adapted tree inliner works fine +on GENERIC, but the current compiler performs inlining after lowering to +GIMPLE (a restricted form described in the next section). Indeed, +currently the frontends perform this lowering before handing off to +'tree_rest_of_compilation', but this seems inelegant. + +* Menu: + +* Deficiencies:: Topics net yet covered in this document. +* Tree overview:: All about 'tree's. +* Types:: Fundamental and aggregate types. +* Declarations:: Type declarations and variables. +* Attributes:: Declaration and type attributes. +* Expressions: Expression trees. Operating on data. +* Statements:: Control flow and related trees. +* Functions:: Function bodies, linkage, and other aspects. +* Language-dependent trees:: Topics and trees specific to language front ends. +* C and C++ Trees:: Trees specific to C and C++. +* Java Trees:: Trees specific to Java. + + +File: gccint.info, Node: Deficiencies, Next: Tree overview, Up: GENERIC + +10.1 Deficiencies +================= + +There are many places in which this document is incomplet and incorrekt. +It is, as of yet, only _preliminary_ documentation. + + +File: gccint.info, Node: Tree overview, Next: Types, Prev: Deficiencies, Up: GENERIC + +10.2 Overview +============= + +The central data structure used by the internal representation is the +'tree'. These nodes, while all of the C type 'tree', are of many +varieties. A 'tree' is a pointer type, but the object to which it +points may be of a variety of types. From this point forward, we will +refer to trees in ordinary type, rather than in 'this font', except when +talking about the actual C type 'tree'. + + You can tell what kind of node a particular tree is by using the +'TREE_CODE' macro. Many, many macros take trees as input and return +trees as output. However, most macros require a certain kind of tree +node as input. In other words, there is a type-system for trees, but it +is not reflected in the C type-system. + + For safety, it is useful to configure GCC with '--enable-checking'. +Although this results in a significant performance penalty (since all +tree types are checked at run-time), and is therefore inappropriate in a +release version, it is extremely helpful during the development process. + + Many macros behave as predicates. Many, although not all, of these +predicates end in '_P'. Do not rely on the result type of these macros +being of any particular type. You may, however, rely on the fact that +the type can be compared to '0', so that statements like + if (TEST_P (t) && !TEST_P (y)) + x = 1; +and + int i = (TEST_P (t) != 0); +are legal. Macros that return 'int' values now may be changed to return +'tree' values, or other pointers in the future. Even those that +continue to return 'int' may return multiple nonzero codes where +previously they returned only zero and one. Therefore, you should not +write code like + if (TEST_P (t) == 1) +as this code is not guaranteed to work correctly in the future. + + You should not take the address of values returned by the macros or +functions described here. In particular, no guarantee is given that the +values are lvalues. + + In general, the names of macros are all in uppercase, while the names +of functions are entirely in lowercase. There are rare exceptions to +this rule. You should assume that any macro or function whose name is +made up entirely of uppercase letters may evaluate its arguments more +than once. You may assume that a macro or function whose name is made +up entirely of lowercase letters will evaluate its arguments only once. + + The 'error_mark_node' is a special tree. Its tree code is +'ERROR_MARK', but since there is only ever one node with that code, the +usual practice is to compare the tree against 'error_mark_node'. (This +test is just a test for pointer equality.) If an error has occurred +during front-end processing the flag 'errorcount' will be set. If the +front end has encountered code it cannot handle, it will issue a message +to the user and set 'sorrycount'. When these flags are set, any macro +or function which normally returns a tree of a particular kind may +instead return the 'error_mark_node'. Thus, if you intend to do any +processing of erroneous code, you must be prepared to deal with the +'error_mark_node'. + + Occasionally, a particular tree slot (like an operand to an expression, +or a particular field in a declaration) will be referred to as "reserved +for the back end". These slots are used to store RTL when the tree is +converted to RTL for use by the GCC back end. However, if that process +is not taking place (e.g., if the front end is being hooked up to an +intelligent editor), then those slots may be used by the back end +presently in use. + + If you encounter situations that do not match this documentation, such +as tree nodes of types not mentioned here, or macros documented to +return entities of a particular kind that instead return entities of +some different kind, you have found a bug, either in the front end or in +the documentation. Please report these bugs as you would any other bug. + +* Menu: + +* Macros and Functions::Macros and functions that can be used with all trees. +* Identifiers:: The names of things. +* Containers:: Lists and vectors. + + +File: gccint.info, Node: Macros and Functions, Next: Identifiers, Up: Tree overview + +10.2.1 Trees +------------ + +All GENERIC trees have two fields in common. First, 'TREE_CHAIN' is a +pointer that can be used as a singly-linked list to other trees. The +other is 'TREE_TYPE'. Many trees store the type of an expression or +declaration in this field. + + These are some other functions for handling trees: + +'tree_size' + Return the number of bytes a tree takes. + +'build0' +'build1' +'build2' +'build3' +'build4' +'build5' +'build6' + + These functions build a tree and supply values to put in each + parameter. The basic signature is 'code, type, [operands]'. + 'code' is the 'TREE_CODE', and 'type' is a tree representing the + 'TREE_TYPE'. These are followed by the operands, each of which is + also a tree. + + +File: gccint.info, Node: Identifiers, Next: Containers, Prev: Macros and Functions, Up: Tree overview + +10.2.2 Identifiers +------------------ + +An 'IDENTIFIER_NODE' represents a slightly more general concept than the +standard C or C++ concept of identifier. In particular, an +'IDENTIFIER_NODE' may contain a '$', or other extraordinary characters. + + There are never two distinct 'IDENTIFIER_NODE's representing the same +identifier. Therefore, you may use pointer equality to compare +'IDENTIFIER_NODE's, rather than using a routine like 'strcmp'. Use +'get_identifier' to obtain the unique 'IDENTIFIER_NODE' for a supplied +string. + + You can use the following macros to access identifiers: +'IDENTIFIER_POINTER' + The string represented by the identifier, represented as a 'char*'. + This string is always 'NUL'-terminated, and contains no embedded + 'NUL' characters. + +'IDENTIFIER_LENGTH' + The length of the string returned by 'IDENTIFIER_POINTER', not + including the trailing 'NUL'. This value of 'IDENTIFIER_LENGTH + (x)' is always the same as 'strlen (IDENTIFIER_POINTER (x))'. + +'IDENTIFIER_OPNAME_P' + This predicate holds if the identifier represents the name of an + overloaded operator. In this case, you should not depend on the + contents of either the 'IDENTIFIER_POINTER' or the + 'IDENTIFIER_LENGTH'. + +'IDENTIFIER_TYPENAME_P' + This predicate holds if the identifier represents the name of a + user-defined conversion operator. In this case, the 'TREE_TYPE' of + the 'IDENTIFIER_NODE' holds the type to which the conversion + operator converts. + + +File: gccint.info, Node: Containers, Prev: Identifiers, Up: Tree overview + +10.2.3 Containers +----------------- + +Two common container data structures can be represented directly with +tree nodes. A 'TREE_LIST' is a singly linked list containing two trees +per node. These are the 'TREE_PURPOSE' and 'TREE_VALUE' of each node. +(Often, the 'TREE_PURPOSE' contains some kind of tag, or additional +information, while the 'TREE_VALUE' contains the majority of the +payload. In other cases, the 'TREE_PURPOSE' is simply 'NULL_TREE', +while in still others both the 'TREE_PURPOSE' and 'TREE_VALUE' are of +equal stature.) Given one 'TREE_LIST' node, the next node is found by +following the 'TREE_CHAIN'. If the 'TREE_CHAIN' is 'NULL_TREE', then +you have reached the end of the list. + + A 'TREE_VEC' is a simple vector. The 'TREE_VEC_LENGTH' is an integer +(not a tree) giving the number of nodes in the vector. The nodes +themselves are accessed using the 'TREE_VEC_ELT' macro, which takes two +arguments. The first is the 'TREE_VEC' in question; the second is an +integer indicating which element in the vector is desired. The elements +are indexed from zero. + + +File: gccint.info, Node: Types, Next: Declarations, Prev: Tree overview, Up: GENERIC + +10.3 Types +========== + +All types have corresponding tree nodes. However, you should not assume +that there is exactly one tree node corresponding to each type. There +are often multiple nodes corresponding to the same type. + + For the most part, different kinds of types have different tree codes. +(For example, pointer types use a 'POINTER_TYPE' code while arrays use +an 'ARRAY_TYPE' code.) However, pointers to member functions use the +'RECORD_TYPE' code. Therefore, when writing a 'switch' statement that +depends on the code associated with a particular type, you should take +care to handle pointers to member functions under the 'RECORD_TYPE' case +label. + + The following functions and macros deal with cv-qualification of types: +'TYPE_MAIN_VARIANT' + This macro returns the unqualified version of a type. It may be + applied to an unqualified type, but it is not always the identity + function in that case. + + A few other macros and functions are usable with all types: +'TYPE_SIZE' + The number of bits required to represent the type, represented as + an 'INTEGER_CST'. For an incomplete type, 'TYPE_SIZE' will be + 'NULL_TREE'. + +'TYPE_ALIGN' + The alignment of the type, in bits, represented as an 'int'. + +'TYPE_NAME' + This macro returns a declaration (in the form of a 'TYPE_DECL') for + the type. (Note this macro does _not_ return an 'IDENTIFIER_NODE', + as you might expect, given its name!) You can look at the + 'DECL_NAME' of the 'TYPE_DECL' to obtain the actual name of the + type. The 'TYPE_NAME' will be 'NULL_TREE' for a type that is not a + built-in type, the result of a typedef, or a named class type. + +'TYPE_CANONICAL' + This macro returns the "canonical" type for the given type node. + Canonical types are used to improve performance in the C++ and + Objective-C++ front ends by allowing efficient comparison between + two type nodes in 'same_type_p': if the 'TYPE_CANONICAL' values of + the types are equal, the types are equivalent; otherwise, the types + are not equivalent. The notion of equivalence for canonical types + is the same as the notion of type equivalence in the language + itself. For instance, + + When 'TYPE_CANONICAL' is 'NULL_TREE', there is no canonical type + for the given type node. In this case, comparison between this + type and any other type requires the compiler to perform a deep, + "structural" comparison to see if the two type nodes have the same + form and properties. + + The canonical type for a node is always the most fundamental type + in the equivalence class of types. For instance, 'int' is its own + canonical type. A typedef 'I' of 'int' will have 'int' as its + canonical type. Similarly, 'I*' and a typedef 'IP' (defined to + 'I*') will has 'int*' as their canonical type. When building a new + type node, be sure to set 'TYPE_CANONICAL' to the appropriate + canonical type. If the new type is a compound type (built from + other types), and any of those other types require structural + equality, use 'SET_TYPE_STRUCTURAL_EQUALITY' to ensure that the new + type also requires structural equality. Finally, if for some + reason you cannot guarantee that 'TYPE_CANONICAL' will point to the + canonical type, use 'SET_TYPE_STRUCTURAL_EQUALITY' to make sure + that the new type-and any type constructed based on it-requires + structural equality. If you suspect that the canonical type system + is miscomparing types, pass '--param verify-canonical-types=1' to + the compiler or configure with '--enable-checking' to force the + compiler to verify its canonical-type comparisons against the + structural comparisons; the compiler will then print any warnings + if the canonical types miscompare. + +'TYPE_STRUCTURAL_EQUALITY_P' + This predicate holds when the node requires structural equality + checks, e.g., when 'TYPE_CANONICAL' is 'NULL_TREE'. + +'SET_TYPE_STRUCTURAL_EQUALITY' + This macro states that the type node it is given requires + structural equality checks, e.g., it sets 'TYPE_CANONICAL' to + 'NULL_TREE'. + +'same_type_p' + This predicate takes two types as input, and holds if they are the + same type. For example, if one type is a 'typedef' for the other, + or both are 'typedef's for the same type. This predicate also + holds if the two trees given as input are simply copies of one + another; i.e., there is no difference between them at the source + level, but, for whatever reason, a duplicate has been made in the + representation. You should never use '==' (pointer equality) to + compare types; always use 'same_type_p' instead. + + Detailed below are the various kinds of types, and the macros that can +be used to access them. Although other kinds of types are used +elsewhere in G++, the types described here are the only ones that you +will encounter while examining the intermediate representation. + +'VOID_TYPE' + Used to represent the 'void' type. + +'INTEGER_TYPE' + Used to represent the various integral types, including 'char', + 'short', 'int', 'long', and 'long long'. This code is not used for + enumeration types, nor for the 'bool' type. The 'TYPE_PRECISION' + is the number of bits used in the representation, represented as an + 'unsigned int'. (Note that in the general case this is not the + same value as 'TYPE_SIZE'; suppose that there were a 24-bit integer + type, but that alignment requirements for the ABI required 32-bit + alignment. Then, 'TYPE_SIZE' would be an 'INTEGER_CST' for 32, + while 'TYPE_PRECISION' would be 24.) The integer type is unsigned + if 'TYPE_UNSIGNED' holds; otherwise, it is signed. + + The 'TYPE_MIN_VALUE' is an 'INTEGER_CST' for the smallest integer + that may be represented by this type. Similarly, the + 'TYPE_MAX_VALUE' is an 'INTEGER_CST' for the largest integer that + may be represented by this type. + +'REAL_TYPE' + Used to represent the 'float', 'double', and 'long double' types. + The number of bits in the floating-point representation is given by + 'TYPE_PRECISION', as in the 'INTEGER_TYPE' case. + +'FIXED_POINT_TYPE' + Used to represent the 'short _Fract', '_Fract', 'long _Fract', + 'long long _Fract', 'short _Accum', '_Accum', 'long _Accum', and + 'long long _Accum' types. The number of bits in the fixed-point + representation is given by 'TYPE_PRECISION', as in the + 'INTEGER_TYPE' case. There may be padding bits, fractional bits + and integral bits. The number of fractional bits is given by + 'TYPE_FBIT', and the number of integral bits is given by + 'TYPE_IBIT'. The fixed-point type is unsigned if 'TYPE_UNSIGNED' + holds; otherwise, it is signed. The fixed-point type is saturating + if 'TYPE_SATURATING' holds; otherwise, it is not saturating. + +'COMPLEX_TYPE' + Used to represent GCC built-in '__complex__' data types. The + 'TREE_TYPE' is the type of the real and imaginary parts. + +'ENUMERAL_TYPE' + Used to represent an enumeration type. The 'TYPE_PRECISION' gives + (as an 'int'), the number of bits used to represent the type. If + there are no negative enumeration constants, 'TYPE_UNSIGNED' will + hold. The minimum and maximum enumeration constants may be + obtained with 'TYPE_MIN_VALUE' and 'TYPE_MAX_VALUE', respectively; + each of these macros returns an 'INTEGER_CST'. + + The actual enumeration constants themselves may be obtained by + looking at the 'TYPE_VALUES'. This macro will return a + 'TREE_LIST', containing the constants. The 'TREE_PURPOSE' of each + node will be an 'IDENTIFIER_NODE' giving the name of the constant; + the 'TREE_VALUE' will be an 'INTEGER_CST' giving the value assigned + to that constant. These constants will appear in the order in + which they were declared. The 'TREE_TYPE' of each of these + constants will be the type of enumeration type itself. + +'BOOLEAN_TYPE' + Used to represent the 'bool' type. + +'POINTER_TYPE' + Used to represent pointer types, and pointer to data member types. + The 'TREE_TYPE' gives the type to which this type points. + +'REFERENCE_TYPE' + Used to represent reference types. The 'TREE_TYPE' gives the type + to which this type refers. + +'FUNCTION_TYPE' + Used to represent the type of non-member functions and of static + member functions. The 'TREE_TYPE' gives the return type of the + function. The 'TYPE_ARG_TYPES' are a 'TREE_LIST' of the argument + types. The 'TREE_VALUE' of each node in this list is the type of + the corresponding argument; the 'TREE_PURPOSE' is an expression for + the default argument value, if any. If the last node in the list + is 'void_list_node' (a 'TREE_LIST' node whose 'TREE_VALUE' is the + 'void_type_node'), then functions of this type do not take variable + arguments. Otherwise, they do take a variable number of arguments. + + Note that in C (but not in C++) a function declared like 'void f()' + is an unprototyped function taking a variable number of arguments; + the 'TYPE_ARG_TYPES' of such a function will be 'NULL'. + +'METHOD_TYPE' + Used to represent the type of a non-static member function. Like a + 'FUNCTION_TYPE', the return type is given by the 'TREE_TYPE'. The + type of '*this', i.e., the class of which functions of this type + are a member, is given by the 'TYPE_METHOD_BASETYPE'. The + 'TYPE_ARG_TYPES' is the parameter list, as for a 'FUNCTION_TYPE', + and includes the 'this' argument. + +'ARRAY_TYPE' + Used to represent array types. The 'TREE_TYPE' gives the type of + the elements in the array. If the array-bound is present in the + type, the 'TYPE_DOMAIN' is an 'INTEGER_TYPE' whose 'TYPE_MIN_VALUE' + and 'TYPE_MAX_VALUE' will be the lower and upper bounds of the + array, respectively. The 'TYPE_MIN_VALUE' will always be an + 'INTEGER_CST' for zero, while the 'TYPE_MAX_VALUE' will be one less + than the number of elements in the array, i.e., the highest value + which may be used to index an element in the array. + +'RECORD_TYPE' + Used to represent 'struct' and 'class' types, as well as pointers + to member functions and similar constructs in other languages. + 'TYPE_FIELDS' contains the items contained in this type, each of + which can be a 'FIELD_DECL', 'VAR_DECL', 'CONST_DECL', or + 'TYPE_DECL'. You may not make any assumptions about the ordering + of the fields in the type or whether one or more of them overlap. + +'UNION_TYPE' + Used to represent 'union' types. Similar to 'RECORD_TYPE' except + that all 'FIELD_DECL' nodes in 'TYPE_FIELD' start at bit position + zero. + +'QUAL_UNION_TYPE' + Used to represent part of a variant record in Ada. Similar to + 'UNION_TYPE' except that each 'FIELD_DECL' has a 'DECL_QUALIFIER' + field, which contains a boolean expression that indicates whether + the field is present in the object. The type will only have one + field, so each field's 'DECL_QUALIFIER' is only evaluated if none + of the expressions in the previous fields in 'TYPE_FIELDS' are + nonzero. Normally these expressions will reference a field in the + outer object using a 'PLACEHOLDER_EXPR'. + +'LANG_TYPE' + This node is used to represent a language-specific type. The front + end must handle it. + +'OFFSET_TYPE' + This node is used to represent a pointer-to-data member. For a + data member 'X::m' the 'TYPE_OFFSET_BASETYPE' is 'X' and the + 'TREE_TYPE' is the type of 'm'. + + There are variables whose values represent some of the basic types. +These include: +'void_type_node' + A node for 'void'. + +'integer_type_node' + A node for 'int'. + +'unsigned_type_node.' + A node for 'unsigned int'. + +'char_type_node.' + A node for 'char'. +It may sometimes be useful to compare one of these variables with a type +in hand, using 'same_type_p'. + + +File: gccint.info, Node: Declarations, Next: Attributes, Prev: Types, Up: GENERIC + +10.4 Declarations +================= + +This section covers the various kinds of declarations that appear in the +internal representation, except for declarations of functions +(represented by 'FUNCTION_DECL' nodes), which are described in *note +Functions::. + +* Menu: + +* Working with declarations:: Macros and functions that work on +declarations. +* Internal structure:: How declaration nodes are represented. + + +File: gccint.info, Node: Working with declarations, Next: Internal structure, Up: Declarations + +10.4.1 Working with declarations +-------------------------------- + +Some macros can be used with any kind of declaration. These include: +'DECL_NAME' + This macro returns an 'IDENTIFIER_NODE' giving the name of the + entity. + +'TREE_TYPE' + This macro returns the type of the entity declared. + +'EXPR_FILENAME' + This macro returns the name of the file in which the entity was + declared, as a 'char*'. For an entity declared implicitly by the + compiler (like '__builtin_memcpy'), this will be the string + '"<internal>"'. + +'EXPR_LINENO' + This macro returns the line number at which the entity was + declared, as an 'int'. + +'DECL_ARTIFICIAL' + This predicate holds if the declaration was implicitly generated by + the compiler. For example, this predicate will hold of an + implicitly declared member function, or of the 'TYPE_DECL' + implicitly generated for a class type. Recall that in C++ code + like: + struct S {}; + is roughly equivalent to C code like: + struct S {}; + typedef struct S S; + The implicitly generated 'typedef' declaration is represented by a + 'TYPE_DECL' for which 'DECL_ARTIFICIAL' holds. + + The various kinds of declarations include: +'LABEL_DECL' + These nodes are used to represent labels in function bodies. For + more information, see *note Functions::. These nodes only appear + in block scopes. + +'CONST_DECL' + These nodes are used to represent enumeration constants. The value + of the constant is given by 'DECL_INITIAL' which will be an + 'INTEGER_CST' with the same type as the 'TREE_TYPE' of the + 'CONST_DECL', i.e., an 'ENUMERAL_TYPE'. + +'RESULT_DECL' + These nodes represent the value returned by a function. When a + value is assigned to a 'RESULT_DECL', that indicates that the value + should be returned, via bitwise copy, by the function. You can use + 'DECL_SIZE' and 'DECL_ALIGN' on a 'RESULT_DECL', just as with a + 'VAR_DECL'. + +'TYPE_DECL' + These nodes represent 'typedef' declarations. The 'TREE_TYPE' is + the type declared to have the name given by 'DECL_NAME'. In some + cases, there is no associated name. + +'VAR_DECL' + These nodes represent variables with namespace or block scope, as + well as static data members. The 'DECL_SIZE' and 'DECL_ALIGN' are + analogous to 'TYPE_SIZE' and 'TYPE_ALIGN'. For a declaration, you + should always use the 'DECL_SIZE' and 'DECL_ALIGN' rather than the + 'TYPE_SIZE' and 'TYPE_ALIGN' given by the 'TREE_TYPE', since + special attributes may have been applied to the variable to give it + a particular size and alignment. You may use the predicates + 'DECL_THIS_STATIC' or 'DECL_THIS_EXTERN' to test whether the + storage class specifiers 'static' or 'extern' were used to declare + a variable. + + If this variable is initialized (but does not require a + constructor), the 'DECL_INITIAL' will be an expression for the + initializer. The initializer should be evaluated, and a bitwise + copy into the variable performed. If the 'DECL_INITIAL' is the + 'error_mark_node', there is an initializer, but it is given by an + explicit statement later in the code; no bitwise copy is required. + + GCC provides an extension that allows either automatic variables, + or global variables, to be placed in particular registers. This + extension is being used for a particular 'VAR_DECL' if + 'DECL_REGISTER' holds for the 'VAR_DECL', and if + 'DECL_ASSEMBLER_NAME' is not equal to 'DECL_NAME'. In that case, + 'DECL_ASSEMBLER_NAME' is the name of the register into which the + variable will be placed. + +'PARM_DECL' + Used to represent a parameter to a function. Treat these nodes + similarly to 'VAR_DECL' nodes. These nodes only appear in the + 'DECL_ARGUMENTS' for a 'FUNCTION_DECL'. + + The 'DECL_ARG_TYPE' for a 'PARM_DECL' is the type that will + actually be used when a value is passed to this function. It may + be a wider type than the 'TREE_TYPE' of the parameter; for example, + the ordinary type might be 'short' while the 'DECL_ARG_TYPE' is + 'int'. + +'DEBUG_EXPR_DECL' + Used to represent an anonymous debug-information temporary created + to hold an expression as it is optimized away, so that its value + can be referenced in debug bind statements. + +'FIELD_DECL' + These nodes represent non-static data members. The 'DECL_SIZE' and + 'DECL_ALIGN' behave as for 'VAR_DECL' nodes. The position of the + field within the parent record is specified by a combination of + three attributes. 'DECL_FIELD_OFFSET' is the position, counting in + bytes, of the 'DECL_OFFSET_ALIGN'-bit sized word containing the bit + of the field closest to the beginning of the structure. + 'DECL_FIELD_BIT_OFFSET' is the bit offset of the first bit of the + field within this word; this may be nonzero even for fields that + are not bit-fields, since 'DECL_OFFSET_ALIGN' may be greater than + the natural alignment of the field's type. + + If 'DECL_C_BIT_FIELD' holds, this field is a bit-field. In a + bit-field, 'DECL_BIT_FIELD_TYPE' also contains the type that was + originally specified for it, while DECL_TYPE may be a modified type + with lesser precision, according to the size of the bit field. + +'NAMESPACE_DECL' + Namespaces provide a name hierarchy for other declarations. They + appear in the 'DECL_CONTEXT' of other '_DECL' nodes. + + +File: gccint.info, Node: Internal structure, Prev: Working with declarations, Up: Declarations + +10.4.2 Internal structure +------------------------- + +'DECL' nodes are represented internally as a hierarchy of structures. + +* Menu: + +* Current structure hierarchy:: The current DECL node structure +hierarchy. +* Adding new DECL node types:: How to add a new DECL node to a +frontend. + + +File: gccint.info, Node: Current structure hierarchy, Next: Adding new DECL node types, Up: Internal structure + +10.4.2.1 Current structure hierarchy +.................................... + +'struct tree_decl_minimal' + This is the minimal structure to inherit from in order for common + 'DECL' macros to work. The fields it contains are a unique ID, + source location, context, and name. + +'struct tree_decl_common' + This structure inherits from 'struct tree_decl_minimal'. It + contains fields that most 'DECL' nodes need, such as a field to + store alignment, machine mode, size, and attributes. + +'struct tree_field_decl' + This structure inherits from 'struct tree_decl_common'. It is used + to represent 'FIELD_DECL'. + +'struct tree_label_decl' + This structure inherits from 'struct tree_decl_common'. It is used + to represent 'LABEL_DECL'. + +'struct tree_translation_unit_decl' + This structure inherits from 'struct tree_decl_common'. It is used + to represent 'TRANSLATION_UNIT_DECL'. + +'struct tree_decl_with_rtl' + This structure inherits from 'struct tree_decl_common'. It + contains a field to store the low-level RTL associated with a + 'DECL' node. + +'struct tree_result_decl' + This structure inherits from 'struct tree_decl_with_rtl'. It is + used to represent 'RESULT_DECL'. + +'struct tree_const_decl' + This structure inherits from 'struct tree_decl_with_rtl'. It is + used to represent 'CONST_DECL'. + +'struct tree_parm_decl' + This structure inherits from 'struct tree_decl_with_rtl'. It is + used to represent 'PARM_DECL'. + +'struct tree_decl_with_vis' + This structure inherits from 'struct tree_decl_with_rtl'. It + contains fields necessary to store visibility information, as well + as a section name and assembler name. + +'struct tree_var_decl' + This structure inherits from 'struct tree_decl_with_vis'. It is + used to represent 'VAR_DECL'. + +'struct tree_function_decl' + This structure inherits from 'struct tree_decl_with_vis'. It is + used to represent 'FUNCTION_DECL'. + + +File: gccint.info, Node: Adding new DECL node types, Prev: Current structure hierarchy, Up: Internal structure + +10.4.2.2 Adding new DECL node types +................................... + +Adding a new 'DECL' tree consists of the following steps + +Add a new tree code for the 'DECL' node + For language specific 'DECL' nodes, there is a '.def' file in each + frontend directory where the tree code should be added. For 'DECL' + nodes that are part of the middle-end, the code should be added to + 'tree.def'. + +Create a new structure type for the 'DECL' node + These structures should inherit from one of the existing structures + in the language hierarchy by using that structure as the first + member. + + struct tree_foo_decl + { + struct tree_decl_with_vis common; + } + + Would create a structure name 'tree_foo_decl' that inherits from + 'struct tree_decl_with_vis'. + + For language specific 'DECL' nodes, this new structure type should + go in the appropriate '.h' file. For 'DECL' nodes that are part of + the middle-end, the structure type should go in 'tree.h'. + +Add a member to the tree structure enumerator for the node + For garbage collection and dynamic checking purposes, each 'DECL' + node structure type is required to have a unique enumerator value + specified with it. For language specific 'DECL' nodes, this new + enumerator value should go in the appropriate '.def' file. For + 'DECL' nodes that are part of the middle-end, the enumerator values + are specified in 'treestruct.def'. + +Update 'union tree_node' + In order to make your new structure type usable, it must be added + to 'union tree_node'. For language specific 'DECL' nodes, a new + entry should be added to the appropriate '.h' file of the form + struct tree_foo_decl GTY ((tag ("TS_VAR_DECL"))) foo_decl; + For 'DECL' nodes that are part of the middle-end, the additional + member goes directly into 'union tree_node' in 'tree.h'. + +Update dynamic checking info + In order to be able to check whether accessing a named portion of + 'union tree_node' is legal, and whether a certain 'DECL' node + contains one of the enumerated 'DECL' node structures in the + hierarchy, a simple lookup table is used. This lookup table needs + to be kept up to date with the tree structure hierarchy, or else + checking and containment macros will fail inappropriately. + + For language specific 'DECL' nodes, their is an 'init_ts' function + in an appropriate '.c' file, which initializes the lookup table. + Code setting up the table for new 'DECL' nodes should be added + there. For each 'DECL' tree code and enumerator value representing + a member of the inheritance hierarchy, the table should contain 1 + if that tree code inherits (directly or indirectly) from that + member. Thus, a 'FOO_DECL' node derived from 'struct + decl_with_rtl', and enumerator value 'TS_FOO_DECL', would be set up + as follows + tree_contains_struct[FOO_DECL][TS_FOO_DECL] = 1; + tree_contains_struct[FOO_DECL][TS_DECL_WRTL] = 1; + tree_contains_struct[FOO_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[FOO_DECL][TS_DECL_MINIMAL] = 1; + + For 'DECL' nodes that are part of the middle-end, the setup code + goes into 'tree.c'. + +Add macros to access any new fields and flags + + Each added field or flag should have a macro that is used to access + it, that performs appropriate checking to ensure only the right + type of 'DECL' nodes access the field. + + These macros generally take the following form + #define FOO_DECL_FIELDNAME(NODE) FOO_DECL_CHECK(NODE)->foo_decl.fieldname + However, if the structure is simply a base class for further + structures, something like the following should be used + #define BASE_STRUCT_CHECK(T) CONTAINS_STRUCT_CHECK(T, TS_BASE_STRUCT) + #define BASE_STRUCT_FIELDNAME(NODE) \ + (BASE_STRUCT_CHECK(NODE)->base_struct.fieldname + + Reading them from the generated 'all-tree.def' file (which in turn + includes all the 'tree.def' files), 'gencheck.c' is used during + GCC's build to generate the '*_CHECK' macros for all tree codes. + + +File: gccint.info, Node: Attributes, Next: Expression trees, Prev: Declarations, Up: GENERIC + +10.5 Attributes in trees +======================== + +Attributes, as specified using the '__attribute__' keyword, are +represented internally as a 'TREE_LIST'. The 'TREE_PURPOSE' is the name +of the attribute, as an 'IDENTIFIER_NODE'. The 'TREE_VALUE' is a +'TREE_LIST' of the arguments of the attribute, if any, or 'NULL_TREE' if +there are no arguments; the arguments are stored as the 'TREE_VALUE' of +successive entries in the list, and may be identifiers or expressions. +The 'TREE_CHAIN' of the attribute is the next attribute in a list of +attributes applying to the same declaration or type, or 'NULL_TREE' if +there are no further attributes in the list. + + Attributes may be attached to declarations and to types; these +attributes may be accessed with the following macros. All attributes +are stored in this way, and many also cause other changes to the +declaration or type or to other internal compiler data structures. + + -- Tree Macro: tree DECL_ATTRIBUTES (tree DECL) + This macro returns the attributes on the declaration DECL. + + -- Tree Macro: tree TYPE_ATTRIBUTES (tree TYPE) + This macro returns the attributes on the type TYPE. + + +File: gccint.info, Node: Expression trees, Next: Statements, Prev: Attributes, Up: GENERIC + +10.6 Expressions +================ + +The internal representation for expressions is for the most part quite +straightforward. However, there are a few facts that one must bear in +mind. In particular, the expression "tree" is actually a directed +acyclic graph. (For example there may be many references to the integer +constant zero throughout the source program; many of these will be +represented by the same expression node.) You should not rely on +certain kinds of node being shared, nor should you rely on certain kinds +of nodes being unshared. + + The following macros can be used with all expression nodes: + +'TREE_TYPE' + Returns the type of the expression. This value may not be + precisely the same type that would be given the expression in the + original program. + + In what follows, some nodes that one might expect to always have type +'bool' are documented to have either integral or boolean type. At some +point in the future, the C front end may also make use of this same +intermediate representation, and at this point these nodes will +certainly have integral type. The previous sentence is not meant to +imply that the C++ front end does not or will not give these nodes +integral type. + + Below, we list the various kinds of expression nodes. Except where +noted otherwise, the operands to an expression are accessed using the +'TREE_OPERAND' macro. For example, to access the first operand to a +binary plus expression 'expr', use: + + TREE_OPERAND (expr, 0) + + As this example indicates, the operands are zero-indexed. + +* Menu: + +* Constants: Constant expressions. +* Storage References:: +* Unary and Binary Expressions:: +* Vectors:: + + +File: gccint.info, Node: Constant expressions, Next: Storage References, Up: Expression trees + +10.6.1 Constant expressions +--------------------------- + +The table below begins with constants, moves on to unary expressions, +then proceeds to binary expressions, and concludes with various other +kinds of expressions: + +'INTEGER_CST' + These nodes represent integer constants. Note that the type of + these constants is obtained with 'TREE_TYPE'; they are not always + of type 'int'. In particular, 'char' constants are represented + with 'INTEGER_CST' nodes. The value of the integer constant 'e' is + given by + ((TREE_INT_CST_HIGH (e) << HOST_BITS_PER_WIDE_INT) + + TREE_INST_CST_LOW (e)) + HOST_BITS_PER_WIDE_INT is at least thirty-two on all platforms. + Both 'TREE_INT_CST_HIGH' and 'TREE_INT_CST_LOW' return a + 'HOST_WIDE_INT'. The value of an 'INTEGER_CST' is interpreted as a + signed or unsigned quantity depending on the type of the constant. + In general, the expression given above will overflow, so it should + not be used to calculate the value of the constant. + + The variable 'integer_zero_node' is an integer constant with value + zero. Similarly, 'integer_one_node' is an integer constant with + value one. The 'size_zero_node' and 'size_one_node' variables are + analogous, but have type 'size_t' rather than 'int'. + + The function 'tree_int_cst_lt' is a predicate which holds if its + first argument is less than its second. Both constants are assumed + to have the same signedness (i.e., either both should be signed or + both should be unsigned.) The full width of the constant is used + when doing the comparison; the usual rules about promotions and + conversions are ignored. Similarly, 'tree_int_cst_equal' holds if + the two constants are equal. The 'tree_int_cst_sgn' function + returns the sign of a constant. The value is '1', '0', or '-1' + according on whether the constant is greater than, equal to, or + less than zero. Again, the signedness of the constant's type is + taken into account; an unsigned constant is never less than zero, + no matter what its bit-pattern. + +'REAL_CST' + + FIXME: Talk about how to obtain representations of this constant, + do comparisons, and so forth. + +'FIXED_CST' + + These nodes represent fixed-point constants. The type of these + constants is obtained with 'TREE_TYPE'. 'TREE_FIXED_CST_PTR' + points to a 'struct fixed_value'; 'TREE_FIXED_CST' returns the + structure itself. 'struct fixed_value' contains 'data' with the + size of two 'HOST_BITS_PER_WIDE_INT' and 'mode' as the associated + fixed-point machine mode for 'data'. + +'COMPLEX_CST' + These nodes are used to represent complex number constants, that is + a '__complex__' whose parts are constant nodes. The + 'TREE_REALPART' and 'TREE_IMAGPART' return the real and the + imaginary parts respectively. + +'VECTOR_CST' + These nodes are used to represent vector constants, whose parts are + constant nodes. Each individual constant node is either an integer + or a double constant node. The first operand is a 'TREE_LIST' of + the constant nodes and is accessed through 'TREE_VECTOR_CST_ELTS'. + +'STRING_CST' + These nodes represent string-constants. The 'TREE_STRING_LENGTH' + returns the length of the string, as an 'int'. The + 'TREE_STRING_POINTER' is a 'char*' containing the string itself. + The string may not be 'NUL'-terminated, and it may contain embedded + 'NUL' characters. Therefore, the 'TREE_STRING_LENGTH' includes the + trailing 'NUL' if it is present. + + For wide string constants, the 'TREE_STRING_LENGTH' is the number + of bytes in the string, and the 'TREE_STRING_POINTER' points to an + array of the bytes of the string, as represented on the target + system (that is, as integers in the target endianness). Wide and + non-wide string constants are distinguished only by the 'TREE_TYPE' + of the 'STRING_CST'. + + FIXME: The formats of string constants are not well-defined when + the target system bytes are not the same width as host system + bytes. + + +File: gccint.info, Node: Storage References, Next: Unary and Binary Expressions, Prev: Constant expressions, Up: Expression trees + +10.6.2 References to storage +---------------------------- + +'ARRAY_REF' + These nodes represent array accesses. The first operand is the + array; the second is the index. To calculate the address of the + memory accessed, you must scale the index by the size of the type + of the array elements. The type of these expressions must be the + type of a component of the array. The third and fourth operands + are used after gimplification to represent the lower bound and + component size but should not be used directly; call + 'array_ref_low_bound' and 'array_ref_element_size' instead. + +'ARRAY_RANGE_REF' + These nodes represent access to a range (or "slice") of an array. + The operands are the same as that for 'ARRAY_REF' and have the same + meanings. The type of these expressions must be an array whose + component type is the same as that of the first operand. The range + of that array type determines the amount of data these expressions + access. + +'TARGET_MEM_REF' + These nodes represent memory accesses whose address directly map to + an addressing mode of the target architecture. The first argument + is 'TMR_SYMBOL' and must be a 'VAR_DECL' of an object with a fixed + address. The second argument is 'TMR_BASE' and the third one is + 'TMR_INDEX'. The fourth argument is 'TMR_STEP' and must be an + 'INTEGER_CST'. The fifth argument is 'TMR_OFFSET' and must be an + 'INTEGER_CST'. Any of the arguments may be NULL if the appropriate + component does not appear in the address. Address of the + 'TARGET_MEM_REF' is determined in the following way. + + &TMR_SYMBOL + TMR_BASE + TMR_INDEX * TMR_STEP + TMR_OFFSET + + The sixth argument is the reference to the original memory access, + which is preserved for the purposes of the RTL alias analysis. The + seventh argument is a tag representing the results of tree level + alias analysis. + +'ADDR_EXPR' + These nodes are used to represent the address of an object. (These + expressions will always have pointer or reference type.) The + operand may be another expression, or it may be a declaration. + + As an extension, GCC allows users to take the address of a label. + In this case, the operand of the 'ADDR_EXPR' will be a + 'LABEL_DECL'. The type of such an expression is 'void*'. + + If the object addressed is not an lvalue, a temporary is created, + and the address of the temporary is used. + +'INDIRECT_REF' + These nodes are used to represent the object pointed to by a + pointer. The operand is the pointer being dereferenced; it will + always have pointer or reference type. + +'MEM_REF' + These nodes are used to represent the object pointed to by a + pointer offset by a constant. The first operand is the pointer + being dereferenced; it will always have pointer or reference type. + The second operand is a pointer constant. Its type is specifying + the type to be used for type-based alias analysis. + +'COMPONENT_REF' + These nodes represent non-static data member accesses. The first + operand is the object (rather than a pointer to it); the second + operand is the 'FIELD_DECL' for the data member. The third operand + represents the byte offset of the field, but should not be used + directly; call 'component_ref_field_offset' instead. + + +File: gccint.info, Node: Unary and Binary Expressions, Next: Vectors, Prev: Storage References, Up: Expression trees + +10.6.3 Unary and Binary Expressions +----------------------------------- + +'NEGATE_EXPR' + These nodes represent unary negation of the single operand, for + both integer and floating-point types. The type of negation can be + determined by looking at the type of the expression. + + The behavior of this operation on signed arithmetic overflow is + controlled by the 'flag_wrapv' and 'flag_trapv' variables. + +'ABS_EXPR' + These nodes represent the absolute value of the single operand, for + both integer and floating-point types. This is typically used to + implement the 'abs', 'labs' and 'llabs' builtins for integer types, + and the 'fabs', 'fabsf' and 'fabsl' builtins for floating point + types. The type of abs operation can be determined by looking at + the type of the expression. + + This node is not used for complex types. To represent the modulus + or complex abs of a complex value, use the 'BUILT_IN_CABS', + 'BUILT_IN_CABSF' or 'BUILT_IN_CABSL' builtins, as used to implement + the C99 'cabs', 'cabsf' and 'cabsl' built-in functions. + +'BIT_NOT_EXPR' + These nodes represent bitwise complement, and will always have + integral type. The only operand is the value to be complemented. + +'TRUTH_NOT_EXPR' + These nodes represent logical negation, and will always have + integral (or boolean) type. The operand is the value being + negated. The type of the operand and that of the result are always + of 'BOOLEAN_TYPE' or 'INTEGER_TYPE'. + +'PREDECREMENT_EXPR' +'PREINCREMENT_EXPR' +'POSTDECREMENT_EXPR' +'POSTINCREMENT_EXPR' + These nodes represent increment and decrement expressions. The + value of the single operand is computed, and the operand + incremented or decremented. In the case of 'PREDECREMENT_EXPR' and + 'PREINCREMENT_EXPR', the value of the expression is the value + resulting after the increment or decrement; in the case of + 'POSTDECREMENT_EXPR' and 'POSTINCREMENT_EXPR' is the value before + the increment or decrement occurs. The type of the operand, like + that of the result, will be either integral, boolean, or + floating-point. + +'FIX_TRUNC_EXPR' + These nodes represent conversion of a floating-point value to an + integer. The single operand will have a floating-point type, while + the complete expression will have an integral (or boolean) type. + The operand is rounded towards zero. + +'FLOAT_EXPR' + These nodes represent conversion of an integral (or boolean) value + to a floating-point value. The single operand will have integral + type, while the complete expression will have a floating-point + type. + + FIXME: How is the operand supposed to be rounded? Is this + dependent on '-mieee'? + +'COMPLEX_EXPR' + These nodes are used to represent complex numbers constructed from + two expressions of the same (integer or real) type. The first + operand is the real part and the second operand is the imaginary + part. + +'CONJ_EXPR' + These nodes represent the conjugate of their operand. + +'REALPART_EXPR' +'IMAGPART_EXPR' + These nodes represent respectively the real and the imaginary parts + of complex numbers (their sole argument). + +'NON_LVALUE_EXPR' + These nodes indicate that their one and only operand is not an + lvalue. A back end can treat these identically to the single + operand. + +'NOP_EXPR' + These nodes are used to represent conversions that do not require + any code-generation. For example, conversion of a 'char*' to an + 'int*' does not require any code be generated; such a conversion is + represented by a 'NOP_EXPR'. The single operand is the expression + to be converted. The conversion from a pointer to a reference is + also represented with a 'NOP_EXPR'. + +'CONVERT_EXPR' + These nodes are similar to 'NOP_EXPR's, but are used in those + situations where code may need to be generated. For example, if an + 'int*' is converted to an 'int' code may need to be generated on + some platforms. These nodes are never used for C++-specific + conversions, like conversions between pointers to different classes + in an inheritance hierarchy. Any adjustments that need to be made + in such cases are always indicated explicitly. Similarly, a + user-defined conversion is never represented by a 'CONVERT_EXPR'; + instead, the function calls are made explicit. + +'FIXED_CONVERT_EXPR' + These nodes are used to represent conversions that involve + fixed-point values. For example, from a fixed-point value to + another fixed-point value, from an integer to a fixed-point value, + from a fixed-point value to an integer, from a floating-point value + to a fixed-point value, or from a fixed-point value to a + floating-point value. + +'LSHIFT_EXPR' +'RSHIFT_EXPR' + These nodes represent left and right shifts, respectively. The + first operand is the value to shift; it will always be of integral + type. The second operand is an expression for the number of bits + by which to shift. Right shift should be treated as arithmetic, + i.e., the high-order bits should be zero-filled when the expression + has unsigned type and filled with the sign bit when the expression + has signed type. Note that the result is undefined if the second + operand is larger than or equal to the first operand's type size. + Unlike most nodes, these can have a vector as first operand and a + scalar as second operand. + +'BIT_IOR_EXPR' +'BIT_XOR_EXPR' +'BIT_AND_EXPR' + These nodes represent bitwise inclusive or, bitwise exclusive or, + and bitwise and, respectively. Both operands will always have + integral type. + +'TRUTH_ANDIF_EXPR' +'TRUTH_ORIF_EXPR' + These nodes represent logical "and" and logical "or", respectively. + These operators are not strict; i.e., the second operand is + evaluated only if the value of the expression is not determined by + evaluation of the first operand. The type of the operands and that + of the result are always of 'BOOLEAN_TYPE' or 'INTEGER_TYPE'. + +'TRUTH_AND_EXPR' +'TRUTH_OR_EXPR' +'TRUTH_XOR_EXPR' + These nodes represent logical and, logical or, and logical + exclusive or. They are strict; both arguments are always + evaluated. There are no corresponding operators in C or C++, but + the front end will sometimes generate these expressions anyhow, if + it can tell that strictness does not matter. The type of the + operands and that of the result are always of 'BOOLEAN_TYPE' or + 'INTEGER_TYPE'. + +'POINTER_PLUS_EXPR' + This node represents pointer arithmetic. The first operand is + always a pointer/reference type. The second operand is always an + unsigned integer type compatible with sizetype. This is the only + binary arithmetic operand that can operate on pointer types. + +'PLUS_EXPR' +'MINUS_EXPR' +'MULT_EXPR' + These nodes represent various binary arithmetic operations. + Respectively, these operations are addition, subtraction (of the + second operand from the first) and multiplication. Their operands + may have either integral or floating type, but there will never be + case in which one operand is of floating type and the other is of + integral type. + + The behavior of these operations on signed arithmetic overflow is + controlled by the 'flag_wrapv' and 'flag_trapv' variables. + +'MULT_HIGHPART_EXPR' + This node represents the "high-part" of a widening multiplication. + For an integral type with B bits of precision, the result is the + most significant B bits of the full 2B product. + +'RDIV_EXPR' + This node represents a floating point division operation. + +'TRUNC_DIV_EXPR' +'FLOOR_DIV_EXPR' +'CEIL_DIV_EXPR' +'ROUND_DIV_EXPR' + These nodes represent integer division operations that return an + integer result. 'TRUNC_DIV_EXPR' rounds towards zero, + 'FLOOR_DIV_EXPR' rounds towards negative infinity, 'CEIL_DIV_EXPR' + rounds towards positive infinity and 'ROUND_DIV_EXPR' rounds to the + closest integer. Integer division in C and C++ is truncating, i.e. + 'TRUNC_DIV_EXPR'. + + The behavior of these operations on signed arithmetic overflow, + when dividing the minimum signed integer by minus one, is + controlled by the 'flag_wrapv' and 'flag_trapv' variables. + +'TRUNC_MOD_EXPR' +'FLOOR_MOD_EXPR' +'CEIL_MOD_EXPR' +'ROUND_MOD_EXPR' + These nodes represent the integer remainder or modulus operation. + The integer modulus of two operands 'a' and 'b' is defined as 'a - + (a/b)*b' where the division calculated using the corresponding + division operator. Hence for 'TRUNC_MOD_EXPR' this definition + assumes division using truncation towards zero, i.e. + 'TRUNC_DIV_EXPR'. Integer remainder in C and C++ uses truncating + division, i.e. 'TRUNC_MOD_EXPR'. + +'EXACT_DIV_EXPR' + The 'EXACT_DIV_EXPR' code is used to represent integer divisions + where the numerator is known to be an exact multiple of the + denominator. This allows the backend to choose between the faster + of 'TRUNC_DIV_EXPR', 'CEIL_DIV_EXPR' and 'FLOOR_DIV_EXPR' for the + current target. + +'LT_EXPR' +'LE_EXPR' +'GT_EXPR' +'GE_EXPR' +'EQ_EXPR' +'NE_EXPR' + These nodes represent the less than, less than or equal to, greater + than, greater than or equal to, equal, and not equal comparison + operators. The first and second operands will either be both of + integral type, both of floating type or both of vector type. The + result type of these expressions will always be of integral, + boolean or signed integral vector type. These operations return + the result type's zero value for false, the result type's one value + for true, and a vector whose elements are zero (false) or minus one + (true) for vectors. + + For floating point comparisons, if we honor IEEE NaNs and either + operand is NaN, then 'NE_EXPR' always returns true and the + remaining operators always return false. On some targets, + comparisons against an IEEE NaN, other than equality and + inequality, may generate a floating point exception. + +'ORDERED_EXPR' +'UNORDERED_EXPR' + These nodes represent non-trapping ordered and unordered comparison + operators. These operations take two floating point operands and + determine whether they are ordered or unordered relative to each + other. If either operand is an IEEE NaN, their comparison is + defined to be unordered, otherwise the comparison is defined to be + ordered. The result type of these expressions will always be of + integral or boolean type. These operations return the result + type's zero value for false, and the result type's one value for + true. + +'UNLT_EXPR' +'UNLE_EXPR' +'UNGT_EXPR' +'UNGE_EXPR' +'UNEQ_EXPR' +'LTGT_EXPR' + These nodes represent the unordered comparison operators. These + operations take two floating point operands and determine whether + the operands are unordered or are less than, less than or equal to, + greater than, greater than or equal to, or equal respectively. For + example, 'UNLT_EXPR' returns true if either operand is an IEEE NaN + or the first operand is less than the second. With the possible + exception of 'LTGT_EXPR', all of these operations are guaranteed + not to generate a floating point exception. The result type of + these expressions will always be of integral or boolean type. + These operations return the result type's zero value for false, and + the result type's one value for true. + +'MODIFY_EXPR' + These nodes represent assignment. The left-hand side is the first + operand; the right-hand side is the second operand. The left-hand + side will be a 'VAR_DECL', 'INDIRECT_REF', 'COMPONENT_REF', or + other lvalue. + + These nodes are used to represent not only assignment with '=' but + also compound assignments (like '+='), by reduction to '=' + assignment. In other words, the representation for 'i += 3' looks + just like that for 'i = i + 3'. + +'INIT_EXPR' + These nodes are just like 'MODIFY_EXPR', but are used only when a + variable is initialized, rather than assigned to subsequently. + This means that we can assume that the target of the initialization + is not used in computing its own value; any reference to the lhs in + computing the rhs is undefined. + +'COMPOUND_EXPR' + These nodes represent comma-expressions. The first operand is an + expression whose value is computed and thrown away prior to the + evaluation of the second operand. The value of the entire + expression is the value of the second operand. + +'COND_EXPR' + These nodes represent '?:' expressions. The first operand is of + boolean or integral type. If it evaluates to a nonzero value, the + second operand should be evaluated, and returned as the value of + the expression. Otherwise, the third operand is evaluated, and + returned as the value of the expression. + + The second operand must have the same type as the entire + expression, unless it unconditionally throws an exception or calls + a noreturn function, in which case it should have void type. The + same constraints apply to the third operand. This allows array + bounds checks to be represented conveniently as '(i >= 0 && i < 10) + ? i : abort()'. + + As a GNU extension, the C language front-ends allow the second + operand of the '?:' operator may be omitted in the source. For + example, 'x ? : 3' is equivalent to 'x ? x : 3', assuming that 'x' + is an expression without side-effects. In the tree representation, + however, the second operand is always present, possibly protected + by 'SAVE_EXPR' if the first argument does cause side-effects. + +'CALL_EXPR' + These nodes are used to represent calls to functions, including + non-static member functions. 'CALL_EXPR's are implemented as + expression nodes with a variable number of operands. Rather than + using 'TREE_OPERAND' to extract them, it is preferable to use the + specialized accessor macros and functions that operate specifically + on 'CALL_EXPR' nodes. + + 'CALL_EXPR_FN' returns a pointer to the function to call; it is + always an expression whose type is a 'POINTER_TYPE'. + + The number of arguments to the call is returned by + 'call_expr_nargs', while the arguments themselves can be accessed + with the 'CALL_EXPR_ARG' macro. The arguments are zero-indexed and + numbered left-to-right. You can iterate over the arguments using + 'FOR_EACH_CALL_EXPR_ARG', as in: + + tree call, arg; + call_expr_arg_iterator iter; + FOR_EACH_CALL_EXPR_ARG (arg, iter, call) + /* arg is bound to successive arguments of call. */ + ...; + + For non-static member functions, there will be an operand + corresponding to the 'this' pointer. There will always be + expressions corresponding to all of the arguments, even if the + function is declared with default arguments and some arguments are + not explicitly provided at the call sites. + + 'CALL_EXPR's also have a 'CALL_EXPR_STATIC_CHAIN' operand that is + used to implement nested functions. This operand is otherwise + null. + +'CLEANUP_POINT_EXPR' + These nodes represent full-expressions. The single operand is an + expression to evaluate. Any destructor calls engendered by the + creation of temporaries during the evaluation of that expression + should be performed immediately after the expression is evaluated. + +'CONSTRUCTOR' + These nodes represent the brace-enclosed initializers for a + structure or an array. They contain a sequence of component values + made out of a vector of constructor_elt, which is a ('INDEX', + 'VALUE') pair. + + If the 'TREE_TYPE' of the 'CONSTRUCTOR' is a 'RECORD_TYPE', + 'UNION_TYPE' or 'QUAL_UNION_TYPE' then the 'INDEX' of each node in + the sequence will be a 'FIELD_DECL' and the 'VALUE' will be the + expression used to initialize that field. + + If the 'TREE_TYPE' of the 'CONSTRUCTOR' is an 'ARRAY_TYPE', then + the 'INDEX' of each node in the sequence will be an 'INTEGER_CST' + or a 'RANGE_EXPR' of two 'INTEGER_CST's. A single 'INTEGER_CST' + indicates which element of the array is being assigned to. A + 'RANGE_EXPR' indicates an inclusive range of elements to + initialize. In both cases the 'VALUE' is the corresponding + initializer. It is re-evaluated for each element of a + 'RANGE_EXPR'. If the 'INDEX' is 'NULL_TREE', then the initializer + is for the next available array element. + + In the front end, you should not depend on the fields appearing in + any particular order. However, in the middle end, fields must + appear in declaration order. You should not assume that all fields + will be represented. Unrepresented fields will be cleared + (zeroed), unless the CONSTRUCTOR_NO_CLEARING flag is set, in which + case their value becomes undefined. + +'COMPOUND_LITERAL_EXPR' + These nodes represent ISO C99 compound literals. The + 'COMPOUND_LITERAL_EXPR_DECL_EXPR' is a 'DECL_EXPR' containing an + anonymous 'VAR_DECL' for the unnamed object represented by the + compound literal; the 'DECL_INITIAL' of that 'VAR_DECL' is a + 'CONSTRUCTOR' representing the brace-enclosed list of initializers + in the compound literal. That anonymous 'VAR_DECL' can also be + accessed directly by the 'COMPOUND_LITERAL_EXPR_DECL' macro. + +'SAVE_EXPR' + + A 'SAVE_EXPR' represents an expression (possibly involving + side-effects) that is used more than once. The side-effects should + occur only the first time the expression is evaluated. Subsequent + uses should just reuse the computed value. The first operand to + the 'SAVE_EXPR' is the expression to evaluate. The side-effects + should be executed where the 'SAVE_EXPR' is first encountered in a + depth-first preorder traversal of the expression tree. + +'TARGET_EXPR' + A 'TARGET_EXPR' represents a temporary object. The first operand + is a 'VAR_DECL' for the temporary variable. The second operand is + the initializer for the temporary. The initializer is evaluated + and, if non-void, copied (bitwise) into the temporary. If the + initializer is void, that means that it will perform the + initialization itself. + + Often, a 'TARGET_EXPR' occurs on the right-hand side of an + assignment, or as the second operand to a comma-expression which is + itself the right-hand side of an assignment, etc. In this case, we + say that the 'TARGET_EXPR' is "normal"; otherwise, we say it is + "orphaned". For a normal 'TARGET_EXPR' the temporary variable + should be treated as an alias for the left-hand side of the + assignment, rather than as a new temporary variable. + + The third operand to the 'TARGET_EXPR', if present, is a + cleanup-expression (i.e., destructor call) for the temporary. If + this expression is orphaned, then this expression must be executed + when the statement containing this expression is complete. These + cleanups must always be executed in the order opposite to that in + which they were encountered. Note that if a temporary is created + on one branch of a conditional operator (i.e., in the second or + third operand to a 'COND_EXPR'), the cleanup must be run only if + that branch is actually executed. + +'VA_ARG_EXPR' + This node is used to implement support for the C/C++ variable + argument-list mechanism. It represents expressions like 'va_arg + (ap, type)'. Its 'TREE_TYPE' yields the tree representation for + 'type' and its sole argument yields the representation for 'ap'. + +'ANNOTATE_EXPR' + This node is used to attach markers to an expression. The first + operand is the annotated expression, the second is an 'INTEGER_CST' + with a value from 'enum annot_expr_kind'. + + +File: gccint.info, Node: Vectors, Prev: Unary and Binary Expressions, Up: Expression trees + +10.6.4 Vectors +-------------- + +'VEC_LSHIFT_EXPR' +'VEC_RSHIFT_EXPR' + These nodes represent whole vector left and right shifts, + respectively. The first operand is the vector to shift; it will + always be of vector type. The second operand is an expression for + the number of bits by which to shift. Note that the result is + undefined if the second operand is larger than or equal to the + first operand's type size. + +'VEC_WIDEN_MULT_HI_EXPR' +'VEC_WIDEN_MULT_LO_EXPR' + These nodes represent widening vector multiplication of the high + and low parts of the two input vectors, respectively. Their + operands are vectors that contain the same number of elements ('N') + of the same integral type. The result is a vector that contains + half as many elements, of an integral type whose size is twice as + wide. In the case of 'VEC_WIDEN_MULT_HI_EXPR' the high 'N/2' + elements of the two vector are multiplied to produce the vector of + 'N/2' products. In the case of 'VEC_WIDEN_MULT_LO_EXPR' the low + 'N/2' elements of the two vector are multiplied to produce the + vector of 'N/2' products. + +'VEC_UNPACK_HI_EXPR' +'VEC_UNPACK_LO_EXPR' + These nodes represent unpacking of the high and low parts of the + input vector, respectively. The single operand is a vector that + contains 'N' elements of the same integral or floating point type. + The result is a vector that contains half as many elements, of an + integral or floating point type whose size is twice as wide. In + the case of 'VEC_UNPACK_HI_EXPR' the high 'N/2' elements of the + vector are extracted and widened (promoted). In the case of + 'VEC_UNPACK_LO_EXPR' the low 'N/2' elements of the vector are + extracted and widened (promoted). + +'VEC_UNPACK_FLOAT_HI_EXPR' +'VEC_UNPACK_FLOAT_LO_EXPR' + These nodes represent unpacking of the high and low parts of the + input vector, where the values are converted from fixed point to + floating point. The single operand is a vector that contains 'N' + elements of the same integral type. The result is a vector that + contains half as many elements of a floating point type whose size + is twice as wide. In the case of 'VEC_UNPACK_HI_EXPR' the high + 'N/2' elements of the vector are extracted, converted and widened. + In the case of 'VEC_UNPACK_LO_EXPR' the low 'N/2' elements of the + vector are extracted, converted and widened. + +'VEC_PACK_TRUNC_EXPR' + This node represents packing of truncated elements of the two input + vectors into the output vector. Input operands are vectors that + contain the same number of elements of the same integral or + floating point type. The result is a vector that contains twice as + many elements of an integral or floating point type whose size is + half as wide. The elements of the two vectors are demoted and + merged (concatenated) to form the output vector. + +'VEC_PACK_SAT_EXPR' + This node represents packing of elements of the two input vectors + into the output vector using saturation. Input operands are + vectors that contain the same number of elements of the same + integral type. The result is a vector that contains twice as many + elements of an integral type whose size is half as wide. The + elements of the two vectors are demoted and merged (concatenated) + to form the output vector. + +'VEC_PACK_FIX_TRUNC_EXPR' + This node represents packing of elements of the two input vectors + into the output vector, where the values are converted from + floating point to fixed point. Input operands are vectors that + contain the same number of elements of a floating point type. The + result is a vector that contains twice as many elements of an + integral type whose size is half as wide. The elements of the two + vectors are merged (concatenated) to form the output vector. + +'VEC_COND_EXPR' + These nodes represent '?:' expressions. The three operands must be + vectors of the same size and number of elements. The second and + third operands must have the same type as the entire expression. + The first operand is of signed integral vector type. If an element + of the first operand evaluates to a zero value, the corresponding + element of the result is taken from the third operand. If it + evaluates to a minus one value, it is taken from the second + operand. It should never evaluate to any other value currently, + but optimizations should not rely on that property. In contrast + with a 'COND_EXPR', all operands are always evaluated. + + +File: gccint.info, Node: Statements, Next: Functions, Prev: Expression trees, Up: GENERIC + +10.7 Statements +=============== + +Most statements in GIMPLE are assignment statements, represented by +'GIMPLE_ASSIGN'. No other C expressions can appear at statement level; +a reference to a volatile object is converted into a 'GIMPLE_ASSIGN'. + + There are also several varieties of complex statements. + +* Menu: + +* Basic Statements:: +* Blocks:: +* Statement Sequences:: +* Empty Statements:: +* Jumps:: +* Cleanups:: +* OpenMP:: + + +File: gccint.info, Node: Basic Statements, Next: Blocks, Up: Statements + +10.7.1 Basic Statements +----------------------- + +'ASM_EXPR' + + Used to represent an inline assembly statement. For an inline + assembly statement like: + asm ("mov x, y"); + The 'ASM_STRING' macro will return a 'STRING_CST' node for '"mov x, + y"'. If the original statement made use of the extended-assembly + syntax, then 'ASM_OUTPUTS', 'ASM_INPUTS', and 'ASM_CLOBBERS' will + be the outputs, inputs, and clobbers for the statement, represented + as 'STRING_CST' nodes. The extended-assembly syntax looks like: + asm ("fsinx %1,%0" : "=f" (result) : "f" (angle)); + The first string is the 'ASM_STRING', containing the instruction + template. The next two strings are the output and inputs, + respectively; this statement has no clobbers. As this example + indicates, "plain" assembly statements are merely a special case of + extended assembly statements; they have no cv-qualifiers, outputs, + inputs, or clobbers. All of the strings will be 'NUL'-terminated, + and will contain no embedded 'NUL'-characters. + + If the assembly statement is declared 'volatile', or if the + statement was not an extended assembly statement, and is therefore + implicitly volatile, then the predicate 'ASM_VOLATILE_P' will hold + of the 'ASM_EXPR'. + +'DECL_EXPR' + + Used to represent a local declaration. The 'DECL_EXPR_DECL' macro + can be used to obtain the entity declared. This declaration may be + a 'LABEL_DECL', indicating that the label declared is a local + label. (As an extension, GCC allows the declaration of labels with + scope.) In C, this declaration may be a 'FUNCTION_DECL', + indicating the use of the GCC nested function extension. For more + information, *note Functions::. + +'LABEL_EXPR' + + Used to represent a label. The 'LABEL_DECL' declared by this + statement can be obtained with the 'LABEL_EXPR_LABEL' macro. The + 'IDENTIFIER_NODE' giving the name of the label can be obtained from + the 'LABEL_DECL' with 'DECL_NAME'. + +'GOTO_EXPR' + + Used to represent a 'goto' statement. The 'GOTO_DESTINATION' will + usually be a 'LABEL_DECL'. However, if the "computed goto" + extension has been used, the 'GOTO_DESTINATION' will be an + arbitrary expression indicating the destination. This expression + will always have pointer type. + +'RETURN_EXPR' + + Used to represent a 'return' statement. Operand 0 represents the + value to return. It should either be the 'RESULT_DECL' for the + containing function, or a 'MODIFY_EXPR' or 'INIT_EXPR' setting the + function's 'RESULT_DECL'. It will be 'NULL_TREE' if the statement + was just + return; + +'LOOP_EXPR' + These nodes represent "infinite" loops. The 'LOOP_EXPR_BODY' + represents the body of the loop. It should be executed forever, + unless an 'EXIT_EXPR' is encountered. + +'EXIT_EXPR' + These nodes represent conditional exits from the nearest enclosing + 'LOOP_EXPR'. The single operand is the condition; if it is + nonzero, then the loop should be exited. An 'EXIT_EXPR' will only + appear within a 'LOOP_EXPR'. + +'SWITCH_STMT' + + Used to represent a 'switch' statement. The 'SWITCH_STMT_COND' is + the expression on which the switch is occurring. See the + documentation for an 'IF_STMT' for more information on the + representation used for the condition. The 'SWITCH_STMT_BODY' is + the body of the switch statement. The 'SWITCH_STMT_TYPE' is the + original type of switch expression as given in the source, before + any compiler conversions. + +'CASE_LABEL_EXPR' + + Use to represent a 'case' label, range of 'case' labels, or a + 'default' label. If 'CASE_LOW' is 'NULL_TREE', then this is a + 'default' label. Otherwise, if 'CASE_HIGH' is 'NULL_TREE', then + this is an ordinary 'case' label. In this case, 'CASE_LOW' is an + expression giving the value of the label. Both 'CASE_LOW' and + 'CASE_HIGH' are 'INTEGER_CST' nodes. These values will have the + same type as the condition expression in the switch statement. + + Otherwise, if both 'CASE_LOW' and 'CASE_HIGH' are defined, the + statement is a range of case labels. Such statements originate + with the extension that allows users to write things of the form: + case 2 ... 5: + The first value will be 'CASE_LOW', while the second will be + 'CASE_HIGH'. + + +File: gccint.info, Node: Blocks, Next: Statement Sequences, Prev: Basic Statements, Up: Statements + +10.7.2 Blocks +------------- + +Block scopes and the variables they declare in GENERIC are expressed +using the 'BIND_EXPR' code, which in previous versions of GCC was +primarily used for the C statement-expression extension. + + Variables in a block are collected into 'BIND_EXPR_VARS' in declaration +order through their 'TREE_CHAIN' field. Any runtime initialization is +moved out of 'DECL_INITIAL' and into a statement in the controlled +block. When gimplifying from C or C++, this initialization replaces the +'DECL_STMT'. These variables will never require cleanups. The scope of +these variables is just the body + + Variable-length arrays (VLAs) complicate this process, as their size +often refers to variables initialized earlier in the block. To handle +this, we currently split the block at that point, and move the VLA into +a new, inner 'BIND_EXPR'. This strategy may change in the future. + + A C++ program will usually contain more 'BIND_EXPR's than there are +syntactic blocks in the source code, since several C++ constructs have +implicit scopes associated with them. On the other hand, although the +C++ front end uses pseudo-scopes to handle cleanups for objects with +destructors, these don't translate into the GIMPLE form; multiple +declarations at the same level use the same 'BIND_EXPR'. + + +File: gccint.info, Node: Statement Sequences, Next: Empty Statements, Prev: Blocks, Up: Statements + +10.7.3 Statement Sequences +-------------------------- + +Multiple statements at the same nesting level are collected into a +'STATEMENT_LIST'. Statement lists are modified and traversed using the +interface in 'tree-iterator.h'. + + +File: gccint.info, Node: Empty Statements, Next: Jumps, Prev: Statement Sequences, Up: Statements + +10.7.4 Empty Statements +----------------------- + +Whenever possible, statements with no effect are discarded. But if they +are nested within another construct which cannot be discarded for some +reason, they are instead replaced with an empty statement, generated by +'build_empty_stmt'. Initially, all empty statements were shared, after +the pattern of the Java front end, but this caused a lot of trouble in +practice. + + An empty statement is represented as '(void)0'. + + +File: gccint.info, Node: Jumps, Next: Cleanups, Prev: Empty Statements, Up: Statements + +10.7.5 Jumps +------------ + +Other jumps are expressed by either 'GOTO_EXPR' or 'RETURN_EXPR'. + + The operand of a 'GOTO_EXPR' must be either a label or a variable +containing the address to jump to. + + The operand of a 'RETURN_EXPR' is either 'NULL_TREE', 'RESULT_DECL', or +a 'MODIFY_EXPR' which sets the return value. It would be nice to move +the 'MODIFY_EXPR' into a separate statement, but the special return +semantics in 'expand_return' make that difficult. It may still happen +in the future, perhaps by moving most of that logic into +'expand_assignment'. + + +File: gccint.info, Node: Cleanups, Next: OpenMP, Prev: Jumps, Up: Statements + +10.7.6 Cleanups +--------------- + +Destructors for local C++ objects and similar dynamic cleanups are +represented in GIMPLE by a 'TRY_FINALLY_EXPR'. 'TRY_FINALLY_EXPR' has +two operands, both of which are a sequence of statements to execute. +The first sequence is executed. When it completes the second sequence +is executed. + + The first sequence may complete in the following ways: + + 1. Execute the last statement in the sequence and fall off the end. + + 2. Execute a goto statement ('GOTO_EXPR') to an ordinary label outside + the sequence. + + 3. Execute a return statement ('RETURN_EXPR'). + + 4. Throw an exception. This is currently not explicitly represented + in GIMPLE. + + The second sequence is not executed if the first sequence completes by +calling 'setjmp' or 'exit' or any other function that does not return. +The second sequence is also not executed if the first sequence completes +via a non-local goto or a computed goto (in general the compiler does +not know whether such a goto statement exits the first sequence or not, +so we assume that it doesn't). + + After the second sequence is executed, if it completes normally by +falling off the end, execution continues wherever the first sequence +would have continued, by falling off the end, or doing a goto, etc. + + 'TRY_FINALLY_EXPR' complicates the flow graph, since the cleanup needs +to appear on every edge out of the controlled block; this reduces the +freedom to move code across these edges. Therefore, the EH lowering +pass which runs before most of the optimization passes eliminates these +expressions by explicitly adding the cleanup to each edge. Rethrowing +the exception is represented using 'RESX_EXPR'. + + +File: gccint.info, Node: OpenMP, Prev: Cleanups, Up: Statements + +10.7.7 OpenMP +------------- + +All the statements starting with 'OMP_' represent directives and clauses +used by the OpenMP API <http://www.openmp.org/>. + +'OMP_PARALLEL' + + Represents '#pragma omp parallel [clause1 ... clauseN]'. It has + four operands: + + Operand 'OMP_PARALLEL_BODY' is valid while in GENERIC and High + GIMPLE forms. It contains the body of code to be executed by all + the threads. During GIMPLE lowering, this operand becomes 'NULL' + and the body is emitted linearly after 'OMP_PARALLEL'. + + Operand 'OMP_PARALLEL_CLAUSES' is the list of clauses associated + with the directive. + + Operand 'OMP_PARALLEL_FN' is created by 'pass_lower_omp', it + contains the 'FUNCTION_DECL' for the function that will contain the + body of the parallel region. + + Operand 'OMP_PARALLEL_DATA_ARG' is also created by + 'pass_lower_omp'. If there are shared variables to be communicated + to the children threads, this operand will contain the 'VAR_DECL' + that contains all the shared values and variables. + +'OMP_FOR' + + Represents '#pragma omp for [clause1 ... clauseN]'. It has 5 + operands: + + Operand 'OMP_FOR_BODY' contains the loop body. + + Operand 'OMP_FOR_CLAUSES' is the list of clauses associated with + the directive. + + Operand 'OMP_FOR_INIT' is the loop initialization code of the form + 'VAR = N1'. + + Operand 'OMP_FOR_COND' is the loop conditional expression of the + form 'VAR {<,>,<=,>=} N2'. + + Operand 'OMP_FOR_INCR' is the loop index increment of the form 'VAR + {+=,-=} INCR'. + + Operand 'OMP_FOR_PRE_BODY' contains side-effect code from operands + 'OMP_FOR_INIT', 'OMP_FOR_COND' and 'OMP_FOR_INC'. These + side-effects are part of the 'OMP_FOR' block but must be evaluated + before the start of loop body. + + The loop index variable 'VAR' must be a signed integer variable, + which is implicitly private to each thread. Bounds 'N1' and 'N2' + and the increment expression 'INCR' are required to be loop + invariant integer expressions that are evaluated without any + synchronization. The evaluation order, frequency of evaluation and + side-effects are unspecified by the standard. + +'OMP_SECTIONS' + + Represents '#pragma omp sections [clause1 ... clauseN]'. + + Operand 'OMP_SECTIONS_BODY' contains the sections body, which in + turn contains a set of 'OMP_SECTION' nodes for each of the + concurrent sections delimited by '#pragma omp section'. + + Operand 'OMP_SECTIONS_CLAUSES' is the list of clauses associated + with the directive. + +'OMP_SECTION' + + Section delimiter for 'OMP_SECTIONS'. + +'OMP_SINGLE' + + Represents '#pragma omp single'. + + Operand 'OMP_SINGLE_BODY' contains the body of code to be executed + by a single thread. + + Operand 'OMP_SINGLE_CLAUSES' is the list of clauses associated with + the directive. + +'OMP_MASTER' + + Represents '#pragma omp master'. + + Operand 'OMP_MASTER_BODY' contains the body of code to be executed + by the master thread. + +'OMP_ORDERED' + + Represents '#pragma omp ordered'. + + Operand 'OMP_ORDERED_BODY' contains the body of code to be executed + in the sequential order dictated by the loop index variable. + +'OMP_CRITICAL' + + Represents '#pragma omp critical [name]'. + + Operand 'OMP_CRITICAL_BODY' is the critical section. + + Operand 'OMP_CRITICAL_NAME' is an optional identifier to label the + critical section. + +'OMP_RETURN' + + This does not represent any OpenMP directive, it is an artificial + marker to indicate the end of the body of an OpenMP. It is used by + the flow graph ('tree-cfg.c') and OpenMP region building code + ('omp-low.c'). + +'OMP_CONTINUE' + + Similarly, this instruction does not represent an OpenMP directive, + it is used by 'OMP_FOR' and 'OMP_SECTIONS' to mark the place where + the code needs to loop to the next iteration (in the case of + 'OMP_FOR') or the next section (in the case of 'OMP_SECTIONS'). + + In some cases, 'OMP_CONTINUE' is placed right before 'OMP_RETURN'. + But if there are cleanups that need to occur right after the + looping body, it will be emitted between 'OMP_CONTINUE' and + 'OMP_RETURN'. + +'OMP_ATOMIC' + + Represents '#pragma omp atomic'. + + Operand 0 is the address at which the atomic operation is to be + performed. + + Operand 1 is the expression to evaluate. The gimplifier tries + three alternative code generation strategies. Whenever possible, + an atomic update built-in is used. If that fails, a + compare-and-swap loop is attempted. If that also fails, a regular + critical section around the expression is used. + +'OMP_CLAUSE' + + Represents clauses associated with one of the 'OMP_' directives. + Clauses are represented by separate subcodes defined in 'tree.h'. + Clauses codes can be one of: 'OMP_CLAUSE_PRIVATE', + 'OMP_CLAUSE_SHARED', 'OMP_CLAUSE_FIRSTPRIVATE', + 'OMP_CLAUSE_LASTPRIVATE', 'OMP_CLAUSE_COPYIN', + 'OMP_CLAUSE_COPYPRIVATE', 'OMP_CLAUSE_IF', + 'OMP_CLAUSE_NUM_THREADS', 'OMP_CLAUSE_SCHEDULE', + 'OMP_CLAUSE_NOWAIT', 'OMP_CLAUSE_ORDERED', 'OMP_CLAUSE_DEFAULT', + 'OMP_CLAUSE_REDUCTION', 'OMP_CLAUSE_COLLAPSE', 'OMP_CLAUSE_UNTIED', + 'OMP_CLAUSE_FINAL', and 'OMP_CLAUSE_MERGEABLE'. Each code + represents the corresponding OpenMP clause. + + Clauses associated with the same directive are chained together via + 'OMP_CLAUSE_CHAIN'. Those clauses that accept a list of variables + are restricted to exactly one, accessed with 'OMP_CLAUSE_VAR'. + Therefore, multiple variables under the same clause 'C' need to be + represented as multiple 'C' clauses chained together. This + facilitates adding new clauses during compilation. + + +File: gccint.info, Node: Functions, Next: Language-dependent trees, Prev: Statements, Up: GENERIC + +10.8 Functions +============== + +A function is represented by a 'FUNCTION_DECL' node. It stores the +basic pieces of the function such as body, parameters, and return type +as well as information on the surrounding context, visibility, and +linkage. + +* Menu: + +* Function Basics:: Function names, body, and parameters. +* Function Properties:: Context, linkage, etc. + + +File: gccint.info, Node: Function Basics, Next: Function Properties, Up: Functions + +10.8.1 Function Basics +---------------------- + +A function has four core parts: the name, the parameters, the result, +and the body. The following macros and functions access these parts of +a 'FUNCTION_DECL' as well as other basic features: +'DECL_NAME' + This macro returns the unqualified name of the function, as an + 'IDENTIFIER_NODE'. For an instantiation of a function template, + the 'DECL_NAME' is the unqualified name of the template, not + something like 'f<int>'. The value of 'DECL_NAME' is undefined + when used on a constructor, destructor, overloaded operator, or + type-conversion operator, or any function that is implicitly + generated by the compiler. See below for macros that can be used + to distinguish these cases. + +'DECL_ASSEMBLER_NAME' + This macro returns the mangled name of the function, also an + 'IDENTIFIER_NODE'. This name does not contain leading underscores + on systems that prefix all identifiers with underscores. The + mangled name is computed in the same way on all platforms; if + special processing is required to deal with the object file format + used on a particular platform, it is the responsibility of the back + end to perform those modifications. (Of course, the back end + should not modify 'DECL_ASSEMBLER_NAME' itself.) + + Using 'DECL_ASSEMBLER_NAME' will cause additional memory to be + allocated (for the mangled name of the entity) so it should be used + only when emitting assembly code. It should not be used within the + optimizers to determine whether or not two declarations are the + same, even though some of the existing optimizers do use it in that + way. These uses will be removed over time. + +'DECL_ARGUMENTS' + This macro returns the 'PARM_DECL' for the first argument to the + function. Subsequent 'PARM_DECL' nodes can be obtained by + following the 'TREE_CHAIN' links. + +'DECL_RESULT' + This macro returns the 'RESULT_DECL' for the function. + +'DECL_SAVED_TREE' + This macro returns the complete body of the function. + +'TREE_TYPE' + This macro returns the 'FUNCTION_TYPE' or 'METHOD_TYPE' for the + function. + +'DECL_INITIAL' + A function that has a definition in the current translation unit + will have a non-'NULL' 'DECL_INITIAL'. However, back ends should + not make use of the particular value given by 'DECL_INITIAL'. + + It should contain a tree of 'BLOCK' nodes that mirrors the scopes + that variables are bound in the function. Each block contains a + list of decls declared in a basic block, a pointer to a chain of + blocks at the next lower scope level, then a pointer to the next + block at the same level and a backpointer to the parent 'BLOCK' or + 'FUNCTION_DECL'. So given a function as follows: + + void foo() + { + int a; + { + int b; + } + int c; + } + + you would get the following: + + tree foo = FUNCTION_DECL; + tree decl_a = VAR_DECL; + tree decl_b = VAR_DECL; + tree decl_c = VAR_DECL; + tree block_a = BLOCK; + tree block_b = BLOCK; + tree block_c = BLOCK; + BLOCK_VARS(block_a) = decl_a; + BLOCK_SUBBLOCKS(block_a) = block_b; + BLOCK_CHAIN(block_a) = block_c; + BLOCK_SUPERCONTEXT(block_a) = foo; + BLOCK_VARS(block_b) = decl_b; + BLOCK_SUPERCONTEXT(block_b) = block_a; + BLOCK_VARS(block_c) = decl_c; + BLOCK_SUPERCONTEXT(block_c) = foo; + DECL_INITIAL(foo) = block_a; + + +File: gccint.info, Node: Function Properties, Prev: Function Basics, Up: Functions + +10.8.2 Function Properties +-------------------------- + +To determine the scope of a function, you can use the 'DECL_CONTEXT' +macro. This macro will return the class (either a 'RECORD_TYPE' or a +'UNION_TYPE') or namespace (a 'NAMESPACE_DECL') of which the function is +a member. For a virtual function, this macro returns the class in which +the function was actually defined, not the base class in which the +virtual declaration occurred. + + In C, the 'DECL_CONTEXT' for a function maybe another function. This +representation indicates that the GNU nested function extension is in +use. For details on the semantics of nested functions, see the GCC +Manual. The nested function can refer to local variables in its +containing function. Such references are not explicitly marked in the +tree structure; back ends must look at the 'DECL_CONTEXT' for the +referenced 'VAR_DECL'. If the 'DECL_CONTEXT' for the referenced +'VAR_DECL' is not the same as the function currently being processed, +and neither 'DECL_EXTERNAL' nor 'TREE_STATIC' hold, then the reference +is to a local variable in a containing function, and the back end must +take appropriate action. + +'DECL_EXTERNAL' + This predicate holds if the function is undefined. + +'TREE_PUBLIC' + This predicate holds if the function has external linkage. + +'TREE_STATIC' + This predicate holds if the function has been defined. + +'TREE_THIS_VOLATILE' + This predicate holds if the function does not return normally. + +'TREE_READONLY' + This predicate holds if the function can only read its arguments. + +'DECL_PURE_P' + This predicate holds if the function can only read its arguments, + but may also read global memory. + +'DECL_VIRTUAL_P' + This predicate holds if the function is virtual. + +'DECL_ARTIFICIAL' + This macro holds if the function was implicitly generated by the + compiler, rather than explicitly declared. In addition to + implicitly generated class member functions, this macro holds for + the special functions created to implement static initialization + and destruction, to compute run-time type information, and so + forth. + +'DECL_FUNCTION_SPECIFIC_TARGET' + This macro returns a tree node that holds the target options that + are to be used to compile this particular function or 'NULL_TREE' + if the function is to be compiled with the target options specified + on the command line. + +'DECL_FUNCTION_SPECIFIC_OPTIMIZATION' + This macro returns a tree node that holds the optimization options + that are to be used to compile this particular function or + 'NULL_TREE' if the function is to be compiled with the optimization + options specified on the command line. + + +File: gccint.info, Node: Language-dependent trees, Next: C and C++ Trees, Prev: Functions, Up: GENERIC + +10.9 Language-dependent trees +============================= + +Front ends may wish to keep some state associated with various GENERIC +trees while parsing. To support this, trees provide a set of flags that +may be used by the front end. They are accessed using +'TREE_LANG_FLAG_n' where 'n' is currently 0 through 6. + + If necessary, a front end can use some language-dependent tree codes in +its GENERIC representation, so long as it provides a hook for converting +them to GIMPLE and doesn't expect them to work with any (hypothetical) +optimizers that run before the conversion to GIMPLE. The intermediate +representation used while parsing C and C++ looks very little like +GENERIC, but the C and C++ gimplifier hooks are perfectly happy to take +it as input and spit out GIMPLE. + + +File: gccint.info, Node: C and C++ Trees, Next: Java Trees, Prev: Language-dependent trees, Up: GENERIC + +10.10 C and C++ Trees +===================== + +This section documents the internal representation used by GCC to +represent C and C++ source programs. When presented with a C or C++ +source program, GCC parses the program, performs semantic analysis +(including the generation of error messages), and then produces the +internal representation described here. This representation contains a +complete representation for the entire translation unit provided as +input to the front end. This representation is then typically processed +by a code-generator in order to produce machine code, but could also be +used in the creation of source browsers, intelligent editors, automatic +documentation generators, interpreters, and any other programs needing +the ability to process C or C++ code. + + This section explains the internal representation. In particular, it +documents the internal representation for C and C++ source constructs, +and the macros, functions, and variables that can be used to access +these constructs. The C++ representation is largely a superset of the +representation used in the C front end. There is only one construct +used in C that does not appear in the C++ front end and that is the GNU +"nested function" extension. Many of the macros documented here do not +apply in C because the corresponding language constructs do not appear +in C. + + The C and C++ front ends generate a mix of GENERIC trees and ones +specific to C and C++. These language-specific trees are higher-level +constructs than the ones in GENERIC to make the parser's job easier. +This section describes those trees that aren't part of GENERIC as well +as aspects of GENERIC trees that are treated in a language-specific +manner. + + If you are developing a "back end", be it is a code-generator or some +other tool, that uses this representation, you may occasionally find +that you need to ask questions not easily answered by the functions and +macros available here. If that situation occurs, it is quite likely +that GCC already supports the functionality you desire, but that the +interface is simply not documented here. In that case, you should ask +the GCC maintainers (via mail to <gcc@gcc.gnu.org>) about documenting +the functionality you require. Similarly, if you find yourself writing +functions that do not deal directly with your back end, but instead +might be useful to other people using the GCC front end, you should +submit your patches for inclusion in GCC. + +* Menu: + +* Types for C++:: Fundamental and aggregate types. +* Namespaces:: Namespaces. +* Classes:: Classes. +* Functions for C++:: Overloading and accessors for C++. +* Statements for C++:: Statements specific to C and C++. +* C++ Expressions:: From 'typeid' to 'throw'. + + +File: gccint.info, Node: Types for C++, Next: Namespaces, Up: C and C++ Trees + +10.10.1 Types for C++ +--------------------- + +In C++, an array type is not qualified; rather the type of the array +elements is qualified. This situation is reflected in the intermediate +representation. The macros described here will always examine the +qualification of the underlying element type when applied to an array +type. (If the element type is itself an array, then the recursion +continues until a non-array type is found, and the qualification of this +type is examined.) So, for example, 'CP_TYPE_CONST_P' will hold of the +type 'const int ()[7]', denoting an array of seven 'int's. + + The following functions and macros deal with cv-qualification of types: +'cp_type_quals' + This function returns the set of type qualifiers applied to this + type. This value is 'TYPE_UNQUALIFIED' if no qualifiers have been + applied. The 'TYPE_QUAL_CONST' bit is set if the type is + 'const'-qualified. The 'TYPE_QUAL_VOLATILE' bit is set if the type + is 'volatile'-qualified. The 'TYPE_QUAL_RESTRICT' bit is set if + the type is 'restrict'-qualified. + +'CP_TYPE_CONST_P' + This macro holds if the type is 'const'-qualified. + +'CP_TYPE_VOLATILE_P' + This macro holds if the type is 'volatile'-qualified. + +'CP_TYPE_RESTRICT_P' + This macro holds if the type is 'restrict'-qualified. + +'CP_TYPE_CONST_NON_VOLATILE_P' + This predicate holds for a type that is 'const'-qualified, but + _not_ 'volatile'-qualified; other cv-qualifiers are ignored as + well: only the 'const'-ness is tested. + + A few other macros and functions are usable with all types: +'TYPE_SIZE' + The number of bits required to represent the type, represented as + an 'INTEGER_CST'. For an incomplete type, 'TYPE_SIZE' will be + 'NULL_TREE'. + +'TYPE_ALIGN' + The alignment of the type, in bits, represented as an 'int'. + +'TYPE_NAME' + This macro returns a declaration (in the form of a 'TYPE_DECL') for + the type. (Note this macro does _not_ return an 'IDENTIFIER_NODE', + as you might expect, given its name!) You can look at the + 'DECL_NAME' of the 'TYPE_DECL' to obtain the actual name of the + type. The 'TYPE_NAME' will be 'NULL_TREE' for a type that is not a + built-in type, the result of a typedef, or a named class type. + +'CP_INTEGRAL_TYPE' + This predicate holds if the type is an integral type. Notice that + in C++, enumerations are _not_ integral types. + +'ARITHMETIC_TYPE_P' + This predicate holds if the type is an integral type (in the C++ + sense) or a floating point type. + +'CLASS_TYPE_P' + This predicate holds for a class-type. + +'TYPE_BUILT_IN' + This predicate holds for a built-in type. + +'TYPE_PTRDATAMEM_P' + This predicate holds if the type is a pointer to data member. + +'TYPE_PTR_P' + This predicate holds if the type is a pointer type, and the pointee + is not a data member. + +'TYPE_PTRFN_P' + This predicate holds for a pointer to function type. + +'TYPE_PTROB_P' + This predicate holds for a pointer to object type. Note however + that it does not hold for the generic pointer to object type 'void + *'. You may use 'TYPE_PTROBV_P' to test for a pointer to object + type as well as 'void *'. + + The table below describes types specific to C and C++ as well as +language-dependent info about GENERIC types. + +'POINTER_TYPE' + Used to represent pointer types, and pointer to data member types. + If 'TREE_TYPE' is a pointer to data member type, then + 'TYPE_PTRDATAMEM_P' will hold. For a pointer to data member type + of the form 'T X::*', 'TYPE_PTRMEM_CLASS_TYPE' will be the type + 'X', while 'TYPE_PTRMEM_POINTED_TO_TYPE' will be the type 'T'. + +'RECORD_TYPE' + Used to represent 'struct' and 'class' types in C and C++. If + 'TYPE_PTRMEMFUNC_P' holds, then this type is a pointer-to-member + type. In that case, the 'TYPE_PTRMEMFUNC_FN_TYPE' is a + 'POINTER_TYPE' pointing to a 'METHOD_TYPE'. The 'METHOD_TYPE' is + the type of a function pointed to by the pointer-to-member + function. If 'TYPE_PTRMEMFUNC_P' does not hold, this type is a + class type. For more information, *note Classes::. + +'UNKNOWN_TYPE' + This node is used to represent a type the knowledge of which is + insufficient for a sound processing. + +'TYPENAME_TYPE' + Used to represent a construct of the form 'typename T::A'. The + 'TYPE_CONTEXT' is 'T'; the 'TYPE_NAME' is an 'IDENTIFIER_NODE' for + 'A'. If the type is specified via a template-id, then + 'TYPENAME_TYPE_FULLNAME' yields a 'TEMPLATE_ID_EXPR'. The + 'TREE_TYPE' is non-'NULL' if the node is implicitly generated in + support for the implicit typename extension; in which case the + 'TREE_TYPE' is a type node for the base-class. + +'TYPEOF_TYPE' + Used to represent the '__typeof__' extension. The 'TYPE_FIELDS' is + the expression the type of which is being represented. + + +File: gccint.info, Node: Namespaces, Next: Classes, Prev: Types for C++, Up: C and C++ Trees + +10.10.2 Namespaces +------------------ + +The root of the entire intermediate representation is the variable +'global_namespace'. This is the namespace specified with '::' in C++ +source code. All other namespaces, types, variables, functions, and so +forth can be found starting with this namespace. + + However, except for the fact that it is distinguished as the root of +the representation, the global namespace is no different from any other +namespace. Thus, in what follows, we describe namespaces generally, +rather than the global namespace in particular. + + A namespace is represented by a 'NAMESPACE_DECL' node. + + The following macros and functions can be used on a 'NAMESPACE_DECL': + +'DECL_NAME' + This macro is used to obtain the 'IDENTIFIER_NODE' corresponding to + the unqualified name of the name of the namespace (*note + Identifiers::). The name of the global namespace is '::', even + though in C++ the global namespace is unnamed. However, you should + use comparison with 'global_namespace', rather than 'DECL_NAME' to + determine whether or not a namespace is the global one. An unnamed + namespace will have a 'DECL_NAME' equal to + 'anonymous_namespace_name'. Within a single translation unit, all + unnamed namespaces will have the same name. + +'DECL_CONTEXT' + This macro returns the enclosing namespace. The 'DECL_CONTEXT' for + the 'global_namespace' is 'NULL_TREE'. + +'DECL_NAMESPACE_ALIAS' + If this declaration is for a namespace alias, then + 'DECL_NAMESPACE_ALIAS' is the namespace for which this one is an + alias. + + Do not attempt to use 'cp_namespace_decls' for a namespace which is + an alias. Instead, follow 'DECL_NAMESPACE_ALIAS' links until you + reach an ordinary, non-alias, namespace, and call + 'cp_namespace_decls' there. + +'DECL_NAMESPACE_STD_P' + This predicate holds if the namespace is the special '::std' + namespace. + +'cp_namespace_decls' + This function will return the declarations contained in the + namespace, including types, overloaded functions, other namespaces, + and so forth. If there are no declarations, this function will + return 'NULL_TREE'. The declarations are connected through their + 'TREE_CHAIN' fields. + + Although most entries on this list will be declarations, + 'TREE_LIST' nodes may also appear. In this case, the 'TREE_VALUE' + will be an 'OVERLOAD'. The value of the 'TREE_PURPOSE' is + unspecified; back ends should ignore this value. As with the other + kinds of declarations returned by 'cp_namespace_decls', the + 'TREE_CHAIN' will point to the next declaration in this list. + + For more information on the kinds of declarations that can occur on + this list, *Note Declarations::. Some declarations will not appear + on this list. In particular, no 'FIELD_DECL', 'LABEL_DECL', or + 'PARM_DECL' nodes will appear here. + + This function cannot be used with namespaces that have + 'DECL_NAMESPACE_ALIAS' set. + + +File: gccint.info, Node: Classes, Next: Functions for C++, Prev: Namespaces, Up: C and C++ Trees + +10.10.3 Classes +--------------- + +Besides namespaces, the other high-level scoping construct in C++ is the +class. (Throughout this manual the term "class" is used to mean the +types referred to in the ANSI/ISO C++ Standard as classes; these include +types defined with the 'class', 'struct', and 'union' keywords.) + + A class type is represented by either a 'RECORD_TYPE' or a +'UNION_TYPE'. A class declared with the 'union' tag is represented by a +'UNION_TYPE', while classes declared with either the 'struct' or the +'class' tag are represented by 'RECORD_TYPE's. You can use the +'CLASSTYPE_DECLARED_CLASS' macro to discern whether or not a particular +type is a 'class' as opposed to a 'struct'. This macro will be true +only for classes declared with the 'class' tag. + + Almost all non-function members are available on the 'TYPE_FIELDS' +list. Given one member, the next can be found by following the +'TREE_CHAIN'. You should not depend in any way on the order in which +fields appear on this list. All nodes on this list will be 'DECL' +nodes. A 'FIELD_DECL' is used to represent a non-static data member, a +'VAR_DECL' is used to represent a static data member, and a 'TYPE_DECL' +is used to represent a type. Note that the 'CONST_DECL' for an +enumeration constant will appear on this list, if the enumeration type +was declared in the class. (Of course, the 'TYPE_DECL' for the +enumeration type will appear here as well.) There are no entries for +base classes on this list. In particular, there is no 'FIELD_DECL' for +the "base-class portion" of an object. + + The 'TYPE_VFIELD' is a compiler-generated field used to point to +virtual function tables. It may or may not appear on the 'TYPE_FIELDS' +list. However, back ends should handle the 'TYPE_VFIELD' just like all +the entries on the 'TYPE_FIELDS' list. + + The function members are available on the 'TYPE_METHODS' list. Again, +subsequent members are found by following the 'TREE_CHAIN' field. If a +function is overloaded, each of the overloaded functions appears; no +'OVERLOAD' nodes appear on the 'TYPE_METHODS' list. Implicitly declared +functions (including default constructors, copy constructors, assignment +operators, and destructors) will appear on this list as well. + + Every class has an associated "binfo", which can be obtained with +'TYPE_BINFO'. Binfos are used to represent base-classes. The binfo +given by 'TYPE_BINFO' is the degenerate case, whereby every class is +considered to be its own base-class. The base binfos for a particular +binfo are held in a vector, whose length is obtained with +'BINFO_N_BASE_BINFOS'. The base binfos themselves are obtained with +'BINFO_BASE_BINFO' and 'BINFO_BASE_ITERATE'. To add a new binfo, use +'BINFO_BASE_APPEND'. The vector of base binfos can be obtained with +'BINFO_BASE_BINFOS', but normally you do not need to use that. The +class type associated with a binfo is given by 'BINFO_TYPE'. It is not +always the case that 'BINFO_TYPE (TYPE_BINFO (x))', because of typedefs +and qualified types. Neither is it the case that 'TYPE_BINFO +(BINFO_TYPE (y))' is the same binfo as 'y'. The reason is that if 'y' +is a binfo representing a base-class 'B' of a derived class 'D', then +'BINFO_TYPE (y)' will be 'B', and 'TYPE_BINFO (BINFO_TYPE (y))' will be +'B' as its own base-class, rather than as a base-class of 'D'. + + The access to a base type can be found with 'BINFO_BASE_ACCESS'. This +will produce 'access_public_node', 'access_private_node' or +'access_protected_node'. If bases are always public, +'BINFO_BASE_ACCESSES' may be 'NULL'. + + 'BINFO_VIRTUAL_P' is used to specify whether the binfo is inherited +virtually or not. The other flags, 'BINFO_MARKED_P' and 'BINFO_FLAG_1' +to 'BINFO_FLAG_6' can be used for language specific use. + + The following macros can be used on a tree node representing a +class-type. + +'LOCAL_CLASS_P' + This predicate holds if the class is local class _i.e._ declared + inside a function body. + +'TYPE_POLYMORPHIC_P' + This predicate holds if the class has at least one virtual function + (declared or inherited). + +'TYPE_HAS_DEFAULT_CONSTRUCTOR' + This predicate holds whenever its argument represents a class-type + with default constructor. + +'CLASSTYPE_HAS_MUTABLE' +'TYPE_HAS_MUTABLE_P' + These predicates hold for a class-type having a mutable data + member. + +'CLASSTYPE_NON_POD_P' + This predicate holds only for class-types that are not PODs. + +'TYPE_HAS_NEW_OPERATOR' + This predicate holds for a class-type that defines 'operator new'. + +'TYPE_HAS_ARRAY_NEW_OPERATOR' + This predicate holds for a class-type for which 'operator new[]' is + defined. + +'TYPE_OVERLOADS_CALL_EXPR' + This predicate holds for class-type for which the function call + 'operator()' is overloaded. + +'TYPE_OVERLOADS_ARRAY_REF' + This predicate holds for a class-type that overloads 'operator[]' + +'TYPE_OVERLOADS_ARROW' + This predicate holds for a class-type for which 'operator->' is + overloaded. + + +File: gccint.info, Node: Functions for C++, Next: Statements for C++, Prev: Classes, Up: C and C++ Trees + +10.10.4 Functions for C++ +------------------------- + +A function is represented by a 'FUNCTION_DECL' node. A set of +overloaded functions is sometimes represented by an 'OVERLOAD' node. + + An 'OVERLOAD' node is not a declaration, so none of the 'DECL_' macros +should be used on an 'OVERLOAD'. An 'OVERLOAD' node is similar to a +'TREE_LIST'. Use 'OVL_CURRENT' to get the function associated with an +'OVERLOAD' node; use 'OVL_NEXT' to get the next 'OVERLOAD' node in the +list of overloaded functions. The macros 'OVL_CURRENT' and 'OVL_NEXT' +are actually polymorphic; you can use them to work with 'FUNCTION_DECL' +nodes as well as with overloads. In the case of a 'FUNCTION_DECL', +'OVL_CURRENT' will always return the function itself, and 'OVL_NEXT' +will always be 'NULL_TREE'. + + To determine the scope of a function, you can use the 'DECL_CONTEXT' +macro. This macro will return the class (either a 'RECORD_TYPE' or a +'UNION_TYPE') or namespace (a 'NAMESPACE_DECL') of which the function is +a member. For a virtual function, this macro returns the class in which +the function was actually defined, not the base class in which the +virtual declaration occurred. + + If a friend function is defined in a class scope, the +'DECL_FRIEND_CONTEXT' macro can be used to determine the class in which +it was defined. For example, in + class C { friend void f() {} }; +the 'DECL_CONTEXT' for 'f' will be the 'global_namespace', but the +'DECL_FRIEND_CONTEXT' will be the 'RECORD_TYPE' for 'C'. + + The following macros and functions can be used on a 'FUNCTION_DECL': +'DECL_MAIN_P' + This predicate holds for a function that is the program entry point + '::code'. + +'DECL_LOCAL_FUNCTION_P' + This predicate holds if the function was declared at block scope, + even though it has a global scope. + +'DECL_ANTICIPATED' + This predicate holds if the function is a built-in function but its + prototype is not yet explicitly declared. + +'DECL_EXTERN_C_FUNCTION_P' + This predicate holds if the function is declared as an ''extern + "C"'' function. + +'DECL_LINKONCE_P' + This macro holds if multiple copies of this function may be emitted + in various translation units. It is the responsibility of the + linker to merge the various copies. Template instantiations are + the most common example of functions for which 'DECL_LINKONCE_P' + holds; G++ instantiates needed templates in all translation units + which require them, and then relies on the linker to remove + duplicate instantiations. + + FIXME: This macro is not yet implemented. + +'DECL_FUNCTION_MEMBER_P' + This macro holds if the function is a member of a class, rather + than a member of a namespace. + +'DECL_STATIC_FUNCTION_P' + This predicate holds if the function a static member function. + +'DECL_NONSTATIC_MEMBER_FUNCTION_P' + This macro holds for a non-static member function. + +'DECL_CONST_MEMFUNC_P' + This predicate holds for a 'const'-member function. + +'DECL_VOLATILE_MEMFUNC_P' + This predicate holds for a 'volatile'-member function. + +'DECL_CONSTRUCTOR_P' + This macro holds if the function is a constructor. + +'DECL_NONCONVERTING_P' + This predicate holds if the constructor is a non-converting + constructor. + +'DECL_COMPLETE_CONSTRUCTOR_P' + This predicate holds for a function which is a constructor for an + object of a complete type. + +'DECL_BASE_CONSTRUCTOR_P' + This predicate holds for a function which is a constructor for a + base class sub-object. + +'DECL_COPY_CONSTRUCTOR_P' + This predicate holds for a function which is a copy-constructor. + +'DECL_DESTRUCTOR_P' + This macro holds if the function is a destructor. + +'DECL_COMPLETE_DESTRUCTOR_P' + This predicate holds if the function is the destructor for an + object a complete type. + +'DECL_OVERLOADED_OPERATOR_P' + This macro holds if the function is an overloaded operator. + +'DECL_CONV_FN_P' + This macro holds if the function is a type-conversion operator. + +'DECL_GLOBAL_CTOR_P' + This predicate holds if the function is a file-scope initialization + function. + +'DECL_GLOBAL_DTOR_P' + This predicate holds if the function is a file-scope finalization + function. + +'DECL_THUNK_P' + This predicate holds if the function is a thunk. + + These functions represent stub code that adjusts the 'this' pointer + and then jumps to another function. When the jumped-to function + returns, control is transferred directly to the caller, without + returning to the thunk. The first parameter to the thunk is always + the 'this' pointer; the thunk should add 'THUNK_DELTA' to this + value. (The 'THUNK_DELTA' is an 'int', not an 'INTEGER_CST'.) + + Then, if 'THUNK_VCALL_OFFSET' (an 'INTEGER_CST') is nonzero the + adjusted 'this' pointer must be adjusted again. The complete + calculation is given by the following pseudo-code: + + this += THUNK_DELTA + if (THUNK_VCALL_OFFSET) + this += (*((ptrdiff_t **) this))[THUNK_VCALL_OFFSET] + + Finally, the thunk should jump to the location given by + 'DECL_INITIAL'; this will always be an expression for the address + of a function. + +'DECL_NON_THUNK_FUNCTION_P' + This predicate holds if the function is _not_ a thunk function. + +'GLOBAL_INIT_PRIORITY' + If either 'DECL_GLOBAL_CTOR_P' or 'DECL_GLOBAL_DTOR_P' holds, then + this gives the initialization priority for the function. The + linker will arrange that all functions for which + 'DECL_GLOBAL_CTOR_P' holds are run in increasing order of priority + before 'main' is called. When the program exits, all functions for + which 'DECL_GLOBAL_DTOR_P' holds are run in the reverse order. + +'TYPE_RAISES_EXCEPTIONS' + This macro returns the list of exceptions that a (member-)function + can raise. The returned list, if non 'NULL', is comprised of nodes + whose 'TREE_VALUE' represents a type. + +'TYPE_NOTHROW_P' + This predicate holds when the exception-specification of its + arguments is of the form ''()''. + +'DECL_ARRAY_DELETE_OPERATOR_P' + This predicate holds if the function an overloaded 'operator + delete[]'. + + +File: gccint.info, Node: Statements for C++, Next: C++ Expressions, Prev: Functions for C++, Up: C and C++ Trees + +10.10.5 Statements for C++ +-------------------------- + +A function that has a definition in the current translation unit will +have a non-'NULL' 'DECL_INITIAL'. However, back ends should not make +use of the particular value given by 'DECL_INITIAL'. + + The 'DECL_SAVED_TREE' macro will give the complete body of the +function. + +10.10.5.1 Statements +.................... + +There are tree nodes corresponding to all of the source-level statement +constructs, used within the C and C++ frontends. These are enumerated +here, together with a list of the various macros that can be used to +obtain information about them. There are a few macros that can be used +with all statements: + +'STMT_IS_FULL_EXPR_P' + In C++, statements normally constitute "full expressions"; + temporaries created during a statement are destroyed when the + statement is complete. However, G++ sometimes represents + expressions by statements; these statements will not have + 'STMT_IS_FULL_EXPR_P' set. Temporaries created during such + statements should be destroyed when the innermost enclosing + statement with 'STMT_IS_FULL_EXPR_P' set is exited. + + Here is the list of the various statement nodes, and the macros used to +access them. This documentation describes the use of these nodes in +non-template functions (including instantiations of template functions). +In template functions, the same nodes are used, but sometimes in +slightly different ways. + + Many of the statements have substatements. For example, a 'while' loop +will have a body, which is itself a statement. If the substatement is +'NULL_TREE', it is considered equivalent to a statement consisting of a +single ';', i.e., an expression statement in which the expression has +been omitted. A substatement may in fact be a list of statements, +connected via their 'TREE_CHAIN's. So, you should always process the +statement tree by looping over substatements, like this: + void process_stmt (stmt) + tree stmt; + { + while (stmt) + { + switch (TREE_CODE (stmt)) + { + case IF_STMT: + process_stmt (THEN_CLAUSE (stmt)); + /* More processing here. */ + break; + + ... + } + + stmt = TREE_CHAIN (stmt); + } + } + In other words, while the 'then' clause of an 'if' statement in C++ can +be only one statement (although that one statement may be a compound +statement), the intermediate representation will sometimes use several +statements chained together. + +'BREAK_STMT' + + Used to represent a 'break' statement. There are no additional + fields. + +'CILK_SPAWN_STMT' + + Used to represent a spawning function in the Cilk Plus language + extension. This tree has one field that holds the name of the + spawning function. '_Cilk_spawn' can be written in C in the + following way: + + _Cilk_spawn <function_name> (<parameters>); + + Detailed description for usage and functionality of '_Cilk_spawn' + can be found at http://www.cilkplus.org + +'CILK_SYNC_STMT' + + This statement is part of the Cilk Plus language extension. It + indicates that the current function cannot continue in parallel + with its spawned children. There are no additional fields. + '_Cilk_sync' can be written in C in the following way: + + _Cilk_sync; + +'CLEANUP_STMT' + + Used to represent an action that should take place upon exit from + the enclosing scope. Typically, these actions are calls to + destructors for local objects, but back ends cannot rely on this + fact. If these nodes are in fact representing such destructors, + 'CLEANUP_DECL' will be the 'VAR_DECL' destroyed. Otherwise, + 'CLEANUP_DECL' will be 'NULL_TREE'. In any case, the + 'CLEANUP_EXPR' is the expression to execute. The cleanups executed + on exit from a scope should be run in the reverse order of the + order in which the associated 'CLEANUP_STMT's were encountered. + +'CONTINUE_STMT' + + Used to represent a 'continue' statement. There are no additional + fields. + +'CTOR_STMT' + + Used to mark the beginning (if 'CTOR_BEGIN_P' holds) or end (if + 'CTOR_END_P' holds of the main body of a constructor. See also + 'SUBOBJECT' for more information on how to use these nodes. + +'DO_STMT' + + Used to represent a 'do' loop. The body of the loop is given by + 'DO_BODY' while the termination condition for the loop is given by + 'DO_COND'. The condition for a 'do'-statement is always an + expression. + +'EMPTY_CLASS_EXPR' + + Used to represent a temporary object of a class with no data whose + address is never taken. (All such objects are interchangeable.) + The 'TREE_TYPE' represents the type of the object. + +'EXPR_STMT' + + Used to represent an expression statement. Use 'EXPR_STMT_EXPR' to + obtain the expression. + +'FOR_STMT' + + Used to represent a 'for' statement. The 'FOR_INIT_STMT' is the + initialization statement for the loop. The 'FOR_COND' is the + termination condition. The 'FOR_EXPR' is the expression executed + right before the 'FOR_COND' on each loop iteration; often, this + expression increments a counter. The body of the loop is given by + 'FOR_BODY'. Note that 'FOR_INIT_STMT' and 'FOR_BODY' return + statements, while 'FOR_COND' and 'FOR_EXPR' return expressions. + +'HANDLER' + + Used to represent a C++ 'catch' block. The 'HANDLER_TYPE' is the + type of exception that will be caught by this handler; it is equal + (by pointer equality) to 'NULL' if this handler is for all types. + 'HANDLER_PARMS' is the 'DECL_STMT' for the catch parameter, and + 'HANDLER_BODY' is the code for the block itself. + +'IF_STMT' + + Used to represent an 'if' statement. The 'IF_COND' is the + expression. + + If the condition is a 'TREE_LIST', then the 'TREE_PURPOSE' is a + statement (usually a 'DECL_STMT'). Each time the condition is + evaluated, the statement should be executed. Then, the + 'TREE_VALUE' should be used as the conditional expression itself. + This representation is used to handle C++ code like this: + + C++ distinguishes between this and 'COND_EXPR' for handling + templates. + + if (int i = 7) ... + + where there is a new local variable (or variables) declared within + the condition. + + The 'THEN_CLAUSE' represents the statement given by the 'then' + condition, while the 'ELSE_CLAUSE' represents the statement given + by the 'else' condition. + +'SUBOBJECT' + + In a constructor, these nodes are used to mark the point at which a + subobject of 'this' is fully constructed. If, after this point, an + exception is thrown before a 'CTOR_STMT' with 'CTOR_END_P' set is + encountered, the 'SUBOBJECT_CLEANUP' must be executed. The + cleanups must be executed in the reverse order in which they + appear. + +'SWITCH_STMT' + + Used to represent a 'switch' statement. The 'SWITCH_STMT_COND' is + the expression on which the switch is occurring. See the + documentation for an 'IF_STMT' for more information on the + representation used for the condition. The 'SWITCH_STMT_BODY' is + the body of the switch statement. The 'SWITCH_STMT_TYPE' is the + original type of switch expression as given in the source, before + any compiler conversions. + +'TRY_BLOCK' + Used to represent a 'try' block. The body of the try block is + given by 'TRY_STMTS'. Each of the catch blocks is a 'HANDLER' + node. The first handler is given by 'TRY_HANDLERS'. Subsequent + handlers are obtained by following the 'TREE_CHAIN' link from one + handler to the next. The body of the handler is given by + 'HANDLER_BODY'. + + If 'CLEANUP_P' holds of the 'TRY_BLOCK', then the 'TRY_HANDLERS' + will not be a 'HANDLER' node. Instead, it will be an expression + that should be executed if an exception is thrown in the try block. + It must rethrow the exception after executing that code. And, if + an exception is thrown while the expression is executing, + 'terminate' must be called. + +'USING_STMT' + Used to represent a 'using' directive. The namespace is given by + 'USING_STMT_NAMESPACE', which will be a NAMESPACE_DECL. This node + is needed inside template functions, to implement using directives + during instantiation. + +'WHILE_STMT' + + Used to represent a 'while' loop. The 'WHILE_COND' is the + termination condition for the loop. See the documentation for an + 'IF_STMT' for more information on the representation used for the + condition. + + The 'WHILE_BODY' is the body of the loop. + + +File: gccint.info, Node: C++ Expressions, Prev: Statements for C++, Up: C and C++ Trees + +10.10.6 C++ Expressions +----------------------- + +This section describes expressions specific to the C and C++ front ends. + +'TYPEID_EXPR' + + Used to represent a 'typeid' expression. + +'NEW_EXPR' +'VEC_NEW_EXPR' + + Used to represent a call to 'new' and 'new[]' respectively. + +'DELETE_EXPR' +'VEC_DELETE_EXPR' + + Used to represent a call to 'delete' and 'delete[]' respectively. + +'MEMBER_REF' + + Represents a reference to a member of a class. + +'THROW_EXPR' + + Represents an instance of 'throw' in the program. Operand 0, which + is the expression to throw, may be 'NULL_TREE'. + +'AGGR_INIT_EXPR' + An 'AGGR_INIT_EXPR' represents the initialization as the return + value of a function call, or as the result of a constructor. An + 'AGGR_INIT_EXPR' will only appear as a full-expression, or as the + second operand of a 'TARGET_EXPR'. 'AGGR_INIT_EXPR's have a + representation similar to that of 'CALL_EXPR's. You can use the + 'AGGR_INIT_EXPR_FN' and 'AGGR_INIT_EXPR_ARG' macros to access the + function to call and the arguments to pass. + + If 'AGGR_INIT_VIA_CTOR_P' holds of the 'AGGR_INIT_EXPR', then the + initialization is via a constructor call. The address of the + 'AGGR_INIT_EXPR_SLOT' operand, which is always a 'VAR_DECL', is + taken, and this value replaces the first argument in the argument + list. + + In either case, the expression is void. + + +File: gccint.info, Node: Java Trees, Prev: C and C++ Trees, Up: GENERIC + +10.11 Java Trees +================ + + +File: gccint.info, Node: GIMPLE, Next: Tree SSA, Prev: GENERIC, Up: Top + +11 GIMPLE +********* + +GIMPLE is a three-address representation derived from GENERIC by +breaking down GENERIC expressions into tuples of no more than 3 operands +(with some exceptions like function calls). GIMPLE was heavily +influenced by the SIMPLE IL used by the McCAT compiler project at McGill +University, though we have made some different choices. For one thing, +SIMPLE doesn't support 'goto'. + + Temporaries are introduced to hold intermediate values needed to +compute complex expressions. Additionally, all the control structures +used in GENERIC are lowered into conditional jumps, lexical scopes are +removed and exception regions are converted into an on the side +exception region tree. + + The compiler pass which converts GENERIC into GIMPLE is referred to as +the 'gimplifier'. The gimplifier works recursively, generating GIMPLE +tuples out of the original GENERIC expressions. + + One of the early implementation strategies used for the GIMPLE +representation was to use the same internal data structures used by +front ends to represent parse trees. This simplified implementation +because we could leverage existing functionality and interfaces. +However, GIMPLE is a much more restrictive representation than abstract +syntax trees (AST), therefore it does not require the full structural +complexity provided by the main tree data structure. + + The GENERIC representation of a function is stored in the +'DECL_SAVED_TREE' field of the associated 'FUNCTION_DECL' tree node. It +is converted to GIMPLE by a call to 'gimplify_function_tree'. + + If a front end wants to include language-specific tree codes in the +tree representation which it provides to the back end, it must provide a +definition of 'LANG_HOOKS_GIMPLIFY_EXPR' which knows how to convert the +front end trees to GIMPLE. Usually such a hook will involve much of the +same code for expanding front end trees to RTL. This function can +return fully lowered GIMPLE, or it can return GENERIC trees and let the +main gimplifier lower them the rest of the way; this is often simpler. +GIMPLE that is not fully lowered is known as "High GIMPLE" and consists +of the IL before the pass 'pass_lower_cf'. High GIMPLE contains some +container statements like lexical scopes (represented by 'GIMPLE_BIND') +and nested expressions (e.g., 'GIMPLE_TRY'), while "Low GIMPLE" exposes +all of the implicit jumps for control and exception expressions directly +in the IL and EH region trees. + + The C and C++ front ends currently convert directly from front end +trees to GIMPLE, and hand that off to the back end rather than first +converting to GENERIC. Their gimplifier hooks know about all the +'_STMT' nodes and how to convert them to GENERIC forms. There was some +work done on a genericization pass which would run first, but the +existence of 'STMT_EXPR' meant that in order to convert all of the C +statements into GENERIC equivalents would involve walking the entire +tree anyway, so it was simpler to lower all the way. This might change +in the future if someone writes an optimization pass which would work +better with higher-level trees, but currently the optimizers all expect +GIMPLE. + + You can request to dump a C-like representation of the GIMPLE form with +the flag '-fdump-tree-gimple'. + +* Menu: + +* Tuple representation:: +* GIMPLE instruction set:: +* GIMPLE Exception Handling:: +* Temporaries:: +* Operands:: +* Manipulating GIMPLE statements:: +* Tuple specific accessors:: +* GIMPLE sequences:: +* Sequence iterators:: +* Adding a new GIMPLE statement code:: +* Statement and operand traversals:: + + +File: gccint.info, Node: Tuple representation, Next: GIMPLE instruction set, Up: GIMPLE + +11.1 Tuple representation +========================= + +GIMPLE instructions are tuples of variable size divided in two groups: a +header describing the instruction and its locations, and a variable +length body with all the operands. Tuples are organized into a +hierarchy with 3 main classes of tuples. + +11.1.1 'gimple_statement_base' (gsbase) +--------------------------------------- + +This is the root of the hierarchy, it holds basic information needed by +most GIMPLE statements. There are some fields that may not be relevant +to every GIMPLE statement, but those were moved into the base structure +to take advantage of holes left by other fields (thus making the +structure more compact). The structure takes 4 words (32 bytes) on 64 +bit hosts: + +Field Size (bits) +'code' 8 +'subcode' 16 +'no_warning' 1 +'visited' 1 +'nontemporal_move' 1 +'plf' 2 +'modified' 1 +'has_volatile_ops' 1 +'references_memory_p' 1 +'uid' 32 +'location' 32 +'num_ops' 32 +'bb' 64 +'block' 63 +Total size 32 bytes + + * 'code' Main identifier for a GIMPLE instruction. + + * 'subcode' Used to distinguish different variants of the same basic + instruction or provide flags applicable to a given code. The + 'subcode' flags field has different uses depending on the code of + the instruction, but mostly it distinguishes instructions of the + same family. The most prominent use of this field is in + assignments, where subcode indicates the operation done on the RHS + of the assignment. For example, a = b + c is encoded as + 'GIMPLE_ASSIGN <PLUS_EXPR, a, b, c>'. + + * 'no_warning' Bitflag to indicate whether a warning has already been + issued on this statement. + + * 'visited' General purpose "visited" marker. Set and cleared by + each pass when needed. + + * 'nontemporal_move' Bitflag used in assignments that represent + non-temporal moves. Although this bitflag is only used in + assignments, it was moved into the base to take advantage of the + bit holes left by the previous fields. + + * 'plf' Pass Local Flags. This 2-bit mask can be used as general + purpose markers by any pass. Passes are responsible for clearing + and setting these two flags accordingly. + + * 'modified' Bitflag to indicate whether the statement has been + modified. Used mainly by the operand scanner to determine when to + re-scan a statement for operands. + + * 'has_volatile_ops' Bitflag to indicate whether this statement + contains operands that have been marked volatile. + + * 'references_memory_p' Bitflag to indicate whether this statement + contains memory references (i.e., its operands are either global + variables, or pointer dereferences or anything that must reside in + memory). + + * 'uid' This is an unsigned integer used by passes that want to + assign IDs to every statement. These IDs must be assigned and used + by each pass. + + * 'location' This is a 'location_t' identifier to specify source code + location for this statement. It is inherited from the front end. + + * 'num_ops' Number of operands that this statement has. This + specifies the size of the operand vector embedded in the tuple. + Only used in some tuples, but it is declared in the base tuple to + take advantage of the 32-bit hole left by the previous fields. + + * 'bb' Basic block holding the instruction. + + * 'block' Lexical block holding this statement. Also used for debug + information generation. + +11.1.2 'gimple_statement_with_ops' +---------------------------------- + +This tuple is actually split in two: 'gimple_statement_with_ops_base' +and 'gimple_statement_with_ops'. This is needed to accommodate the way +the operand vector is allocated. The operand vector is defined to be an +array of 1 element. So, to allocate a dynamic number of operands, the +memory allocator ('gimple_alloc') simply allocates enough memory to hold +the structure itself plus 'N - 1' operands which run "off the end" of +the structure. For example, to allocate space for a tuple with 3 +operands, 'gimple_alloc' reserves 'sizeof (struct +gimple_statement_with_ops) + 2 * sizeof (tree)' bytes. + + On the other hand, several fields in this tuple need to be shared with +the 'gimple_statement_with_memory_ops' tuple. So, these common fields +are placed in 'gimple_statement_with_ops_base' which is then inherited +from the other two tuples. + +'gsbase' 256 +'def_ops' 64 +'use_ops' 64 +'op' 'num_ops' * 64 +Total 48 + 8 * 'num_ops' bytes +size + + * 'gsbase' Inherited from 'struct gimple_statement_base'. + + * 'def_ops' Array of pointers into the operand array indicating all + the slots that contain a variable written-to by the statement. + This array is also used for immediate use chaining. Note that it + would be possible to not rely on this array, but the changes + required to implement this are pretty invasive. + + * 'use_ops' Similar to 'def_ops' but for variables read by the + statement. + + * 'op' Array of trees with 'num_ops' slots. + +11.1.3 'gimple_statement_with_memory_ops' +----------------------------------------- + +This tuple is essentially identical to 'gimple_statement_with_ops', +except that it contains 4 additional fields to hold vectors related +memory stores and loads. Similar to the previous case, the structure is +split in two to accommodate for the operand vector +('gimple_statement_with_memory_ops_base' and +'gimple_statement_with_memory_ops'). + +Field Size (bits) +'gsbase' 256 +'def_ops' 64 +'use_ops' 64 +'vdef_ops' 64 +'vuse_ops' 64 +'stores' 64 +'loads' 64 +'op' 'num_ops' * 64 +Total size 80 + 8 * 'num_ops' bytes + + * 'vdef_ops' Similar to 'def_ops' but for 'VDEF' operators. There is + one entry per memory symbol written by this statement. This is + used to maintain the memory SSA use-def and def-def chains. + + * 'vuse_ops' Similar to 'use_ops' but for 'VUSE' operators. There is + one entry per memory symbol loaded by this statement. This is used + to maintain the memory SSA use-def chains. + + * 'stores' Bitset with all the UIDs for the symbols written-to by the + statement. This is different than 'vdef_ops' in that all the + affected symbols are mentioned in this set. If memory partitioning + is enabled, the 'vdef_ops' vector will refer to memory partitions. + Furthermore, no SSA information is stored in this set. + + * 'loads' Similar to 'stores', but for memory loads. (Note that + there is some amount of redundancy here, it should be possible to + reduce memory utilization further by removing these sets). + + All the other tuples are defined in terms of these three basic ones. +Each tuple will add some fields. The main gimple type is defined to be +the union of all these structures ('GTY' markers elided for clarity): + + union gimple_statement_d + { + struct gimple_statement_base gsbase; + struct gimple_statement_with_ops gsops; + struct gimple_statement_with_memory_ops gsmem; + struct gimple_statement_omp omp; + struct gimple_statement_bind gimple_bind; + struct gimple_statement_catch gimple_catch; + struct gimple_statement_eh_filter gimple_eh_filter; + struct gimple_statement_phi gimple_phi; + struct gimple_statement_resx gimple_resx; + struct gimple_statement_try gimple_try; + struct gimple_statement_wce gimple_wce; + struct gimple_statement_asm gimple_asm; + struct gimple_statement_omp_critical gimple_omp_critical; + struct gimple_statement_omp_for gimple_omp_for; + struct gimple_statement_omp_parallel gimple_omp_parallel; + struct gimple_statement_omp_task gimple_omp_task; + struct gimple_statement_omp_sections gimple_omp_sections; + struct gimple_statement_omp_single gimple_omp_single; + struct gimple_statement_omp_continue gimple_omp_continue; + struct gimple_statement_omp_atomic_load gimple_omp_atomic_load; + struct gimple_statement_omp_atomic_store gimple_omp_atomic_store; + }; + + +File: gccint.info, Node: GIMPLE instruction set, Next: GIMPLE Exception Handling, Prev: Tuple representation, Up: GIMPLE + +11.2 GIMPLE instruction set +=========================== + +The following table briefly describes the GIMPLE instruction set. + +Instruction High GIMPLE Low GIMPLE +'GIMPLE_ASM' x x +'GIMPLE_ASSIGN' x x +'GIMPLE_BIND' x +'GIMPLE_CALL' x x +'GIMPLE_CATCH' x +'GIMPLE_COND' x x +'GIMPLE_DEBUG' x x +'GIMPLE_EH_FILTER' x +'GIMPLE_GOTO' x x +'GIMPLE_LABEL' x x +'GIMPLE_NOP' x x +'GIMPLE_OMP_ATOMIC_LOAD' x x +'GIMPLE_OMP_ATOMIC_STORE' x x +'GIMPLE_OMP_CONTINUE' x x +'GIMPLE_OMP_CRITICAL' x x +'GIMPLE_OMP_FOR' x x +'GIMPLE_OMP_MASTER' x x +'GIMPLE_OMP_ORDERED' x x +'GIMPLE_OMP_PARALLEL' x x +'GIMPLE_OMP_RETURN' x x +'GIMPLE_OMP_SECTION' x x +'GIMPLE_OMP_SECTIONS' x x +'GIMPLE_OMP_SECTIONS_SWITCH' x x +'GIMPLE_OMP_SINGLE' x x +'GIMPLE_PHI' x +'GIMPLE_RESX' x +'GIMPLE_RETURN' x x +'GIMPLE_SWITCH' x x +'GIMPLE_TRY' x + + +File: gccint.info, Node: GIMPLE Exception Handling, Next: Temporaries, Prev: GIMPLE instruction set, Up: GIMPLE + +11.3 Exception Handling +======================= + +Other exception handling constructs are represented using +'GIMPLE_TRY_CATCH'. 'GIMPLE_TRY_CATCH' has two operands. The first +operand is a sequence of statements to execute. If executing these +statements does not throw an exception, then the second operand is +ignored. Otherwise, if an exception is thrown, then the second operand +of the 'GIMPLE_TRY_CATCH' is checked. The second operand may have the +following forms: + + 1. A sequence of statements to execute. When an exception occurs, + these statements are executed, and then the exception is rethrown. + + 2. A sequence of 'GIMPLE_CATCH' statements. Each 'GIMPLE_CATCH' has a + list of applicable exception types and handler code. If the thrown + exception matches one of the caught types, the associated handler + code is executed. If the handler code falls off the bottom, + execution continues after the original 'GIMPLE_TRY_CATCH'. + + 3. A 'GIMPLE_EH_FILTER' statement. This has a list of permitted + exception types, and code to handle a match failure. If the thrown + exception does not match one of the allowed types, the associated + match failure code is executed. If the thrown exception does + match, it continues unwinding the stack looking for the next + handler. + + Currently throwing an exception is not directly represented in GIMPLE, +since it is implemented by calling a function. At some point in the +future we will want to add some way to express that the call will throw +an exception of a known type. + + Just before running the optimizers, the compiler lowers the high-level +EH constructs above into a set of 'goto's, magic labels, and EH regions. +Continuing to unwind at the end of a cleanup is represented with a +'GIMPLE_RESX'. + + +File: gccint.info, Node: Temporaries, Next: Operands, Prev: GIMPLE Exception Handling, Up: GIMPLE + +11.4 Temporaries +================ + +When gimplification encounters a subexpression that is too complex, it +creates a new temporary variable to hold the value of the subexpression, +and adds a new statement to initialize it before the current statement. +These special temporaries are known as 'expression temporaries', and are +allocated using 'get_formal_tmp_var'. The compiler tries to always +evaluate identical expressions into the same temporary, to simplify +elimination of redundant calculations. + + We can only use expression temporaries when we know that it will not be +reevaluated before its value is used, and that it will not be otherwise +modified(1). Other temporaries can be allocated using +'get_initialized_tmp_var' or 'create_tmp_var'. + + Currently, an expression like 'a = b + 5' is not reduced any further. +We tried converting it to something like + T1 = b + 5; + a = T1; + but this bloated the representation for minimal benefit. However, a +variable which must live in memory cannot appear in an expression; its +value is explicitly loaded into a temporary first. Similarly, storing +the value of an expression to a memory variable goes through a +temporary. + + ---------- Footnotes ---------- + + (1) These restrictions are derived from those in Morgan 4.8. + + +File: gccint.info, Node: Operands, Next: Manipulating GIMPLE statements, Prev: Temporaries, Up: GIMPLE + +11.5 Operands +============= + +In general, expressions in GIMPLE consist of an operation and the +appropriate number of simple operands; these operands must either be a +GIMPLE rvalue ('is_gimple_val'), i.e. a constant or a register variable. +More complex operands are factored out into temporaries, so that + a = b + c + d + becomes + T1 = b + c; + a = T1 + d; + + The same rule holds for arguments to a 'GIMPLE_CALL'. + + The target of an assignment is usually a variable, but can also be a +'MEM_REF' or a compound lvalue as described below. + +* Menu: + +* Compound Expressions:: +* Compound Lvalues:: +* Conditional Expressions:: +* Logical Operators:: + + +File: gccint.info, Node: Compound Expressions, Next: Compound Lvalues, Up: Operands + +11.5.1 Compound Expressions +--------------------------- + +The left-hand side of a C comma expression is simply moved into a +separate statement. + + +File: gccint.info, Node: Compound Lvalues, Next: Conditional Expressions, Prev: Compound Expressions, Up: Operands + +11.5.2 Compound Lvalues +----------------------- + +Currently compound lvalues involving array and structure field +references are not broken down; an expression like 'a.b[2] = 42' is not +reduced any further (though complex array subscripts are). This +restriction is a workaround for limitations in later optimizers; if we +were to convert this to + + T1 = &a.b; + T1[2] = 42; + + alias analysis would not remember that the reference to 'T1[2]' came by +way of 'a.b', so it would think that the assignment could alias another +member of 'a'; this broke 'struct-alias-1.c'. Future optimizer +improvements may make this limitation unnecessary. + + +File: gccint.info, Node: Conditional Expressions, Next: Logical Operators, Prev: Compound Lvalues, Up: Operands + +11.5.3 Conditional Expressions +------------------------------ + +A C '?:' expression is converted into an 'if' statement with each branch +assigning to the same temporary. So, + + a = b ? c : d; + becomes + if (b == 1) + T1 = c; + else + T1 = d; + a = T1; + + The GIMPLE level if-conversion pass re-introduces '?:' expression, if +appropriate. It is used to vectorize loops with conditions using vector +conditional operations. + + Note that in GIMPLE, 'if' statements are represented using +'GIMPLE_COND', as described below. + + +File: gccint.info, Node: Logical Operators, Prev: Conditional Expressions, Up: Operands + +11.5.4 Logical Operators +------------------------ + +Except when they appear in the condition operand of a 'GIMPLE_COND', +logical 'and' and 'or' operators are simplified as follows: 'a = b && c' +becomes + + T1 = (bool)b; + if (T1 == true) + T1 = (bool)c; + a = T1; + + Note that 'T1' in this example cannot be an expression temporary, +because it has two different assignments. + +11.5.5 Manipulating operands +---------------------------- + +All gimple operands are of type 'tree'. But only certain types of trees +are allowed to be used as operand tuples. Basic validation is +controlled by the function 'get_gimple_rhs_class', which given a tree +code, returns an 'enum' with the following values of type 'enum +gimple_rhs_class' + + * 'GIMPLE_INVALID_RHS' The tree cannot be used as a GIMPLE operand. + + * 'GIMPLE_TERNARY_RHS' The tree is a valid GIMPLE ternary operation. + + * 'GIMPLE_BINARY_RHS' The tree is a valid GIMPLE binary operation. + + * 'GIMPLE_UNARY_RHS' The tree is a valid GIMPLE unary operation. + + * 'GIMPLE_SINGLE_RHS' The tree is a single object, that cannot be + split into simpler operands (for instance, 'SSA_NAME', 'VAR_DECL', + 'COMPONENT_REF', etc). + + This operand class also acts as an escape hatch for tree nodes that + may be flattened out into the operand vector, but would need more + than two slots on the RHS. For instance, a 'COND_EXPR' expression + of the form '(a op b) ? x : y' could be flattened out on the + operand vector using 4 slots, but it would also require additional + processing to distinguish 'c = a op b' from 'c = a op b ? x : y'. + Something similar occurs with 'ASSERT_EXPR'. In time, these + special case tree expressions should be flattened into the operand + vector. + + For tree nodes in the categories 'GIMPLE_TERNARY_RHS', +'GIMPLE_BINARY_RHS' and 'GIMPLE_UNARY_RHS', they cannot be stored inside +tuples directly. They first need to be flattened and separated into +individual components. For instance, given the GENERIC expression + + a = b + c + + its tree representation is: + + MODIFY_EXPR <VAR_DECL <a>, PLUS_EXPR <VAR_DECL <b>, VAR_DECL <c>>> + + In this case, the GIMPLE form for this statement is logically identical +to its GENERIC form but in GIMPLE, the 'PLUS_EXPR' on the RHS of the +assignment is not represented as a tree, instead the two operands are +taken out of the 'PLUS_EXPR' sub-tree and flattened into the GIMPLE +tuple as follows: + + GIMPLE_ASSIGN <PLUS_EXPR, VAR_DECL <a>, VAR_DECL <b>, VAR_DECL <c>> + +11.5.6 Operand vector allocation +-------------------------------- + +The operand vector is stored at the bottom of the three tuple structures +that accept operands. This means, that depending on the code of a given +statement, its operand vector will be at different offsets from the base +of the structure. To access tuple operands use the following accessors + + -- GIMPLE function: unsigned gimple_num_ops (gimple g) + Returns the number of operands in statement G. + + -- GIMPLE function: tree gimple_op (gimple g, unsigned i) + Returns operand 'I' from statement 'G'. + + -- GIMPLE function: tree * gimple_ops (gimple g) + Returns a pointer into the operand vector for statement 'G'. This + is computed using an internal table called 'gimple_ops_offset_'[]. + This table is indexed by the gimple code of 'G'. + + When the compiler is built, this table is filled-in using the sizes + of the structures used by each statement code defined in + gimple.def. Since the operand vector is at the bottom of the + structure, for a gimple code 'C' the offset is computed as sizeof + (struct-of 'C') - sizeof (tree). + + This mechanism adds one memory indirection to every access when + using 'gimple_op'(), if this becomes a bottleneck, a pass can + choose to memoize the result from 'gimple_ops'() and use that to + access the operands. + +11.5.7 Operand validation +------------------------- + +When adding a new operand to a gimple statement, the operand will be +validated according to what each tuple accepts in its operand vector. +These predicates are called by the 'gimple_NAME_set_...()'. Each tuple +will use one of the following predicates (Note, this list is not +exhaustive): + + -- GIMPLE function: bool is_gimple_val (tree t) + Returns true if t is a "GIMPLE value", which are all the + non-addressable stack variables (variables for which + 'is_gimple_reg' returns true) and constants (expressions for which + 'is_gimple_min_invariant' returns true). + + -- GIMPLE function: bool is_gimple_addressable (tree t) + Returns true if t is a symbol or memory reference whose address can + be taken. + + -- GIMPLE function: bool is_gimple_asm_val (tree t) + Similar to 'is_gimple_val' but it also accepts hard registers. + + -- GIMPLE function: bool is_gimple_call_addr (tree t) + Return true if t is a valid expression to use as the function + called by a 'GIMPLE_CALL'. + + -- GIMPLE function: bool is_gimple_mem_ref_addr (tree t) + Return true if t is a valid expression to use as first operand of a + 'MEM_REF' expression. + + -- GIMPLE function: bool is_gimple_constant (tree t) + Return true if t is a valid gimple constant. + + -- GIMPLE function: bool is_gimple_min_invariant (tree t) + Return true if t is a valid minimal invariant. This is different + from constants, in that the specific value of t may not be known at + compile time, but it is known that it doesn't change (e.g., the + address of a function local variable). + + -- GIMPLE function: bool is_gimple_ip_invariant (tree t) + Return true if t is an interprocedural invariant. This means that + t is a valid invariant in all functions (e.g. it can be an address + of a global variable but not of a local one). + + -- GIMPLE function: bool is_gimple_ip_invariant_address (tree t) + Return true if t is an 'ADDR_EXPR' that does not change once the + program is running (and which is valid in all functions). + +11.5.8 Statement validation +--------------------------- + + -- GIMPLE function: bool is_gimple_assign (gimple g) + Return true if the code of g is 'GIMPLE_ASSIGN'. + + -- GIMPLE function: bool is_gimple_call (gimple g) + Return true if the code of g is 'GIMPLE_CALL'. + + -- GIMPLE function: bool is_gimple_debug (gimple g) + Return true if the code of g is 'GIMPLE_DEBUG'. + + -- GIMPLE function: bool gimple_assign_cast_p (gimple g) + Return true if g is a 'GIMPLE_ASSIGN' that performs a type cast + operation. + + -- GIMPLE function: bool gimple_debug_bind_p (gimple g) + Return true if g is a 'GIMPLE_DEBUG' that binds the value of an + expression to a variable. + + -- GIMPLE function: bool is_gimple_omp (gimple g) + Return true if g is any of the OpenMP codes. + + +File: gccint.info, Node: Manipulating GIMPLE statements, Next: Tuple specific accessors, Prev: Operands, Up: GIMPLE + +11.6 Manipulating GIMPLE statements +=================================== + +This section documents all the functions available to handle each of the +GIMPLE instructions. + +11.6.1 Common accessors +----------------------- + +The following are common accessors for gimple statements. + + -- GIMPLE function: enum gimple_code gimple_code (gimple g) + Return the code for statement 'G'. + + -- GIMPLE function: basic_block gimple_bb (gimple g) + Return the basic block to which statement 'G' belongs to. + + -- GIMPLE function: tree gimple_block (gimple g) + Return the lexical scope block holding statement 'G'. + + -- GIMPLE function: tree gimple_expr_type (gimple stmt) + Return the type of the main expression computed by 'STMT'. Return + 'void_type_node' if 'STMT' computes nothing. This will only return + something meaningful for 'GIMPLE_ASSIGN', 'GIMPLE_COND' and + 'GIMPLE_CALL'. For all other tuple codes, it will return + 'void_type_node'. + + -- GIMPLE function: enum tree_code gimple_expr_code (gimple stmt) + Return the tree code for the expression computed by 'STMT'. This + is only meaningful for 'GIMPLE_CALL', 'GIMPLE_ASSIGN' and + 'GIMPLE_COND'. If 'STMT' is 'GIMPLE_CALL', it will return + 'CALL_EXPR'. For 'GIMPLE_COND', it returns the code of the + comparison predicate. For 'GIMPLE_ASSIGN' it returns the code of + the operation performed by the 'RHS' of the assignment. + + -- GIMPLE function: void gimple_set_block (gimple g, tree block) + Set the lexical scope block of 'G' to 'BLOCK'. + + -- GIMPLE function: location_t gimple_locus (gimple g) + Return locus information for statement 'G'. + + -- GIMPLE function: void gimple_set_locus (gimple g, location_t locus) + Set locus information for statement 'G'. + + -- GIMPLE function: bool gimple_locus_empty_p (gimple g) + Return true if 'G' does not have locus information. + + -- GIMPLE function: bool gimple_no_warning_p (gimple stmt) + Return true if no warnings should be emitted for statement 'STMT'. + + -- GIMPLE function: void gimple_set_visited (gimple stmt, bool + visited_p) + Set the visited status on statement 'STMT' to 'VISITED_P'. + + -- GIMPLE function: bool gimple_visited_p (gimple stmt) + Return the visited status on statement 'STMT'. + + -- GIMPLE function: void gimple_set_plf (gimple stmt, enum plf_mask + plf, bool val_p) + Set pass local flag 'PLF' on statement 'STMT' to 'VAL_P'. + + -- GIMPLE function: unsigned int gimple_plf (gimple stmt, enum plf_mask + plf) + Return the value of pass local flag 'PLF' on statement 'STMT'. + + -- GIMPLE function: bool gimple_has_ops (gimple g) + Return true if statement 'G' has register or memory operands. + + -- GIMPLE function: bool gimple_has_mem_ops (gimple g) + Return true if statement 'G' has memory operands. + + -- GIMPLE function: unsigned gimple_num_ops (gimple g) + Return the number of operands for statement 'G'. + + -- GIMPLE function: tree * gimple_ops (gimple g) + Return the array of operands for statement 'G'. + + -- GIMPLE function: tree gimple_op (gimple g, unsigned i) + Return operand 'I' for statement 'G'. + + -- GIMPLE function: tree * gimple_op_ptr (gimple g, unsigned i) + Return a pointer to operand 'I' for statement 'G'. + + -- GIMPLE function: void gimple_set_op (gimple g, unsigned i, tree op) + Set operand 'I' of statement 'G' to 'OP'. + + -- GIMPLE function: bitmap gimple_addresses_taken (gimple stmt) + Return the set of symbols that have had their address taken by + 'STMT'. + + -- GIMPLE function: struct def_optype_d * gimple_def_ops (gimple g) + Return the set of 'DEF' operands for statement 'G'. + + -- GIMPLE function: void gimple_set_def_ops (gimple g, struct + def_optype_d *def) + Set 'DEF' to be the set of 'DEF' operands for statement 'G'. + + -- GIMPLE function: struct use_optype_d * gimple_use_ops (gimple g) + Return the set of 'USE' operands for statement 'G'. + + -- GIMPLE function: void gimple_set_use_ops (gimple g, struct + use_optype_d *use) + Set 'USE' to be the set of 'USE' operands for statement 'G'. + + -- GIMPLE function: struct voptype_d * gimple_vuse_ops (gimple g) + Return the set of 'VUSE' operands for statement 'G'. + + -- GIMPLE function: void gimple_set_vuse_ops (gimple g, struct + voptype_d *ops) + Set 'OPS' to be the set of 'VUSE' operands for statement 'G'. + + -- GIMPLE function: struct voptype_d * gimple_vdef_ops (gimple g) + Return the set of 'VDEF' operands for statement 'G'. + + -- GIMPLE function: void gimple_set_vdef_ops (gimple g, struct + voptype_d *ops) + Set 'OPS' to be the set of 'VDEF' operands for statement 'G'. + + -- GIMPLE function: bitmap gimple_loaded_syms (gimple g) + Return the set of symbols loaded by statement 'G'. Each element of + the set is the 'DECL_UID' of the corresponding symbol. + + -- GIMPLE function: bitmap gimple_stored_syms (gimple g) + Return the set of symbols stored by statement 'G'. Each element of + the set is the 'DECL_UID' of the corresponding symbol. + + -- GIMPLE function: bool gimple_modified_p (gimple g) + Return true if statement 'G' has operands and the modified field + has been set. + + -- GIMPLE function: bool gimple_has_volatile_ops (gimple stmt) + Return true if statement 'STMT' contains volatile operands. + + -- GIMPLE function: void gimple_set_has_volatile_ops (gimple stmt, bool + volatilep) + Return true if statement 'STMT' contains volatile operands. + + -- GIMPLE function: void update_stmt (gimple s) + Mark statement 'S' as modified, and update it. + + -- GIMPLE function: void update_stmt_if_modified (gimple s) + Update statement 'S' if it has been marked modified. + + -- GIMPLE function: gimple gimple_copy (gimple stmt) + Return a deep copy of statement 'STMT'. + + +File: gccint.info, Node: Tuple specific accessors, Next: GIMPLE sequences, Prev: Manipulating GIMPLE statements, Up: GIMPLE + +11.7 Tuple specific accessors +============================= + +* Menu: + +* 'GIMPLE_ASM':: +* 'GIMPLE_ASSIGN':: +* 'GIMPLE_BIND':: +* 'GIMPLE_CALL':: +* 'GIMPLE_CATCH':: +* 'GIMPLE_COND':: +* 'GIMPLE_DEBUG':: +* 'GIMPLE_EH_FILTER':: +* 'GIMPLE_LABEL':: +* 'GIMPLE_NOP':: +* 'GIMPLE_OMP_ATOMIC_LOAD':: +* 'GIMPLE_OMP_ATOMIC_STORE':: +* 'GIMPLE_OMP_CONTINUE':: +* 'GIMPLE_OMP_CRITICAL':: +* 'GIMPLE_OMP_FOR':: +* 'GIMPLE_OMP_MASTER':: +* 'GIMPLE_OMP_ORDERED':: +* 'GIMPLE_OMP_PARALLEL':: +* 'GIMPLE_OMP_RETURN':: +* 'GIMPLE_OMP_SECTION':: +* 'GIMPLE_OMP_SECTIONS':: +* 'GIMPLE_OMP_SINGLE':: +* 'GIMPLE_PHI':: +* 'GIMPLE_RESX':: +* 'GIMPLE_RETURN':: +* 'GIMPLE_SWITCH':: +* 'GIMPLE_TRY':: +* 'GIMPLE_WITH_CLEANUP_EXPR':: + + +File: gccint.info, Node: 'GIMPLE_ASM', Next: 'GIMPLE_ASSIGN', Up: Tuple specific accessors + +11.7.1 'GIMPLE_ASM' +------------------- + + -- GIMPLE function: gimple gimple_build_asm (const char *string, + ninputs, noutputs, nclobbers, ...) + Build a 'GIMPLE_ASM' statement. This statement is used for + building in-line assembly constructs. 'STRING' is the assembly + code. 'NINPUT' is the number of register inputs. 'NOUTPUT' is the + number of register outputs. 'NCLOBBERS' is the number of clobbered + registers. The rest of the arguments trees for each input, output, + and clobbered registers. + + -- GIMPLE function: gimple gimple_build_asm_vec (const char *, + VEC(tree,gc) *, VEC(tree,gc) *, VEC(tree,gc) *) + Identical to gimple_build_asm, but the arguments are passed in + VECs. + + -- GIMPLE function: unsigned gimple_asm_ninputs (gimple g) + Return the number of input operands for 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: unsigned gimple_asm_noutputs (gimple g) + Return the number of output operands for 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: unsigned gimple_asm_nclobbers (gimple g) + Return the number of clobber operands for 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: tree gimple_asm_input_op (gimple g, unsigned index) + Return input operand 'INDEX' of 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: void gimple_asm_set_input_op (gimple g, unsigned + index, tree in_op) + Set 'IN_OP' to be input operand 'INDEX' in 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: tree gimple_asm_output_op (gimple g, unsigned + index) + Return output operand 'INDEX' of 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: void gimple_asm_set_output_op (gimple g, unsigned + index, tree out_op) + Set 'OUT_OP' to be output operand 'INDEX' in 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: tree gimple_asm_clobber_op (gimple g, unsigned + index) + Return clobber operand 'INDEX' of 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: void gimple_asm_set_clobber_op (gimple g, unsigned + index, tree clobber_op) + Set 'CLOBBER_OP' to be clobber operand 'INDEX' in 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: const char * gimple_asm_string (gimple g) + Return the string representing the assembly instruction in + 'GIMPLE_ASM' 'G'. + + -- GIMPLE function: bool gimple_asm_volatile_p (gimple g) + Return true if 'G' is an asm statement marked volatile. + + -- GIMPLE function: void gimple_asm_set_volatile (gimple g) + Mark asm statement 'G' as volatile. + + +File: gccint.info, Node: 'GIMPLE_ASSIGN', Next: 'GIMPLE_BIND', Prev: 'GIMPLE_ASM', Up: Tuple specific accessors + +11.7.2 'GIMPLE_ASSIGN' +---------------------- + + -- GIMPLE function: gimple gimple_build_assign (tree lhs, tree rhs) + Build a 'GIMPLE_ASSIGN' statement. The left-hand side is an lvalue + passed in lhs. The right-hand side can be either a unary or binary + tree expression. The expression tree rhs will be flattened and its + operands assigned to the corresponding operand slots in the new + statement. This function is useful when you already have a tree + expression that you want to convert into a tuple. However, try to + avoid building expression trees for the sole purpose of calling + this function. If you already have the operands in separate trees, + it is better to use 'gimple_build_assign_with_ops'. + + -- GIMPLE function: gimple gimplify_assign (tree dst, tree src, + gimple_seq *seq_p) + Build a new 'GIMPLE_ASSIGN' tuple and append it to the end of + '*SEQ_P'. + + 'DST'/'SRC' are the destination and source respectively. You can pass +ungimplified trees in 'DST' or 'SRC', in which case they will be +converted to a gimple operand if necessary. + + This function returns the newly created 'GIMPLE_ASSIGN' tuple. + + -- GIMPLE function: gimple gimple_build_assign_with_ops (enum tree_code + subcode, tree lhs, tree op1, tree op2) + This function is similar to 'gimple_build_assign', but is used to + build a 'GIMPLE_ASSIGN' statement when the operands of the + right-hand side of the assignment are already split into different + operands. + + The left-hand side is an lvalue passed in lhs. Subcode is the + 'tree_code' for the right-hand side of the assignment. Op1 and op2 + are the operands. If op2 is null, subcode must be a 'tree_code' + for a unary expression. + + -- GIMPLE function: enum tree_code gimple_assign_rhs_code (gimple g) + Return the code of the expression computed on the 'RHS' of + assignment statement 'G'. + + -- GIMPLE function: enum gimple_rhs_class gimple_assign_rhs_class + (gimple g) + Return the gimple rhs class of the code for the expression computed + on the rhs of assignment statement 'G'. This will never return + 'GIMPLE_INVALID_RHS'. + + -- GIMPLE function: tree gimple_assign_lhs (gimple g) + Return the 'LHS' of assignment statement 'G'. + + -- GIMPLE function: tree * gimple_assign_lhs_ptr (gimple g) + Return a pointer to the 'LHS' of assignment statement 'G'. + + -- GIMPLE function: tree gimple_assign_rhs1 (gimple g) + Return the first operand on the 'RHS' of assignment statement 'G'. + + -- GIMPLE function: tree * gimple_assign_rhs1_ptr (gimple g) + Return the address of the first operand on the 'RHS' of assignment + statement 'G'. + + -- GIMPLE function: tree gimple_assign_rhs2 (gimple g) + Return the second operand on the 'RHS' of assignment statement 'G'. + + -- GIMPLE function: tree * gimple_assign_rhs2_ptr (gimple g) + Return the address of the second operand on the 'RHS' of assignment + statement 'G'. + + -- GIMPLE function: tree gimple_assign_rhs3 (gimple g) + Return the third operand on the 'RHS' of assignment statement 'G'. + + -- GIMPLE function: tree * gimple_assign_rhs3_ptr (gimple g) + Return the address of the third operand on the 'RHS' of assignment + statement 'G'. + + -- GIMPLE function: void gimple_assign_set_lhs (gimple g, tree lhs) + Set 'LHS' to be the 'LHS' operand of assignment statement 'G'. + + -- GIMPLE function: void gimple_assign_set_rhs1 (gimple g, tree rhs) + Set 'RHS' to be the first operand on the 'RHS' of assignment + statement 'G'. + + -- GIMPLE function: void gimple_assign_set_rhs2 (gimple g, tree rhs) + Set 'RHS' to be the second operand on the 'RHS' of assignment + statement 'G'. + + -- GIMPLE function: void gimple_assign_set_rhs3 (gimple g, tree rhs) + Set 'RHS' to be the third operand on the 'RHS' of assignment + statement 'G'. + + -- GIMPLE function: bool gimple_assign_cast_p (gimple s) + Return true if 'S' is a type-cast assignment. + + +File: gccint.info, Node: 'GIMPLE_BIND', Next: 'GIMPLE_CALL', Prev: 'GIMPLE_ASSIGN', Up: Tuple specific accessors + +11.7.3 'GIMPLE_BIND' +-------------------- + + -- GIMPLE function: gimple gimple_build_bind (tree vars, gimple_seq + body) + Build a 'GIMPLE_BIND' statement with a list of variables in 'VARS' + and a body of statements in sequence 'BODY'. + + -- GIMPLE function: tree gimple_bind_vars (gimple g) + Return the variables declared in the 'GIMPLE_BIND' statement 'G'. + + -- GIMPLE function: void gimple_bind_set_vars (gimple g, tree vars) + Set 'VARS' to be the set of variables declared in the 'GIMPLE_BIND' + statement 'G'. + + -- GIMPLE function: void gimple_bind_append_vars (gimple g, tree vars) + Append 'VARS' to the set of variables declared in the 'GIMPLE_BIND' + statement 'G'. + + -- GIMPLE function: gimple_seq gimple_bind_body (gimple g) + Return the GIMPLE sequence contained in the 'GIMPLE_BIND' statement + 'G'. + + -- GIMPLE function: void gimple_bind_set_body (gimple g, gimple_seq + seq) + Set 'SEQ' to be sequence contained in the 'GIMPLE_BIND' statement + 'G'. + + -- GIMPLE function: void gimple_bind_add_stmt (gimple gs, gimple stmt) + Append a statement to the end of a 'GIMPLE_BIND''s body. + + -- GIMPLE function: void gimple_bind_add_seq (gimple gs, gimple_seq + seq) + Append a sequence of statements to the end of a 'GIMPLE_BIND''s + body. + + -- GIMPLE function: tree gimple_bind_block (gimple g) + Return the 'TREE_BLOCK' node associated with 'GIMPLE_BIND' + statement 'G'. This is analogous to the 'BIND_EXPR_BLOCK' field in + trees. + + -- GIMPLE function: void gimple_bind_set_block (gimple g, tree block) + Set 'BLOCK' to be the 'TREE_BLOCK' node associated with + 'GIMPLE_BIND' statement 'G'. + + +File: gccint.info, Node: 'GIMPLE_CALL', Next: 'GIMPLE_CATCH', Prev: 'GIMPLE_BIND', Up: Tuple specific accessors + +11.7.4 'GIMPLE_CALL' +-------------------- + + -- GIMPLE function: gimple gimple_build_call (tree fn, unsigned nargs, + ...) + Build a 'GIMPLE_CALL' statement to function 'FN'. The argument + 'FN' must be either a 'FUNCTION_DECL' or a gimple call address as + determined by 'is_gimple_call_addr'. 'NARGS' are the number of + arguments. The rest of the arguments follow the argument 'NARGS', + and must be trees that are valid as rvalues in gimple (i.e., each + operand is validated with 'is_gimple_operand'). + + -- GIMPLE function: gimple gimple_build_call_from_tree (tree call_expr) + Build a 'GIMPLE_CALL' from a 'CALL_EXPR' node. The arguments and + the function are taken from the expression directly. This routine + assumes that 'call_expr' is already in GIMPLE form. That is, its + operands are GIMPLE values and the function call needs no further + simplification. All the call flags in 'call_expr' are copied over + to the new 'GIMPLE_CALL'. + + -- GIMPLE function: gimple gimple_build_call_vec (tree fn, 'VEC'(tree, + heap) *args) + Identical to 'gimple_build_call' but the arguments are stored in a + 'VEC'(). + + -- GIMPLE function: tree gimple_call_lhs (gimple g) + Return the 'LHS' of call statement 'G'. + + -- GIMPLE function: tree * gimple_call_lhs_ptr (gimple g) + Return a pointer to the 'LHS' of call statement 'G'. + + -- GIMPLE function: void gimple_call_set_lhs (gimple g, tree lhs) + Set 'LHS' to be the 'LHS' operand of call statement 'G'. + + -- GIMPLE function: tree gimple_call_fn (gimple g) + Return the tree node representing the function called by call + statement 'G'. + + -- GIMPLE function: void gimple_call_set_fn (gimple g, tree fn) + Set 'FN' to be the function called by call statement 'G'. This has + to be a gimple value specifying the address of the called function. + + -- GIMPLE function: tree gimple_call_fndecl (gimple g) + If a given 'GIMPLE_CALL''s callee is a 'FUNCTION_DECL', return it. + Otherwise return 'NULL'. This function is analogous to + 'get_callee_fndecl' in 'GENERIC'. + + -- GIMPLE function: tree gimple_call_set_fndecl (gimple g, tree fndecl) + Set the called function to 'FNDECL'. + + -- GIMPLE function: tree gimple_call_return_type (gimple g) + Return the type returned by call statement 'G'. + + -- GIMPLE function: tree gimple_call_chain (gimple g) + Return the static chain for call statement 'G'. + + -- GIMPLE function: void gimple_call_set_chain (gimple g, tree chain) + Set 'CHAIN' to be the static chain for call statement 'G'. + + -- GIMPLE function: unsigned gimple_call_num_args (gimple g) + Return the number of arguments used by call statement 'G'. + + -- GIMPLE function: tree gimple_call_arg (gimple g, unsigned index) + Return the argument at position 'INDEX' for call statement 'G'. + The first argument is 0. + + -- GIMPLE function: tree * gimple_call_arg_ptr (gimple g, unsigned + index) + Return a pointer to the argument at position 'INDEX' for call + statement 'G'. + + -- GIMPLE function: void gimple_call_set_arg (gimple g, unsigned index, + tree arg) + Set 'ARG' to be the argument at position 'INDEX' for call statement + 'G'. + + -- GIMPLE function: void gimple_call_set_tail (gimple s) + Mark call statement 'S' as being a tail call (i.e., a call just + before the exit of a function). These calls are candidate for tail + call optimization. + + -- GIMPLE function: bool gimple_call_tail_p (gimple s) + Return true if 'GIMPLE_CALL' 'S' is marked as a tail call. + + -- GIMPLE function: void gimple_call_mark_uninlinable (gimple s) + Mark 'GIMPLE_CALL' 'S' as being uninlinable. + + -- GIMPLE function: bool gimple_call_cannot_inline_p (gimple s) + Return true if 'GIMPLE_CALL' 'S' cannot be inlined. + + -- GIMPLE function: bool gimple_call_noreturn_p (gimple s) + Return true if 'S' is a noreturn call. + + -- GIMPLE function: gimple gimple_call_copy_skip_args (gimple stmt, + bitmap args_to_skip) + Build a 'GIMPLE_CALL' identical to 'STMT' but skipping the + arguments in the positions marked by the set 'ARGS_TO_SKIP'. + + +File: gccint.info, Node: 'GIMPLE_CATCH', Next: 'GIMPLE_COND', Prev: 'GIMPLE_CALL', Up: Tuple specific accessors + +11.7.5 'GIMPLE_CATCH' +--------------------- + + -- GIMPLE function: gimple gimple_build_catch (tree types, gimple_seq + handler) + Build a 'GIMPLE_CATCH' statement. 'TYPES' are the tree types this + catch handles. 'HANDLER' is a sequence of statements with the code + for the handler. + + -- GIMPLE function: tree gimple_catch_types (gimple g) + Return the types handled by 'GIMPLE_CATCH' statement 'G'. + + -- GIMPLE function: tree * gimple_catch_types_ptr (gimple g) + Return a pointer to the types handled by 'GIMPLE_CATCH' statement + 'G'. + + -- GIMPLE function: gimple_seq gimple_catch_handler (gimple g) + Return the GIMPLE sequence representing the body of the handler of + 'GIMPLE_CATCH' statement 'G'. + + -- GIMPLE function: void gimple_catch_set_types (gimple g, tree t) + Set 'T' to be the set of types handled by 'GIMPLE_CATCH' 'G'. + + -- GIMPLE function: void gimple_catch_set_handler (gimple g, gimple_seq + handler) + Set 'HANDLER' to be the body of 'GIMPLE_CATCH' 'G'. + + +File: gccint.info, Node: 'GIMPLE_COND', Next: 'GIMPLE_DEBUG', Prev: 'GIMPLE_CATCH', Up: Tuple specific accessors + +11.7.6 'GIMPLE_COND' +-------------------- + + -- GIMPLE function: gimple gimple_build_cond (enum tree_code pred_code, + tree lhs, tree rhs, tree t_label, tree f_label) + Build a 'GIMPLE_COND' statement. 'A' 'GIMPLE_COND' statement + compares 'LHS' and 'RHS' and if the condition in 'PRED_CODE' is + true, jump to the label in 't_label', otherwise jump to the label + in 'f_label'. 'PRED_CODE' are relational operator tree codes like + 'EQ_EXPR', 'LT_EXPR', 'LE_EXPR', 'NE_EXPR', etc. + + -- GIMPLE function: gimple gimple_build_cond_from_tree (tree cond, tree + t_label, tree f_label) + Build a 'GIMPLE_COND' statement from the conditional expression + tree 'COND'. 'T_LABEL' and 'F_LABEL' are as in + 'gimple_build_cond'. + + -- GIMPLE function: enum tree_code gimple_cond_code (gimple g) + Return the code of the predicate computed by conditional statement + 'G'. + + -- GIMPLE function: void gimple_cond_set_code (gimple g, enum tree_code + code) + Set 'CODE' to be the predicate code for the conditional statement + 'G'. + + -- GIMPLE function: tree gimple_cond_lhs (gimple g) + Return the 'LHS' of the predicate computed by conditional statement + 'G'. + + -- GIMPLE function: void gimple_cond_set_lhs (gimple g, tree lhs) + Set 'LHS' to be the 'LHS' operand of the predicate computed by + conditional statement 'G'. + + -- GIMPLE function: tree gimple_cond_rhs (gimple g) + Return the 'RHS' operand of the predicate computed by conditional + 'G'. + + -- GIMPLE function: void gimple_cond_set_rhs (gimple g, tree rhs) + Set 'RHS' to be the 'RHS' operand of the predicate computed by + conditional statement 'G'. + + -- GIMPLE function: tree gimple_cond_true_label (gimple g) + Return the label used by conditional statement 'G' when its + predicate evaluates to true. + + -- GIMPLE function: void gimple_cond_set_true_label (gimple g, tree + label) + Set 'LABEL' to be the label used by conditional statement 'G' when + its predicate evaluates to true. + + -- GIMPLE function: void gimple_cond_set_false_label (gimple g, tree + label) + Set 'LABEL' to be the label used by conditional statement 'G' when + its predicate evaluates to false. + + -- GIMPLE function: tree gimple_cond_false_label (gimple g) + Return the label used by conditional statement 'G' when its + predicate evaluates to false. + + -- GIMPLE function: void gimple_cond_make_false (gimple g) + Set the conditional 'COND_STMT' to be of the form 'if (1 == 0)'. + + -- GIMPLE function: void gimple_cond_make_true (gimple g) + Set the conditional 'COND_STMT' to be of the form 'if (1 == 1)'. + + +File: gccint.info, Node: 'GIMPLE_DEBUG', Next: 'GIMPLE_EH_FILTER', Prev: 'GIMPLE_COND', Up: Tuple specific accessors + +11.7.7 'GIMPLE_DEBUG' +--------------------- + + -- GIMPLE function: gimple gimple_build_debug_bind (tree var, tree + value, gimple stmt) + Build a 'GIMPLE_DEBUG' statement with 'GIMPLE_DEBUG_BIND' of + 'subcode'. The effect of this statement is to tell debug + information generation machinery that the value of user variable + 'var' is given by 'value' at that point, and to remain with that + value until 'var' runs out of scope, a dynamically-subsequent debug + bind statement overrides the binding, or conflicting values reach a + control flow merge point. Even if components of the 'value' + expression change afterwards, the variable is supposed to retain + the same value, though not necessarily the same location. + + It is expected that 'var' be most often a tree for automatic user + variables ('VAR_DECL' or 'PARM_DECL') that satisfy the requirements + for gimple registers, but it may also be a tree for a scalarized + component of a user variable ('ARRAY_REF', 'COMPONENT_REF'), or a + debug temporary ('DEBUG_EXPR_DECL'). + + As for 'value', it can be an arbitrary tree expression, but it is + recommended that it be in a suitable form for a gimple assignment + 'RHS'. It is not expected that user variables that could appear as + 'var' ever appear in 'value', because in the latter we'd have their + 'SSA_NAME's instead, but even if they were not in SSA form, user + variables appearing in 'value' are to be regarded as part of the + executable code space, whereas those in 'var' are to be regarded as + part of the source code space. There is no way to refer to the + value bound to a user variable within a 'value' expression. + + If 'value' is 'GIMPLE_DEBUG_BIND_NOVALUE', debug information + generation machinery is informed that the variable 'var' is + unbound, i.e., that its value is indeterminate, which sometimes + means it is really unavailable, and other times that the compiler + could not keep track of it. + + Block and location information for the newly-created stmt are taken + from 'stmt', if given. + + -- GIMPLE function: tree gimple_debug_bind_get_var (gimple stmt) + Return the user variable VAR that is bound at 'stmt'. + + -- GIMPLE function: tree gimple_debug_bind_get_value (gimple stmt) + Return the value expression that is bound to a user variable at + 'stmt'. + + -- GIMPLE function: tree * gimple_debug_bind_get_value_ptr (gimple + stmt) + Return a pointer to the value expression that is bound to a user + variable at 'stmt'. + + -- GIMPLE function: void gimple_debug_bind_set_var (gimple stmt, tree + var) + Modify the user variable bound at 'stmt' to VAR. + + -- GIMPLE function: void gimple_debug_bind_set_value (gimple stmt, tree + var) + Modify the value bound to the user variable bound at 'stmt' to + VALUE. + + -- GIMPLE function: void gimple_debug_bind_reset_value (gimple stmt) + Modify the value bound to the user variable bound at 'stmt' so that + the variable becomes unbound. + + -- GIMPLE function: bool gimple_debug_bind_has_value_p (gimple stmt) + Return 'TRUE' if 'stmt' binds a user variable to a value, and + 'FALSE' if it unbinds the variable. + + +File: gccint.info, Node: 'GIMPLE_EH_FILTER', Next: 'GIMPLE_LABEL', Prev: 'GIMPLE_DEBUG', Up: Tuple specific accessors + +11.7.8 'GIMPLE_EH_FILTER' +------------------------- + + -- GIMPLE function: gimple gimple_build_eh_filter (tree types, + gimple_seq failure) + Build a 'GIMPLE_EH_FILTER' statement. 'TYPES' are the filter's + types. 'FAILURE' is a sequence with the filter's failure action. + + -- GIMPLE function: tree gimple_eh_filter_types (gimple g) + Return the types handled by 'GIMPLE_EH_FILTER' statement 'G'. + + -- GIMPLE function: tree * gimple_eh_filter_types_ptr (gimple g) + Return a pointer to the types handled by 'GIMPLE_EH_FILTER' + statement 'G'. + + -- GIMPLE function: gimple_seq gimple_eh_filter_failure (gimple g) + Return the sequence of statement to execute when 'GIMPLE_EH_FILTER' + statement fails. + + -- GIMPLE function: void gimple_eh_filter_set_types (gimple g, tree + types) + Set 'TYPES' to be the set of types handled by 'GIMPLE_EH_FILTER' + 'G'. + + -- GIMPLE function: void gimple_eh_filter_set_failure (gimple g, + gimple_seq failure) + Set 'FAILURE' to be the sequence of statements to execute on + failure for 'GIMPLE_EH_FILTER' 'G'. + + -- GIMPLE function: bool gimple_eh_filter_must_not_throw (gimple g) + Return the 'EH_FILTER_MUST_NOT_THROW' flag. + + -- GIMPLE function: void gimple_eh_filter_set_must_not_throw (gimple g, + bool mntp) + Set the 'EH_FILTER_MUST_NOT_THROW' flag. + + +File: gccint.info, Node: 'GIMPLE_LABEL', Next: 'GIMPLE_NOP', Prev: 'GIMPLE_EH_FILTER', Up: Tuple specific accessors + +11.7.9 'GIMPLE_LABEL' +--------------------- + + -- GIMPLE function: gimple gimple_build_label (tree label) + Build a 'GIMPLE_LABEL' statement with corresponding to the tree + label, 'LABEL'. + + -- GIMPLE function: tree gimple_label_label (gimple g) + Return the 'LABEL_DECL' node used by 'GIMPLE_LABEL' statement 'G'. + + -- GIMPLE function: void gimple_label_set_label (gimple g, tree label) + Set 'LABEL' to be the 'LABEL_DECL' node used by 'GIMPLE_LABEL' + statement 'G'. + + -- GIMPLE function: gimple gimple_build_goto (tree dest) + Build a 'GIMPLE_GOTO' statement to label 'DEST'. + + -- GIMPLE function: tree gimple_goto_dest (gimple g) + Return the destination of the unconditional jump 'G'. + + -- GIMPLE function: void gimple_goto_set_dest (gimple g, tree dest) + Set 'DEST' to be the destination of the unconditional jump 'G'. + + +File: gccint.info, Node: 'GIMPLE_NOP', Next: 'GIMPLE_OMP_ATOMIC_LOAD', Prev: 'GIMPLE_LABEL', Up: Tuple specific accessors + +11.7.10 'GIMPLE_NOP' +-------------------- + + -- GIMPLE function: gimple gimple_build_nop (void) + Build a 'GIMPLE_NOP' statement. + + -- GIMPLE function: bool gimple_nop_p (gimple g) + Returns 'TRUE' if statement 'G' is a 'GIMPLE_NOP'. + + +File: gccint.info, Node: 'GIMPLE_OMP_ATOMIC_LOAD', Next: 'GIMPLE_OMP_ATOMIC_STORE', Prev: 'GIMPLE_NOP', Up: Tuple specific accessors + +11.7.11 'GIMPLE_OMP_ATOMIC_LOAD' +-------------------------------- + + -- GIMPLE function: gimple gimple_build_omp_atomic_load (tree lhs, tree + rhs) + Build a 'GIMPLE_OMP_ATOMIC_LOAD' statement. 'LHS' is the left-hand + side of the assignment. 'RHS' is the right-hand side of the + assignment. + + -- GIMPLE function: void gimple_omp_atomic_load_set_lhs (gimple g, tree + lhs) + Set the 'LHS' of an atomic load. + + -- GIMPLE function: tree gimple_omp_atomic_load_lhs (gimple g) + Get the 'LHS' of an atomic load. + + -- GIMPLE function: void gimple_omp_atomic_load_set_rhs (gimple g, tree + rhs) + Set the 'RHS' of an atomic set. + + -- GIMPLE function: tree gimple_omp_atomic_load_rhs (gimple g) + Get the 'RHS' of an atomic set. + + +File: gccint.info, Node: 'GIMPLE_OMP_ATOMIC_STORE', Next: 'GIMPLE_OMP_CONTINUE', Prev: 'GIMPLE_OMP_ATOMIC_LOAD', Up: Tuple specific accessors + +11.7.12 'GIMPLE_OMP_ATOMIC_STORE' +--------------------------------- + + -- GIMPLE function: gimple gimple_build_omp_atomic_store (tree val) + Build a 'GIMPLE_OMP_ATOMIC_STORE' statement. 'VAL' is the value to + be stored. + + -- GIMPLE function: void gimple_omp_atomic_store_set_val (gimple g, + tree val) + Set the value being stored in an atomic store. + + -- GIMPLE function: tree gimple_omp_atomic_store_val (gimple g) + Return the value being stored in an atomic store. + + +File: gccint.info, Node: 'GIMPLE_OMP_CONTINUE', Next: 'GIMPLE_OMP_CRITICAL', Prev: 'GIMPLE_OMP_ATOMIC_STORE', Up: Tuple specific accessors + +11.7.13 'GIMPLE_OMP_CONTINUE' +----------------------------- + + -- GIMPLE function: gimple gimple_build_omp_continue (tree control_def, + tree control_use) + Build a 'GIMPLE_OMP_CONTINUE' statement. 'CONTROL_DEF' is the + definition of the control variable. 'CONTROL_USE' is the use of + the control variable. + + -- GIMPLE function: tree gimple_omp_continue_control_def (gimple s) + Return the definition of the control variable on a + 'GIMPLE_OMP_CONTINUE' in 'S'. + + -- GIMPLE function: tree gimple_omp_continue_control_def_ptr (gimple s) + Same as above, but return the pointer. + + -- GIMPLE function: tree gimple_omp_continue_set_control_def (gimple s) + Set the control variable definition for a 'GIMPLE_OMP_CONTINUE' + statement in 'S'. + + -- GIMPLE function: tree gimple_omp_continue_control_use (gimple s) + Return the use of the control variable on a 'GIMPLE_OMP_CONTINUE' + in 'S'. + + -- GIMPLE function: tree gimple_omp_continue_control_use_ptr (gimple s) + Same as above, but return the pointer. + + -- GIMPLE function: tree gimple_omp_continue_set_control_use (gimple s) + Set the control variable use for a 'GIMPLE_OMP_CONTINUE' statement + in 'S'. + + +File: gccint.info, Node: 'GIMPLE_OMP_CRITICAL', Next: 'GIMPLE_OMP_FOR', Prev: 'GIMPLE_OMP_CONTINUE', Up: Tuple specific accessors + +11.7.14 'GIMPLE_OMP_CRITICAL' +----------------------------- + + -- GIMPLE function: gimple gimple_build_omp_critical (gimple_seq body, + tree name) + Build a 'GIMPLE_OMP_CRITICAL' statement. 'BODY' is the sequence of + statements for which only one thread can execute. 'NAME' is an + optional identifier for this critical block. + + -- GIMPLE function: tree gimple_omp_critical_name (gimple g) + Return the name associated with 'OMP_CRITICAL' statement 'G'. + + -- GIMPLE function: tree * gimple_omp_critical_name_ptr (gimple g) + Return a pointer to the name associated with 'OMP' critical + statement 'G'. + + -- GIMPLE function: void gimple_omp_critical_set_name (gimple g, tree + name) + Set 'NAME' to be the name associated with 'OMP' critical statement + 'G'. + + +File: gccint.info, Node: 'GIMPLE_OMP_FOR', Next: 'GIMPLE_OMP_MASTER', Prev: 'GIMPLE_OMP_CRITICAL', Up: Tuple specific accessors + +11.7.15 'GIMPLE_OMP_FOR' +------------------------ + + -- GIMPLE function: gimple gimple_build_omp_for (gimple_seq body, tree + clauses, tree index, tree initial, tree final, tree incr, + gimple_seq pre_body, enum tree_code omp_for_cond) + Build a 'GIMPLE_OMP_FOR' statement. 'BODY' is sequence of + statements inside the for loop. 'CLAUSES', are any of the 'OMP' + loop construct's clauses: private, firstprivate, lastprivate, + reductions, ordered, schedule, and nowait. 'PRE_BODY' is the + sequence of statements that are loop invariant. 'INDEX' is the + index variable. 'INITIAL' is the initial value of 'INDEX'. + 'FINAL' is final value of 'INDEX'. OMP_FOR_COND is the predicate + used to compare 'INDEX' and 'FINAL'. 'INCR' is the increment + expression. + + -- GIMPLE function: tree gimple_omp_for_clauses (gimple g) + Return the clauses associated with 'OMP_FOR' 'G'. + + -- GIMPLE function: tree * gimple_omp_for_clauses_ptr (gimple g) + Return a pointer to the 'OMP_FOR' 'G'. + + -- GIMPLE function: void gimple_omp_for_set_clauses (gimple g, tree + clauses) + Set 'CLAUSES' to be the list of clauses associated with 'OMP_FOR' + 'G'. + + -- GIMPLE function: tree gimple_omp_for_index (gimple g) + Return the index variable for 'OMP_FOR' 'G'. + + -- GIMPLE function: tree * gimple_omp_for_index_ptr (gimple g) + Return a pointer to the index variable for 'OMP_FOR' 'G'. + + -- GIMPLE function: void gimple_omp_for_set_index (gimple g, tree + index) + Set 'INDEX' to be the index variable for 'OMP_FOR' 'G'. + + -- GIMPLE function: tree gimple_omp_for_initial (gimple g) + Return the initial value for 'OMP_FOR' 'G'. + + -- GIMPLE function: tree * gimple_omp_for_initial_ptr (gimple g) + Return a pointer to the initial value for 'OMP_FOR' 'G'. + + -- GIMPLE function: void gimple_omp_for_set_initial (gimple g, tree + initial) + Set 'INITIAL' to be the initial value for 'OMP_FOR' 'G'. + + -- GIMPLE function: tree gimple_omp_for_final (gimple g) + Return the final value for 'OMP_FOR' 'G'. + + -- GIMPLE function: tree * gimple_omp_for_final_ptr (gimple g) + turn a pointer to the final value for 'OMP_FOR' 'G'. + + -- GIMPLE function: void gimple_omp_for_set_final (gimple g, tree + final) + Set 'FINAL' to be the final value for 'OMP_FOR' 'G'. + + -- GIMPLE function: tree gimple_omp_for_incr (gimple g) + Return the increment value for 'OMP_FOR' 'G'. + + -- GIMPLE function: tree * gimple_omp_for_incr_ptr (gimple g) + Return a pointer to the increment value for 'OMP_FOR' 'G'. + + -- GIMPLE function: void gimple_omp_for_set_incr (gimple g, tree incr) + Set 'INCR' to be the increment value for 'OMP_FOR' 'G'. + + -- GIMPLE function: gimple_seq gimple_omp_for_pre_body (gimple g) + Return the sequence of statements to execute before the 'OMP_FOR' + statement 'G' starts. + + -- GIMPLE function: void gimple_omp_for_set_pre_body (gimple g, + gimple_seq pre_body) + Set 'PRE_BODY' to be the sequence of statements to execute before + the 'OMP_FOR' statement 'G' starts. + + -- GIMPLE function: void gimple_omp_for_set_cond (gimple g, enum + tree_code cond) + Set 'COND' to be the condition code for 'OMP_FOR' 'G'. + + -- GIMPLE function: enum tree_code gimple_omp_for_cond (gimple g) + Return the condition code associated with 'OMP_FOR' 'G'. + + +File: gccint.info, Node: 'GIMPLE_OMP_MASTER', Next: 'GIMPLE_OMP_ORDERED', Prev: 'GIMPLE_OMP_FOR', Up: Tuple specific accessors + +11.7.16 'GIMPLE_OMP_MASTER' +--------------------------- + + -- GIMPLE function: gimple gimple_build_omp_master (gimple_seq body) + Build a 'GIMPLE_OMP_MASTER' statement. 'BODY' is the sequence of + statements to be executed by just the master. + + +File: gccint.info, Node: 'GIMPLE_OMP_ORDERED', Next: 'GIMPLE_OMP_PARALLEL', Prev: 'GIMPLE_OMP_MASTER', Up: Tuple specific accessors + +11.7.17 'GIMPLE_OMP_ORDERED' +---------------------------- + + -- GIMPLE function: gimple gimple_build_omp_ordered (gimple_seq body) + Build a 'GIMPLE_OMP_ORDERED' statement. + + 'BODY' is the sequence of statements inside a loop that will executed +in sequence. + + +File: gccint.info, Node: 'GIMPLE_OMP_PARALLEL', Next: 'GIMPLE_OMP_RETURN', Prev: 'GIMPLE_OMP_ORDERED', Up: Tuple specific accessors + +11.7.18 'GIMPLE_OMP_PARALLEL' +----------------------------- + + -- GIMPLE function: gimple gimple_build_omp_parallel (gimple_seq body, + tree clauses, tree child_fn, tree data_arg) + Build a 'GIMPLE_OMP_PARALLEL' statement. + + 'BODY' is sequence of statements which are executed in parallel. +'CLAUSES', are the 'OMP' parallel construct's clauses. 'CHILD_FN' is +the function created for the parallel threads to execute. 'DATA_ARG' +are the shared data argument(s). + + -- GIMPLE function: bool gimple_omp_parallel_combined_p (gimple g) + Return true if 'OMP' parallel statement 'G' has the + 'GF_OMP_PARALLEL_COMBINED' flag set. + + -- GIMPLE function: void gimple_omp_parallel_set_combined_p (gimple g) + Set the 'GF_OMP_PARALLEL_COMBINED' field in 'OMP' parallel + statement 'G'. + + -- GIMPLE function: gimple_seq gimple_omp_body (gimple g) + Return the body for the 'OMP' statement 'G'. + + -- GIMPLE function: void gimple_omp_set_body (gimple g, gimple_seq + body) + Set 'BODY' to be the body for the 'OMP' statement 'G'. + + -- GIMPLE function: tree gimple_omp_parallel_clauses (gimple g) + Return the clauses associated with 'OMP_PARALLEL' 'G'. + + -- GIMPLE function: tree * gimple_omp_parallel_clauses_ptr (gimple g) + Return a pointer to the clauses associated with 'OMP_PARALLEL' 'G'. + + -- GIMPLE function: void gimple_omp_parallel_set_clauses (gimple g, + tree clauses) + Set 'CLAUSES' to be the list of clauses associated with + 'OMP_PARALLEL' 'G'. + + -- GIMPLE function: tree gimple_omp_parallel_child_fn (gimple g) + Return the child function used to hold the body of 'OMP_PARALLEL' + 'G'. + + -- GIMPLE function: tree * gimple_omp_parallel_child_fn_ptr (gimple g) + Return a pointer to the child function used to hold the body of + 'OMP_PARALLEL' 'G'. + + -- GIMPLE function: void gimple_omp_parallel_set_child_fn (gimple g, + tree child_fn) + Set 'CHILD_FN' to be the child function for 'OMP_PARALLEL' 'G'. + + -- GIMPLE function: tree gimple_omp_parallel_data_arg (gimple g) + Return the artificial argument used to send variables and values + from the parent to the children threads in 'OMP_PARALLEL' 'G'. + + -- GIMPLE function: tree * gimple_omp_parallel_data_arg_ptr (gimple g) + Return a pointer to the data argument for 'OMP_PARALLEL' 'G'. + + -- GIMPLE function: void gimple_omp_parallel_set_data_arg (gimple g, + tree data_arg) + Set 'DATA_ARG' to be the data argument for 'OMP_PARALLEL' 'G'. + + +File: gccint.info, Node: 'GIMPLE_OMP_RETURN', Next: 'GIMPLE_OMP_SECTION', Prev: 'GIMPLE_OMP_PARALLEL', Up: Tuple specific accessors + +11.7.19 'GIMPLE_OMP_RETURN' +--------------------------- + + -- GIMPLE function: gimple gimple_build_omp_return (bool wait_p) + Build a 'GIMPLE_OMP_RETURN' statement. 'WAIT_P' is true if this is + a non-waiting return. + + -- GIMPLE function: void gimple_omp_return_set_nowait (gimple s) + Set the nowait flag on 'GIMPLE_OMP_RETURN' statement 'S'. + + -- GIMPLE function: bool gimple_omp_return_nowait_p (gimple g) + Return true if 'OMP' return statement 'G' has the + 'GF_OMP_RETURN_NOWAIT' flag set. + + +File: gccint.info, Node: 'GIMPLE_OMP_SECTION', Next: 'GIMPLE_OMP_SECTIONS', Prev: 'GIMPLE_OMP_RETURN', Up: Tuple specific accessors + +11.7.20 'GIMPLE_OMP_SECTION' +---------------------------- + + -- GIMPLE function: gimple gimple_build_omp_section (gimple_seq body) + Build a 'GIMPLE_OMP_SECTION' statement for a sections statement. + + 'BODY' is the sequence of statements in the section. + + -- GIMPLE function: bool gimple_omp_section_last_p (gimple g) + Return true if 'OMP' section statement 'G' has the + 'GF_OMP_SECTION_LAST' flag set. + + -- GIMPLE function: void gimple_omp_section_set_last (gimple g) + Set the 'GF_OMP_SECTION_LAST' flag on 'G'. + + +File: gccint.info, Node: 'GIMPLE_OMP_SECTIONS', Next: 'GIMPLE_OMP_SINGLE', Prev: 'GIMPLE_OMP_SECTION', Up: Tuple specific accessors + +11.7.21 'GIMPLE_OMP_SECTIONS' +----------------------------- + + -- GIMPLE function: gimple gimple_build_omp_sections (gimple_seq body, + tree clauses) + Build a 'GIMPLE_OMP_SECTIONS' statement. 'BODY' is a sequence of + section statements. 'CLAUSES' are any of the 'OMP' sections + construct's clauses: private, firstprivate, lastprivate, reduction, + and nowait. + + -- GIMPLE function: gimple gimple_build_omp_sections_switch (void) + Build a 'GIMPLE_OMP_SECTIONS_SWITCH' statement. + + -- GIMPLE function: tree gimple_omp_sections_control (gimple g) + Return the control variable associated with the + 'GIMPLE_OMP_SECTIONS' in 'G'. + + -- GIMPLE function: tree * gimple_omp_sections_control_ptr (gimple g) + Return a pointer to the clauses associated with the + 'GIMPLE_OMP_SECTIONS' in 'G'. + + -- GIMPLE function: void gimple_omp_sections_set_control (gimple g, + tree control) + Set 'CONTROL' to be the set of clauses associated with the + 'GIMPLE_OMP_SECTIONS' in 'G'. + + -- GIMPLE function: tree gimple_omp_sections_clauses (gimple g) + Return the clauses associated with 'OMP_SECTIONS' 'G'. + + -- GIMPLE function: tree * gimple_omp_sections_clauses_ptr (gimple g) + Return a pointer to the clauses associated with 'OMP_SECTIONS' 'G'. + + -- GIMPLE function: void gimple_omp_sections_set_clauses (gimple g, + tree clauses) + Set 'CLAUSES' to be the set of clauses associated with + 'OMP_SECTIONS' 'G'. + + +File: gccint.info, Node: 'GIMPLE_OMP_SINGLE', Next: 'GIMPLE_PHI', Prev: 'GIMPLE_OMP_SECTIONS', Up: Tuple specific accessors + +11.7.22 'GIMPLE_OMP_SINGLE' +--------------------------- + + -- GIMPLE function: gimple gimple_build_omp_single (gimple_seq body, + tree clauses) + Build a 'GIMPLE_OMP_SINGLE' statement. 'BODY' is the sequence of + statements that will be executed once. 'CLAUSES' are any of the + 'OMP' single construct's clauses: private, firstprivate, + copyprivate, nowait. + + -- GIMPLE function: tree gimple_omp_single_clauses (gimple g) + Return the clauses associated with 'OMP_SINGLE' 'G'. + + -- GIMPLE function: tree * gimple_omp_single_clauses_ptr (gimple g) + Return a pointer to the clauses associated with 'OMP_SINGLE' 'G'. + + -- GIMPLE function: void gimple_omp_single_set_clauses (gimple g, tree + clauses) + Set 'CLAUSES' to be the clauses associated with 'OMP_SINGLE' 'G'. + + +File: gccint.info, Node: 'GIMPLE_PHI', Next: 'GIMPLE_RESX', Prev: 'GIMPLE_OMP_SINGLE', Up: Tuple specific accessors + +11.7.23 'GIMPLE_PHI' +-------------------- + + -- GIMPLE function: unsigned gimple_phi_capacity (gimple g) + Return the maximum number of arguments supported by 'GIMPLE_PHI' + 'G'. + + -- GIMPLE function: unsigned gimple_phi_num_args (gimple g) + Return the number of arguments in 'GIMPLE_PHI' 'G'. This must + always be exactly the number of incoming edges for the basic block + holding 'G'. + + -- GIMPLE function: tree gimple_phi_result (gimple g) + Return the 'SSA' name created by 'GIMPLE_PHI' 'G'. + + -- GIMPLE function: tree * gimple_phi_result_ptr (gimple g) + Return a pointer to the 'SSA' name created by 'GIMPLE_PHI' 'G'. + + -- GIMPLE function: void gimple_phi_set_result (gimple g, tree result) + Set 'RESULT' to be the 'SSA' name created by 'GIMPLE_PHI' 'G'. + + -- GIMPLE function: struct phi_arg_d * gimple_phi_arg (gimple g, index) + Return the 'PHI' argument corresponding to incoming edge 'INDEX' + for 'GIMPLE_PHI' 'G'. + + -- GIMPLE function: void gimple_phi_set_arg (gimple g, index, struct + phi_arg_d * phiarg) + Set 'PHIARG' to be the argument corresponding to incoming edge + 'INDEX' for 'GIMPLE_PHI' 'G'. + + +File: gccint.info, Node: 'GIMPLE_RESX', Next: 'GIMPLE_RETURN', Prev: 'GIMPLE_PHI', Up: Tuple specific accessors + +11.7.24 'GIMPLE_RESX' +--------------------- + + -- GIMPLE function: gimple gimple_build_resx (int region) + Build a 'GIMPLE_RESX' statement which is a statement. This + statement is a placeholder for _Unwind_Resume before we know if a + function call or a branch is needed. 'REGION' is the exception + region from which control is flowing. + + -- GIMPLE function: int gimple_resx_region (gimple g) + Return the region number for 'GIMPLE_RESX' 'G'. + + -- GIMPLE function: void gimple_resx_set_region (gimple g, int region) + Set 'REGION' to be the region number for 'GIMPLE_RESX' 'G'. + + +File: gccint.info, Node: 'GIMPLE_RETURN', Next: 'GIMPLE_SWITCH', Prev: 'GIMPLE_RESX', Up: Tuple specific accessors + +11.7.25 'GIMPLE_RETURN' +----------------------- + + -- GIMPLE function: gimple gimple_build_return (tree retval) + Build a 'GIMPLE_RETURN' statement whose return value is retval. + + -- GIMPLE function: tree gimple_return_retval (gimple g) + Return the return value for 'GIMPLE_RETURN' 'G'. + + -- GIMPLE function: void gimple_return_set_retval (gimple g, tree + retval) + Set 'RETVAL' to be the return value for 'GIMPLE_RETURN' 'G'. + + +File: gccint.info, Node: 'GIMPLE_SWITCH', Next: 'GIMPLE_TRY', Prev: 'GIMPLE_RETURN', Up: Tuple specific accessors + +11.7.26 'GIMPLE_SWITCH' +----------------------- + + -- GIMPLE function: gimple gimple_build_switch (tree index, tree + default_label, 'VEC'(tree,heap) *args) + Build a 'GIMPLE_SWITCH' statement. 'INDEX' is the index variable + to switch on, and 'DEFAULT_LABEL' represents the default label. + 'ARGS' is a vector of 'CASE_LABEL_EXPR' trees that contain the + non-default case labels. Each label is a tree of code + 'CASE_LABEL_EXPR'. + + -- GIMPLE function: unsigned gimple_switch_num_labels (gimple g) + Return the number of labels associated with the switch statement + 'G'. + + -- GIMPLE function: void gimple_switch_set_num_labels (gimple g, + unsigned nlabels) + Set 'NLABELS' to be the number of labels for the switch statement + 'G'. + + -- GIMPLE function: tree gimple_switch_index (gimple g) + Return the index variable used by the switch statement 'G'. + + -- GIMPLE function: void gimple_switch_set_index (gimple g, tree index) + Set 'INDEX' to be the index variable for switch statement 'G'. + + -- GIMPLE function: tree gimple_switch_label (gimple g, unsigned index) + Return the label numbered 'INDEX'. The default label is 0, + followed by any labels in a switch statement. + + -- GIMPLE function: void gimple_switch_set_label (gimple g, unsigned + index, tree label) + Set the label number 'INDEX' to 'LABEL'. 0 is always the default + label. + + -- GIMPLE function: tree gimple_switch_default_label (gimple g) + Return the default label for a switch statement. + + -- GIMPLE function: void gimple_switch_set_default_label (gimple g, + tree label) + Set the default label for a switch statement. + + +File: gccint.info, Node: 'GIMPLE_TRY', Next: 'GIMPLE_WITH_CLEANUP_EXPR', Prev: 'GIMPLE_SWITCH', Up: Tuple specific accessors + +11.7.27 'GIMPLE_TRY' +-------------------- + + -- GIMPLE function: gimple gimple_build_try (gimple_seq eval, + gimple_seq cleanup, unsigned int kind) + Build a 'GIMPLE_TRY' statement. 'EVAL' is a sequence with the + expression to evaluate. 'CLEANUP' is a sequence of statements to + run at clean-up time. 'KIND' is the enumeration value + 'GIMPLE_TRY_CATCH' if this statement denotes a try/catch construct + or 'GIMPLE_TRY_FINALLY' if this statement denotes a try/finally + construct. + + -- GIMPLE function: enum gimple_try_flags gimple_try_kind (gimple g) + Return the kind of try block represented by 'GIMPLE_TRY' 'G'. This + is either 'GIMPLE_TRY_CATCH' or 'GIMPLE_TRY_FINALLY'. + + -- GIMPLE function: bool gimple_try_catch_is_cleanup (gimple g) + Return the 'GIMPLE_TRY_CATCH_IS_CLEANUP' flag. + + -- GIMPLE function: gimple_seq gimple_try_eval (gimple g) + Return the sequence of statements used as the body for 'GIMPLE_TRY' + 'G'. + + -- GIMPLE function: gimple_seq gimple_try_cleanup (gimple g) + Return the sequence of statements used as the cleanup body for + 'GIMPLE_TRY' 'G'. + + -- GIMPLE function: void gimple_try_set_catch_is_cleanup (gimple g, + bool catch_is_cleanup) + Set the 'GIMPLE_TRY_CATCH_IS_CLEANUP' flag. + + -- GIMPLE function: void gimple_try_set_eval (gimple g, gimple_seq + eval) + Set 'EVAL' to be the sequence of statements to use as the body for + 'GIMPLE_TRY' 'G'. + + -- GIMPLE function: void gimple_try_set_cleanup (gimple g, gimple_seq + cleanup) + Set 'CLEANUP' to be the sequence of statements to use as the + cleanup body for 'GIMPLE_TRY' 'G'. + + +File: gccint.info, Node: 'GIMPLE_WITH_CLEANUP_EXPR', Prev: 'GIMPLE_TRY', Up: Tuple specific accessors + +11.7.28 'GIMPLE_WITH_CLEANUP_EXPR' +---------------------------------- + + -- GIMPLE function: gimple gimple_build_wce (gimple_seq cleanup) + Build a 'GIMPLE_WITH_CLEANUP_EXPR' statement. 'CLEANUP' is the + clean-up expression. + + -- GIMPLE function: gimple_seq gimple_wce_cleanup (gimple g) + Return the cleanup sequence for cleanup statement 'G'. + + -- GIMPLE function: void gimple_wce_set_cleanup (gimple g, gimple_seq + cleanup) + Set 'CLEANUP' to be the cleanup sequence for 'G'. + + -- GIMPLE function: bool gimple_wce_cleanup_eh_only (gimple g) + Return the 'CLEANUP_EH_ONLY' flag for a 'WCE' tuple. + + -- GIMPLE function: void gimple_wce_set_cleanup_eh_only (gimple g, bool + eh_only_p) + Set the 'CLEANUP_EH_ONLY' flag for a 'WCE' tuple. + + +File: gccint.info, Node: GIMPLE sequences, Next: Sequence iterators, Prev: Tuple specific accessors, Up: GIMPLE + +11.8 GIMPLE sequences +===================== + +GIMPLE sequences are the tuple equivalent of 'STATEMENT_LIST''s used in +'GENERIC'. They are used to chain statements together, and when used in +conjunction with sequence iterators, provide a framework for iterating +through statements. + + GIMPLE sequences are of type struct 'gimple_sequence', but are more +commonly passed by reference to functions dealing with sequences. The +type for a sequence pointer is 'gimple_seq' which is the same as struct +'gimple_sequence' *. When declaring a local sequence, you can define a +local variable of type struct 'gimple_sequence'. When declaring a +sequence allocated on the garbage collected heap, use the function +'gimple_seq_alloc' documented below. + + There are convenience functions for iterating through sequences in the +section entitled Sequence Iterators. + + Below is a list of functions to manipulate and query sequences. + + -- GIMPLE function: void gimple_seq_add_stmt (gimple_seq *seq, gimple + g) + Link a gimple statement to the end of the sequence *'SEQ' if 'G' is + not 'NULL'. If *'SEQ' is 'NULL', allocate a sequence before + linking. + + -- GIMPLE function: void gimple_seq_add_seq (gimple_seq *dest, + gimple_seq src) + Append sequence 'SRC' to the end of sequence *'DEST' if 'SRC' is + not 'NULL'. If *'DEST' is 'NULL', allocate a new sequence before + appending. + + -- GIMPLE function: gimple_seq gimple_seq_deep_copy (gimple_seq src) + Perform a deep copy of sequence 'SRC' and return the result. + + -- GIMPLE function: gimple_seq gimple_seq_reverse (gimple_seq seq) + Reverse the order of the statements in the sequence 'SEQ'. Return + 'SEQ'. + + -- GIMPLE function: gimple gimple_seq_first (gimple_seq s) + Return the first statement in sequence 'S'. + + -- GIMPLE function: gimple gimple_seq_last (gimple_seq s) + Return the last statement in sequence 'S'. + + -- GIMPLE function: void gimple_seq_set_last (gimple_seq s, gimple + last) + Set the last statement in sequence 'S' to the statement in 'LAST'. + + -- GIMPLE function: void gimple_seq_set_first (gimple_seq s, gimple + first) + Set the first statement in sequence 'S' to the statement in + 'FIRST'. + + -- GIMPLE function: void gimple_seq_init (gimple_seq s) + Initialize sequence 'S' to an empty sequence. + + -- GIMPLE function: gimple_seq gimple_seq_alloc (void) + Allocate a new sequence in the garbage collected store and return + it. + + -- GIMPLE function: void gimple_seq_copy (gimple_seq dest, gimple_seq + src) + Copy the sequence 'SRC' into the sequence 'DEST'. + + -- GIMPLE function: bool gimple_seq_empty_p (gimple_seq s) + Return true if the sequence 'S' is empty. + + -- GIMPLE function: gimple_seq bb_seq (basic_block bb) + Returns the sequence of statements in 'BB'. + + -- GIMPLE function: void set_bb_seq (basic_block bb, gimple_seq seq) + Sets the sequence of statements in 'BB' to 'SEQ'. + + -- GIMPLE function: bool gimple_seq_singleton_p (gimple_seq seq) + Determine whether 'SEQ' contains exactly one statement. + + +File: gccint.info, Node: Sequence iterators, Next: Adding a new GIMPLE statement code, Prev: GIMPLE sequences, Up: GIMPLE + +11.9 Sequence iterators +======================= + +Sequence iterators are convenience constructs for iterating through +statements in a sequence. Given a sequence 'SEQ', here is a typical use +of gimple sequence iterators: + + gimple_stmt_iterator gsi; + + for (gsi = gsi_start (seq); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple g = gsi_stmt (gsi); + /* Do something with gimple statement G. */ + } + + Backward iterations are possible: + + for (gsi = gsi_last (seq); !gsi_end_p (gsi); gsi_prev (&gsi)) + + Forward and backward iterations on basic blocks are possible with +'gsi_start_bb' and 'gsi_last_bb'. + + In the documentation below we sometimes refer to enum +'gsi_iterator_update'. The valid options for this enumeration are: + + * 'GSI_NEW_STMT' Only valid when a single statement is added. Move + the iterator to it. + + * 'GSI_SAME_STMT' Leave the iterator at the same statement. + + * 'GSI_CONTINUE_LINKING' Move iterator to whatever position is + suitable for linking other statements in the same direction. + + Below is a list of the functions used to manipulate and use statement +iterators. + + -- GIMPLE function: gimple_stmt_iterator gsi_start (gimple_seq seq) + Return a new iterator pointing to the sequence 'SEQ''s first + statement. If 'SEQ' is empty, the iterator's basic block is + 'NULL'. Use 'gsi_start_bb' instead when the iterator needs to + always have the correct basic block set. + + -- GIMPLE function: gimple_stmt_iterator gsi_start_bb (basic_block bb) + Return a new iterator pointing to the first statement in basic + block 'BB'. + + -- GIMPLE function: gimple_stmt_iterator gsi_last (gimple_seq seq) + Return a new iterator initially pointing to the last statement of + sequence 'SEQ'. If 'SEQ' is empty, the iterator's basic block is + 'NULL'. Use 'gsi_last_bb' instead when the iterator needs to + always have the correct basic block set. + + -- GIMPLE function: gimple_stmt_iterator gsi_last_bb (basic_block bb) + Return a new iterator pointing to the last statement in basic block + 'BB'. + + -- GIMPLE function: bool gsi_end_p (gimple_stmt_iterator i) + Return 'TRUE' if at the end of 'I'. + + -- GIMPLE function: bool gsi_one_before_end_p (gimple_stmt_iterator i) + Return 'TRUE' if we're one statement before the end of 'I'. + + -- GIMPLE function: void gsi_next (gimple_stmt_iterator *i) + Advance the iterator to the next gimple statement. + + -- GIMPLE function: void gsi_prev (gimple_stmt_iterator *i) + Advance the iterator to the previous gimple statement. + + -- GIMPLE function: gimple gsi_stmt (gimple_stmt_iterator i) + Return the current stmt. + + -- GIMPLE function: gimple_stmt_iterator gsi_after_labels (basic_block + bb) + Return a block statement iterator that points to the first + non-label statement in block 'BB'. + + -- GIMPLE function: gimple * gsi_stmt_ptr (gimple_stmt_iterator *i) + Return a pointer to the current stmt. + + -- GIMPLE function: basic_block gsi_bb (gimple_stmt_iterator i) + Return the basic block associated with this iterator. + + -- GIMPLE function: gimple_seq gsi_seq (gimple_stmt_iterator i) + Return the sequence associated with this iterator. + + -- GIMPLE function: void gsi_remove (gimple_stmt_iterator *i, bool + remove_eh_info) + Remove the current stmt from the sequence. The iterator is updated + to point to the next statement. When 'REMOVE_EH_INFO' is true we + remove the statement pointed to by iterator 'I' from the 'EH' + tables. Otherwise we do not modify the 'EH' tables. Generally, + 'REMOVE_EH_INFO' should be true when the statement is going to be + removed from the 'IL' and not reinserted elsewhere. + + -- GIMPLE function: void gsi_link_seq_before (gimple_stmt_iterator *i, + gimple_seq seq, enum gsi_iterator_update mode) + Links the sequence of statements 'SEQ' before the statement pointed + by iterator 'I'. 'MODE' indicates what to do with the iterator + after insertion (see 'enum gsi_iterator_update' above). + + -- GIMPLE function: void gsi_link_before (gimple_stmt_iterator *i, + gimple g, enum gsi_iterator_update mode) + Links statement 'G' before the statement pointed-to by iterator + 'I'. Updates iterator 'I' according to 'MODE'. + + -- GIMPLE function: void gsi_link_seq_after (gimple_stmt_iterator *i, + gimple_seq seq, enum gsi_iterator_update mode) + Links sequence 'SEQ' after the statement pointed-to by iterator + 'I'. 'MODE' is as in 'gsi_insert_after'. + + -- GIMPLE function: void gsi_link_after (gimple_stmt_iterator *i, + gimple g, enum gsi_iterator_update mode) + Links statement 'G' after the statement pointed-to by iterator 'I'. + 'MODE' is as in 'gsi_insert_after'. + + -- GIMPLE function: gimple_seq gsi_split_seq_after + (gimple_stmt_iterator i) + Move all statements in the sequence after 'I' to a new sequence. + Return this new sequence. + + -- GIMPLE function: gimple_seq gsi_split_seq_before + (gimple_stmt_iterator *i) + Move all statements in the sequence before 'I' to a new sequence. + Return this new sequence. + + -- GIMPLE function: void gsi_replace (gimple_stmt_iterator *i, gimple + stmt, bool update_eh_info) + Replace the statement pointed-to by 'I' to 'STMT'. If + 'UPDATE_EH_INFO' is true, the exception handling information of the + original statement is moved to the new statement. + + -- GIMPLE function: void gsi_insert_before (gimple_stmt_iterator *i, + gimple stmt, enum gsi_iterator_update mode) + Insert statement 'STMT' before the statement pointed-to by iterator + 'I', update 'STMT''s basic block and scan it for new operands. + 'MODE' specifies how to update iterator 'I' after insertion (see + enum 'gsi_iterator_update'). + + -- GIMPLE function: void gsi_insert_seq_before (gimple_stmt_iterator + *i, gimple_seq seq, enum gsi_iterator_update mode) + Like 'gsi_insert_before', but for all the statements in 'SEQ'. + + -- GIMPLE function: void gsi_insert_after (gimple_stmt_iterator *i, + gimple stmt, enum gsi_iterator_update mode) + Insert statement 'STMT' after the statement pointed-to by iterator + 'I', update 'STMT''s basic block and scan it for new operands. + 'MODE' specifies how to update iterator 'I' after insertion (see + enum 'gsi_iterator_update'). + + -- GIMPLE function: void gsi_insert_seq_after (gimple_stmt_iterator *i, + gimple_seq seq, enum gsi_iterator_update mode) + Like 'gsi_insert_after', but for all the statements in 'SEQ'. + + -- GIMPLE function: gimple_stmt_iterator gsi_for_stmt (gimple stmt) + Finds iterator for 'STMT'. + + -- GIMPLE function: void gsi_move_after (gimple_stmt_iterator *from, + gimple_stmt_iterator *to) + Move the statement at 'FROM' so it comes right after the statement + at 'TO'. + + -- GIMPLE function: void gsi_move_before (gimple_stmt_iterator *from, + gimple_stmt_iterator *to) + Move the statement at 'FROM' so it comes right before the statement + at 'TO'. + + -- GIMPLE function: void gsi_move_to_bb_end (gimple_stmt_iterator + *from, basic_block bb) + Move the statement at 'FROM' to the end of basic block 'BB'. + + -- GIMPLE function: void gsi_insert_on_edge (edge e, gimple stmt) + Add 'STMT' to the pending list of edge 'E'. No actual insertion is + made until a call to 'gsi_commit_edge_inserts'() is made. + + -- GIMPLE function: void gsi_insert_seq_on_edge (edge e, gimple_seq + seq) + Add the sequence of statements in 'SEQ' to the pending list of edge + 'E'. No actual insertion is made until a call to + 'gsi_commit_edge_inserts'() is made. + + -- GIMPLE function: basic_block gsi_insert_on_edge_immediate (edge e, + gimple stmt) + Similar to 'gsi_insert_on_edge'+'gsi_commit_edge_inserts'. If a + new block has to be created, it is returned. + + -- GIMPLE function: void gsi_commit_one_edge_insert (edge e, + basic_block *new_bb) + Commit insertions pending at edge 'E'. If a new block is created, + set 'NEW_BB' to this block, otherwise set it to 'NULL'. + + -- GIMPLE function: void gsi_commit_edge_inserts (void) + This routine will commit all pending edge insertions, creating any + new basic blocks which are necessary. + + +File: gccint.info, Node: Adding a new GIMPLE statement code, Next: Statement and operand traversals, Prev: Sequence iterators, Up: GIMPLE + +11.10 Adding a new GIMPLE statement code +======================================== + +The first step in adding a new GIMPLE statement code, is modifying the +file 'gimple.def', which contains all the GIMPLE codes. Then you must +add a corresponding structure, and an entry in 'union +gimple_statement_d', both of which are located in 'gimple.h'. This in +turn, will require you to add a corresponding 'GTY' tag in +'gsstruct.def', and code to handle this tag in 'gss_for_code' which is +located in 'gimple.c'. + + In order for the garbage collector to know the size of the structure +you created in 'gimple.h', you need to add a case to handle your new +GIMPLE statement in 'gimple_size' which is located in 'gimple.c'. + + You will probably want to create a function to build the new gimple +statement in 'gimple.c'. The function should be called +'gimple_build_NEW-TUPLE-NAME', and should return the new tuple of type +gimple. + + If your new statement requires accessors for any members or operands it +may have, put simple inline accessors in 'gimple.h' and any non-trivial +accessors in 'gimple.c' with a corresponding prototype in 'gimple.h'. + + +File: gccint.info, Node: Statement and operand traversals, Prev: Adding a new GIMPLE statement code, Up: GIMPLE + +11.11 Statement and operand traversals +====================================== + +There are two functions available for walking statements and sequences: +'walk_gimple_stmt' and 'walk_gimple_seq', accordingly, and a third +function for walking the operands in a statement: 'walk_gimple_op'. + + -- GIMPLE function: tree walk_gimple_stmt (gimple_stmt_iterator *gsi, + walk_stmt_fn callback_stmt, walk_tree_fn callback_op, struct + walk_stmt_info *wi) + This function is used to walk the current statement in 'GSI', + optionally using traversal state stored in 'WI'. If 'WI' is + 'NULL', no state is kept during the traversal. + + The callback 'CALLBACK_STMT' is called. If 'CALLBACK_STMT' returns + true, it means that the callback function has handled all the + operands of the statement and it is not necessary to walk its + operands. + + If 'CALLBACK_STMT' is 'NULL' or it returns false, 'CALLBACK_OP' is + called on each operand of the statement via 'walk_gimple_op'. If + 'walk_gimple_op' returns non-'NULL' for any operand, the remaining + operands are not scanned. + + The return value is that returned by the last call to + 'walk_gimple_op', or 'NULL_TREE' if no 'CALLBACK_OP' is specified. + + -- GIMPLE function: tree walk_gimple_op (gimple stmt, walk_tree_fn + callback_op, struct walk_stmt_info *wi) + Use this function to walk the operands of statement 'STMT'. Every + operand is walked via 'walk_tree' with optional state information + in 'WI'. + + 'CALLBACK_OP' is called on each operand of 'STMT' via 'walk_tree'. + Additional parameters to 'walk_tree' must be stored in 'WI'. For + each operand 'OP', 'walk_tree' is called as: + + walk_tree (&OP, CALLBACK_OP, WI, PSET) + + If 'CALLBACK_OP' returns non-'NULL' for an operand, the remaining + operands are not scanned. The return value is that returned by the + last call to 'walk_tree', or 'NULL_TREE' if no 'CALLBACK_OP' is + specified. + + -- GIMPLE function: tree walk_gimple_seq (gimple_seq seq, walk_stmt_fn + callback_stmt, walk_tree_fn callback_op, struct walk_stmt_info + *wi) + This function walks all the statements in the sequence 'SEQ' + calling 'walk_gimple_stmt' on each one. 'WI' is as in + 'walk_gimple_stmt'. If 'walk_gimple_stmt' returns non-'NULL', the + walk is stopped and the value returned. Otherwise, all the + statements are walked and 'NULL_TREE' returned. + + +File: gccint.info, Node: Tree SSA, Next: RTL, Prev: GIMPLE, Up: Top + +12 Analysis and Optimization of GIMPLE tuples +********************************************* + +GCC uses three main intermediate languages to represent the program +during compilation: GENERIC, GIMPLE and RTL. GENERIC is a +language-independent representation generated by each front end. It is +used to serve as an interface between the parser and optimizer. GENERIC +is a common representation that is able to represent programs written in +all the languages supported by GCC. + + GIMPLE and RTL are used to optimize the program. GIMPLE is used for +target and language independent optimizations (e.g., inlining, constant +propagation, tail call elimination, redundancy elimination, etc). Much +like GENERIC, GIMPLE is a language independent, tree based +representation. However, it differs from GENERIC in that the GIMPLE +grammar is more restrictive: expressions contain no more than 3 operands +(except function calls), it has no control flow structures and +expressions with side-effects are only allowed on the right hand side of +assignments. See the chapter describing GENERIC and GIMPLE for more +details. + + This chapter describes the data structures and functions used in the +GIMPLE optimizers (also known as "tree optimizers" or "middle end"). In +particular, it focuses on all the macros, data structures, functions and +programming constructs needed to implement optimization passes for +GIMPLE. + +* Menu: + +* Annotations:: Attributes for variables. +* SSA Operands:: SSA names referenced by GIMPLE statements. +* SSA:: Static Single Assignment representation. +* Alias analysis:: Representing aliased loads and stores. +* Memory model:: Memory model used by the middle-end. + + +File: gccint.info, Node: Annotations, Next: SSA Operands, Up: Tree SSA + +12.1 Annotations +================ + +The optimizers need to associate attributes with variables during the +optimization process. For instance, we need to know whether a variable +has aliases. All these attributes are stored in data structures called +annotations which are then linked to the field 'ann' in 'struct +tree_common'. + + +File: gccint.info, Node: SSA Operands, Next: SSA, Prev: Annotations, Up: Tree SSA + +12.2 SSA Operands +================= + +Almost every GIMPLE statement will contain a reference to a variable or +memory location. Since statements come in different shapes and sizes, +their operands are going to be located at various spots inside the +statement's tree. To facilitate access to the statement's operands, +they are organized into lists associated inside each statement's +annotation. Each element in an operand list is a pointer to a +'VAR_DECL', 'PARM_DECL' or 'SSA_NAME' tree node. This provides a very +convenient way of examining and replacing operands. + + Data flow analysis and optimization is done on all tree nodes +representing variables. Any node for which 'SSA_VAR_P' returns nonzero +is considered when scanning statement operands. However, not all +'SSA_VAR_P' variables are processed in the same way. For the purposes +of optimization, we need to distinguish between references to local +scalar variables and references to globals, statics, structures, arrays, +aliased variables, etc. The reason is simple, the compiler can gather +complete data flow information for a local scalar. On the other hand, a +global variable may be modified by a function call, it may not be +possible to keep track of all the elements of an array or the fields of +a structure, etc. + + The operand scanner gathers two kinds of operands: "real" and +"virtual". An operand for which 'is_gimple_reg' returns true is +considered real, otherwise it is a virtual operand. We also distinguish +between uses and definitions. An operand is used if its value is loaded +by the statement (e.g., the operand at the RHS of an assignment). If +the statement assigns a new value to the operand, the operand is +considered a definition (e.g., the operand at the LHS of an assignment). + + Virtual and real operands also have very different data flow +properties. Real operands are unambiguous references to the full object +that they represent. For instance, given + + { + int a, b; + a = b + } + + Since 'a' and 'b' are non-aliased locals, the statement 'a = b' will +have one real definition and one real use because variable 'a' is +completely modified with the contents of variable 'b'. Real definition +are also known as "killing definitions". Similarly, the use of 'b' +reads all its bits. + + In contrast, virtual operands are used with variables that can have a +partial or ambiguous reference. This includes structures, arrays, +globals, and aliased variables. In these cases, we have two types of +definitions. For globals, structures, and arrays, we can determine from +a statement whether a variable of these types has a killing definition. +If the variable does, then the statement is marked as having a "must +definition" of that variable. However, if a statement is only defining +a part of the variable (i.e. a field in a structure), or if we know that +a statement might define the variable but we cannot say for sure, then +we mark that statement as having a "may definition". For instance, +given + + { + int a, b, *p; + + if (...) + p = &a; + else + p = &b; + *p = 5; + return *p; + } + + The assignment '*p = 5' may be a definition of 'a' or 'b'. If we +cannot determine statically where 'p' is pointing to at the time of the +store operation, we create virtual definitions to mark that statement as +a potential definition site for 'a' and 'b'. Memory loads are similarly +marked with virtual use operands. Virtual operands are shown in tree +dumps right before the statement that contains them. To request a tree +dump with virtual operands, use the '-vops' option to '-fdump-tree': + + { + int a, b, *p; + + if (...) + p = &a; + else + p = &b; + # a = VDEF <a> + # b = VDEF <b> + *p = 5; + + # VUSE <a> + # VUSE <b> + return *p; + } + + Notice that 'VDEF' operands have two copies of the referenced variable. +This indicates that this is not a killing definition of that variable. +In this case we refer to it as a "may definition" or "aliased store". +The presence of the second copy of the variable in the 'VDEF' operand +will become important when the function is converted into SSA form. +This will be used to link all the non-killing definitions to prevent +optimizations from making incorrect assumptions about them. + + Operands are updated as soon as the statement is finished via a call to +'update_stmt'. If statement elements are changed via 'SET_USE' or +'SET_DEF', then no further action is required (i.e., those macros take +care of updating the statement). If changes are made by manipulating +the statement's tree directly, then a call must be made to 'update_stmt' +when complete. Calling one of the 'bsi_insert' routines or +'bsi_replace' performs an implicit call to 'update_stmt'. + +12.2.1 Operand Iterators And Access Routines +-------------------------------------------- + +Operands are collected by 'tree-ssa-operands.c'. They are stored inside +each statement's annotation and can be accessed through either the +operand iterators or an access routine. + + The following access routines are available for examining operands: + + 1. 'SINGLE_SSA_{USE,DEF,TREE}_OPERAND': These accessors will return + NULL unless there is exactly one operand matching the specified + flags. If there is exactly one operand, the operand is returned as + either a 'tree', 'def_operand_p', or 'use_operand_p'. + + tree t = SINGLE_SSA_TREE_OPERAND (stmt, flags); + use_operand_p u = SINGLE_SSA_USE_OPERAND (stmt, SSA_ALL_VIRTUAL_USES); + def_operand_p d = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_ALL_DEFS); + + 2. 'ZERO_SSA_OPERANDS': This macro returns true if there are no + operands matching the specified flags. + + if (ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)) + return; + + 3. 'NUM_SSA_OPERANDS': This macro Returns the number of operands + matching 'flags'. This actually executes a loop to perform the + count, so only use this if it is really needed. + + int count = NUM_SSA_OPERANDS (stmt, flags) + + If you wish to iterate over some or all operands, use the +'FOR_EACH_SSA_{USE,DEF,TREE}_OPERAND' iterator. For example, to print +all the operands for a statement: + + void + print_ops (tree stmt) + { + ssa_op_iter; + tree var; + + FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_ALL_OPERANDS) + print_generic_expr (stderr, var, TDF_SLIM); + } + + How to choose the appropriate iterator: + + 1. Determine whether you are need to see the operand pointers, or just + the trees, and choose the appropriate macro: + + Need Macro: + ---- ------- + use_operand_p FOR_EACH_SSA_USE_OPERAND + def_operand_p FOR_EACH_SSA_DEF_OPERAND + tree FOR_EACH_SSA_TREE_OPERAND + + 2. You need to declare a variable of the type you are interested in, + and an ssa_op_iter structure which serves as the loop controlling + variable. + + 3. Determine which operands you wish to use, and specify the flags of + those you are interested in. They are documented in + 'tree-ssa-operands.h': + + #define SSA_OP_USE 0x01 /* Real USE operands. */ + #define SSA_OP_DEF 0x02 /* Real DEF operands. */ + #define SSA_OP_VUSE 0x04 /* VUSE operands. */ + #define SSA_OP_VDEF 0x08 /* VDEF operands. */ + + /* These are commonly grouped operand flags. */ + #define SSA_OP_VIRTUAL_USES (SSA_OP_VUSE) + #define SSA_OP_VIRTUAL_DEFS (SSA_OP_VDEF) + #define SSA_OP_ALL_VIRTUALS (SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_DEFS) + #define SSA_OP_ALL_USES (SSA_OP_VIRTUAL_USES | SSA_OP_USE) + #define SSA_OP_ALL_DEFS (SSA_OP_VIRTUAL_DEFS | SSA_OP_DEF) + #define SSA_OP_ALL_OPERANDS (SSA_OP_ALL_USES | SSA_OP_ALL_DEFS) + + So if you want to look at the use pointers for all the 'USE' and 'VUSE' +operands, you would do something like: + + use_operand_p use_p; + ssa_op_iter iter; + + FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, (SSA_OP_USE | SSA_OP_VUSE)) + { + process_use_ptr (use_p); + } + + The 'TREE' macro is basically the same as the 'USE' and 'DEF' macros, +only with the use or def dereferenced via 'USE_FROM_PTR (use_p)' and +'DEF_FROM_PTR (def_p)'. Since we aren't using operand pointers, use and +defs flags can be mixed. + + tree var; + ssa_op_iter iter; + + FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_VUSE) + { + print_generic_expr (stderr, var, TDF_SLIM); + } + + 'VDEF's are broken into two flags, one for the 'DEF' portion +('SSA_OP_VDEF') and one for the USE portion ('SSA_OP_VUSE'). + + There are many examples in the code, in addition to the documentation +in 'tree-ssa-operands.h' and 'ssa-iterators.h'. + + There are also a couple of variants on the stmt iterators regarding PHI +nodes. + + 'FOR_EACH_PHI_ARG' Works exactly like 'FOR_EACH_SSA_USE_OPERAND', +except it works over 'PHI' arguments instead of statement operands. + + /* Look at every virtual PHI use. */ + FOR_EACH_PHI_ARG (use_p, phi_stmt, iter, SSA_OP_VIRTUAL_USES) + { + my_code; + } + + /* Look at every real PHI use. */ + FOR_EACH_PHI_ARG (use_p, phi_stmt, iter, SSA_OP_USES) + my_code; + + /* Look at every PHI use. */ + FOR_EACH_PHI_ARG (use_p, phi_stmt, iter, SSA_OP_ALL_USES) + my_code; + + 'FOR_EACH_PHI_OR_STMT_{USE,DEF}' works exactly like +'FOR_EACH_SSA_{USE,DEF}_OPERAND', except it will function on either a +statement or a 'PHI' node. These should be used when it is appropriate +but they are not quite as efficient as the individual 'FOR_EACH_PHI' and +'FOR_EACH_SSA' routines. + + FOR_EACH_PHI_OR_STMT_USE (use_operand_p, stmt, iter, flags) + { + my_code; + } + + FOR_EACH_PHI_OR_STMT_DEF (def_operand_p, phi, iter, flags) + { + my_code; + } + +12.2.2 Immediate Uses +--------------------- + +Immediate use information is now always available. Using the immediate +use iterators, you may examine every use of any 'SSA_NAME'. For +instance, to change each use of 'ssa_var' to 'ssa_var2' and call +fold_stmt on each stmt after that is done: + + use_operand_p imm_use_p; + imm_use_iterator iterator; + tree ssa_var, stmt; + + + FOR_EACH_IMM_USE_STMT (stmt, iterator, ssa_var) + { + FOR_EACH_IMM_USE_ON_STMT (imm_use_p, iterator) + SET_USE (imm_use_p, ssa_var_2); + fold_stmt (stmt); + } + + There are 2 iterators which can be used. 'FOR_EACH_IMM_USE_FAST' is +used when the immediate uses are not changed, i.e., you are looking at +the uses, but not setting them. + + If they do get changed, then care must be taken that things are not +changed under the iterators, so use the 'FOR_EACH_IMM_USE_STMT' and +'FOR_EACH_IMM_USE_ON_STMT' iterators. They attempt to preserve the +sanity of the use list by moving all the uses for a statement into a +controlled position, and then iterating over those uses. Then the +optimization can manipulate the stmt when all the uses have been +processed. This is a little slower than the FAST version since it adds +a placeholder element and must sort through the list a bit for each +statement. This placeholder element must be also be removed if the loop +is terminated early. The macro 'BREAK_FROM_IMM_USE_SAFE' is provided to +do this : + + FOR_EACH_IMM_USE_STMT (stmt, iterator, ssa_var) + { + if (stmt == last_stmt) + BREAK_FROM_SAFE_IMM_USE (iter); + + FOR_EACH_IMM_USE_ON_STMT (imm_use_p, iterator) + SET_USE (imm_use_p, ssa_var_2); + fold_stmt (stmt); + } + + There are checks in 'verify_ssa' which verify that the immediate use +list is up to date, as well as checking that an optimization didn't +break from the loop without using this macro. It is safe to simply +'break'; from a 'FOR_EACH_IMM_USE_FAST' traverse. + + Some useful functions and macros: + 1. 'has_zero_uses (ssa_var)' : Returns true if there are no uses of + 'ssa_var'. + 2. 'has_single_use (ssa_var)' : Returns true if there is only a single + use of 'ssa_var'. + 3. 'single_imm_use (ssa_var, use_operand_p *ptr, tree *stmt)' : + Returns true if there is only a single use of 'ssa_var', and also + returns the use pointer and statement it occurs in, in the second + and third parameters. + 4. 'num_imm_uses (ssa_var)' : Returns the number of immediate uses of + 'ssa_var'. It is better not to use this if possible since it + simply utilizes a loop to count the uses. + 5. 'PHI_ARG_INDEX_FROM_USE (use_p)' : Given a use within a 'PHI' node, + return the index number for the use. An assert is triggered if the + use isn't located in a 'PHI' node. + 6. 'USE_STMT (use_p)' : Return the statement a use occurs in. + + Note that uses are not put into an immediate use list until their +statement is actually inserted into the instruction stream via a 'bsi_*' +routine. + + It is also still possible to utilize lazy updating of statements, but +this should be used only when absolutely required. Both alias analysis +and the dominator optimizations currently do this. + + When lazy updating is being used, the immediate use information is out +of date and cannot be used reliably. Lazy updating is achieved by +simply marking statements modified via calls to 'mark_stmt_modified' +instead of 'update_stmt'. When lazy updating is no longer required, all +the modified statements must have 'update_stmt' called in order to bring +them up to date. This must be done before the optimization is finished, +or 'verify_ssa' will trigger an abort. + + This is done with a simple loop over the instruction stream: + block_stmt_iterator bsi; + basic_block bb; + FOR_EACH_BB (bb) + { + for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) + update_stmt_if_modified (bsi_stmt (bsi)); + } + + +File: gccint.info, Node: SSA, Next: Alias analysis, Prev: SSA Operands, Up: Tree SSA + +12.3 Static Single Assignment +============================= + +Most of the tree optimizers rely on the data flow information provided +by the Static Single Assignment (SSA) form. We implement the SSA form +as described in 'R. Cytron, J. Ferrante, B. Rosen, M. Wegman, and K. +Zadeck. Efficiently Computing Static Single Assignment Form and the +Control Dependence Graph. ACM Transactions on Programming Languages and +Systems, 13(4):451-490, October 1991'. + + The SSA form is based on the premise that program variables are +assigned in exactly one location in the program. Multiple assignments +to the same variable create new versions of that variable. Naturally, +actual programs are seldom in SSA form initially because variables tend +to be assigned multiple times. The compiler modifies the program +representation so that every time a variable is assigned in the code, a +new version of the variable is created. Different versions of the same +variable are distinguished by subscripting the variable name with its +version number. Variables used in the right-hand side of expressions +are renamed so that their version number matches that of the most recent +assignment. + + We represent variable versions using 'SSA_NAME' nodes. The renaming +process in 'tree-ssa.c' wraps every real and virtual operand with an +'SSA_NAME' node which contains the version number and the statement that +created the 'SSA_NAME'. Only definitions and virtual definitions may +create new 'SSA_NAME' nodes. + + Sometimes, flow of control makes it impossible to determine the most +recent version of a variable. In these cases, the compiler inserts an +artificial definition for that variable called "PHI function" or "PHI +node". This new definition merges all the incoming versions of the +variable to create a new name for it. For instance, + + if (...) + a_1 = 5; + else if (...) + a_2 = 2; + else + a_3 = 13; + + # a_4 = PHI <a_1, a_2, a_3> + return a_4; + + Since it is not possible to determine which of the three branches will +be taken at runtime, we don't know which of 'a_1', 'a_2' or 'a_3' to use +at the return statement. So, the SSA renamer creates a new version +'a_4' which is assigned the result of "merging" 'a_1', 'a_2' and 'a_3'. +Hence, PHI nodes mean "one of these operands. I don't know which". + + The following functions can be used to examine PHI nodes + + -- Function: gimple_phi_result (PHI) + Returns the 'SSA_NAME' created by PHI node PHI (i.e., PHI's LHS). + + -- Function: gimple_phi_num_args (PHI) + Returns the number of arguments in PHI. This number is exactly the + number of incoming edges to the basic block holding PHI. + + -- Function: gimple_phi_arg (PHI, I) + Returns Ith argument of PHI. + + -- Function: gimple_phi_arg_edge (PHI, I) + Returns the incoming edge for the Ith argument of PHI. + + -- Function: gimple_phi_arg_def (PHI, I) + Returns the 'SSA_NAME' for the Ith argument of PHI. + +12.3.1 Preserving the SSA form +------------------------------ + +Some optimization passes make changes to the function that invalidate +the SSA property. This can happen when a pass has added new symbols or +changed the program so that variables that were previously aliased +aren't anymore. Whenever something like this happens, the affected +symbols must be renamed into SSA form again. Transformations that emit +new code or replicate existing statements will also need to update the +SSA form. + + Since GCC implements two different SSA forms for register and virtual +variables, keeping the SSA form up to date depends on whether you are +updating register or virtual names. In both cases, the general idea +behind incremental SSA updates is similar: when new SSA names are +created, they typically are meant to replace other existing names in the +program. + + For instance, given the following code: + + 1 L0: + 2 x_1 = PHI (0, x_5) + 3 if (x_1 < 10) + 4 if (x_1 > 7) + 5 y_2 = 0 + 6 else + 7 y_3 = x_1 + x_7 + 8 endif + 9 x_5 = x_1 + 1 + 10 goto L0; + 11 endif + + Suppose that we insert new names 'x_10' and 'x_11' (lines '4' and '8'). + + 1 L0: + 2 x_1 = PHI (0, x_5) + 3 if (x_1 < 10) + 4 x_10 = ... + 5 if (x_1 > 7) + 6 y_2 = 0 + 7 else + 8 x_11 = ... + 9 y_3 = x_1 + x_7 + 10 endif + 11 x_5 = x_1 + 1 + 12 goto L0; + 13 endif + + We want to replace all the uses of 'x_1' with the new definitions of +'x_10' and 'x_11'. Note that the only uses that should be replaced are +those at lines '5', '9' and '11'. Also, the use of 'x_7' at line '9' +should _not_ be replaced (this is why we cannot just mark symbol 'x' for +renaming). + + Additionally, we may need to insert a PHI node at line '11' because +that is a merge point for 'x_10' and 'x_11'. So the use of 'x_1' at +line '11' will be replaced with the new PHI node. The insertion of PHI +nodes is optional. They are not strictly necessary to preserve the SSA +form, and depending on what the caller inserted, they may not even be +useful for the optimizers. + + Updating the SSA form is a two step process. First, the pass has to +identify which names need to be updated and/or which symbols need to be +renamed into SSA form for the first time. When new names are introduced +to replace existing names in the program, the mapping between the old +and the new names are registered by calling 'register_new_name_mapping' +(note that if your pass creates new code by duplicating basic blocks, +the call to 'tree_duplicate_bb' will set up the necessary mappings +automatically). + + After the replacement mappings have been registered and new symbols +marked for renaming, a call to 'update_ssa' makes the registered +changes. This can be done with an explicit call or by creating 'TODO' +flags in the 'tree_opt_pass' structure for your pass. There are several +'TODO' flags that control the behavior of 'update_ssa': + + * 'TODO_update_ssa'. Update the SSA form inserting PHI nodes for + newly exposed symbols and virtual names marked for updating. When + updating real names, only insert PHI nodes for a real name 'O_j' in + blocks reached by all the new and old definitions for 'O_j'. If + the iterated dominance frontier for 'O_j' is not pruned, we may end + up inserting PHI nodes in blocks that have one or more edges with + no incoming definition for 'O_j'. This would lead to uninitialized + warnings for 'O_j''s symbol. + + * 'TODO_update_ssa_no_phi'. Update the SSA form without inserting + any new PHI nodes at all. This is used by passes that have either + inserted all the PHI nodes themselves or passes that need only to + patch use-def and def-def chains for virtuals (e.g., DCE). + + * 'TODO_update_ssa_full_phi'. Insert PHI nodes everywhere they are + needed. No pruning of the IDF is done. This is used by passes + that need the PHI nodes for 'O_j' even if it means that some + arguments will come from the default definition of 'O_j''s symbol + (e.g., 'pass_linear_transform'). + + WARNING: If you need to use this flag, chances are that your pass + may be doing something wrong. Inserting PHI nodes for an old name + where not all edges carry a new replacement may lead to silent + codegen errors or spurious uninitialized warnings. + + * 'TODO_update_ssa_only_virtuals'. Passes that update the SSA form + on their own may want to delegate the updating of virtual names to + the generic updater. Since FUD chains are easier to maintain, this + simplifies the work they need to do. NOTE: If this flag is used, + any OLD->NEW mappings for real names are explicitly destroyed and + only the symbols marked for renaming are processed. + +12.3.2 Preserving the virtual SSA form +-------------------------------------- + +The virtual SSA form is harder to preserve than the non-virtual SSA form +mainly because the set of virtual operands for a statement may change at +what some would consider unexpected times. In general, statement +modifications should be bracketed between calls to 'push_stmt_changes' +and 'pop_stmt_changes'. For example, + + munge_stmt (tree stmt) + { + push_stmt_changes (&stmt); + ... rewrite STMT ... + pop_stmt_changes (&stmt); + } + + The call to 'push_stmt_changes' saves the current state of the +statement operands and the call to 'pop_stmt_changes' compares the saved +state with the current one and does the appropriate symbol marking for +the SSA renamer. + + It is possible to modify several statements at a time, provided that +'push_stmt_changes' and 'pop_stmt_changes' are called in LIFO order, as +when processing a stack of statements. + + Additionally, if the pass discovers that it did not need to make +changes to the statement after calling 'push_stmt_changes', it can +simply discard the topmost change buffer by calling +'discard_stmt_changes'. This will avoid the expensive operand re-scan +operation and the buffer comparison that determines if symbols need to +be marked for renaming. + +12.3.3 Examining 'SSA_NAME' nodes +--------------------------------- + +The following macros can be used to examine 'SSA_NAME' nodes + + -- Macro: SSA_NAME_DEF_STMT (VAR) + Returns the statement S that creates the 'SSA_NAME' VAR. If S is + an empty statement (i.e., 'IS_EMPTY_STMT (S)' returns 'true'), it + means that the first reference to this variable is a USE or a VUSE. + + -- Macro: SSA_NAME_VERSION (VAR) + Returns the version number of the 'SSA_NAME' object VAR. + +12.3.4 Walking the dominator tree +--------------------------------- + + -- Tree SSA function: void walk_dominator_tree (WALK_DATA, BB) + + This function walks the dominator tree for the current CFG calling + a set of callback functions defined in STRUCT DOM_WALK_DATA in + 'domwalk.h'. The call back functions you need to define give you + hooks to execute custom code at various points during traversal: + + 1. Once to initialize any local data needed while processing BB + and its children. This local data is pushed into an internal + stack which is automatically pushed and popped as the walker + traverses the dominator tree. + + 2. Once before traversing all the statements in the BB. + + 3. Once for every statement inside BB. + + 4. Once after traversing all the statements and before recursing + into BB's dominator children. + + 5. It then recurses into all the dominator children of BB. + + 6. After recursing into all the dominator children of BB it can, + optionally, traverse every statement in BB again (i.e., + repeating steps 2 and 3). + + 7. Once after walking the statements in BB and BB's dominator + children. At this stage, the block local data stack is + popped. + + +File: gccint.info, Node: Alias analysis, Next: Memory model, Prev: SSA, Up: Tree SSA + +12.4 Alias analysis +=================== + +Alias analysis in GIMPLE SSA form consists of two pieces. First the +virtual SSA web ties conflicting memory accesses and provides a SSA +use-def chain and SSA immediate-use chains for walking possibly +dependent memory accesses. Second an alias-oracle can be queried to +disambiguate explicit and implicit memory references. + + 1. Memory SSA form. + + All statements that may use memory have exactly one accompanied use + of a virtual SSA name that represents the state of memory at the + given point in the IL. + + All statements that may define memory have exactly one accompanied + definition of a virtual SSA name using the previous state of memory + and defining the new state of memory after the given point in the + IL. + + int i; + int foo (void) + { + # .MEM_3 = VDEF <.MEM_2(D)> + i = 1; + # VUSE <.MEM_3> + return i; + } + + The virtual SSA names in this case are '.MEM_2(D)' and '.MEM_3'. + The store to the global variable 'i' defines '.MEM_3' invalidating + '.MEM_2(D)'. The load from 'i' uses that new state '.MEM_3'. + + The virtual SSA web serves as constraints to SSA optimizers + preventing illegitimate code-motion and optimization. It also + provides a way to walk related memory statements. + + 2. Points-to and escape analysis. + + Points-to analysis builds a set of constraints from the GIMPLE SSA + IL representing all pointer operations and facts we do or do not + know about pointers. Solving this set of constraints yields a + conservatively correct solution for each pointer variable in the + program (though we are only interested in SSA name pointers) as to + what it may possibly point to. + + This points-to solution for a given SSA name pointer is stored in + the 'pt_solution' sub-structure of the 'SSA_NAME_PTR_INFO' record. + The following accessor functions are available: + + * 'pt_solution_includes' + * 'pt_solutions_intersect' + + Points-to analysis also computes the solution for two special set + of pointers, 'ESCAPED' and 'CALLUSED'. Those represent all memory + that has escaped the scope of analysis or that is used by pure or + nested const calls. + + 3. Type-based alias analysis + + Type-based alias analysis is frontend dependent though generic + support is provided by the middle-end in 'alias.c'. TBAA code is + used by both tree optimizers and RTL optimizers. + + Every language that wishes to perform language-specific alias + analysis should define a function that computes, given a 'tree' + node, an alias set for the node. Nodes in different alias sets are + not allowed to alias. For an example, see the C front-end function + 'c_get_alias_set'. + + 4. Tree alias-oracle + + The tree alias-oracle provides means to disambiguate two memory + references and memory references against statements. The following + queries are available: + + * 'refs_may_alias_p' + * 'ref_maybe_used_by_stmt_p' + * 'stmt_may_clobber_ref_p' + + In addition to those two kind of statement walkers are available + walking statements related to a reference ref. + 'walk_non_aliased_vuses' walks over dominating memory defining + statements and calls back if the statement does not clobber ref + providing the non-aliased VUSE. The walk stops at the first + clobbering statement or if asked to. 'walk_aliased_vdefs' walks + over dominating memory defining statements and calls back on each + statement clobbering ref providing its aliasing VDEF. The walk + stops if asked to. + + +File: gccint.info, Node: Memory model, Prev: Alias analysis, Up: Tree SSA + +12.5 Memory model +================= + +The memory model used by the middle-end models that of the C/C++ +languages. The middle-end has the notion of an effective type of a +memory region which is used for type-based alias analysis. + + The following is a refinement of ISO C99 6.5/6, clarifying the block +copy case to follow common sense and extending the concept of a dynamic +effective type to objects with a declared type as required for C++. + + The effective type of an object for an access to its stored value is + the declared type of the object or the effective type determined by + a previous store to it. If a value is stored into an object through + an lvalue having a type that is not a character type, then the + type of the lvalue becomes the effective type of the object for that + access and for subsequent accesses that do not modify the stored value. + If a value is copied into an object using memcpy or memmove, + or is copied as an array of character type, then the effective type + of the modified object for that access and for subsequent accesses that + do not modify the value is undetermined. For all other accesses to an + object, the effective type of the object is simply the type of the + lvalue used for the access. + + +File: gccint.info, Node: RTL, Next: Control Flow, Prev: Tree SSA, Up: Top + +13 RTL Representation +********************* + +The last part of the compiler work is done on a low-level intermediate +representation called Register Transfer Language. In this language, the +instructions to be output are described, pretty much one by one, in an +algebraic form that describes what the instruction does. + + RTL is inspired by Lisp lists. It has both an internal form, made up +of structures that point at other structures, and a textual form that is +used in the machine description and in printed debugging dumps. The +textual form uses nested parentheses to indicate the pointers in the +internal form. + +* Menu: + +* RTL Objects:: Expressions vs vectors vs strings vs integers. +* RTL Classes:: Categories of RTL expression objects, and their structure. +* Accessors:: Macros to access expression operands or vector elts. +* Special Accessors:: Macros to access specific annotations on RTL. +* Flags:: Other flags in an RTL expression. +* Machine Modes:: Describing the size and format of a datum. +* Constants:: Expressions with constant values. +* Regs and Memory:: Expressions representing register contents or memory. +* Arithmetic:: Expressions representing arithmetic on other expressions. +* Comparisons:: Expressions representing comparison of expressions. +* Bit-Fields:: Expressions representing bit-fields in memory or reg. +* Vector Operations:: Expressions involving vector datatypes. +* Conversions:: Extending, truncating, floating or fixing. +* RTL Declarations:: Declaring volatility, constancy, etc. +* Side Effects:: Expressions for storing in registers, etc. +* Incdec:: Embedded side-effects for autoincrement addressing. +* Assembler:: Representing 'asm' with operands. +* Debug Information:: Expressions representing debugging information. +* Insns:: Expression types for entire insns. +* Calls:: RTL representation of function call insns. +* Sharing:: Some expressions are unique; others *must* be copied. +* Reading RTL:: Reading textual RTL from a file. + + +File: gccint.info, Node: RTL Objects, Next: RTL Classes, Up: RTL + +13.1 RTL Object Types +===================== + +RTL uses five kinds of objects: expressions, integers, wide integers, +strings and vectors. Expressions are the most important ones. An RTL +expression ("RTX", for short) is a C structure, but it is usually +referred to with a pointer; a type that is given the typedef name 'rtx'. + + An integer is simply an 'int'; their written form uses decimal digits. +A wide integer is an integral object whose type is 'HOST_WIDE_INT'; +their written form uses decimal digits. + + A string is a sequence of characters. In core it is represented as a +'char *' in usual C fashion, and it is written in C syntax as well. +However, strings in RTL may never be null. If you write an empty string +in a machine description, it is represented in core as a null pointer +rather than as a pointer to a null character. In certain contexts, +these null pointers instead of strings are valid. Within RTL code, +strings are most commonly found inside 'symbol_ref' expressions, but +they appear in other contexts in the RTL expressions that make up +machine descriptions. + + In a machine description, strings are normally written with double +quotes, as you would in C. However, strings in machine descriptions may +extend over many lines, which is invalid C, and adjacent string +constants are not concatenated as they are in C. Any string constant +may be surrounded with a single set of parentheses. Sometimes this +makes the machine description easier to read. + + There is also a special syntax for strings, which can be useful when C +code is embedded in a machine description. Wherever a string can +appear, it is also valid to write a C-style brace block. The entire +brace block, including the outermost pair of braces, is considered to be +the string constant. Double quote characters inside the braces are not +special. Therefore, if you write string constants in the C code, you +need not escape each quote character with a backslash. + + A vector contains an arbitrary number of pointers to expressions. The +number of elements in the vector is explicitly present in the vector. +The written form of a vector consists of square brackets ('[...]') +surrounding the elements, in sequence and with whitespace separating +them. Vectors of length zero are not created; null pointers are used +instead. + + Expressions are classified by "expression codes" (also called RTX +codes). The expression code is a name defined in 'rtl.def', which is +also (in uppercase) a C enumeration constant. The possible expression +codes and their meanings are machine-independent. The code of an RTX +can be extracted with the macro 'GET_CODE (X)' and altered with +'PUT_CODE (X, NEWCODE)'. + + The expression code determines how many operands the expression +contains, and what kinds of objects they are. In RTL, unlike Lisp, you +cannot tell by looking at an operand what kind of object it is. +Instead, you must know from its context--from the expression code of the +containing expression. For example, in an expression of code 'subreg', +the first operand is to be regarded as an expression and the second +operand as an integer. In an expression of code 'plus', there are two +operands, both of which are to be regarded as expressions. In a +'symbol_ref' expression, there is one operand, which is to be regarded +as a string. + + Expressions are written as parentheses containing the name of the +expression type, its flags and machine mode if any, and then the +operands of the expression (separated by spaces). + + Expression code names in the 'md' file are written in lowercase, but +when they appear in C code they are written in uppercase. In this +manual, they are shown as follows: 'const_int'. + + In a few contexts a null pointer is valid where an expression is +normally wanted. The written form of this is '(nil)'. + + +File: gccint.info, Node: RTL Classes, Next: Accessors, Prev: RTL Objects, Up: RTL + +13.2 RTL Classes and Formats +============================ + +The various expression codes are divided into several "classes", which +are represented by single characters. You can determine the class of an +RTX code with the macro 'GET_RTX_CLASS (CODE)'. Currently, 'rtl.def' +defines these classes: + +'RTX_OBJ' + An RTX code that represents an actual object, such as a register + ('REG') or a memory location ('MEM', 'SYMBOL_REF'). 'LO_SUM') is + also included; instead, 'SUBREG' and 'STRICT_LOW_PART' are not in + this class, but in class 'x'. + +'RTX_CONST_OBJ' + An RTX code that represents a constant object. 'HIGH' is also + included in this class. + +'RTX_COMPARE' + An RTX code for a non-symmetric comparison, such as 'GEU' or 'LT'. + +'RTX_COMM_COMPARE' + An RTX code for a symmetric (commutative) comparison, such as 'EQ' + or 'ORDERED'. + +'RTX_UNARY' + An RTX code for a unary arithmetic operation, such as 'NEG', 'NOT', + or 'ABS'. This category also includes value extension (sign or + zero) and conversions between integer and floating point. + +'RTX_COMM_ARITH' + An RTX code for a commutative binary operation, such as 'PLUS' or + 'AND'. 'NE' and 'EQ' are comparisons, so they have class '<'. + +'RTX_BIN_ARITH' + An RTX code for a non-commutative binary operation, such as + 'MINUS', 'DIV', or 'ASHIFTRT'. + +'RTX_BITFIELD_OPS' + An RTX code for a bit-field operation. Currently only + 'ZERO_EXTRACT' and 'SIGN_EXTRACT'. These have three inputs and are + lvalues (so they can be used for insertion as well). *Note + Bit-Fields::. + +'RTX_TERNARY' + An RTX code for other three input operations. Currently only + 'IF_THEN_ELSE', 'VEC_MERGE', 'SIGN_EXTRACT', 'ZERO_EXTRACT', and + 'FMA'. + +'RTX_INSN' + An RTX code for an entire instruction: 'INSN', 'JUMP_INSN', and + 'CALL_INSN'. *Note Insns::. + +'RTX_MATCH' + An RTX code for something that matches in insns, such as + 'MATCH_DUP'. These only occur in machine descriptions. + +'RTX_AUTOINC' + An RTX code for an auto-increment addressing mode, such as + 'POST_INC'. + +'RTX_EXTRA' + All other RTX codes. This category includes the remaining codes + used only in machine descriptions ('DEFINE_*', etc.). It also + includes all the codes describing side effects ('SET', 'USE', + 'CLOBBER', etc.) and the non-insns that may appear on an insn + chain, such as 'NOTE', 'BARRIER', and 'CODE_LABEL'. 'SUBREG' is + also part of this class. + + For each expression code, 'rtl.def' specifies the number of contained +objects and their kinds using a sequence of characters called the +"format" of the expression code. For example, the format of 'subreg' is +'ei'. + + These are the most commonly used format characters: + +'e' + An expression (actually a pointer to an expression). + +'i' + An integer. + +'w' + A wide integer. + +'s' + A string. + +'E' + A vector of expressions. + + A few other format characters are used occasionally: + +'u' + 'u' is equivalent to 'e' except that it is printed differently in + debugging dumps. It is used for pointers to insns. + +'n' + 'n' is equivalent to 'i' except that it is printed differently in + debugging dumps. It is used for the line number or code number of + a 'note' insn. + +'S' + 'S' indicates a string which is optional. In the RTL objects in + core, 'S' is equivalent to 's', but when the object is read, from + an 'md' file, the string value of this operand may be omitted. An + omitted string is taken to be the null string. + +'V' + 'V' indicates a vector which is optional. In the RTL objects in + core, 'V' is equivalent to 'E', but when the object is read from an + 'md' file, the vector value of this operand may be omitted. An + omitted vector is effectively the same as a vector of no elements. + +'B' + 'B' indicates a pointer to basic block structure. + +'0' + '0' means a slot whose contents do not fit any normal category. + '0' slots are not printed at all in dumps, and are often used in + special ways by small parts of the compiler. + + There are macros to get the number of operands and the format of an +expression code: + +'GET_RTX_LENGTH (CODE)' + Number of operands of an RTX of code CODE. + +'GET_RTX_FORMAT (CODE)' + The format of an RTX of code CODE, as a C string. + + Some classes of RTX codes always have the same format. For example, it +is safe to assume that all comparison operations have format 'ee'. + +'1' + All codes of this class have format 'e'. + +'<' +'c' +'2' + All codes of these classes have format 'ee'. + +'b' +'3' + All codes of these classes have format 'eee'. + +'i' + All codes of this class have formats that begin with 'iuueiee'. + *Note Insns::. Note that not all RTL objects linked onto an insn + chain are of class 'i'. + +'o' +'m' +'x' + You can make no assumptions about the format of these codes. + + +File: gccint.info, Node: Accessors, Next: Special Accessors, Prev: RTL Classes, Up: RTL + +13.3 Access to Operands +======================= + +Operands of expressions are accessed using the macros 'XEXP', 'XINT', +'XWINT' and 'XSTR'. Each of these macros takes two arguments: an +expression-pointer (RTX) and an operand number (counting from zero). +Thus, + + XEXP (X, 2) + +accesses operand 2 of expression X, as an expression. + + XINT (X, 2) + +accesses the same operand as an integer. 'XSTR', used in the same +fashion, would access it as a string. + + Any operand can be accessed as an integer, as an expression or as a +string. You must choose the correct method of access for the kind of +value actually stored in the operand. You would do this based on the +expression code of the containing expression. That is also how you +would know how many operands there are. + + For example, if X is a 'subreg' expression, you know that it has two +operands which can be correctly accessed as 'XEXP (X, 0)' and 'XINT (X, +1)'. If you did 'XINT (X, 0)', you would get the address of the +expression operand but cast as an integer; that might occasionally be +useful, but it would be cleaner to write '(int) XEXP (X, 0)'. 'XEXP (X, +1)' would also compile without error, and would return the second, +integer operand cast as an expression pointer, which would probably +result in a crash when accessed. Nothing stops you from writing 'XEXP +(X, 28)' either, but this will access memory past the end of the +expression with unpredictable results. + + Access to operands which are vectors is more complicated. You can use +the macro 'XVEC' to get the vector-pointer itself, or the macros +'XVECEXP' and 'XVECLEN' to access the elements and length of a vector. + +'XVEC (EXP, IDX)' + Access the vector-pointer which is operand number IDX in EXP. + +'XVECLEN (EXP, IDX)' + Access the length (number of elements) in the vector which is in + operand number IDX in EXP. This value is an 'int'. + +'XVECEXP (EXP, IDX, ELTNUM)' + Access element number ELTNUM in the vector which is in operand + number IDX in EXP. This value is an RTX. + + It is up to you to make sure that ELTNUM is not negative and is + less than 'XVECLEN (EXP, IDX)'. + + All the macros defined in this section expand into lvalues and +therefore can be used to assign the operands, lengths and vector +elements as well as to access them. + + +File: gccint.info, Node: Special Accessors, Next: Flags, Prev: Accessors, Up: RTL + +13.4 Access to Special Operands +=============================== + +Some RTL nodes have special annotations associated with them. + +'MEM' + 'MEM_ALIAS_SET (X)' + If 0, X is not in any alias set, and may alias anything. + Otherwise, X can only alias 'MEM's in a conflicting alias set. + This value is set in a language-dependent manner in the + front-end, and should not be altered in the back-end. In some + front-ends, these numbers may correspond in some way to types, + or other language-level entities, but they need not, and the + back-end makes no such assumptions. These set numbers are + tested with 'alias_sets_conflict_p'. + + 'MEM_EXPR (X)' + If this register is known to hold the value of some user-level + declaration, this is that tree node. It may also be a + 'COMPONENT_REF', in which case this is some field reference, + and 'TREE_OPERAND (X, 0)' contains the declaration, or another + 'COMPONENT_REF', or null if there is no compile-time object + associated with the reference. + + 'MEM_OFFSET_KNOWN_P (X)' + True if the offset of the memory reference from 'MEM_EXPR' is + known. 'MEM_OFFSET (X)' provides the offset if so. + + 'MEM_OFFSET (X)' + The offset from the start of 'MEM_EXPR'. The value is only + valid if 'MEM_OFFSET_KNOWN_P (X)' is true. + + 'MEM_SIZE_KNOWN_P (X)' + True if the size of the memory reference is known. 'MEM_SIZE + (X)' provides its size if so. + + 'MEM_SIZE (X)' + The size in bytes of the memory reference. This is mostly + relevant for 'BLKmode' references as otherwise the size is + implied by the mode. The value is only valid if + 'MEM_SIZE_KNOWN_P (X)' is true. + + 'MEM_ALIGN (X)' + The known alignment in bits of the memory reference. + + 'MEM_ADDR_SPACE (X)' + The address space of the memory reference. This will commonly + be zero for the generic address space. + +'REG' + 'ORIGINAL_REGNO (X)' + This field holds the number the register "originally" had; for + a pseudo register turned into a hard reg this will hold the + old pseudo register number. + + 'REG_EXPR (X)' + If this register is known to hold the value of some user-level + declaration, this is that tree node. + + 'REG_OFFSET (X)' + If this register is known to hold the value of some user-level + declaration, this is the offset into that logical storage. + +'SYMBOL_REF' + 'SYMBOL_REF_DECL (X)' + If the 'symbol_ref' X was created for a 'VAR_DECL' or a + 'FUNCTION_DECL', that tree is recorded here. If this value is + null, then X was created by back end code generation routines, + and there is no associated front end symbol table entry. + + 'SYMBOL_REF_DECL' may also point to a tree of class ''c'', + that is, some sort of constant. In this case, the + 'symbol_ref' is an entry in the per-file constant pool; again, + there is no associated front end symbol table entry. + + 'SYMBOL_REF_CONSTANT (X)' + If 'CONSTANT_POOL_ADDRESS_P (X)' is true, this is the constant + pool entry for X. It is null otherwise. + + 'SYMBOL_REF_DATA (X)' + A field of opaque type used to store 'SYMBOL_REF_DECL' or + 'SYMBOL_REF_CONSTANT'. + + 'SYMBOL_REF_FLAGS (X)' + In a 'symbol_ref', this is used to communicate various + predicates about the symbol. Some of these are common enough + to be computed by common code, some are specific to the + target. The common bits are: + + 'SYMBOL_FLAG_FUNCTION' + Set if the symbol refers to a function. + + 'SYMBOL_FLAG_LOCAL' + Set if the symbol is local to this "module". See + 'TARGET_BINDS_LOCAL_P'. + + 'SYMBOL_FLAG_EXTERNAL' + Set if this symbol is not defined in this translation + unit. Note that this is not the inverse of + 'SYMBOL_FLAG_LOCAL'. + + 'SYMBOL_FLAG_SMALL' + Set if the symbol is located in the small data section. + See 'TARGET_IN_SMALL_DATA_P'. + + 'SYMBOL_REF_TLS_MODEL (X)' + This is a multi-bit field accessor that returns the + 'tls_model' to be used for a thread-local storage symbol. + It returns zero for non-thread-local symbols. + + 'SYMBOL_FLAG_HAS_BLOCK_INFO' + Set if the symbol has 'SYMBOL_REF_BLOCK' and + 'SYMBOL_REF_BLOCK_OFFSET' fields. + + 'SYMBOL_FLAG_ANCHOR' + Set if the symbol is used as a section anchor. "Section + anchors" are symbols that have a known position within an + 'object_block' and that can be used to access nearby + members of that block. They are used to implement + '-fsection-anchors'. + + If this flag is set, then 'SYMBOL_FLAG_HAS_BLOCK_INFO' + will be too. + + Bits beginning with 'SYMBOL_FLAG_MACH_DEP' are available for + the target's use. + +'SYMBOL_REF_BLOCK (X)' + If 'SYMBOL_REF_HAS_BLOCK_INFO_P (X)', this is the 'object_block' + structure to which the symbol belongs, or 'NULL' if it has not been + assigned a block. + +'SYMBOL_REF_BLOCK_OFFSET (X)' + If 'SYMBOL_REF_HAS_BLOCK_INFO_P (X)', this is the offset of X from + the first object in 'SYMBOL_REF_BLOCK (X)'. The value is negative + if X has not yet been assigned to a block, or it has not been given + an offset within that block. + + +File: gccint.info, Node: Flags, Next: Machine Modes, Prev: Special Accessors, Up: RTL + +13.5 Flags in an RTL Expression +=============================== + +RTL expressions contain several flags (one-bit bit-fields) that are used +in certain types of expression. Most often they are accessed with the +following macros, which expand into lvalues. + +'CONSTANT_POOL_ADDRESS_P (X)' + Nonzero in a 'symbol_ref' if it refers to part of the current + function's constant pool. For most targets these addresses are in + a '.rodata' section entirely separate from the function, but for + some targets the addresses are close to the beginning of the + function. In either case GCC assumes these addresses can be + addressed directly, perhaps with the help of base registers. + Stored in the 'unchanging' field and printed as '/u'. + +'RTL_CONST_CALL_P (X)' + In a 'call_insn' indicates that the insn represents a call to a + const function. Stored in the 'unchanging' field and printed as + '/u'. + +'RTL_PURE_CALL_P (X)' + In a 'call_insn' indicates that the insn represents a call to a + pure function. Stored in the 'return_val' field and printed as + '/i'. + +'RTL_CONST_OR_PURE_CALL_P (X)' + In a 'call_insn', true if 'RTL_CONST_CALL_P' or 'RTL_PURE_CALL_P' + is true. + +'RTL_LOOPING_CONST_OR_PURE_CALL_P (X)' + In a 'call_insn' indicates that the insn represents a possibly + infinite looping call to a const or pure function. Stored in the + 'call' field and printed as '/c'. Only true if one of + 'RTL_CONST_CALL_P' or 'RTL_PURE_CALL_P' is true. + +'INSN_ANNULLED_BRANCH_P (X)' + In a 'jump_insn', 'call_insn', or 'insn' indicates that the branch + is an annulling one. See the discussion under 'sequence' below. + Stored in the 'unchanging' field and printed as '/u'. + +'INSN_DELETED_P (X)' + In an 'insn', 'call_insn', 'jump_insn', 'code_label', + 'jump_table_data', 'barrier', or 'note', nonzero if the insn has + been deleted. Stored in the 'volatil' field and printed as '/v'. + +'INSN_FROM_TARGET_P (X)' + In an 'insn' or 'jump_insn' or 'call_insn' in a delay slot of a + branch, indicates that the insn is from the target of the branch. + If the branch insn has 'INSN_ANNULLED_BRANCH_P' set, this insn will + only be executed if the branch is taken. For annulled branches + with 'INSN_FROM_TARGET_P' clear, the insn will be executed only if + the branch is not taken. When 'INSN_ANNULLED_BRANCH_P' is not set, + this insn will always be executed. Stored in the 'in_struct' field + and printed as '/s'. + +'LABEL_PRESERVE_P (X)' + In a 'code_label' or 'note', indicates that the label is referenced + by code or data not visible to the RTL of a given function. Labels + referenced by a non-local goto will have this bit set. Stored in + the 'in_struct' field and printed as '/s'. + +'LABEL_REF_NONLOCAL_P (X)' + In 'label_ref' and 'reg_label' expressions, nonzero if this is a + reference to a non-local label. Stored in the 'volatil' field and + printed as '/v'. + +'MEM_KEEP_ALIAS_SET_P (X)' + In 'mem' expressions, 1 if we should keep the alias set for this + mem unchanged when we access a component. Set to 1, for example, + when we are already in a non-addressable component of an aggregate. + Stored in the 'jump' field and printed as '/j'. + +'MEM_VOLATILE_P (X)' + In 'mem', 'asm_operands', and 'asm_input' expressions, nonzero for + volatile memory references. Stored in the 'volatil' field and + printed as '/v'. + +'MEM_NOTRAP_P (X)' + In 'mem', nonzero for memory references that will not trap. Stored + in the 'call' field and printed as '/c'. + +'MEM_POINTER (X)' + Nonzero in a 'mem' if the memory reference holds a pointer. Stored + in the 'frame_related' field and printed as '/f'. + +'REG_FUNCTION_VALUE_P (X)' + Nonzero in a 'reg' if it is the place in which this function's + value is going to be returned. (This happens only in a hard + register.) Stored in the 'return_val' field and printed as '/i'. + +'REG_POINTER (X)' + Nonzero in a 'reg' if the register holds a pointer. Stored in the + 'frame_related' field and printed as '/f'. + +'REG_USERVAR_P (X)' + In a 'reg', nonzero if it corresponds to a variable present in the + user's source code. Zero for temporaries generated internally by + the compiler. Stored in the 'volatil' field and printed as '/v'. + + The same hard register may be used also for collecting the values + of functions called by this one, but 'REG_FUNCTION_VALUE_P' is zero + in this kind of use. + +'RTX_FRAME_RELATED_P (X)' + Nonzero in an 'insn', 'call_insn', 'jump_insn', 'barrier', or 'set' + which is part of a function prologue and sets the stack pointer, + sets the frame pointer, or saves a register. This flag should also + be set on an instruction that sets up a temporary register to use + in place of the frame pointer. Stored in the 'frame_related' field + and printed as '/f'. + + In particular, on RISC targets where there are limits on the sizes + of immediate constants, it is sometimes impossible to reach the + register save area directly from the stack pointer. In that case, + a temporary register is used that is near enough to the register + save area, and the Canonical Frame Address, i.e., DWARF2's logical + frame pointer, register must (temporarily) be changed to be this + temporary register. So, the instruction that sets this temporary + register must be marked as 'RTX_FRAME_RELATED_P'. + + If the marked instruction is overly complex (defined in terms of + what 'dwarf2out_frame_debug_expr' can handle), you will also have + to create a 'REG_FRAME_RELATED_EXPR' note and attach it to the + instruction. This note should contain a simple expression of the + computation performed by this instruction, i.e., one that + 'dwarf2out_frame_debug_expr' can handle. + + This flag is required for exception handling support on targets + with RTL prologues. + +'MEM_READONLY_P (X)' + Nonzero in a 'mem', if the memory is statically allocated and + read-only. + + Read-only in this context means never modified during the lifetime + of the program, not necessarily in ROM or in write-disabled pages. + A common example of the later is a shared library's global offset + table. This table is initialized by the runtime loader, so the + memory is technically writable, but after control is transferred + from the runtime loader to the application, this memory will never + be subsequently modified. + + Stored in the 'unchanging' field and printed as '/u'. + +'SCHED_GROUP_P (X)' + During instruction scheduling, in an 'insn', 'call_insn', + 'jump_insn' or 'jump_table_data', indicates that the previous insn + must be scheduled together with this insn. This is used to ensure + that certain groups of instructions will not be split up by the + instruction scheduling pass, for example, 'use' insns before a + 'call_insn' may not be separated from the 'call_insn'. Stored in + the 'in_struct' field and printed as '/s'. + +'SET_IS_RETURN_P (X)' + For a 'set', nonzero if it is for a return. Stored in the 'jump' + field and printed as '/j'. + +'SIBLING_CALL_P (X)' + For a 'call_insn', nonzero if the insn is a sibling call. Stored + in the 'jump' field and printed as '/j'. + +'STRING_POOL_ADDRESS_P (X)' + For a 'symbol_ref' expression, nonzero if it addresses this + function's string constant pool. Stored in the 'frame_related' + field and printed as '/f'. + +'SUBREG_PROMOTED_UNSIGNED_P (X)' + Returns a value greater then zero for a 'subreg' that has + 'SUBREG_PROMOTED_VAR_P' nonzero if the object being referenced is + kept zero-extended, zero if it is kept sign-extended, and less then + zero if it is extended some other way via the 'ptr_extend' + instruction. Stored in the 'unchanging' field and 'volatil' field, + printed as '/u' and '/v'. This macro may only be used to get the + value it may not be used to change the value. Use + 'SUBREG_PROMOTED_UNSIGNED_SET' to change the value. + +'SUBREG_PROMOTED_UNSIGNED_SET (X)' + Set the 'unchanging' and 'volatil' fields in a 'subreg' to reflect + zero, sign, or other extension. If 'volatil' is zero, then + 'unchanging' as nonzero means zero extension and as zero means sign + extension. If 'volatil' is nonzero then some other type of + extension was done via the 'ptr_extend' instruction. + +'SUBREG_PROMOTED_VAR_P (X)' + Nonzero in a 'subreg' if it was made when accessing an object that + was promoted to a wider mode in accord with the 'PROMOTED_MODE' + machine description macro (*note Storage Layout::). In this case, + the mode of the 'subreg' is the declared mode of the object and the + mode of 'SUBREG_REG' is the mode of the register that holds the + object. Promoted variables are always either sign- or + zero-extended to the wider mode on every assignment. Stored in the + 'in_struct' field and printed as '/s'. + +'SYMBOL_REF_USED (X)' + In a 'symbol_ref', indicates that X has been used. This is + normally only used to ensure that X is only declared external once. + Stored in the 'used' field. + +'SYMBOL_REF_WEAK (X)' + In a 'symbol_ref', indicates that X has been declared weak. Stored + in the 'return_val' field and printed as '/i'. + +'SYMBOL_REF_FLAG (X)' + In a 'symbol_ref', this is used as a flag for machine-specific + purposes. Stored in the 'volatil' field and printed as '/v'. + + Most uses of 'SYMBOL_REF_FLAG' are historic and may be subsumed by + 'SYMBOL_REF_FLAGS'. Certainly use of 'SYMBOL_REF_FLAGS' is + mandatory if the target requires more than one bit of storage. + +'PREFETCH_SCHEDULE_BARRIER_P (X)' + In a 'prefetch', indicates that the prefetch is a scheduling + barrier. No other INSNs will be moved over it. Stored in the + 'volatil' field and printed as '/v'. + + These are the fields to which the above macros refer: + +'call' + In a 'mem', 1 means that the memory reference will not trap. + + In a 'call', 1 means that this pure or const call may possibly + infinite loop. + + In an RTL dump, this flag is represented as '/c'. + +'frame_related' + In an 'insn' or 'set' expression, 1 means that it is part of a + function prologue and sets the stack pointer, sets the frame + pointer, saves a register, or sets up a temporary register to use + in place of the frame pointer. + + In 'reg' expressions, 1 means that the register holds a pointer. + + In 'mem' expressions, 1 means that the memory reference holds a + pointer. + + In 'symbol_ref' expressions, 1 means that the reference addresses + this function's string constant pool. + + In an RTL dump, this flag is represented as '/f'. + +'in_struct' + In 'reg' expressions, it is 1 if the register has its entire life + contained within the test expression of some loop. + + In 'subreg' expressions, 1 means that the 'subreg' is accessing an + object that has had its mode promoted from a wider mode. + + In 'label_ref' expressions, 1 means that the referenced label is + outside the innermost loop containing the insn in which the + 'label_ref' was found. + + In 'code_label' expressions, it is 1 if the label may never be + deleted. This is used for labels which are the target of non-local + gotos. Such a label that would have been deleted is replaced with + a 'note' of type 'NOTE_INSN_DELETED_LABEL'. + + In an 'insn' during dead-code elimination, 1 means that the insn is + dead code. + + In an 'insn' or 'jump_insn' during reorg for an insn in the delay + slot of a branch, 1 means that this insn is from the target of the + branch. + + In an 'insn' during instruction scheduling, 1 means that this insn + must be scheduled as part of a group together with the previous + insn. + + In an RTL dump, this flag is represented as '/s'. + +'return_val' + In 'reg' expressions, 1 means the register contains the value to be + returned by the current function. On machines that pass parameters + in registers, the same register number may be used for parameters + as well, but this flag is not set on such uses. + + In 'symbol_ref' expressions, 1 means the referenced symbol is weak. + + In 'call' expressions, 1 means the call is pure. + + In an RTL dump, this flag is represented as '/i'. + +'jump' + In a 'mem' expression, 1 means we should keep the alias set for + this mem unchanged when we access a component. + + In a 'set', 1 means it is for a return. + + In a 'call_insn', 1 means it is a sibling call. + + In an RTL dump, this flag is represented as '/j'. + +'unchanging' + In 'reg' and 'mem' expressions, 1 means that the value of the + expression never changes. + + In 'subreg' expressions, it is 1 if the 'subreg' references an + unsigned object whose mode has been promoted to a wider mode. + + In an 'insn' or 'jump_insn' in the delay slot of a branch + instruction, 1 means an annulling branch should be used. + + In a 'symbol_ref' expression, 1 means that this symbol addresses + something in the per-function constant pool. + + In a 'call_insn' 1 means that this instruction is a call to a const + function. + + In an RTL dump, this flag is represented as '/u'. + +'used' + This flag is used directly (without an access macro) at the end of + RTL generation for a function, to count the number of times an + expression appears in insns. Expressions that appear more than + once are copied, according to the rules for shared structure (*note + Sharing::). + + For a 'reg', it is used directly (without an access macro) by the + leaf register renumbering code to ensure that each register is only + renumbered once. + + In a 'symbol_ref', it indicates that an external declaration for + the symbol has already been written. + +'volatil' + In a 'mem', 'asm_operands', or 'asm_input' expression, it is 1 if + the memory reference is volatile. Volatile memory references may + not be deleted, reordered or combined. + + In a 'symbol_ref' expression, it is used for machine-specific + purposes. + + In a 'reg' expression, it is 1 if the value is a user-level + variable. 0 indicates an internal compiler temporary. + + In an 'insn', 1 means the insn has been deleted. + + In 'label_ref' and 'reg_label' expressions, 1 means a reference to + a non-local label. + + In 'prefetch' expressions, 1 means that the containing insn is a + scheduling barrier. + + In an RTL dump, this flag is represented as '/v'. + + +File: gccint.info, Node: Machine Modes, Next: Constants, Prev: Flags, Up: RTL + +13.6 Machine Modes +================== + +A machine mode describes a size of data object and the representation +used for it. In the C code, machine modes are represented by an +enumeration type, 'enum machine_mode', defined in 'machmode.def'. Each +RTL expression has room for a machine mode and so do certain kinds of +tree expressions (declarations and types, to be precise). + + In debugging dumps and machine descriptions, the machine mode of an RTL +expression is written after the expression code with a colon to separate +them. The letters 'mode' which appear at the end of each machine mode +name are omitted. For example, '(reg:SI 38)' is a 'reg' expression with +machine mode 'SImode'. If the mode is 'VOIDmode', it is not written at +all. + + Here is a table of machine modes. The term "byte" below refers to an +object of 'BITS_PER_UNIT' bits (*note Storage Layout::). + +'BImode' + "Bit" mode represents a single bit, for predicate registers. + +'QImode' + "Quarter-Integer" mode represents a single byte treated as an + integer. + +'HImode' + "Half-Integer" mode represents a two-byte integer. + +'PSImode' + "Partial Single Integer" mode represents an integer which occupies + four bytes but which doesn't really use all four. On some + machines, this is the right mode to use for pointers. + +'SImode' + "Single Integer" mode represents a four-byte integer. + +'PDImode' + "Partial Double Integer" mode represents an integer which occupies + eight bytes but which doesn't really use all eight. On some + machines, this is the right mode to use for certain pointers. + +'DImode' + "Double Integer" mode represents an eight-byte integer. + +'TImode' + "Tetra Integer" (?) mode represents a sixteen-byte integer. + +'OImode' + "Octa Integer" (?) mode represents a thirty-two-byte integer. + +'XImode' + "Hexadeca Integer" (?) mode represents a sixty-four-byte integer. + +'QFmode' + "Quarter-Floating" mode represents a quarter-precision (single + byte) floating point number. + +'HFmode' + "Half-Floating" mode represents a half-precision (two byte) + floating point number. + +'TQFmode' + "Three-Quarter-Floating" (?) mode represents a + three-quarter-precision (three byte) floating point number. + +'SFmode' + "Single Floating" mode represents a four byte floating point + number. In the common case, of a processor with IEEE arithmetic + and 8-bit bytes, this is a single-precision IEEE floating point + number; it can also be used for double-precision (on processors + with 16-bit bytes) and single-precision VAX and IBM types. + +'DFmode' + "Double Floating" mode represents an eight byte floating point + number. In the common case, of a processor with IEEE arithmetic + and 8-bit bytes, this is a double-precision IEEE floating point + number. + +'XFmode' + "Extended Floating" mode represents an IEEE extended floating point + number. This mode only has 80 meaningful bits (ten bytes). Some + processors require such numbers to be padded to twelve bytes, + others to sixteen; this mode is used for either. + +'SDmode' + "Single Decimal Floating" mode represents a four byte decimal + floating point number (as distinct from conventional binary + floating point). + +'DDmode' + "Double Decimal Floating" mode represents an eight byte decimal + floating point number. + +'TDmode' + "Tetra Decimal Floating" mode represents a sixteen byte decimal + floating point number all 128 of whose bits are meaningful. + +'TFmode' + "Tetra Floating" mode represents a sixteen byte floating point + number all 128 of whose bits are meaningful. One common use is the + IEEE quad-precision format. + +'QQmode' + "Quarter-Fractional" mode represents a single byte treated as a + signed fractional number. The default format is "s.7". + +'HQmode' + "Half-Fractional" mode represents a two-byte signed fractional + number. The default format is "s.15". + +'SQmode' + "Single Fractional" mode represents a four-byte signed fractional + number. The default format is "s.31". + +'DQmode' + "Double Fractional" mode represents an eight-byte signed fractional + number. The default format is "s.63". + +'TQmode' + "Tetra Fractional" mode represents a sixteen-byte signed fractional + number. The default format is "s.127". + +'UQQmode' + "Unsigned Quarter-Fractional" mode represents a single byte treated + as an unsigned fractional number. The default format is ".8". + +'UHQmode' + "Unsigned Half-Fractional" mode represents a two-byte unsigned + fractional number. The default format is ".16". + +'USQmode' + "Unsigned Single Fractional" mode represents a four-byte unsigned + fractional number. The default format is ".32". + +'UDQmode' + "Unsigned Double Fractional" mode represents an eight-byte unsigned + fractional number. The default format is ".64". + +'UTQmode' + "Unsigned Tetra Fractional" mode represents a sixteen-byte unsigned + fractional number. The default format is ".128". + +'HAmode' + "Half-Accumulator" mode represents a two-byte signed accumulator. + The default format is "s8.7". + +'SAmode' + "Single Accumulator" mode represents a four-byte signed + accumulator. The default format is "s16.15". + +'DAmode' + "Double Accumulator" mode represents an eight-byte signed + accumulator. The default format is "s32.31". + +'TAmode' + "Tetra Accumulator" mode represents a sixteen-byte signed + accumulator. The default format is "s64.63". + +'UHAmode' + "Unsigned Half-Accumulator" mode represents a two-byte unsigned + accumulator. The default format is "8.8". + +'USAmode' + "Unsigned Single Accumulator" mode represents a four-byte unsigned + accumulator. The default format is "16.16". + +'UDAmode' + "Unsigned Double Accumulator" mode represents an eight-byte + unsigned accumulator. The default format is "32.32". + +'UTAmode' + "Unsigned Tetra Accumulator" mode represents a sixteen-byte + unsigned accumulator. The default format is "64.64". + +'CCmode' + "Condition Code" mode represents the value of a condition code, + which is a machine-specific set of bits used to represent the + result of a comparison operation. Other machine-specific modes may + also be used for the condition code. These modes are not used on + machines that use 'cc0' (*note Condition Code::). + +'BLKmode' + "Block" mode represents values that are aggregates to which none of + the other modes apply. In RTL, only memory references can have + this mode, and only if they appear in string-move or vector + instructions. On machines which have no such instructions, + 'BLKmode' will not appear in RTL. + +'VOIDmode' + Void mode means the absence of a mode or an unspecified mode. For + example, RTL expressions of code 'const_int' have mode 'VOIDmode' + because they can be taken to have whatever mode the context + requires. In debugging dumps of RTL, 'VOIDmode' is expressed by + the absence of any mode. + +'QCmode, HCmode, SCmode, DCmode, XCmode, TCmode' + These modes stand for a complex number represented as a pair of + floating point values. The floating point values are in 'QFmode', + 'HFmode', 'SFmode', 'DFmode', 'XFmode', and 'TFmode', respectively. + +'CQImode, CHImode, CSImode, CDImode, CTImode, COImode' + These modes stand for a complex number represented as a pair of + integer values. The integer values are in 'QImode', 'HImode', + 'SImode', 'DImode', 'TImode', and 'OImode', respectively. + + The machine description defines 'Pmode' as a C macro which expands into +the machine mode used for addresses. Normally this is the mode whose +size is 'BITS_PER_WORD', 'SImode' on 32-bit machines. + + The only modes which a machine description must support are 'QImode', +and the modes corresponding to 'BITS_PER_WORD', 'FLOAT_TYPE_SIZE' and +'DOUBLE_TYPE_SIZE'. The compiler will attempt to use 'DImode' for +8-byte structures and unions, but this can be prevented by overriding +the definition of 'MAX_FIXED_MODE_SIZE'. Alternatively, you can have +the compiler use 'TImode' for 16-byte structures and unions. Likewise, +you can arrange for the C type 'short int' to avoid using 'HImode'. + + Very few explicit references to machine modes remain in the compiler +and these few references will soon be removed. Instead, the machine +modes are divided into mode classes. These are represented by the +enumeration type 'enum mode_class' defined in 'machmode.h'. The +possible mode classes are: + +'MODE_INT' + Integer modes. By default these are 'BImode', 'QImode', 'HImode', + 'SImode', 'DImode', 'TImode', and 'OImode'. + +'MODE_PARTIAL_INT' + The "partial integer" modes, 'PQImode', 'PHImode', 'PSImode' and + 'PDImode'. + +'MODE_FLOAT' + Floating point modes. By default these are 'QFmode', 'HFmode', + 'TQFmode', 'SFmode', 'DFmode', 'XFmode' and 'TFmode'. + +'MODE_DECIMAL_FLOAT' + Decimal floating point modes. By default these are 'SDmode', + 'DDmode' and 'TDmode'. + +'MODE_FRACT' + Signed fractional modes. By default these are 'QQmode', 'HQmode', + 'SQmode', 'DQmode' and 'TQmode'. + +'MODE_UFRACT' + Unsigned fractional modes. By default these are 'UQQmode', + 'UHQmode', 'USQmode', 'UDQmode' and 'UTQmode'. + +'MODE_ACCUM' + Signed accumulator modes. By default these are 'HAmode', 'SAmode', + 'DAmode' and 'TAmode'. + +'MODE_UACCUM' + Unsigned accumulator modes. By default these are 'UHAmode', + 'USAmode', 'UDAmode' and 'UTAmode'. + +'MODE_COMPLEX_INT' + Complex integer modes. (These are not currently implemented). + +'MODE_COMPLEX_FLOAT' + Complex floating point modes. By default these are 'QCmode', + 'HCmode', 'SCmode', 'DCmode', 'XCmode', and 'TCmode'. + +'MODE_FUNCTION' + Algol or Pascal function variables including a static chain. + (These are not currently implemented). + +'MODE_CC' + Modes representing condition code values. These are 'CCmode' plus + any 'CC_MODE' modes listed in the 'MACHINE-modes.def'. *Note Jump + Patterns::, also see *note Condition Code::. + +'MODE_RANDOM' + This is a catchall mode class for modes which don't fit into the + above classes. Currently 'VOIDmode' and 'BLKmode' are in + 'MODE_RANDOM'. + + Here are some C macros that relate to machine modes: + +'GET_MODE (X)' + Returns the machine mode of the RTX X. + +'PUT_MODE (X, NEWMODE)' + Alters the machine mode of the RTX X to be NEWMODE. + +'NUM_MACHINE_MODES' + Stands for the number of machine modes available on the target + machine. This is one greater than the largest numeric value of any + machine mode. + +'GET_MODE_NAME (M)' + Returns the name of mode M as a string. + +'GET_MODE_CLASS (M)' + Returns the mode class of mode M. + +'GET_MODE_WIDER_MODE (M)' + Returns the next wider natural mode. For example, the expression + 'GET_MODE_WIDER_MODE (QImode)' returns 'HImode'. + +'GET_MODE_SIZE (M)' + Returns the size in bytes of a datum of mode M. + +'GET_MODE_BITSIZE (M)' + Returns the size in bits of a datum of mode M. + +'GET_MODE_IBIT (M)' + Returns the number of integral bits of a datum of fixed-point mode + M. + +'GET_MODE_FBIT (M)' + Returns the number of fractional bits of a datum of fixed-point + mode M. + +'GET_MODE_MASK (M)' + Returns a bitmask containing 1 for all bits in a word that fit + within mode M. This macro can only be used for modes whose bitsize + is less than or equal to 'HOST_BITS_PER_INT'. + +'GET_MODE_ALIGNMENT (M)' + Return the required alignment, in bits, for an object of mode M. + +'GET_MODE_UNIT_SIZE (M)' + Returns the size in bytes of the subunits of a datum of mode M. + This is the same as 'GET_MODE_SIZE' except in the case of complex + modes. For them, the unit size is the size of the real or + imaginary part. + +'GET_MODE_NUNITS (M)' + Returns the number of units contained in a mode, i.e., + 'GET_MODE_SIZE' divided by 'GET_MODE_UNIT_SIZE'. + +'GET_CLASS_NARROWEST_MODE (C)' + Returns the narrowest mode in mode class C. + + The following 3 variables are defined on every target. They can be +used to allocate buffers that are guaranteed to be large enough to hold +any value that can be represented on the target. The first two can be +overridden by defining them in the target's mode.def file, however, the +value must be a constant that can determined very early in the +compilation process. The third symbol cannot be overridden. + +'BITS_PER_UNIT' + The number of bits in an addressable storage unit (byte). If you + do not define this, the default is 8. + +'MAX_BITSIZE_MODE_ANY_INT' + The maximum bitsize of any mode that is used in integer math. This + should be overridden by the target if it uses large integers as + containers for larger vectors but otherwise never uses the contents + to compute integer values. + +'MAX_BITSIZE_MODE_ANY_MODE' + The bitsize of the largest mode on the target. + + The global variables 'byte_mode' and 'word_mode' contain modes whose +classes are 'MODE_INT' and whose bitsizes are either 'BITS_PER_UNIT' or +'BITS_PER_WORD', respectively. On 32-bit machines, these are 'QImode' +and 'SImode', respectively. + + +File: gccint.info, Node: Constants, Next: Regs and Memory, Prev: Machine Modes, Up: RTL + +13.7 Constant Expression Types +============================== + +The simplest RTL expressions are those that represent constant values. + +'(const_int I)' + This type of expression represents the integer value I. I is + customarily accessed with the macro 'INTVAL' as in 'INTVAL (EXP)', + which is equivalent to 'XWINT (EXP, 0)'. + + Constants generated for modes with fewer bits than in + 'HOST_WIDE_INT' must be sign extended to full width (e.g., with + 'gen_int_mode'). For constants for modes with more bits than in + 'HOST_WIDE_INT' the implied high order bits of that constant are + copies of the top bit. Note however that values are neither + inherently signed nor inherently unsigned; where necessary, + signedness is determined by the rtl operation instead. + + There is only one expression object for the integer value zero; it + is the value of the variable 'const0_rtx'. Likewise, the only + expression for integer value one is found in 'const1_rtx', the only + expression for integer value two is found in 'const2_rtx', and the + only expression for integer value negative one is found in + 'constm1_rtx'. Any attempt to create an expression of code + 'const_int' and value zero, one, two or negative one will return + 'const0_rtx', 'const1_rtx', 'const2_rtx' or 'constm1_rtx' as + appropriate. + + Similarly, there is only one object for the integer whose value is + 'STORE_FLAG_VALUE'. It is found in 'const_true_rtx'. If + 'STORE_FLAG_VALUE' is one, 'const_true_rtx' and 'const1_rtx' will + point to the same object. If 'STORE_FLAG_VALUE' is -1, + 'const_true_rtx' and 'constm1_rtx' will point to the same object. + +'(const_double:M I0 I1 ...)' + Represents either a floating-point constant of mode M or an integer + constant too large to fit into 'HOST_BITS_PER_WIDE_INT' bits but + small enough to fit within twice that number of bits (GCC does not + provide a mechanism to represent even larger constants). In the + latter case, M will be 'VOIDmode'. For integral values constants + for modes with more bits than twice the number in 'HOST_WIDE_INT' + the implied high order bits of that constant are copies of the top + bit of 'CONST_DOUBLE_HIGH'. Note however that integral values are + neither inherently signed nor inherently unsigned; where necessary, + signedness is determined by the rtl operation instead. + + If M is 'VOIDmode', the bits of the value are stored in I0 and I1. + I0 is customarily accessed with the macro 'CONST_DOUBLE_LOW' and I1 + with 'CONST_DOUBLE_HIGH'. + + If the constant is floating point (regardless of its precision), + then the number of integers used to store the value depends on the + size of 'REAL_VALUE_TYPE' (*note Floating Point::). The integers + represent a floating point number, but not precisely in the target + machine's or host machine's floating point format. To convert them + to the precise bit pattern used by the target machine, use the + macro 'REAL_VALUE_TO_TARGET_DOUBLE' and friends (*note Data + Output::). + +'(const_fixed:M ...)' + Represents a fixed-point constant of mode M. The operand is a data + structure of type 'struct fixed_value' and is accessed with the + macro 'CONST_FIXED_VALUE'. The high part of data is accessed with + 'CONST_FIXED_VALUE_HIGH'; the low part is accessed with + 'CONST_FIXED_VALUE_LOW'. + +'(const_vector:M [X0 X1 ...])' + Represents a vector constant. The square brackets stand for the + vector containing the constant elements. X0, X1 and so on are the + 'const_int', 'const_double' or 'const_fixed' elements. + + The number of units in a 'const_vector' is obtained with the macro + 'CONST_VECTOR_NUNITS' as in 'CONST_VECTOR_NUNITS (V)'. + + Individual elements in a vector constant are accessed with the + macro 'CONST_VECTOR_ELT' as in 'CONST_VECTOR_ELT (V, N)' where V is + the vector constant and N is the element desired. + +'(const_string STR)' + Represents a constant string with value STR. Currently this is + used only for insn attributes (*note Insn Attributes::) since + constant strings in C are placed in memory. + +'(symbol_ref:MODE SYMBOL)' + Represents the value of an assembler label for data. SYMBOL is a + string that describes the name of the assembler label. If it + starts with a '*', the label is the rest of SYMBOL not including + the '*'. Otherwise, the label is SYMBOL, usually prefixed with + '_'. + + The 'symbol_ref' contains a mode, which is usually 'Pmode'. + Usually that is the only mode for which a symbol is directly valid. + +'(label_ref:MODE LABEL)' + Represents the value of an assembler label for code. It contains + one operand, an expression, which must be a 'code_label' or a + 'note' of type 'NOTE_INSN_DELETED_LABEL' that appears in the + instruction sequence to identify the place where the label should + go. + + The reason for using a distinct expression type for code label + references is so that jump optimization can distinguish them. + + The 'label_ref' contains a mode, which is usually 'Pmode'. Usually + that is the only mode for which a label is directly valid. + +'(const:M EXP)' + Represents a constant that is the result of an assembly-time + arithmetic computation. The operand, EXP, is an expression that + contains only constants ('const_int', 'symbol_ref' and 'label_ref' + expressions) combined with 'plus' and 'minus'. However, not all + combinations are valid, since the assembler cannot do arbitrary + arithmetic on relocatable symbols. + + M should be 'Pmode'. + +'(high:M EXP)' + Represents the high-order bits of EXP, usually a 'symbol_ref'. The + number of bits is machine-dependent and is normally the number of + bits specified in an instruction that initializes the high order + bits of a register. It is used with 'lo_sum' to represent the + typical two-instruction sequence used in RISC machines to reference + a global memory location. + + M should be 'Pmode'. + + The macro 'CONST0_RTX (MODE)' refers to an expression with value 0 in +mode MODE. If mode MODE is of mode class 'MODE_INT', it returns +'const0_rtx'. If mode MODE is of mode class 'MODE_FLOAT', it returns a +'CONST_DOUBLE' expression in mode MODE. Otherwise, it returns a +'CONST_VECTOR' expression in mode MODE. Similarly, the macro +'CONST1_RTX (MODE)' refers to an expression with value 1 in mode MODE +and similarly for 'CONST2_RTX'. The 'CONST1_RTX' and 'CONST2_RTX' +macros are undefined for vector modes. + + +File: gccint.info, Node: Regs and Memory, Next: Arithmetic, Prev: Constants, Up: RTL + +13.8 Registers and Memory +========================= + +Here are the RTL expression types for describing access to machine +registers and to main memory. + +'(reg:M N)' + For small values of the integer N (those that are less than + 'FIRST_PSEUDO_REGISTER'), this stands for a reference to machine + register number N: a "hard register". For larger values of N, it + stands for a temporary value or "pseudo register". The compiler's + strategy is to generate code assuming an unlimited number of such + pseudo registers, and later convert them into hard registers or + into memory references. + + M is the machine mode of the reference. It is necessary because + machines can generally refer to each register in more than one + mode. For example, a register may contain a full word but there + may be instructions to refer to it as a half word or as a single + byte, as well as instructions to refer to it as a floating point + number of various precisions. + + Even for a register that the machine can access in only one mode, + the mode must always be specified. + + The symbol 'FIRST_PSEUDO_REGISTER' is defined by the machine + description, since the number of hard registers on the machine is + an invariant characteristic of the machine. Note, however, that + not all of the machine registers must be general registers. All + the machine registers that can be used for storage of data are + given hard register numbers, even those that can be used only in + certain instructions or can hold only certain types of data. + + A hard register may be accessed in various modes throughout one + function, but each pseudo register is given a natural mode and is + accessed only in that mode. When it is necessary to describe an + access to a pseudo register using a nonnatural mode, a 'subreg' + expression is used. + + A 'reg' expression with a machine mode that specifies more than one + word of data may actually stand for several consecutive registers. + If in addition the register number specifies a hardware register, + then it actually represents several consecutive hardware registers + starting with the specified one. + + Each pseudo register number used in a function's RTL code is + represented by a unique 'reg' expression. + + Some pseudo register numbers, those within the range of + 'FIRST_VIRTUAL_REGISTER' to 'LAST_VIRTUAL_REGISTER' only appear + during the RTL generation phase and are eliminated before the + optimization phases. These represent locations in the stack frame + that cannot be determined until RTL generation for the function has + been completed. The following virtual register numbers are + defined: + + 'VIRTUAL_INCOMING_ARGS_REGNUM' + This points to the first word of the incoming arguments passed + on the stack. Normally these arguments are placed there by + the caller, but the callee may have pushed some arguments that + were previously passed in registers. + + When RTL generation is complete, this virtual register is + replaced by the sum of the register given by + 'ARG_POINTER_REGNUM' and the value of 'FIRST_PARM_OFFSET'. + + 'VIRTUAL_STACK_VARS_REGNUM' + If 'FRAME_GROWS_DOWNWARD' is defined to a nonzero value, this + points to immediately above the first variable on the stack. + Otherwise, it points to the first variable on the stack. + + 'VIRTUAL_STACK_VARS_REGNUM' is replaced with the sum of the + register given by 'FRAME_POINTER_REGNUM' and the value + 'STARTING_FRAME_OFFSET'. + + 'VIRTUAL_STACK_DYNAMIC_REGNUM' + This points to the location of dynamically allocated memory on + the stack immediately after the stack pointer has been + adjusted by the amount of memory desired. + + This virtual register is replaced by the sum of the register + given by 'STACK_POINTER_REGNUM' and the value + 'STACK_DYNAMIC_OFFSET'. + + 'VIRTUAL_OUTGOING_ARGS_REGNUM' + This points to the location in the stack at which outgoing + arguments should be written when the stack is pre-pushed + (arguments pushed using push insns should always use + 'STACK_POINTER_REGNUM'). + + This virtual register is replaced by the sum of the register + given by 'STACK_POINTER_REGNUM' and the value + 'STACK_POINTER_OFFSET'. + +'(subreg:M1 REG:M2 BYTENUM)' + + 'subreg' expressions are used to refer to a register in a machine + mode other than its natural one, or to refer to one register of a + multi-part 'reg' that actually refers to several registers. + + Each pseudo register has a natural mode. If it is necessary to + operate on it in a different mode, the register must be enclosed in + a 'subreg'. + + There are currently three supported types for the first operand of + a 'subreg': + * pseudo registers This is the most common case. Most 'subreg's + have pseudo 'reg's as their first operand. + + * mem 'subreg's of 'mem' were common in earlier versions of GCC + and are still supported. During the reload pass these are + replaced by plain 'mem's. On machines that do not do + instruction scheduling, use of 'subreg's of 'mem' are still + used, but this is no longer recommended. Such 'subreg's are + considered to be 'register_operand's rather than + 'memory_operand's before and during reload. Because of this, + the scheduling passes cannot properly schedule instructions + with 'subreg's of 'mem', so for machines that do scheduling, + 'subreg's of 'mem' should never be used. To support this, the + combine and recog passes have explicit code to inhibit the + creation of 'subreg's of 'mem' when 'INSN_SCHEDULING' is + defined. + + The use of 'subreg's of 'mem' after the reload pass is an area + that is not well understood and should be avoided. There is + still some code in the compiler to support this, but this code + has possibly rotted. This use of 'subreg's is discouraged and + will most likely not be supported in the future. + + * hard registers It is seldom necessary to wrap hard registers + in 'subreg's; such registers would normally reduce to a single + 'reg' rtx. This use of 'subreg's is discouraged and may not + be supported in the future. + + 'subreg's of 'subreg's are not supported. Using + 'simplify_gen_subreg' is the recommended way to avoid this problem. + + 'subreg's come in two distinct flavors, each having its own usage + and rules: + + Paradoxical subregs + When M1 is strictly wider than M2, the 'subreg' expression is + called "paradoxical". The canonical test for this class of + 'subreg' is: + + GET_MODE_SIZE (M1) > GET_MODE_SIZE (M2) + + Paradoxical 'subreg's can be used as both lvalues and rvalues. + When used as an lvalue, the low-order bits of the source value + are stored in REG and the high-order bits are discarded. When + used as an rvalue, the low-order bits of the 'subreg' are + taken from REG while the high-order bits may or may not be + defined. + + The high-order bits of rvalues are in the following + circumstances: + + * 'subreg's of 'mem' When M2 is smaller than a word, the + macro 'LOAD_EXTEND_OP', can control how the high-order + bits are defined. + + * 'subreg' of 'reg's The upper bits are defined when + 'SUBREG_PROMOTED_VAR_P' is true. + 'SUBREG_PROMOTED_UNSIGNED_P' describes what the upper + bits hold. Such subregs usually represent local + variables, register variables and parameter pseudo + variables that have been promoted to a wider mode. + + BYTENUM is always zero for a paradoxical 'subreg', even on + big-endian targets. + + For example, the paradoxical 'subreg': + + (set (subreg:SI (reg:HI X) 0) Y) + + stores the lower 2 bytes of Y in X and discards the upper 2 + bytes. A subsequent: + + (set Z (subreg:SI (reg:HI X) 0)) + + would set the lower two bytes of Z to Y and set the upper two + bytes to an unknown value assuming 'SUBREG_PROMOTED_VAR_P' is + false. + + Normal subregs + When M1 is at least as narrow as M2 the 'subreg' expression is + called "normal". + + Normal 'subreg's restrict consideration to certain bits of + REG. There are two cases. If M1 is smaller than a word, the + 'subreg' refers to the least-significant part (or "lowpart") + of one word of REG. If M1 is word-sized or greater, the + 'subreg' refers to one or more complete words. + + When used as an lvalue, 'subreg' is a word-based accessor. + Storing to a 'subreg' modifies all the words of REG that + overlap the 'subreg', but it leaves the other words of REG + alone. + + When storing to a normal 'subreg' that is smaller than a word, + the other bits of the referenced word are usually left in an + undefined state. This laxity makes it easier to generate + efficient code for such instructions. To represent an + instruction that preserves all the bits outside of those in + the 'subreg', use 'strict_low_part' or 'zero_extract' around + the 'subreg'. + + BYTENUM must identify the offset of the first byte of the + 'subreg' from the start of REG, assuming that REG is laid out + in memory order. The memory order of bytes is defined by two + target macros, 'WORDS_BIG_ENDIAN' and 'BYTES_BIG_ENDIAN': + + * 'WORDS_BIG_ENDIAN', if set to 1, says that byte number + zero is part of the most significant word; otherwise, it + is part of the least significant word. + + * 'BYTES_BIG_ENDIAN', if set to 1, says that byte number + zero is the most significant byte within a word; + otherwise, it is the least significant byte within a + word. + + On a few targets, 'FLOAT_WORDS_BIG_ENDIAN' disagrees with + 'WORDS_BIG_ENDIAN'. However, most parts of the compiler treat + floating point values as if they had the same endianness as + integer values. This works because they handle them solely as + a collection of integer values, with no particular numerical + value. Only real.c and the runtime libraries care about + 'FLOAT_WORDS_BIG_ENDIAN'. + + Thus, + + (subreg:HI (reg:SI X) 2) + + on a 'BYTES_BIG_ENDIAN', 'UNITS_PER_WORD == 4' target is the + same as + + (subreg:HI (reg:SI X) 0) + + on a little-endian, 'UNITS_PER_WORD == 4' target. Both + 'subreg's access the lower two bytes of register X. + + A 'MODE_PARTIAL_INT' mode behaves as if it were as wide as the + corresponding 'MODE_INT' mode, except that it has an unknown number + of undefined bits. For example: + + (subreg:PSI (reg:SI 0) 0) + + accesses the whole of '(reg:SI 0)', but the exact relationship + between the 'PSImode' value and the 'SImode' value is not defined. + If we assume 'UNITS_PER_WORD <= 4', then the following two + 'subreg's: + + (subreg:PSI (reg:DI 0) 0) + (subreg:PSI (reg:DI 0) 4) + + represent independent 4-byte accesses to the two halves of '(reg:DI + 0)'. Both 'subreg's have an unknown number of undefined bits. + + If 'UNITS_PER_WORD <= 2' then these two 'subreg's: + + (subreg:HI (reg:PSI 0) 0) + (subreg:HI (reg:PSI 0) 2) + + represent independent 2-byte accesses that together span the whole + of '(reg:PSI 0)'. Storing to the first 'subreg' does not affect + the value of the second, and vice versa. '(reg:PSI 0)' has an + unknown number of undefined bits, so the assignment: + + (set (subreg:HI (reg:PSI 0) 0) (reg:HI 4)) + + does not guarantee that '(subreg:HI (reg:PSI 0) 0)' has the value + '(reg:HI 4)'. + + The rules above apply to both pseudo REGs and hard REGs. If the + semantics are not correct for particular combinations of M1, M2 and + hard REG, the target-specific code must ensure that those + combinations are never used. For example: + + CANNOT_CHANGE_MODE_CLASS (M2, M1, CLASS) + + must be true for every class CLASS that includes REG. + + The first operand of a 'subreg' expression is customarily accessed + with the 'SUBREG_REG' macro and the second operand is customarily + accessed with the 'SUBREG_BYTE' macro. + + It has been several years since a platform in which + 'BYTES_BIG_ENDIAN' not equal to 'WORDS_BIG_ENDIAN' has been tested. + Anyone wishing to support such a platform in the future may be + confronted with code rot. + +'(scratch:M)' + This represents a scratch register that will be required for the + execution of a single instruction and not used subsequently. It is + converted into a 'reg' by either the local register allocator or + the reload pass. + + 'scratch' is usually present inside a 'clobber' operation (*note + Side Effects::). + +'(cc0)' + This refers to the machine's condition code register. It has no + operands and may not have a machine mode. There are two ways to + use it: + + * To stand for a complete set of condition code flags. This is + best on most machines, where each comparison sets the entire + series of flags. + + With this technique, '(cc0)' may be validly used in only two + contexts: as the destination of an assignment (in test and + compare instructions) and in comparison operators comparing + against zero ('const_int' with value zero; that is to say, + 'const0_rtx'). + + * To stand for a single flag that is the result of a single + condition. This is useful on machines that have only a single + flag bit, and in which comparison instructions must specify + the condition to test. + + With this technique, '(cc0)' may be validly used in only two + contexts: as the destination of an assignment (in test and + compare instructions) where the source is a comparison + operator, and as the first operand of 'if_then_else' (in a + conditional branch). + + There is only one expression object of code 'cc0'; it is the value + of the variable 'cc0_rtx'. Any attempt to create an expression of + code 'cc0' will return 'cc0_rtx'. + + Instructions can set the condition code implicitly. On many + machines, nearly all instructions set the condition code based on + the value that they compute or store. It is not necessary to + record these actions explicitly in the RTL because the machine + description includes a prescription for recognizing the + instructions that do so (by means of the macro 'NOTICE_UPDATE_CC'). + *Note Condition Code::. Only instructions whose sole purpose is to + set the condition code, and instructions that use the condition + code, need mention '(cc0)'. + + On some machines, the condition code register is given a register + number and a 'reg' is used instead of '(cc0)'. This is usually the + preferable approach if only a small subset of instructions modify + the condition code. Other machines store condition codes in + general registers; in such cases a pseudo register should be used. + + Some machines, such as the SPARC and RS/6000, have two sets of + arithmetic instructions, one that sets and one that does not set + the condition code. This is best handled by normally generating + the instruction that does not set the condition code, and making a + pattern that both performs the arithmetic and sets the condition + code register (which would not be '(cc0)' in this case). For + examples, search for 'addcc' and 'andcc' in 'sparc.md'. + +'(pc)' + This represents the machine's program counter. It has no operands + and may not have a machine mode. '(pc)' may be validly used only + in certain specific contexts in jump instructions. + + There is only one expression object of code 'pc'; it is the value + of the variable 'pc_rtx'. Any attempt to create an expression of + code 'pc' will return 'pc_rtx'. + + All instructions that do not jump alter the program counter + implicitly by incrementing it, but there is no need to mention this + in the RTL. + +'(mem:M ADDR ALIAS)' + This RTX represents a reference to main memory at an address + represented by the expression ADDR. M specifies how large a unit + of memory is accessed. ALIAS specifies an alias set for the + reference. In general two items are in different alias sets if + they cannot reference the same memory address. + + The construct '(mem:BLK (scratch))' is considered to alias all + other memories. Thus it may be used as a memory barrier in + epilogue stack deallocation patterns. + +'(concatM RTX RTX)' + This RTX represents the concatenation of two other RTXs. This is + used for complex values. It should only appear in the RTL attached + to declarations and during RTL generation. It should not appear in + the ordinary insn chain. + +'(concatnM [RTX ...])' + This RTX represents the concatenation of all the RTX to make a + single value. Like 'concat', this should only appear in + declarations, and not in the insn chain. + + +File: gccint.info, Node: Arithmetic, Next: Comparisons, Prev: Regs and Memory, Up: RTL + +13.9 RTL Expressions for Arithmetic +=================================== + +Unless otherwise specified, all the operands of arithmetic expressions +must be valid for mode M. An operand is valid for mode M if it has mode +M, or if it is a 'const_int' or 'const_double' and M is a mode of class +'MODE_INT'. + + For commutative binary operations, constants should be placed in the +second operand. + +'(plus:M X Y)' +'(ss_plus:M X Y)' +'(us_plus:M X Y)' + + These three expressions all represent the sum of the values + represented by X and Y carried out in machine mode M. They differ + in their behavior on overflow of integer modes. 'plus' wraps round + modulo the width of M; 'ss_plus' saturates at the maximum signed + value representable in M; 'us_plus' saturates at the maximum + unsigned value. + +'(lo_sum:M X Y)' + + This expression represents the sum of X and the low-order bits of + Y. It is used with 'high' (*note Constants::) to represent the + typical two-instruction sequence used in RISC machines to reference + a global memory location. + + The number of low order bits is machine-dependent but is normally + the number of bits in a 'Pmode' item minus the number of bits set + by 'high'. + + M should be 'Pmode'. + +'(minus:M X Y)' +'(ss_minus:M X Y)' +'(us_minus:M X Y)' + + These three expressions represent the result of subtracting Y from + X, carried out in mode M. Behavior on overflow is the same as for + the three variants of 'plus' (see above). + +'(compare:M X Y)' + Represents the result of subtracting Y from X for purposes of + comparison. The result is computed without overflow, as if with + infinite precision. + + Of course, machines can't really subtract with infinite precision. + However, they can pretend to do so when only the sign of the result + will be used, which is the case when the result is stored in the + condition code. And that is the _only_ way this kind of expression + may validly be used: as a value to be stored in the condition + codes, either '(cc0)' or a register. *Note Comparisons::. + + The mode M is not related to the modes of X and Y, but instead is + the mode of the condition code value. If '(cc0)' is used, it is + 'VOIDmode'. Otherwise it is some mode in class 'MODE_CC', often + 'CCmode'. *Note Condition Code::. If M is 'VOIDmode' or 'CCmode', + the operation returns sufficient information (in an unspecified + format) so that any comparison operator can be applied to the + result of the 'COMPARE' operation. For other modes in class + 'MODE_CC', the operation only returns a subset of this information. + + Normally, X and Y must have the same mode. Otherwise, 'compare' is + valid only if the mode of X is in class 'MODE_INT' and Y is a + 'const_int' or 'const_double' with mode 'VOIDmode'. The mode of X + determines what mode the comparison is to be done in; thus it must + not be 'VOIDmode'. + + If one of the operands is a constant, it should be placed in the + second operand and the comparison code adjusted as appropriate. + + A 'compare' specifying two 'VOIDmode' constants is not valid since + there is no way to know in what mode the comparison is to be + performed; the comparison must either be folded during the + compilation or the first operand must be loaded into a register + while its mode is still known. + +'(neg:M X)' +'(ss_neg:M X)' +'(us_neg:M X)' + These two expressions represent the negation (subtraction from + zero) of the value represented by X, carried out in mode M. They + differ in the behavior on overflow of integer modes. In the case + of 'neg', the negation of the operand may be a number not + representable in mode M, in which case it is truncated to M. + 'ss_neg' and 'us_neg' ensure that an out-of-bounds result saturates + to the maximum or minimum signed or unsigned value. + +'(mult:M X Y)' +'(ss_mult:M X Y)' +'(us_mult:M X Y)' + Represents the signed product of the values represented by X and Y + carried out in machine mode M. 'ss_mult' and 'us_mult' ensure that + an out-of-bounds result saturates to the maximum or minimum signed + or unsigned value. + + Some machines support a multiplication that generates a product + wider than the operands. Write the pattern for this as + + (mult:M (sign_extend:M X) (sign_extend:M Y)) + + where M is wider than the modes of X and Y, which need not be the + same. + + For unsigned widening multiplication, use the same idiom, but with + 'zero_extend' instead of 'sign_extend'. + +'(fma:M X Y Z)' + Represents the 'fma', 'fmaf', and 'fmal' builtin functions that do + a combined multiply of X and Y and then adding toZ without doing an + intermediate rounding step. + +'(div:M X Y)' +'(ss_div:M X Y)' + Represents the quotient in signed division of X by Y, carried out + in machine mode M. If M is a floating point mode, it represents + the exact quotient; otherwise, the integerized quotient. 'ss_div' + ensures that an out-of-bounds result saturates to the maximum or + minimum signed value. + + Some machines have division instructions in which the operands and + quotient widths are not all the same; you should represent such + instructions using 'truncate' and 'sign_extend' as in, + + (truncate:M1 (div:M2 X (sign_extend:M2 Y))) + +'(udiv:M X Y)' +'(us_div:M X Y)' + Like 'div' but represents unsigned division. 'us_div' ensures that + an out-of-bounds result saturates to the maximum or minimum + unsigned value. + +'(mod:M X Y)' +'(umod:M X Y)' + Like 'div' and 'udiv' but represent the remainder instead of the + quotient. + +'(smin:M X Y)' +'(smax:M X Y)' + Represents the smaller (for 'smin') or larger (for 'smax') of X and + Y, interpreted as signed values in mode M. When used with floating + point, if both operands are zeros, or if either operand is 'NaN', + then it is unspecified which of the two operands is returned as the + result. + +'(umin:M X Y)' +'(umax:M X Y)' + Like 'smin' and 'smax', but the values are interpreted as unsigned + integers. + +'(not:M X)' + Represents the bitwise complement of the value represented by X, + carried out in mode M, which must be a fixed-point machine mode. + +'(and:M X Y)' + Represents the bitwise logical-and of the values represented by X + and Y, carried out in machine mode M, which must be a fixed-point + machine mode. + +'(ior:M X Y)' + Represents the bitwise inclusive-or of the values represented by X + and Y, carried out in machine mode M, which must be a fixed-point + mode. + +'(xor:M X Y)' + Represents the bitwise exclusive-or of the values represented by X + and Y, carried out in machine mode M, which must be a fixed-point + mode. + +'(ashift:M X C)' +'(ss_ashift:M X C)' +'(us_ashift:M X C)' + These three expressions represent the result of arithmetically + shifting X left by C places. They differ in their behavior on + overflow of integer modes. An 'ashift' operation is a plain shift + with no special behavior in case of a change in the sign bit; + 'ss_ashift' and 'us_ashift' saturates to the minimum or maximum + representable value if any of the bits shifted out differs from the + final sign bit. + + X have mode M, a fixed-point machine mode. C be a fixed-point mode + or be a constant with mode 'VOIDmode'; which mode is determined by + the mode called for in the machine description entry for the + left-shift instruction. For example, on the VAX, the mode of C is + 'QImode' regardless of M. + +'(lshiftrt:M X C)' +'(ashiftrt:M X C)' + Like 'ashift' but for right shift. Unlike the case for left shift, + these two operations are distinct. + +'(rotate:M X C)' +'(rotatert:M X C)' + Similar but represent left and right rotate. If C is a constant, + use 'rotate'. + +'(abs:M X)' +'(ss_abs:M X)' + Represents the absolute value of X, computed in mode M. 'ss_abs' + ensures that an out-of-bounds result saturates to the maximum + signed value. + +'(sqrt:M X)' + Represents the square root of X, computed in mode M. Most often M + will be a floating point mode. + +'(ffs:M X)' + Represents one plus the index of the least significant 1-bit in X, + represented as an integer of mode M. (The value is zero if X is + zero.) The mode of X must be M or 'VOIDmode'. + +'(clrsb:M X)' + Represents the number of redundant leading sign bits in X, + represented as an integer of mode M, starting at the most + significant bit position. This is one less than the number of + leading sign bits (either 0 or 1), with no special cases. The mode + of X must be M or 'VOIDmode'. + +'(clz:M X)' + Represents the number of leading 0-bits in X, represented as an + integer of mode M, starting at the most significant bit position. + If X is zero, the value is determined by + 'CLZ_DEFINED_VALUE_AT_ZERO' (*note Misc::). Note that this is one + of the few expressions that is not invariant under widening. The + mode of X must be M or 'VOIDmode'. + +'(ctz:M X)' + Represents the number of trailing 0-bits in X, represented as an + integer of mode M, starting at the least significant bit position. + If X is zero, the value is determined by + 'CTZ_DEFINED_VALUE_AT_ZERO' (*note Misc::). Except for this case, + 'ctz(x)' is equivalent to 'ffs(X) - 1'. The mode of X must be M or + 'VOIDmode'. + +'(popcount:M X)' + Represents the number of 1-bits in X, represented as an integer of + mode M. The mode of X must be M or 'VOIDmode'. + +'(parity:M X)' + Represents the number of 1-bits modulo 2 in X, represented as an + integer of mode M. The mode of X must be M or 'VOIDmode'. + +'(bswap:M X)' + Represents the value X with the order of bytes reversed, carried + out in mode M, which must be a fixed-point machine mode. The mode + of X must be M or 'VOIDmode'. + + +File: gccint.info, Node: Comparisons, Next: Bit-Fields, Prev: Arithmetic, Up: RTL + +13.10 Comparison Operations +=========================== + +Comparison operators test a relation on two operands and are considered +to represent a machine-dependent nonzero value described by, but not +necessarily equal to, 'STORE_FLAG_VALUE' (*note Misc::) if the relation +holds, or zero if it does not, for comparison operators whose results +have a 'MODE_INT' mode, 'FLOAT_STORE_FLAG_VALUE' (*note Misc::) if the +relation holds, or zero if it does not, for comparison operators that +return floating-point values, and a vector of either +'VECTOR_STORE_FLAG_VALUE' (*note Misc::) if the relation holds, or of +zeros if it does not, for comparison operators that return vector +results. The mode of the comparison operation is independent of the +mode of the data being compared. If the comparison operation is being +tested (e.g., the first operand of an 'if_then_else'), the mode must be +'VOIDmode'. + + There are two ways that comparison operations may be used. The +comparison operators may be used to compare the condition codes '(cc0)' +against zero, as in '(eq (cc0) (const_int 0))'. Such a construct +actually refers to the result of the preceding instruction in which the +condition codes were set. The instruction setting the condition code +must be adjacent to the instruction using the condition code; only +'note' insns may separate them. + + Alternatively, a comparison operation may directly compare two data +objects. The mode of the comparison is determined by the operands; they +must both be valid for a common machine mode. A comparison with both +operands constant would be invalid as the machine mode could not be +deduced from it, but such a comparison should never exist in RTL due to +constant folding. + + In the example above, if '(cc0)' were last set to '(compare X Y)', the +comparison operation is identical to '(eq X Y)'. Usually only one style +of comparisons is supported on a particular machine, but the combine +pass will try to merge the operations to produce the 'eq' shown in case +it exists in the context of the particular insn involved. + + Inequality comparisons come in two flavors, signed and unsigned. Thus, +there are distinct expression codes 'gt' and 'gtu' for signed and +unsigned greater-than. These can produce different results for the same +pair of integer values: for example, 1 is signed greater-than -1 but not +unsigned greater-than, because -1 when regarded as unsigned is actually +'0xffffffff' which is greater than 1. + + The signed comparisons are also used for floating point values. +Floating point comparisons are distinguished by the machine modes of the +operands. + +'(eq:M X Y)' + 'STORE_FLAG_VALUE' if the values represented by X and Y are equal, + otherwise 0. + +'(ne:M X Y)' + 'STORE_FLAG_VALUE' if the values represented by X and Y are not + equal, otherwise 0. + +'(gt:M X Y)' + 'STORE_FLAG_VALUE' if the X is greater than Y. If they are + fixed-point, the comparison is done in a signed sense. + +'(gtu:M X Y)' + Like 'gt' but does unsigned comparison, on fixed-point numbers + only. + +'(lt:M X Y)' +'(ltu:M X Y)' + Like 'gt' and 'gtu' but test for "less than". + +'(ge:M X Y)' +'(geu:M X Y)' + Like 'gt' and 'gtu' but test for "greater than or equal". + +'(le:M X Y)' +'(leu:M X Y)' + Like 'gt' and 'gtu' but test for "less than or equal". + +'(if_then_else COND THEN ELSE)' + This is not a comparison operation but is listed here because it is + always used in conjunction with a comparison operation. To be + precise, COND is a comparison expression. This expression + represents a choice, according to COND, between the value + represented by THEN and the one represented by ELSE. + + On most machines, 'if_then_else' expressions are valid only to + express conditional jumps. + +'(cond [TEST1 VALUE1 TEST2 VALUE2 ...] DEFAULT)' + Similar to 'if_then_else', but more general. Each of TEST1, TEST2, + ... is performed in turn. The result of this expression is the + VALUE corresponding to the first nonzero test, or DEFAULT if none + of the tests are nonzero expressions. + + This is currently not valid for instruction patterns and is + supported only for insn attributes. *Note Insn Attributes::. + + +File: gccint.info, Node: Bit-Fields, Next: Vector Operations, Prev: Comparisons, Up: RTL + +13.11 Bit-Fields +================ + +Special expression codes exist to represent bit-field instructions. + +'(sign_extract:M LOC SIZE POS)' + This represents a reference to a sign-extended bit-field contained + or starting in LOC (a memory or register reference). The bit-field + is SIZE bits wide and starts at bit POS. The compilation option + 'BITS_BIG_ENDIAN' says which end of the memory unit POS counts + from. + + If LOC is in memory, its mode must be a single-byte integer mode. + If LOC is in a register, the mode to use is specified by the + operand of the 'insv' or 'extv' pattern (*note Standard Names::) + and is usually a full-word integer mode, which is the default if + none is specified. + + The mode of POS is machine-specific and is also specified in the + 'insv' or 'extv' pattern. + + The mode M is the same as the mode that would be used for LOC if it + were a register. + + A 'sign_extract' can not appear as an lvalue, or part thereof, in + RTL. + +'(zero_extract:M LOC SIZE POS)' + Like 'sign_extract' but refers to an unsigned or zero-extended + bit-field. The same sequence of bits are extracted, but they are + filled to an entire word with zeros instead of by sign-extension. + + Unlike 'sign_extract', this type of expressions can be lvalues in + RTL; they may appear on the left side of an assignment, indicating + insertion of a value into the specified bit-field. + + +File: gccint.info, Node: Vector Operations, Next: Conversions, Prev: Bit-Fields, Up: RTL + +13.12 Vector Operations +======================= + +All normal RTL expressions can be used with vector modes; they are +interpreted as operating on each part of the vector independently. +Additionally, there are a few new expressions to describe specific +vector operations. + +'(vec_merge:M VEC1 VEC2 ITEMS)' + This describes a merge operation between two vectors. The result + is a vector of mode M; its elements are selected from either VEC1 + or VEC2. Which elements are selected is described by ITEMS, which + is a bit mask represented by a 'const_int'; a zero bit indicates + the corresponding element in the result vector is taken from VEC2 + while a set bit indicates it is taken from VEC1. + +'(vec_select:M VEC1 SELECTION)' + This describes an operation that selects parts of a vector. VEC1 + is the source vector, and SELECTION is a 'parallel' that contains a + 'const_int' for each of the subparts of the result vector, giving + the number of the source subpart that should be stored into it. + The result mode M is either the submode for a single element of + VEC1 (if only one subpart is selected), or another vector mode with + that element submode (if multiple subparts are selected). + +'(vec_concat:M X1 X2)' + Describes a vector concat operation. The result is a concatenation + of the vectors or scalars X1 and X2; its length is the sum of the + lengths of the two inputs. + +'(vec_duplicate:M X)' + This operation converts a scalar into a vector or a small vector + into a larger one by duplicating the input values. The output + vector mode must have the same submodes as the input vector mode or + the scalar modes, and the number of output parts must be an integer + multiple of the number of input parts. + + +File: gccint.info, Node: Conversions, Next: RTL Declarations, Prev: Vector Operations, Up: RTL + +13.13 Conversions +================= + +All conversions between machine modes must be represented by explicit +conversion operations. For example, an expression which is the sum of a +byte and a full word cannot be written as '(plus:SI (reg:QI 34) (reg:SI +80))' because the 'plus' operation requires two operands of the same +machine mode. Therefore, the byte-sized operand is enclosed in a +conversion operation, as in + + (plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80)) + + The conversion operation is not a mere placeholder, because there may +be more than one way of converting from a given starting mode to the +desired final mode. The conversion operation code says how to do it. + + For all conversion operations, X must not be 'VOIDmode' because the +mode in which to do the conversion would not be known. The conversion +must either be done at compile-time or X must be placed into a register. + +'(sign_extend:M X)' + Represents the result of sign-extending the value X to machine mode + M. M must be a fixed-point mode and X a fixed-point value of a + mode narrower than M. + +'(zero_extend:M X)' + Represents the result of zero-extending the value X to machine mode + M. M must be a fixed-point mode and X a fixed-point value of a + mode narrower than M. + +'(float_extend:M X)' + Represents the result of extending the value X to machine mode M. + M must be a floating point mode and X a floating point value of a + mode narrower than M. + +'(truncate:M X)' + Represents the result of truncating the value X to machine mode M. + M must be a fixed-point mode and X a fixed-point value of a mode + wider than M. + +'(ss_truncate:M X)' + Represents the result of truncating the value X to machine mode M, + using signed saturation in the case of overflow. Both M and the + mode of X must be fixed-point modes. + +'(us_truncate:M X)' + Represents the result of truncating the value X to machine mode M, + using unsigned saturation in the case of overflow. Both M and the + mode of X must be fixed-point modes. + +'(float_truncate:M X)' + Represents the result of truncating the value X to machine mode M. + M must be a floating point mode and X a floating point value of a + mode wider than M. + +'(float:M X)' + Represents the result of converting fixed point value X, regarded + as signed, to floating point mode M. + +'(unsigned_float:M X)' + Represents the result of converting fixed point value X, regarded + as unsigned, to floating point mode M. + +'(fix:M X)' + When M is a floating-point mode, represents the result of + converting floating point value X (valid for mode M) to an integer, + still represented in floating point mode M, by rounding towards + zero. + + When M is a fixed-point mode, represents the result of converting + floating point value X to mode M, regarded as signed. How rounding + is done is not specified, so this operation may be used validly in + compiling C code only for integer-valued operands. + +'(unsigned_fix:M X)' + Represents the result of converting floating point value X to fixed + point mode M, regarded as unsigned. How rounding is done is not + specified. + +'(fract_convert:M X)' + Represents the result of converting fixed-point value X to + fixed-point mode M, signed integer value X to fixed-point mode M, + floating-point value X to fixed-point mode M, fixed-point value X + to integer mode M regarded as signed, or fixed-point value X to + floating-point mode M. When overflows or underflows happen, the + results are undefined. + +'(sat_fract:M X)' + Represents the result of converting fixed-point value X to + fixed-point mode M, signed integer value X to fixed-point mode M, + or floating-point value X to fixed-point mode M. When overflows or + underflows happen, the results are saturated to the maximum or the + minimum. + +'(unsigned_fract_convert:M X)' + Represents the result of converting fixed-point value X to integer + mode M regarded as unsigned, or unsigned integer value X to + fixed-point mode M. When overflows or underflows happen, the + results are undefined. + +'(unsigned_sat_fract:M X)' + Represents the result of converting unsigned integer value X to + fixed-point mode M. When overflows or underflows happen, the + results are saturated to the maximum or the minimum. + + +File: gccint.info, Node: RTL Declarations, Next: Side Effects, Prev: Conversions, Up: RTL + +13.14 Declarations +================== + +Declaration expression codes do not represent arithmetic operations but +rather state assertions about their operands. + +'(strict_low_part (subreg:M (reg:N R) 0))' + This expression code is used in only one context: as the + destination operand of a 'set' expression. In addition, the + operand of this expression must be a non-paradoxical 'subreg' + expression. + + The presence of 'strict_low_part' says that the part of the + register which is meaningful in mode N, but is not part of mode M, + is not to be altered. Normally, an assignment to such a subreg is + allowed to have undefined effects on the rest of the register when + M is less than a word. + + +File: gccint.info, Node: Side Effects, Next: Incdec, Prev: RTL Declarations, Up: RTL + +13.15 Side Effect Expressions +============================= + +The expression codes described so far represent values, not actions. +But machine instructions never produce values; they are meaningful only +for their side effects on the state of the machine. Special expression +codes are used to represent side effects. + + The body of an instruction is always one of these side effect codes; +the codes described above, which represent values, appear only as the +operands of these. + +'(set LVAL X)' + Represents the action of storing the value of X into the place + represented by LVAL. LVAL must be an expression representing a + place that can be stored in: 'reg' (or 'subreg', 'strict_low_part' + or 'zero_extract'), 'mem', 'pc', 'parallel', or 'cc0'. + + If LVAL is a 'reg', 'subreg' or 'mem', it has a machine mode; then + X must be valid for that mode. + + If LVAL is a 'reg' whose machine mode is less than the full width + of the register, then it means that the part of the register + specified by the machine mode is given the specified value and the + rest of the register receives an undefined value. Likewise, if + LVAL is a 'subreg' whose machine mode is narrower than the mode of + the register, the rest of the register can be changed in an + undefined way. + + If LVAL is a 'strict_low_part' of a subreg, then the part of the + register specified by the machine mode of the 'subreg' is given the + value X and the rest of the register is not changed. + + If LVAL is a 'zero_extract', then the referenced part of the + bit-field (a memory or register reference) specified by the + 'zero_extract' is given the value X and the rest of the bit-field + is not changed. Note that 'sign_extract' can not appear in LVAL. + + If LVAL is '(cc0)', it has no machine mode, and X may be either a + 'compare' expression or a value that may have any mode. The latter + case represents a "test" instruction. The expression '(set (cc0) + (reg:M N))' is equivalent to '(set (cc0) (compare (reg:M N) + (const_int 0)))'. Use the former expression to save space during + the compilation. + + If LVAL is a 'parallel', it is used to represent the case of a + function returning a structure in multiple registers. Each element + of the 'parallel' is an 'expr_list' whose first operand is a 'reg' + and whose second operand is a 'const_int' representing the offset + (in bytes) into the structure at which the data in that register + corresponds. The first element may be null to indicate that the + structure is also passed partly in memory. + + If LVAL is '(pc)', we have a jump instruction, and the + possibilities for X are very limited. It may be a 'label_ref' + expression (unconditional jump). It may be an 'if_then_else' + (conditional jump), in which case either the second or the third + operand must be '(pc)' (for the case which does not jump) and the + other of the two must be a 'label_ref' (for the case which does + jump). X may also be a 'mem' or '(plus:SI (pc) Y)', where Y may be + a 'reg' or a 'mem'; these unusual patterns are used to represent + jumps through branch tables. + + If LVAL is neither '(cc0)' nor '(pc)', the mode of LVAL must not be + 'VOIDmode' and the mode of X must be valid for the mode of LVAL. + + LVAL is customarily accessed with the 'SET_DEST' macro and X with + the 'SET_SRC' macro. + +'(return)' + As the sole expression in a pattern, represents a return from the + current function, on machines where this can be done with one + instruction, such as VAXen. On machines where a multi-instruction + "epilogue" must be executed in order to return from the function, + returning is done by jumping to a label which precedes the + epilogue, and the 'return' expression code is never used. + + Inside an 'if_then_else' expression, represents the value to be + placed in 'pc' to return to the caller. + + Note that an insn pattern of '(return)' is logically equivalent to + '(set (pc) (return))', but the latter form is never used. + +'(simple_return)' + Like '(return)', but truly represents only a function return, while + '(return)' may represent an insn that also performs other functions + of the function epilogue. Like '(return)', this may also occur in + conditional jumps. + +'(call FUNCTION NARGS)' + Represents a function call. FUNCTION is a 'mem' expression whose + address is the address of the function to be called. NARGS is an + expression which can be used for two purposes: on some machines it + represents the number of bytes of stack argument; on others, it + represents the number of argument registers. + + Each machine has a standard machine mode which FUNCTION must have. + The machine description defines macro 'FUNCTION_MODE' to expand + into the requisite mode name. The purpose of this mode is to + specify what kind of addressing is allowed, on machines where the + allowed kinds of addressing depend on the machine mode being + addressed. + +'(clobber X)' + Represents the storing or possible storing of an unpredictable, + undescribed value into X, which must be a 'reg', 'scratch', + 'parallel' or 'mem' expression. + + One place this is used is in string instructions that store + standard values into particular hard registers. It may not be + worth the trouble to describe the values that are stored, but it is + essential to inform the compiler that the registers will be + altered, lest it attempt to keep data in them across the string + instruction. + + If X is '(mem:BLK (const_int 0))' or '(mem:BLK (scratch))', it + means that all memory locations must be presumed clobbered. If X + is a 'parallel', it has the same meaning as a 'parallel' in a 'set' + expression. + + Note that the machine description classifies certain hard registers + as "call-clobbered". All function call instructions are assumed by + default to clobber these registers, so there is no need to use + 'clobber' expressions to indicate this fact. Also, each function + call is assumed to have the potential to alter any memory location, + unless the function is declared 'const'. + + If the last group of expressions in a 'parallel' are each a + 'clobber' expression whose arguments are 'reg' or 'match_scratch' + (*note RTL Template::) expressions, the combiner phase can add the + appropriate 'clobber' expressions to an insn it has constructed + when doing so will cause a pattern to be matched. + + This feature can be used, for example, on a machine that whose + multiply and add instructions don't use an MQ register but which + has an add-accumulate instruction that does clobber the MQ + register. Similarly, a combined instruction might require a + temporary register while the constituent instructions might not. + + When a 'clobber' expression for a register appears inside a + 'parallel' with other side effects, the register allocator + guarantees that the register is unoccupied both before and after + that insn if it is a hard register clobber. For pseudo-register + clobber, the register allocator and the reload pass do not assign + the same hard register to the clobber and the input operands if + there is an insn alternative containing the '&' constraint (*note + Modifiers::) for the clobber and the hard register is in register + classes of the clobber in the alternative. You can clobber either + a specific hard register, a pseudo register, or a 'scratch' + expression; in the latter two cases, GCC will allocate a hard + register that is available there for use as a temporary. + + For instructions that require a temporary register, you should use + 'scratch' instead of a pseudo-register because this will allow the + combiner phase to add the 'clobber' when required. You do this by + coding ('clobber' ('match_scratch' ...)). If you do clobber a + pseudo register, use one which appears nowhere else--generate a new + one each time. Otherwise, you may confuse CSE. + + There is one other known use for clobbering a pseudo register in a + 'parallel': when one of the input operands of the insn is also + clobbered by the insn. In this case, using the same pseudo + register in the clobber and elsewhere in the insn produces the + expected results. + +'(use X)' + Represents the use of the value of X. It indicates that the value + in X at this point in the program is needed, even though it may not + be apparent why this is so. Therefore, the compiler will not + attempt to delete previous instructions whose only effect is to + store a value in X. X must be a 'reg' expression. + + In some situations, it may be tempting to add a 'use' of a register + in a 'parallel' to describe a situation where the value of a + special register will modify the behavior of the instruction. A + hypothetical example might be a pattern for an addition that can + either wrap around or use saturating addition depending on the + value of a special control register: + + (parallel [(set (reg:SI 2) (unspec:SI [(reg:SI 3) + (reg:SI 4)] 0)) + (use (reg:SI 1))]) + + This will not work, several of the optimizers only look at + expressions locally; it is very likely that if you have multiple + insns with identical inputs to the 'unspec', they will be optimized + away even if register 1 changes in between. + + This means that 'use' can _only_ be used to describe that the + register is live. You should think twice before adding 'use' + statements, more often you will want to use 'unspec' instead. The + 'use' RTX is most commonly useful to describe that a fixed register + is implicitly used in an insn. It is also safe to use in patterns + where the compiler knows for other reasons that the result of the + whole pattern is variable, such as 'movmemM' or 'call' patterns. + + During the reload phase, an insn that has a 'use' as pattern can + carry a reg_equal note. These 'use' insns will be deleted before + the reload phase exits. + + During the delayed branch scheduling phase, X may be an insn. This + indicates that X previously was located at this place in the code + and its data dependencies need to be taken into account. These + 'use' insns will be deleted before the delayed branch scheduling + phase exits. + +'(parallel [X0 X1 ...])' + Represents several side effects performed in parallel. The square + brackets stand for a vector; the operand of 'parallel' is a vector + of expressions. X0, X1 and so on are individual side effect + expressions--expressions of code 'set', 'call', 'return', + 'simple_return', 'clobber' or 'use'. + + "In parallel" means that first all the values used in the + individual side-effects are computed, and second all the actual + side-effects are performed. For example, + + (parallel [(set (reg:SI 1) (mem:SI (reg:SI 1))) + (set (mem:SI (reg:SI 1)) (reg:SI 1))]) + + says unambiguously that the values of hard register 1 and the + memory location addressed by it are interchanged. In both places + where '(reg:SI 1)' appears as a memory address it refers to the + value in register 1 _before_ the execution of the insn. + + It follows that it is _incorrect_ to use 'parallel' and expect the + result of one 'set' to be available for the next one. For example, + people sometimes attempt to represent a jump-if-zero instruction + this way: + + (parallel [(set (cc0) (reg:SI 34)) + (set (pc) (if_then_else + (eq (cc0) (const_int 0)) + (label_ref ...) + (pc)))]) + + But this is incorrect, because it says that the jump condition + depends on the condition code value _before_ this instruction, not + on the new value that is set by this instruction. + + Peephole optimization, which takes place together with final + assembly code output, can produce insns whose patterns consist of a + 'parallel' whose elements are the operands needed to output the + resulting assembler code--often 'reg', 'mem' or constant + expressions. This would not be well-formed RTL at any other stage + in compilation, but it is OK then because no further optimization + remains to be done. However, the definition of the macro + 'NOTICE_UPDATE_CC', if any, must deal with such insns if you define + any peephole optimizations. + +'(cond_exec [COND EXPR])' + Represents a conditionally executed expression. The EXPR is + executed only if the COND is nonzero. The COND expression must not + have side-effects, but the EXPR may very well have side-effects. + +'(sequence [INSNS ...])' + Represents a sequence of insns. If a 'sequence' appears in the + chain of insns, then each of the INSNS that appears in the sequence + must be suitable for appearing in the chain of insns, i.e. must + satisfy the 'INSN_P' predicate. + + After delay-slot scheduling is completed, an insn and all the insns + that reside in its delay slots are grouped together into a + 'sequence'. The insn requiring the delay slot is the first insn in + the vector; subsequent insns are to be placed in the delay slot. + + 'INSN_ANNULLED_BRANCH_P' is set on an insn in a delay slot to + indicate that a branch insn should be used that will conditionally + annul the effect of the insns in the delay slots. In such a case, + 'INSN_FROM_TARGET_P' indicates that the insn is from the target of + the branch and should be executed only if the branch is taken; + otherwise the insn should be executed only if the branch is not + taken. *Note Delay Slots::. + + Some back ends also use 'sequence' objects for purposes other than + delay-slot groups. This is not supported in the common parts of + the compiler, which treat such sequences as delay-slot groups. + + DWARF2 Call Frame Address (CFA) adjustments are sometimes also + expressed using 'sequence' objects as the value of a + 'RTX_FRAME_RELATED_P' note. This only happens if the CFA + adjustments cannot be easily derived from the pattern of the + instruction to which the note is attached. In such cases, the + value of the note is used instead of best-guesing the semantics of + the instruction. The back end can attach notes containing a + 'sequence' of 'set' patterns that express the effect of the parent + instruction. + + These expression codes appear in place of a side effect, as the body of +an insn, though strictly speaking they do not always describe side +effects as such: + +'(asm_input S)' + Represents literal assembler code as described by the string S. + +'(unspec [OPERANDS ...] INDEX)' +'(unspec_volatile [OPERANDS ...] INDEX)' + Represents a machine-specific operation on OPERANDS. INDEX selects + between multiple machine-specific operations. 'unspec_volatile' is + used for volatile operations and operations that may trap; 'unspec' + is used for other operations. + + These codes may appear inside a 'pattern' of an insn, inside a + 'parallel', or inside an expression. + +'(addr_vec:M [LR0 LR1 ...])' + Represents a table of jump addresses. The vector elements LR0, + etc., are 'label_ref' expressions. The mode M specifies how much + space is given to each address; normally M would be 'Pmode'. + +'(addr_diff_vec:M BASE [LR0 LR1 ...] MIN MAX FLAGS)' + Represents a table of jump addresses expressed as offsets from + BASE. The vector elements LR0, etc., are 'label_ref' expressions + and so is BASE. The mode M specifies how much space is given to + each address-difference. MIN and MAX are set up by branch + shortening and hold a label with a minimum and a maximum address, + respectively. FLAGS indicates the relative position of BASE, MIN + and MAX to the containing insn and of MIN and MAX to BASE. See + rtl.def for details. + +'(prefetch:M ADDR RW LOCALITY)' + Represents prefetch of memory at address ADDR. Operand RW is 1 if + the prefetch is for data to be written, 0 otherwise; targets that + do not support write prefetches should treat this as a normal + prefetch. Operand LOCALITY specifies the amount of temporal + locality; 0 if there is none or 1, 2, or 3 for increasing levels of + temporal locality; targets that do not support locality hints + should ignore this. + + This insn is used to minimize cache-miss latency by moving data + into a cache before it is accessed. It should use only + non-faulting data prefetch instructions. + + +File: gccint.info, Node: Incdec, Next: Assembler, Prev: Side Effects, Up: RTL + +13.16 Embedded Side-Effects on Addresses +======================================== + +Six special side-effect expression codes appear as memory addresses. + +'(pre_dec:M X)' + Represents the side effect of decrementing X by a standard amount + and represents also the value that X has after being decremented. + X must be a 'reg' or 'mem', but most machines allow only a 'reg'. + M must be the machine mode for pointers on the machine in use. The + amount X is decremented by is the length in bytes of the machine + mode of the containing memory reference of which this expression + serves as the address. Here is an example of its use: + + (mem:DF (pre_dec:SI (reg:SI 39))) + + This says to decrement pseudo register 39 by the length of a + 'DFmode' value and use the result to address a 'DFmode' value. + +'(pre_inc:M X)' + Similar, but specifies incrementing X instead of decrementing it. + +'(post_dec:M X)' + Represents the same side effect as 'pre_dec' but a different value. + The value represented here is the value X has before being + decremented. + +'(post_inc:M X)' + Similar, but specifies incrementing X instead of decrementing it. + +'(post_modify:M X Y)' + + Represents the side effect of setting X to Y and represents X + before X is modified. X must be a 'reg' or 'mem', but most + machines allow only a 'reg'. M must be the machine mode for + pointers on the machine in use. + + The expression Y must be one of three forms: '(plus:M X Z)', + '(minus:M X Z)', or '(plus:M X I)', where Z is an index register + and I is a constant. + + Here is an example of its use: + + (mem:SF (post_modify:SI (reg:SI 42) (plus (reg:SI 42) + (reg:SI 48)))) + + This says to modify pseudo register 42 by adding the contents of + pseudo register 48 to it, after the use of what ever 42 points to. + +'(pre_modify:M X EXPR)' + Similar except side effects happen before the use. + + These embedded side effect expressions must be used with care. +Instruction patterns may not use them. Until the 'flow' pass of the +compiler, they may occur only to represent pushes onto the stack. The +'flow' pass finds cases where registers are incremented or decremented +in one instruction and used as an address shortly before or after; these +cases are then transformed to use pre- or post-increment or -decrement. + + If a register used as the operand of these expressions is used in +another address in an insn, the original value of the register is used. +Uses of the register outside of an address are not permitted within the +same insn as a use in an embedded side effect expression because such +insns behave differently on different machines and hence must be treated +as ambiguous and disallowed. + + An instruction that can be represented with an embedded side effect +could also be represented using 'parallel' containing an additional +'set' to describe how the address register is altered. This is not done +because machines that allow these operations at all typically allow them +wherever a memory address is called for. Describing them as additional +parallel stores would require doubling the number of entries in the +machine description. + + +File: gccint.info, Node: Assembler, Next: Debug Information, Prev: Incdec, Up: RTL + +13.17 Assembler Instructions as Expressions +=========================================== + +The RTX code 'asm_operands' represents a value produced by a +user-specified assembler instruction. It is used to represent an 'asm' +statement with arguments. An 'asm' statement with a single output +operand, like this: + + asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z)); + +is represented using a single 'asm_operands' RTX which represents the +value that is stored in 'outputvar': + + (set RTX-FOR-OUTPUTVAR + (asm_operands "foo %1,%2,%0" "a" 0 + [RTX-FOR-ADDITION-RESULT RTX-FOR-*Z] + [(asm_input:M1 "g") + (asm_input:M2 "di")])) + +Here the operands of the 'asm_operands' RTX are the assembler template +string, the output-operand's constraint, the index-number of the output +operand among the output operands specified, a vector of input operand +RTX's, and a vector of input-operand modes and constraints. The mode M1 +is the mode of the sum 'x+y'; M2 is that of '*z'. + + When an 'asm' statement has multiple output values, its insn has +several such 'set' RTX's inside of a 'parallel'. Each 'set' contains an +'asm_operands'; all of these share the same assembler template and +vectors, but each contains the constraint for the respective output +operand. They are also distinguished by the output-operand index +number, which is 0, 1, ... for successive output operands. + + +File: gccint.info, Node: Debug Information, Next: Insns, Prev: Assembler, Up: RTL + +13.18 Variable Location Debug Information in RTL +================================================ + +Variable tracking relies on 'MEM_EXPR' and 'REG_EXPR' annotations to +determine what user variables memory and register references refer to. + + Variable tracking at assignments uses these notes only when they refer +to variables that live at fixed locations (e.g., addressable variables, +global non-automatic variables). For variables whose location may vary, +it relies on the following types of notes. + +'(var_location:MODE VAR EXP STAT)' + Binds variable 'var', a tree, to value EXP, an RTL expression. It + appears only in 'NOTE_INSN_VAR_LOCATION' and 'DEBUG_INSN's, with + slightly different meanings. MODE, if present, represents the mode + of EXP, which is useful if it is a modeless expression. STAT is + only meaningful in notes, indicating whether the variable is known + to be initialized or uninitialized. + +'(debug_expr:MODE DECL)' + Stands for the value bound to the 'DEBUG_EXPR_DECL' DECL, that + points back to it, within value expressions in 'VAR_LOCATION' + nodes. + + +File: gccint.info, Node: Insns, Next: Calls, Prev: Debug Information, Up: RTL + +13.19 Insns +=========== + +The RTL representation of the code for a function is a doubly-linked +chain of objects called "insns". Insns are expressions with special +codes that are used for no other purpose. Some insns are actual +instructions; others represent dispatch tables for 'switch' statements; +others represent labels to jump to or various sorts of declarative +information. + + In addition to its own specific data, each insn must have a unique +id-number that distinguishes it from all other insns in the current +function (after delayed branch scheduling, copies of an insn with the +same id-number may be present in multiple places in a function, but +these copies will always be identical and will only appear inside a +'sequence'), and chain pointers to the preceding and following insns. +These three fields occupy the same position in every insn, independent +of the expression code of the insn. They could be accessed with 'XEXP' +and 'XINT', but instead three special macros are always used: + +'INSN_UID (I)' + Accesses the unique id of insn I. + +'PREV_INSN (I)' + Accesses the chain pointer to the insn preceding I. If I is the + first insn, this is a null pointer. + +'NEXT_INSN (I)' + Accesses the chain pointer to the insn following I. If I is the + last insn, this is a null pointer. + + The first insn in the chain is obtained by calling 'get_insns'; the +last insn is the result of calling 'get_last_insn'. Within the chain +delimited by these insns, the 'NEXT_INSN' and 'PREV_INSN' pointers must +always correspond: if INSN is not the first insn, + + NEXT_INSN (PREV_INSN (INSN)) == INSN + +is always true and if INSN is not the last insn, + + PREV_INSN (NEXT_INSN (INSN)) == INSN + +is always true. + + After delay slot scheduling, some of the insns in the chain might be +'sequence' expressions, which contain a vector of insns. The value of +'NEXT_INSN' in all but the last of these insns is the next insn in the +vector; the value of 'NEXT_INSN' of the last insn in the vector is the +same as the value of 'NEXT_INSN' for the 'sequence' in which it is +contained. Similar rules apply for 'PREV_INSN'. + + This means that the above invariants are not necessarily true for insns +inside 'sequence' expressions. Specifically, if INSN is the first insn +in a 'sequence', 'NEXT_INSN (PREV_INSN (INSN))' is the insn containing +the 'sequence' expression, as is the value of 'PREV_INSN (NEXT_INSN +(INSN))' if INSN is the last insn in the 'sequence' expression. You can +use these expressions to find the containing 'sequence' expression. + + Every insn has one of the following expression codes: + +'insn' + The expression code 'insn' is used for instructions that do not + jump and do not do function calls. 'sequence' expressions are + always contained in insns with code 'insn' even if one of those + insns should jump or do function calls. + + Insns with code 'insn' have four additional fields beyond the three + mandatory ones listed above. These four are described in a table + below. + +'jump_insn' + The expression code 'jump_insn' is used for instructions that may + jump (or, more generally, may contain 'label_ref' expressions to + which 'pc' can be set in that instruction). If there is an + instruction to return from the current function, it is recorded as + a 'jump_insn'. + + 'jump_insn' insns have the same extra fields as 'insn' insns, + accessed in the same way and in addition contain a field + 'JUMP_LABEL' which is defined once jump optimization has completed. + + For simple conditional and unconditional jumps, this field contains + the 'code_label' to which this insn will (possibly conditionally) + branch. In a more complex jump, 'JUMP_LABEL' records one of the + labels that the insn refers to; other jump target labels are + recorded as 'REG_LABEL_TARGET' notes. The exception is 'addr_vec' + and 'addr_diff_vec', where 'JUMP_LABEL' is 'NULL_RTX' and the only + way to find the labels is to scan the entire body of the insn. + + Return insns count as jumps, but since they do not refer to any + labels, their 'JUMP_LABEL' is 'NULL_RTX'. + +'call_insn' + The expression code 'call_insn' is used for instructions that may + do function calls. It is important to distinguish these + instructions because they imply that certain registers and memory + locations may be altered unpredictably. + + 'call_insn' insns have the same extra fields as 'insn' insns, + accessed in the same way and in addition contain a field + 'CALL_INSN_FUNCTION_USAGE', which contains a list (chain of + 'expr_list' expressions) containing 'use', 'clobber' and sometimes + 'set' expressions that denote hard registers and 'mem's used or + clobbered by the called function. + + A 'mem' generally points to a stack slot in which arguments passed + to the libcall by reference (*note TARGET_PASS_BY_REFERENCE: + Register Arguments.) are stored. If the argument is caller-copied + (*note TARGET_CALLEE_COPIES: Register Arguments.), the stack slot + will be mentioned in 'clobber' and 'use' entries; if it's + callee-copied, only a 'use' will appear, and the 'mem' may point to + addresses that are not stack slots. + + Registers occurring inside a 'clobber' in this list augment + registers specified in 'CALL_USED_REGISTERS' (*note Register + Basics::). + + If the list contains a 'set' involving two registers, it indicates + that the function returns one of its arguments. Such a 'set' may + look like a no-op if the same register holds the argument and the + return value. + +'code_label' + A 'code_label' insn represents a label that a jump insn can jump + to. It contains two special fields of data in addition to the + three standard ones. 'CODE_LABEL_NUMBER' is used to hold the + "label number", a number that identifies this label uniquely among + all the labels in the compilation (not just in the current + function). Ultimately, the label is represented in the assembler + output as an assembler label, usually of the form 'LN' where N is + the label number. + + When a 'code_label' appears in an RTL expression, it normally + appears within a 'label_ref' which represents the address of the + label, as a number. + + Besides as a 'code_label', a label can also be represented as a + 'note' of type 'NOTE_INSN_DELETED_LABEL'. + + The field 'LABEL_NUSES' is only defined once the jump optimization + phase is completed. It contains the number of times this label is + referenced in the current function. + + The field 'LABEL_KIND' differentiates four different types of + labels: 'LABEL_NORMAL', 'LABEL_STATIC_ENTRY', 'LABEL_GLOBAL_ENTRY', + and 'LABEL_WEAK_ENTRY'. The only labels that do not have type + 'LABEL_NORMAL' are "alternate entry points" to the current + function. These may be static (visible only in the containing + translation unit), global (exposed to all translation units), or + weak (global, but can be overridden by another symbol with the same + name). + + Much of the compiler treats all four kinds of label identically. + Some of it needs to know whether or not a label is an alternate + entry point; for this purpose, the macro 'LABEL_ALT_ENTRY_P' is + provided. It is equivalent to testing whether 'LABEL_KIND (label) + == LABEL_NORMAL'. The only place that cares about the distinction + between static, global, and weak alternate entry points, besides + the front-end code that creates them, is the function + 'output_alternate_entry_point', in 'final.c'. + + To set the kind of a label, use the 'SET_LABEL_KIND' macro. + +'jump_table_data' + A 'jump_table_data' insn is a placeholder for the jump-table data + of a 'casesi' or 'tablejump' insn. They are placed after a + 'tablejump_p' insn. A 'jump_table_data' insn is not part o a basic + blockm but it is associated with the basic block that ends with the + 'tablejump_p' insn. The 'PATTERN' of a 'jump_table_data' is always + either an 'addr_vec' or an 'addr_diff_vec', and a 'jump_table_data' + insn is always preceded by a 'code_label'. The 'tablejump_p' insn + refers to that 'code_label' via its 'JUMP_LABEL'. + +'barrier' + Barriers are placed in the instruction stream when control cannot + flow past them. They are placed after unconditional jump + instructions to indicate that the jumps are unconditional and after + calls to 'volatile' functions, which do not return (e.g., 'exit'). + They contain no information beyond the three standard fields. + +'note' + 'note' insns are used to represent additional debugging and + declarative information. They contain two nonstandard fields, an + integer which is accessed with the macro 'NOTE_LINE_NUMBER' and a + string accessed with 'NOTE_SOURCE_FILE'. + + If 'NOTE_LINE_NUMBER' is positive, the note represents the position + of a source line and 'NOTE_SOURCE_FILE' is the source file name + that the line came from. These notes control generation of line + number data in the assembler output. + + Otherwise, 'NOTE_LINE_NUMBER' is not really a line number but a + code with one of the following values (and 'NOTE_SOURCE_FILE' must + contain a null pointer): + + 'NOTE_INSN_DELETED' + Such a note is completely ignorable. Some passes of the + compiler delete insns by altering them into notes of this + kind. + + 'NOTE_INSN_DELETED_LABEL' + This marks what used to be a 'code_label', but was not used + for other purposes than taking its address and was transformed + to mark that no code jumps to it. + + 'NOTE_INSN_BLOCK_BEG' + 'NOTE_INSN_BLOCK_END' + These types of notes indicate the position of the beginning + and end of a level of scoping of variable names. They control + the output of debugging information. + + 'NOTE_INSN_EH_REGION_BEG' + 'NOTE_INSN_EH_REGION_END' + These types of notes indicate the position of the beginning + and end of a level of scoping for exception handling. + 'NOTE_EH_HANDLER' identifies which region is associated with + these notes. + + 'NOTE_INSN_FUNCTION_BEG' + Appears at the start of the function body, after the function + prologue. + + 'NOTE_INSN_VAR_LOCATION' + This note is used to generate variable location debugging + information. It indicates that the user variable in its + 'VAR_LOCATION' operand is at the location given in the RTL + expression, or holds a value that can be computed by + evaluating the RTL expression from that static point in the + program up to the next such note for the same user variable. + + These codes are printed symbolically when they appear in debugging + dumps. + +'debug_insn' + The expression code 'debug_insn' is used for pseudo-instructions + that hold debugging information for variable tracking at + assignments (see '-fvar-tracking-assignments' option). They are + the RTL representation of 'GIMPLE_DEBUG' statements (*note + 'GIMPLE_DEBUG'::), with a 'VAR_LOCATION' operand that binds a user + variable tree to an RTL representation of the 'value' in the + corresponding statement. A 'DEBUG_EXPR' in it stands for the value + bound to the corresponding 'DEBUG_EXPR_DECL'. + + Throughout optimization passes, binding information is kept in + pseudo-instruction form, so that, unlike notes, it gets the same + treatment and adjustments that regular instructions would. It is + the variable tracking pass that turns these pseudo-instructions + into var location notes, analyzing control flow, value equivalences + and changes to registers and memory referenced in value + expressions, propagating the values of debug temporaries and + determining expressions that can be used to compute the value of + each user variable at as many points (ranges, actually) in the + program as possible. + + Unlike 'NOTE_INSN_VAR_LOCATION', the value expression in an + 'INSN_VAR_LOCATION' denotes a value at that specific point in the + program, rather than an expression that can be evaluated at any + later point before an overriding 'VAR_LOCATION' is encountered. + E.g., if a user variable is bound to a 'REG' and then a subsequent + insn modifies the 'REG', the note location would keep mapping the + user variable to the register across the insn, whereas the insn + location would keep the variable bound to the value, so that the + variable tracking pass would emit another location note for the + variable at the point in which the register is modified. + + The machine mode of an insn is normally 'VOIDmode', but some phases use +the mode for various purposes. + + The common subexpression elimination pass sets the mode of an insn to +'QImode' when it is the first insn in a block that has already been +processed. + + The second Haifa scheduling pass, for targets that can multiple issue, +sets the mode of an insn to 'TImode' when it is believed that the +instruction begins an issue group. That is, when the instruction cannot +issue simultaneously with the previous. This may be relied on by later +passes, in particular machine-dependent reorg. + + Here is a table of the extra fields of 'insn', 'jump_insn' and +'call_insn' insns: + +'PATTERN (I)' + An expression for the side effect performed by this insn. This + must be one of the following codes: 'set', 'call', 'use', + 'clobber', 'return', 'simple_return', 'asm_input', 'asm_output', + 'addr_vec', 'addr_diff_vec', 'trap_if', 'unspec', + 'unspec_volatile', 'parallel', 'cond_exec', or 'sequence'. If it + is a 'parallel', each element of the 'parallel' must be one these + codes, except that 'parallel' expressions cannot be nested and + 'addr_vec' and 'addr_diff_vec' are not permitted inside a + 'parallel' expression. + +'INSN_CODE (I)' + An integer that says which pattern in the machine description + matches this insn, or -1 if the matching has not yet been + attempted. + + Such matching is never attempted and this field remains -1 on an + insn whose pattern consists of a single 'use', 'clobber', + 'asm_input', 'addr_vec' or 'addr_diff_vec' expression. + + Matching is also never attempted on insns that result from an 'asm' + statement. These contain at least one 'asm_operands' expression. + The function 'asm_noperands' returns a non-negative value for such + insns. + + In the debugging output, this field is printed as a number followed + by a symbolic representation that locates the pattern in the 'md' + file as some small positive or negative offset from a named + pattern. + +'LOG_LINKS (I)' + A list (chain of 'insn_list' expressions) giving information about + dependencies between instructions within a basic block. Neither a + jump nor a label may come between the related insns. These are + only used by the schedulers and by combine. This is a deprecated + data structure. Def-use and use-def chains are now preferred. + +'REG_NOTES (I)' + A list (chain of 'expr_list', 'insn_list' and 'int_list' + expressions) giving miscellaneous information about the insn. It + is often information pertaining to the registers used in this insn. + + The 'LOG_LINKS' field of an insn is a chain of 'insn_list' expressions. +Each of these has two operands: the first is an insn, and the second is +another 'insn_list' expression (the next one in the chain). The last +'insn_list' in the chain has a null pointer as second operand. The +significant thing about the chain is which insns appear in it (as first +operands of 'insn_list' expressions). Their order is not significant. + + This list is originally set up by the flow analysis pass; it is a null +pointer until then. Flow only adds links for those data dependencies +which can be used for instruction combination. For each insn, the flow +analysis pass adds a link to insns which store into registers values +that are used for the first time in this insn. + + The 'REG_NOTES' field of an insn is a chain similar to the 'LOG_LINKS' +field but it includes 'expr_list' and 'int_list' expressions in addition +to 'insn_list' expressions. There are several kinds of register notes, +which are distinguished by the machine mode, which in a register note is +really understood as being an 'enum reg_note'. The first operand OP of +the note is data whose meaning depends on the kind of note. + + The macro 'REG_NOTE_KIND (X)' returns the kind of register note. Its +counterpart, the macro 'PUT_REG_NOTE_KIND (X, NEWKIND)' sets the +register note type of X to be NEWKIND. + + Register notes are of three classes: They may say something about an +input to an insn, they may say something about an output of an insn, or +they may create a linkage between two insns. There are also a set of +values that are only used in 'LOG_LINKS'. + + These register notes annotate inputs to an insn: + +'REG_DEAD' + The value in OP dies in this insn; that is to say, altering the + value immediately after this insn would not affect the future + behavior of the program. + + It does not follow that the register OP has no useful value after + this insn since OP is not necessarily modified by this insn. + Rather, no subsequent instruction uses the contents of OP. + +'REG_UNUSED' + The register OP being set by this insn will not be used in a + subsequent insn. This differs from a 'REG_DEAD' note, which + indicates that the value in an input will not be used subsequently. + These two notes are independent; both may be present for the same + register. + +'REG_INC' + The register OP is incremented (or decremented; at this level there + is no distinction) by an embedded side effect inside this insn. + This means it appears in a 'post_inc', 'pre_inc', 'post_dec' or + 'pre_dec' expression. + +'REG_NONNEG' + The register OP is known to have a nonnegative value when this insn + is reached. This is used so that decrement and branch until zero + instructions, such as the m68k dbra, can be matched. + + The 'REG_NONNEG' note is added to insns only if the machine + description has a 'decrement_and_branch_until_zero' pattern. + +'REG_LABEL_OPERAND' + This insn uses OP, a 'code_label' or a 'note' of type + 'NOTE_INSN_DELETED_LABEL', but is not a 'jump_insn', or it is a + 'jump_insn' that refers to the operand as an ordinary operand. The + label may still eventually be a jump target, but if so in an + indirect jump in a subsequent insn. The presence of this note + allows jump optimization to be aware that OP is, in fact, being + used, and flow optimization to build an accurate flow graph. + +'REG_LABEL_TARGET' + This insn is a 'jump_insn' but not an 'addr_vec' or + 'addr_diff_vec'. It uses OP, a 'code_label' as a direct or + indirect jump target. Its purpose is similar to that of + 'REG_LABEL_OPERAND'. This note is only present if the insn has + multiple targets; the last label in the insn (in the highest + numbered insn-field) goes into the 'JUMP_LABEL' field and does not + have a 'REG_LABEL_TARGET' note. *Note JUMP_LABEL: Insns. + +'REG_CROSSING_JUMP' + This insn is a branching instruction (either an unconditional jump + or an indirect jump) which crosses between hot and cold sections, + which could potentially be very far apart in the executable. The + presence of this note indicates to other optimizations that this + branching instruction should not be "collapsed" into a simpler + branching construct. It is used when the optimization to partition + basic blocks into hot and cold sections is turned on. + +'REG_SETJMP' + Appears attached to each 'CALL_INSN' to 'setjmp' or a related + function. + + The following notes describe attributes of outputs of an insn: + +'REG_EQUIV' +'REG_EQUAL' + This note is only valid on an insn that sets only one register and + indicates that that register will be equal to OP at run time; the + scope of this equivalence differs between the two types of notes. + The value which the insn explicitly copies into the register may + look different from OP, but they will be equal at run time. If the + output of the single 'set' is a 'strict_low_part' expression, the + note refers to the register that is contained in 'SUBREG_REG' of + the 'subreg' expression. + + For 'REG_EQUIV', the register is equivalent to OP throughout the + entire function, and could validly be replaced in all its + occurrences by OP. ("Validly" here refers to the data flow of the + program; simple replacement may make some insns invalid.) For + example, when a constant is loaded into a register that is never + assigned any other value, this kind of note is used. + + When a parameter is copied into a pseudo-register at entry to a + function, a note of this kind records that the register is + equivalent to the stack slot where the parameter was passed. + Although in this case the register may be set by other insns, it is + still valid to replace the register by the stack slot throughout + the function. + + A 'REG_EQUIV' note is also used on an instruction which copies a + register parameter into a pseudo-register at entry to a function, + if there is a stack slot where that parameter could be stored. + Although other insns may set the pseudo-register, it is valid for + the compiler to replace the pseudo-register by stack slot + throughout the function, provided the compiler ensures that the + stack slot is properly initialized by making the replacement in the + initial copy instruction as well. This is used on machines for + which the calling convention allocates stack space for register + parameters. See 'REG_PARM_STACK_SPACE' in *note Stack Arguments::. + + In the case of 'REG_EQUAL', the register that is set by this insn + will be equal to OP at run time at the end of this insn but not + necessarily elsewhere in the function. In this case, OP is + typically an arithmetic expression. For example, when a sequence + of insns such as a library call is used to perform an arithmetic + operation, this kind of note is attached to the insn that produces + or copies the final value. + + These two notes are used in different ways by the compiler passes. + 'REG_EQUAL' is used by passes prior to register allocation (such as + common subexpression elimination and loop optimization) to tell + them how to think of that value. 'REG_EQUIV' notes are used by + register allocation to indicate that there is an available + substitute expression (either a constant or a 'mem' expression for + the location of a parameter on the stack) that may be used in place + of a register if insufficient registers are available. + + Except for stack homes for parameters, which are indicated by a + 'REG_EQUIV' note and are not useful to the early optimization + passes and pseudo registers that are equivalent to a memory + location throughout their entire life, which is not detected until + later in the compilation, all equivalences are initially indicated + by an attached 'REG_EQUAL' note. In the early stages of register + allocation, a 'REG_EQUAL' note is changed into a 'REG_EQUIV' note + if OP is a constant and the insn represents the only set of its + destination register. + + Thus, compiler passes prior to register allocation need only check + for 'REG_EQUAL' notes and passes subsequent to register allocation + need only check for 'REG_EQUIV' notes. + + These notes describe linkages between insns. They occur in pairs: one +insn has one of a pair of notes that points to a second insn, which has +the inverse note pointing back to the first insn. + +'REG_CC_SETTER' +'REG_CC_USER' + On machines that use 'cc0', the insns which set and use 'cc0' set + and use 'cc0' are adjacent. However, when branch delay slot + filling is done, this may no longer be true. In this case a + 'REG_CC_USER' note will be placed on the insn setting 'cc0' to + point to the insn using 'cc0' and a 'REG_CC_SETTER' note will be + placed on the insn using 'cc0' to point to the insn setting 'cc0'. + + These values are only used in the 'LOG_LINKS' field, and indicate the +type of dependency that each link represents. Links which indicate a +data dependence (a read after write dependence) do not use any code, +they simply have mode 'VOIDmode', and are printed without any +descriptive text. + +'REG_DEP_TRUE' + This indicates a true dependence (a read after write dependence). + +'REG_DEP_OUTPUT' + This indicates an output dependence (a write after write + dependence). + +'REG_DEP_ANTI' + This indicates an anti dependence (a write after read dependence). + + These notes describe information gathered from gcov profile data. They +are stored in the 'REG_NOTES' field of an insn. + +'REG_BR_PROB' + This is used to specify the ratio of branches to non-branches of a + branch insn according to the profile data. The note is represented + as an 'int_list' expression whose integer value is between 0 and + REG_BR_PROB_BASE. Larger values indicate a higher probability that + the branch will be taken. + +'REG_BR_PRED' + These notes are found in JUMP insns after delayed branch scheduling + has taken place. They indicate both the direction and the + likelihood of the JUMP. The format is a bitmask of ATTR_FLAG_* + values. + +'REG_FRAME_RELATED_EXPR' + This is used on an RTX_FRAME_RELATED_P insn wherein the attached + expression is used in place of the actual insn pattern. This is + done in cases where the pattern is either complex or misleading. + + For convenience, the machine mode in an 'insn_list' or 'expr_list' is +printed using these symbolic codes in debugging dumps. + + The only difference between the expression codes 'insn_list' and +'expr_list' is that the first operand of an 'insn_list' is assumed to be +an insn and is printed in debugging dumps as the insn's unique id; the +first operand of an 'expr_list' is printed in the ordinary way as an +expression. + + +File: gccint.info, Node: Calls, Next: Sharing, Prev: Insns, Up: RTL + +13.20 RTL Representation of Function-Call Insns +=============================================== + +Insns that call subroutines have the RTL expression code 'call_insn'. +These insns must satisfy special rules, and their bodies must use a +special RTL expression code, 'call'. + + A 'call' expression has two operands, as follows: + + (call (mem:FM ADDR) NBYTES) + +Here NBYTES is an operand that represents the number of bytes of +argument data being passed to the subroutine, FM is a machine mode +(which must equal as the definition of the 'FUNCTION_MODE' macro in the +machine description) and ADDR represents the address of the subroutine. + + For a subroutine that returns no value, the 'call' expression as shown +above is the entire body of the insn, except that the insn might also +contain 'use' or 'clobber' expressions. + + For a subroutine that returns a value whose mode is not 'BLKmode', the +value is returned in a hard register. If this register's number is R, +then the body of the call insn looks like this: + + (set (reg:M R) + (call (mem:FM ADDR) NBYTES)) + +This RTL expression makes it clear (to the optimizer passes) that the +appropriate register receives a useful value in this insn. + + When a subroutine returns a 'BLKmode' value, it is handled by passing +to the subroutine the address of a place to store the value. So the +call insn itself does not "return" any value, and it has the same RTL +form as a call that returns nothing. + + On some machines, the call instruction itself clobbers some register, +for example to contain the return address. 'call_insn' insns on these +machines should have a body which is a 'parallel' that contains both the +'call' expression and 'clobber' expressions that indicate which +registers are destroyed. Similarly, if the call instruction requires +some register other than the stack pointer that is not explicitly +mentioned in its RTL, a 'use' subexpression should mention that +register. + + Functions that are called are assumed to modify all registers listed in +the configuration macro 'CALL_USED_REGISTERS' (*note Register Basics::) +and, with the exception of 'const' functions and library calls, to +modify all of memory. + + Insns containing just 'use' expressions directly precede the +'call_insn' insn to indicate which registers contain inputs to the +function. Similarly, if registers other than those in +'CALL_USED_REGISTERS' are clobbered by the called function, insns +containing a single 'clobber' follow immediately after the call to +indicate which registers. + + +File: gccint.info, Node: Sharing, Next: Reading RTL, Prev: Calls, Up: RTL + +13.21 Structure Sharing Assumptions +=================================== + +The compiler assumes that certain kinds of RTL expressions are unique; +there do not exist two distinct objects representing the same value. In +other cases, it makes an opposite assumption: that no RTL expression +object of a certain kind appears in more than one place in the +containing structure. + + These assumptions refer to a single function; except for the RTL +objects that describe global variables and external functions, and a few +standard objects such as small integer constants, no RTL objects are +common to two functions. + + * Each pseudo-register has only a single 'reg' object to represent + it, and therefore only a single machine mode. + + * For any symbolic label, there is only one 'symbol_ref' object + referring to it. + + * All 'const_int' expressions with equal values are shared. + + * There is only one 'pc' expression. + + * There is only one 'cc0' expression. + + * There is only one 'const_double' expression with value 0 for each + floating point mode. Likewise for values 1 and 2. + + * There is only one 'const_vector' expression with value 0 for each + vector mode, be it an integer or a double constant vector. + + * No 'label_ref' or 'scratch' appears in more than one place in the + RTL structure; in other words, it is safe to do a tree-walk of all + the insns in the function and assume that each time a 'label_ref' + or 'scratch' is seen it is distinct from all others that are seen. + + * Only one 'mem' object is normally created for each static variable + or stack slot, so these objects are frequently shared in all the + places they appear. However, separate but equal objects for these + variables are occasionally made. + + * When a single 'asm' statement has multiple output operands, a + distinct 'asm_operands' expression is made for each output operand. + However, these all share the vector which contains the sequence of + input operands. This sharing is used later on to test whether two + 'asm_operands' expressions come from the same statement, so all + optimizations must carefully preserve the sharing if they copy the + vector at all. + + * No RTL object appears in more than one place in the RTL structure + except as described above. Many passes of the compiler rely on + this by assuming that they can modify RTL objects in place without + unwanted side-effects on other insns. + + * During initial RTL generation, shared structure is freely + introduced. After all the RTL for a function has been generated, + all shared structure is copied by 'unshare_all_rtl' in + 'emit-rtl.c', after which the above rules are guaranteed to be + followed. + + * During the combiner pass, shared structure within an insn can exist + temporarily. However, the shared structure is copied before the + combiner is finished with the insn. This is done by calling + 'copy_rtx_if_shared', which is a subroutine of 'unshare_all_rtl'. + + +File: gccint.info, Node: Reading RTL, Prev: Sharing, Up: RTL + +13.22 Reading RTL +================= + +To read an RTL object from a file, call 'read_rtx'. It takes one +argument, a stdio stream, and returns a single RTL object. This routine +is defined in 'read-rtl.c'. It is not available in the compiler itself, +only the various programs that generate the compiler back end from the +machine description. + + People frequently have the idea of using RTL stored as text in a file +as an interface between a language front end and the bulk of GCC. This +idea is not feasible. + + GCC was designed to use RTL internally only. Correct RTL for a given +program is very dependent on the particular target machine. And the RTL +does not contain all the information about the program. + + The proper way to interface GCC to a new language front end is with the +"tree" data structure, described in the files 'tree.h' and 'tree.def'. +The documentation for this structure (*note GENERIC::) is incomplete. + + +File: gccint.info, Node: Control Flow, Next: Loop Analysis and Representation, Prev: RTL, Up: Top + +14 Control Flow Graph +********************* + +A control flow graph (CFG) is a data structure built on top of the +intermediate code representation (the RTL or 'GIMPLE' instruction +stream) abstracting the control flow behavior of a function that is +being compiled. The CFG is a directed graph where the vertices +represent basic blocks and edges represent possible transfer of control +flow from one basic block to another. The data structures used to +represent the control flow graph are defined in 'basic-block.h'. + + In GCC, the representation of control flow is maintained throughout the +compilation process, from constructing the CFG early in 'pass_build_cfg' +to 'pass_free_cfg' (see 'passes.def'). The CFG takes various different +modes and may undergo extensive manipulations, but the graph is always +valid between its construction and its release. This way, transfer of +information such as data flow, a measured profile, or the loop tree, can +be propagated through the passes pipeline, and even from 'GIMPLE' to +'RTL'. + + Often the CFG may be better viewed as integral part of instruction +chain, than structure built on the top of it. Updating the compiler's +intermediate representation for instructions can not be easily done +without proper maintenance of the CFG simultaneously. + +* Menu: + +* Basic Blocks:: The definition and representation of basic blocks. +* Edges:: Types of edges and their representation. +* Profile information:: Representation of frequencies and probabilities. +* Maintaining the CFG:: Keeping the control flow graph and up to date. +* Liveness information:: Using and maintaining liveness information. + + +File: gccint.info, Node: Basic Blocks, Next: Edges, Up: Control Flow + +14.1 Basic Blocks +================= + +A basic block is a straight-line sequence of code with only one entry +point and only one exit. In GCC, basic blocks are represented using the +'basic_block' data type. + + Special basic blocks represent possible entry and exit points of a +function. These blocks are called 'ENTRY_BLOCK_PTR' and +'EXIT_BLOCK_PTR'. These blocks do not contain any code. + + The 'BASIC_BLOCK' array contains all basic blocks in an unspecified +order. Each 'basic_block' structure has a field that holds a unique +integer identifier 'index' that is the index of the block in the +'BASIC_BLOCK' array. The total number of basic blocks in the function +is 'n_basic_blocks'. Both the basic block indices and the total number +of basic blocks may vary during the compilation process, as passes +reorder, create, duplicate, and destroy basic blocks. The index for any +block should never be greater than 'last_basic_block'. The indices 0 +and 1 are special codes reserved for 'ENTRY_BLOCK' and 'EXIT_BLOCK', the +indices of 'ENTRY_BLOCK_PTR' and 'EXIT_BLOCK_PTR'. + + Two pointer members of the 'basic_block' structure are the pointers +'next_bb' and 'prev_bb'. These are used to keep doubly linked chain of +basic blocks in the same order as the underlying instruction stream. +The chain of basic blocks is updated transparently by the provided API +for manipulating the CFG. The macro 'FOR_EACH_BB' can be used to visit +all the basic blocks in lexicographical order, except 'ENTRY_BLOCK' and +'EXIT_BLOCK'. The macro 'FOR_ALL_BB' also visits all basic blocks in +lexicographical order, including 'ENTRY_BLOCK' and 'EXIT_BLOCK'. + + The functions 'post_order_compute' and 'inverted_post_order_compute' +can be used to compute topological orders of the CFG. The orders are +stored as vectors of basic block indices. The 'BASIC_BLOCK' array can +be used to iterate each basic block by index. Dominator traversals are +also possible using 'walk_dominator_tree'. Given two basic blocks A and +B, block A dominates block B if A is _always_ executed before B. + + Each 'basic_block' also contains pointers to the first instruction (the +"head") and the last instruction (the "tail") or "end" of the +instruction stream contained in a basic block. In fact, since the +'basic_block' data type is used to represent blocks in both major +intermediate representations of GCC ('GIMPLE' and RTL), there are +pointers to the head and end of a basic block for both representations, +stored in intermediate representation specific data in the 'il' field of +'struct basic_block_def'. + + For RTL, these pointers are 'BB_HEAD' and 'BB_END'. + + In the RTL representation of a function, the instruction stream +contains not only the "real" instructions, but also "notes" or "insn +notes" (to distinguish them from "reg notes"). Any function that moves +or duplicates the basic blocks needs to take care of updating of these +notes. Many of these notes expect that the instruction stream consists +of linear regions, so updating can sometimes be tedious. All types of +insn notes are defined in 'insn-notes.def'. + + In the RTL function representation, the instructions contained in a +basic block always follow a 'NOTE_INSN_BASIC_BLOCK', but zero or more +'CODE_LABEL' nodes can precede the block note. A basic block ends with +a control flow instruction or with the last instruction before the next +'CODE_LABEL' or 'NOTE_INSN_BASIC_BLOCK'. By definition, a 'CODE_LABEL' +cannot appear in the middle of the instruction stream of a basic block. + + In addition to notes, the jump table vectors are also represented as +"pseudo-instructions" inside the insn stream. These vectors never +appear in the basic block and should always be placed just after the +table jump instructions referencing them. After removing the table-jump +it is often difficult to eliminate the code computing the address and +referencing the vector, so cleaning up these vectors is postponed until +after liveness analysis. Thus the jump table vectors may appear in the +insn stream unreferenced and without any purpose. Before any edge is +made "fall-thru", the existence of such construct in the way needs to be +checked by calling 'can_fallthru' function. + + For the 'GIMPLE' representation, the PHI nodes and statements contained +in a basic block are in a 'gimple_seq' pointed to by the basic block +intermediate language specific pointers. Abstract containers and +iterators are used to access the PHI nodes and statements in a basic +blocks. These iterators are called "GIMPLE statement iterators" (GSIs). +Grep for '^gsi' in the various 'gimple-*' and 'tree-*' files. The +following snippet will pretty-print all PHI nodes the statements of the +current function in the GIMPLE representation. + + basic_block bb; + + FOR_EACH_BB (bb) + { + gimple_stmt_iterator si; + + for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si)) + { + gimple phi = gsi_stmt (si); + print_gimple_stmt (dump_file, phi, 0, TDF_SLIM); + } + for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) + { + gimple stmt = gsi_stmt (si); + print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); + } + } + + +File: gccint.info, Node: Edges, Next: Profile information, Prev: Basic Blocks, Up: Control Flow + +14.2 Edges +========== + +Edges represent possible control flow transfers from the end of some +basic block A to the head of another basic block B. We say that A is a +predecessor of B, and B is a successor of A. Edges are represented in +GCC with the 'edge' data type. Each 'edge' acts as a link between two +basic blocks: The 'src' member of an edge points to the predecessor +basic block of the 'dest' basic block. The members 'preds' and 'succs' +of the 'basic_block' data type point to type-safe vectors of edges to +the predecessors and successors of the block. + + When walking the edges in an edge vector, "edge iterators" should be +used. Edge iterators are constructed using the 'edge_iterator' data +structure and several methods are available to operate on them: + +'ei_start' + This function initializes an 'edge_iterator' that points to the + first edge in a vector of edges. + +'ei_last' + This function initializes an 'edge_iterator' that points to the + last edge in a vector of edges. + +'ei_end_p' + This predicate is 'true' if an 'edge_iterator' represents the last + edge in an edge vector. + +'ei_one_before_end_p' + This predicate is 'true' if an 'edge_iterator' represents the + second last edge in an edge vector. + +'ei_next' + This function takes a pointer to an 'edge_iterator' and makes it + point to the next edge in the sequence. + +'ei_prev' + This function takes a pointer to an 'edge_iterator' and makes it + point to the previous edge in the sequence. + +'ei_edge' + This function returns the 'edge' currently pointed to by an + 'edge_iterator'. + +'ei_safe_safe' + This function returns the 'edge' currently pointed to by an + 'edge_iterator', but returns 'NULL' if the iterator is pointing at + the end of the sequence. This function has been provided for + existing code makes the assumption that a 'NULL' edge indicates the + end of the sequence. + + The convenience macro 'FOR_EACH_EDGE' can be used to visit all of the +edges in a sequence of predecessor or successor edges. It must not be +used when an element might be removed during the traversal, otherwise +elements will be missed. Here is an example of how to use the macro: + + edge e; + edge_iterator ei; + + FOR_EACH_EDGE (e, ei, bb->succs) + { + if (e->flags & EDGE_FALLTHRU) + break; + } + + There are various reasons why control flow may transfer from one block +to another. One possibility is that some instruction, for example a +'CODE_LABEL', in a linearized instruction stream just always starts a +new basic block. In this case a "fall-thru" edge links the basic block +to the first following basic block. But there are several other reasons +why edges may be created. The 'flags' field of the 'edge' data type is +used to store information about the type of edge we are dealing with. +Each edge is of one of the following types: + +_jump_ + No type flags are set for edges corresponding to jump instructions. + These edges are used for unconditional or conditional jumps and in + RTL also for table jumps. They are the easiest to manipulate as + they may be freely redirected when the flow graph is not in SSA + form. + +_fall-thru_ + Fall-thru edges are present in case where the basic block may + continue execution to the following one without branching. These + edges have the 'EDGE_FALLTHRU' flag set. Unlike other types of + edges, these edges must come into the basic block immediately + following in the instruction stream. The function + 'force_nonfallthru' is available to insert an unconditional jump in + the case that redirection is needed. Note that this may require + creation of a new basic block. + +_exception handling_ + Exception handling edges represent possible control transfers from + a trapping instruction to an exception handler. The definition of + "trapping" varies. In C++, only function calls can throw, but for + Java and Ada, exceptions like division by zero or segmentation + fault are defined and thus each instruction possibly throwing this + kind of exception needs to be handled as control flow instruction. + Exception edges have the 'EDGE_ABNORMAL' and 'EDGE_EH' flags set. + + When updating the instruction stream it is easy to change possibly + trapping instruction to non-trapping, by simply removing the + exception edge. The opposite conversion is difficult, but should + not happen anyway. The edges can be eliminated via + 'purge_dead_edges' call. + + In the RTL representation, the destination of an exception edge is + specified by 'REG_EH_REGION' note attached to the insn. In case of + a trapping call the 'EDGE_ABNORMAL_CALL' flag is set too. In the + 'GIMPLE' representation, this extra flag is not set. + + In the RTL representation, the predicate 'may_trap_p' may be used + to check whether instruction still may trap or not. For the tree + representation, the 'tree_could_trap_p' predicate is available, but + this predicate only checks for possible memory traps, as in + dereferencing an invalid pointer location. + +_sibling calls_ + Sibling calls or tail calls terminate the function in a + non-standard way and thus an edge to the exit must be present. + 'EDGE_SIBCALL' and 'EDGE_ABNORMAL' are set in such case. These + edges only exist in the RTL representation. + +_computed jumps_ + Computed jumps contain edges to all labels in the function + referenced from the code. All those edges have 'EDGE_ABNORMAL' + flag set. The edges used to represent computed jumps often cause + compile time performance problems, since functions consisting of + many taken labels and many computed jumps may have _very_ dense + flow graphs, so these edges need to be handled with special care. + During the earlier stages of the compilation process, GCC tries to + avoid such dense flow graphs by factoring computed jumps. For + example, given the following series of jumps, + + goto *x; + [ ... ] + + goto *x; + [ ... ] + + goto *x; + [ ... ] + + factoring the computed jumps results in the following code sequence + which has a much simpler flow graph: + + goto y; + [ ... ] + + goto y; + [ ... ] + + goto y; + [ ... ] + + y: + goto *x; + + However, the classic problem with this transformation is that it + has a runtime cost in there resulting code: An extra jump. + Therefore, the computed jumps are un-factored in the later passes + of the compiler (in the pass called + 'pass_duplicate_computed_gotos'). Be aware of that when you work + on passes in that area. There have been numerous examples already + where the compile time for code with unfactored computed jumps + caused some serious headaches. + +_nonlocal goto handlers_ + GCC allows nested functions to return into caller using a 'goto' to + a label passed to as an argument to the callee. The labels passed + to nested functions contain special code to cleanup after function + call. Such sections of code are referred to as "nonlocal goto + receivers". If a function contains such nonlocal goto receivers, + an edge from the call to the label is created with the + 'EDGE_ABNORMAL' and 'EDGE_ABNORMAL_CALL' flags set. + +_function entry points_ + By definition, execution of function starts at basic block 0, so + there is always an edge from the 'ENTRY_BLOCK_PTR' to basic block + 0. There is no 'GIMPLE' representation for alternate entry points + at this moment. In RTL, alternate entry points are specified by + 'CODE_LABEL' with 'LABEL_ALTERNATE_NAME' defined. This feature is + currently used for multiple entry point prologues and is limited to + post-reload passes only. This can be used by back-ends to emit + alternate prologues for functions called from different contexts. + In future full support for multiple entry functions defined by + Fortran 90 needs to be implemented. + +_function exits_ + In the pre-reload representation a function terminates after the + last instruction in the insn chain and no explicit return + instructions are used. This corresponds to the fall-thru edge into + exit block. After reload, optimal RTL epilogues are used that use + explicit (conditional) return instructions that are represented by + edges with no flags set. + + +File: gccint.info, Node: Profile information, Next: Maintaining the CFG, Prev: Edges, Up: Control Flow + +14.3 Profile information +======================== + +In many cases a compiler must make a choice whether to trade speed in +one part of code for speed in another, or to trade code size for code +speed. In such cases it is useful to know information about how often +some given block will be executed. That is the purpose for maintaining +profile within the flow graph. GCC can handle profile information +obtained through "profile feedback", but it can also estimate branch +probabilities based on statics and heuristics. + + The feedback based profile is produced by compiling the program with +instrumentation, executing it on a train run and reading the numbers of +executions of basic blocks and edges back to the compiler while +re-compiling the program to produce the final executable. This method +provides very accurate information about where a program spends most of +its time on the train run. Whether it matches the average run of course +depends on the choice of train data set, but several studies have shown +that the behavior of a program usually changes just marginally over +different data sets. + + When profile feedback is not available, the compiler may be asked to +attempt to predict the behavior of each branch in the program using a +set of heuristics (see 'predict.def' for details) and compute estimated +frequencies of each basic block by propagating the probabilities over +the graph. + + Each 'basic_block' contains two integer fields to represent profile +information: 'frequency' and 'count'. The 'frequency' is an estimation +how often is basic block executed within a function. It is represented +as an integer scaled in the range from 0 to 'BB_FREQ_BASE'. The most +frequently executed basic block in function is initially set to +'BB_FREQ_BASE' and the rest of frequencies are scaled accordingly. +During optimization, the frequency of the most frequent basic block can +both decrease (for instance by loop unrolling) or grow (for instance by +cross-jumping optimization), so scaling sometimes has to be performed +multiple times. + + The 'count' contains hard-counted numbers of execution measured during +training runs and is nonzero only when profile feedback is available. +This value is represented as the host's widest integer (typically a 64 +bit integer) of the special type 'gcov_type'. + + Most optimization passes can use only the frequency information of a +basic block, but a few passes may want to know hard execution counts. +The frequencies should always match the counts after scaling, however +during updating of the profile information numerical error may +accumulate into quite large errors. + + Each edge also contains a branch probability field: an integer in the +range from 0 to 'REG_BR_PROB_BASE'. It represents probability of +passing control from the end of the 'src' basic block to the 'dest' +basic block, i.e. the probability that control will flow along this +edge. The 'EDGE_FREQUENCY' macro is available to compute how frequently +a given edge is taken. There is a 'count' field for each edge as well, +representing same information as for a basic block. + + The basic block frequencies are not represented in the instruction +stream, but in the RTL representation the edge frequencies are +represented for conditional jumps (via the 'REG_BR_PROB' macro) since +they are used when instructions are output to the assembly file and the +flow graph is no longer maintained. + + The probability that control flow arrives via a given edge to its +destination basic block is called "reverse probability" and is not +directly represented, but it may be easily computed from frequencies of +basic blocks. + + Updating profile information is a delicate task that can unfortunately +not be easily integrated with the CFG manipulation API. Many of the +functions and hooks to modify the CFG, such as +'redirect_edge_and_branch', do not have enough information to easily +update the profile, so updating it is in the majority of cases left up +to the caller. It is difficult to uncover bugs in the profile updating +code, because they manifest themselves only by producing worse code, and +checking profile consistency is not possible because of numeric error +accumulation. Hence special attention needs to be given to this issue +in each pass that modifies the CFG. + + It is important to point out that 'REG_BR_PROB_BASE' and 'BB_FREQ_BASE' +are both set low enough to be possible to compute second power of any +frequency or probability in the flow graph, it is not possible to even +square the 'count' field, as modern CPUs are fast enough to execute +$2^32$ operations quickly. + + +File: gccint.info, Node: Maintaining the CFG, Next: Liveness information, Prev: Profile information, Up: Control Flow + +14.4 Maintaining the CFG +======================== + +An important task of each compiler pass is to keep both the control flow +graph and all profile information up-to-date. Reconstruction of the +control flow graph after each pass is not an option, since it may be +very expensive and lost profile information cannot be reconstructed at +all. + + GCC has two major intermediate representations, and both use the +'basic_block' and 'edge' data types to represent control flow. Both +representations share as much of the CFG maintenance code as possible. +For each representation, a set of "hooks" is defined so that each +representation can provide its own implementation of CFG manipulation +routines when necessary. These hooks are defined in 'cfghooks.h'. +There are hooks for almost all common CFG manipulations, including block +splitting and merging, edge redirection and creating and deleting basic +blocks. These hooks should provide everything you need to maintain and +manipulate the CFG in both the RTL and 'GIMPLE' representation. + + At the moment, the basic block boundaries are maintained transparently +when modifying instructions, so there rarely is a need to move them +manually (such as in case someone wants to output instruction outside +basic block explicitly). + + In the RTL representation, each instruction has a 'BLOCK_FOR_INSN' +value that represents pointer to the basic block that contains the +instruction. In the 'GIMPLE' representation, the function 'gimple_bb' +returns a pointer to the basic block containing the queried statement. + + When changes need to be applied to a function in its 'GIMPLE' +representation, "GIMPLE statement iterators" should be used. These +iterators provide an integrated abstraction of the flow graph and the +instruction stream. Block statement iterators are constructed using the +'gimple_stmt_iterator' data structure and several modifier are +available, including the following: + +'gsi_start' + This function initializes a 'gimple_stmt_iterator' that points to + the first non-empty statement in a basic block. + +'gsi_last' + This function initializes a 'gimple_stmt_iterator' that points to + the last statement in a basic block. + +'gsi_end_p' + This predicate is 'true' if a 'gimple_stmt_iterator' represents the + end of a basic block. + +'gsi_next' + This function takes a 'gimple_stmt_iterator' and makes it point to + its successor. + +'gsi_prev' + This function takes a 'gimple_stmt_iterator' and makes it point to + its predecessor. + +'gsi_insert_after' + This function inserts a statement after the 'gimple_stmt_iterator' + passed in. The final parameter determines whether the statement + iterator is updated to point to the newly inserted statement, or + left pointing to the original statement. + +'gsi_insert_before' + This function inserts a statement before the 'gimple_stmt_iterator' + passed in. The final parameter determines whether the statement + iterator is updated to point to the newly inserted statement, or + left pointing to the original statement. + +'gsi_remove' + This function removes the 'gimple_stmt_iterator' passed in and + rechains the remaining statements in a basic block, if any. + + In the RTL representation, the macros 'BB_HEAD' and 'BB_END' may be +used to get the head and end 'rtx' of a basic block. No abstract +iterators are defined for traversing the insn chain, but you can just +use 'NEXT_INSN' and 'PREV_INSN' instead. *Note Insns::. + + Usually a code manipulating pass simplifies the instruction stream and +the flow of control, possibly eliminating some edges. This may for +example happen when a conditional jump is replaced with an unconditional +jump, but also when simplifying possibly trapping instruction to +non-trapping while compiling Java. Updating of edges is not transparent +and each optimization pass is required to do so manually. However only +few cases occur in practice. The pass may call 'purge_dead_edges' on a +given basic block to remove superfluous edges, if any. + + Another common scenario is redirection of branch instructions, but this +is best modeled as redirection of edges in the control flow graph and +thus use of 'redirect_edge_and_branch' is preferred over more low level +functions, such as 'redirect_jump' that operate on RTL chain only. The +CFG hooks defined in 'cfghooks.h' should provide the complete API +required for manipulating and maintaining the CFG. + + It is also possible that a pass has to insert control flow instruction +into the middle of a basic block, thus creating an entry point in the +middle of the basic block, which is impossible by definition: The block +must be split to make sure it only has one entry point, i.e. the head of +the basic block. The CFG hook 'split_block' may be used when an +instruction in the middle of a basic block has to become the target of a +jump or branch instruction. + + For a global optimizer, a common operation is to split edges in the +flow graph and insert instructions on them. In the RTL representation, +this can be easily done using the 'insert_insn_on_edge' function that +emits an instruction "on the edge", caching it for a later +'commit_edge_insertions' call that will take care of moving the inserted +instructions off the edge into the instruction stream contained in a +basic block. This includes the creation of new basic blocks where +needed. In the 'GIMPLE' representation, the equivalent functions are +'gsi_insert_on_edge' which inserts a block statement iterator on an +edge, and 'gsi_commit_edge_inserts' which flushes the instruction to +actual instruction stream. + + While debugging the optimization pass, the 'verify_flow_info' function +may be useful to find bugs in the control flow graph updating code. + + +File: gccint.info, Node: Liveness information, Prev: Maintaining the CFG, Up: Control Flow + +14.5 Liveness information +========================= + +Liveness information is useful to determine whether some register is +"live" at given point of program, i.e. that it contains a value that may +be used at a later point in the program. This information is used, for +instance, during register allocation, as the pseudo registers only need +to be assigned to a unique hard register or to a stack slot if they are +live. The hard registers and stack slots may be freely reused for other +values when a register is dead. + + Liveness information is available in the back end starting with +'pass_df_initialize' and ending with 'pass_df_finish'. Three flavors of +live analysis are available: With 'LR', it is possible to determine at +any point 'P' in the function if the register may be used on some path +from 'P' to the end of the function. With 'UR', it is possible to +determine if there is a path from the beginning of the function to 'P' +that defines the variable. 'LIVE' is the intersection of the 'LR' and +'UR' and a variable is live at 'P' if there is both an assignment that +reaches it from the beginning of the function and a use that can be +reached on some path from 'P' to the end of the function. + + In general 'LIVE' is the most useful of the three. The macros +'DF_[LR,UR,LIVE]_[IN,OUT]' can be used to access this information. The +macros take a basic block number and return a bitmap that is indexed by +the register number. This information is only guaranteed to be up to +date after calls are made to 'df_analyze'. See the file 'df-core.c' for +details on using the dataflow. + + The liveness information is stored partly in the RTL instruction stream +and partly in the flow graph. Local information is stored in the +instruction stream: Each instruction may contain 'REG_DEAD' notes +representing that the value of a given register is no longer needed, or +'REG_UNUSED' notes representing that the value computed by the +instruction is never used. The second is useful for instructions +computing multiple values at once. + + +File: gccint.info, Node: Loop Analysis and Representation, Next: Machine Desc, Prev: Control Flow, Up: Top + +15 Analysis and Representation of Loops +*************************************** + +GCC provides extensive infrastructure for work with natural loops, i.e., +strongly connected components of CFG with only one entry block. This +chapter describes representation of loops in GCC, both on GIMPLE and in +RTL, as well as the interfaces to loop-related analyses (induction +variable analysis and number of iterations analysis). + +* Menu: + +* Loop representation:: Representation and analysis of loops. +* Loop querying:: Getting information about loops. +* Loop manipulation:: Loop manipulation functions. +* LCSSA:: Loop-closed SSA form. +* Scalar evolutions:: Induction variables on GIMPLE. +* loop-iv:: Induction variables on RTL. +* Number of iterations:: Number of iterations analysis. +* Dependency analysis:: Data dependency analysis. +* Omega:: A solver for linear programming problems. + + +File: gccint.info, Node: Loop representation, Next: Loop querying, Up: Loop Analysis and Representation + +15.1 Loop representation +======================== + +This chapter describes the representation of loops in GCC, and functions +that can be used to build, modify and analyze this representation. Most +of the interfaces and data structures are declared in 'cfgloop.h'. Loop +structures are analyzed and this information disposed or updated at the +discretion of individual passes. Still most of the generic CFG +manipulation routines are aware of loop structures and try to keep them +up-to-date. By this means an increasing part of the compilation +pipeline is setup to maintain loop structure across passes to allow +attaching meta information to individual loops for consumption by later +passes. + + In general, a natural loop has one entry block (header) and possibly +several back edges (latches) leading to the header from the inside of +the loop. Loops with several latches may appear if several loops share +a single header, or if there is a branching in the middle of the loop. +The representation of loops in GCC however allows only loops with a +single latch. During loop analysis, headers of such loops are split and +forwarder blocks are created in order to disambiguate their structures. +Heuristic based on profile information and structure of the induction +variables in the loops is used to determine whether the latches +correspond to sub-loops or to control flow in a single loop. This means +that the analysis sometimes changes the CFG, and if you run it in the +middle of an optimization pass, you must be able to deal with the new +blocks. You may avoid CFG changes by passing +'LOOPS_MAY_HAVE_MULTIPLE_LATCHES' flag to the loop discovery, note +however that most other loop manipulation functions will not work +correctly for loops with multiple latch edges (the functions that only +query membership of blocks to loops and subloop relationships, or +enumerate and test loop exits, can be expected to work). + + Body of the loop is the set of blocks that are dominated by its header, +and reachable from its latch against the direction of edges in CFG. The +loops are organized in a containment hierarchy (tree) such that all the +loops immediately contained inside loop L are the children of L in the +tree. This tree is represented by the 'struct loops' structure. The +root of this tree is a fake loop that contains all blocks in the +function. Each of the loops is represented in a 'struct loop' +structure. Each loop is assigned an index ('num' field of the 'struct +loop' structure), and the pointer to the loop is stored in the +corresponding field of the 'larray' vector in the loops structure. The +indices do not have to be continuous, there may be empty ('NULL') +entries in the 'larray' created by deleting loops. Also, there is no +guarantee on the relative order of a loop and its subloops in the +numbering. The index of a loop never changes. + + The entries of the 'larray' field should not be accessed directly. The +function 'get_loop' returns the loop description for a loop with the +given index. 'number_of_loops' function returns number of loops in the +function. To traverse all loops, use 'FOR_EACH_LOOP' macro. The +'flags' argument of the macro is used to determine the direction of +traversal and the set of loops visited. Each loop is guaranteed to be +visited exactly once, regardless of the changes to the loop tree, and +the loops may be removed during the traversal. The newly created loops +are never traversed, if they need to be visited, this must be done +separately after their creation. The 'FOR_EACH_LOOP' macro allocates +temporary variables. If the 'FOR_EACH_LOOP' loop were ended using break +or goto, they would not be released; 'FOR_EACH_LOOP_BREAK' macro must be +used instead. + + Each basic block contains the reference to the innermost loop it +belongs to ('loop_father'). For this reason, it is only possible to +have one 'struct loops' structure initialized at the same time for each +CFG. The global variable 'current_loops' contains the 'struct loops' +structure. Many of the loop manipulation functions assume that +dominance information is up-to-date. + + The loops are analyzed through 'loop_optimizer_init' function. The +argument of this function is a set of flags represented in an integer +bitmask. These flags specify what other properties of the loop +structures should be calculated/enforced and preserved later: + + * 'LOOPS_MAY_HAVE_MULTIPLE_LATCHES': If this flag is set, no changes + to CFG will be performed in the loop analysis, in particular, loops + with multiple latch edges will not be disambiguated. If a loop has + multiple latches, its latch block is set to NULL. Most of the loop + manipulation functions will not work for loops in this shape. No + other flags that require CFG changes can be passed to + loop_optimizer_init. + * 'LOOPS_HAVE_PREHEADERS': Forwarder blocks are created in such a way + that each loop has only one entry edge, and additionally, the + source block of this entry edge has only one successor. This + creates a natural place where the code can be moved out of the + loop, and ensures that the entry edge of the loop leads from its + immediate super-loop. + * 'LOOPS_HAVE_SIMPLE_LATCHES': Forwarder blocks are created to force + the latch block of each loop to have only one successor. This + ensures that the latch of the loop does not belong to any of its + sub-loops, and makes manipulation with the loops significantly + easier. Most of the loop manipulation functions assume that the + loops are in this shape. Note that with this flag, the "normal" + loop without any control flow inside and with one exit consists of + two basic blocks. + * 'LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS': Basic blocks and edges in + the strongly connected components that are not natural loops (have + more than one entry block) are marked with 'BB_IRREDUCIBLE_LOOP' + and 'EDGE_IRREDUCIBLE_LOOP' flags. The flag is not set for blocks + and edges that belong to natural loops that are in such an + irreducible region (but it is set for the entry and exit edges of + such a loop, if they lead to/from this region). + * 'LOOPS_HAVE_RECORDED_EXITS': The lists of exits are recorded and + updated for each loop. This makes some functions (e.g., + 'get_loop_exit_edges') more efficient. Some functions (e.g., + 'single_exit') can be used only if the lists of exits are recorded. + + These properties may also be computed/enforced later, using functions +'create_preheaders', 'force_single_succ_latches', +'mark_irreducible_loops' and 'record_loop_exits'. The properties can be +queried using 'loops_state_satisfies_p'. + + The memory occupied by the loops structures should be freed with +'loop_optimizer_finalize' function. When loop structures are setup to +be preserved across passes this function reduces the information to be +kept up-to-date to a minimum (only 'LOOPS_MAY_HAVE_MULTIPLE_LATCHES' +set). + + The CFG manipulation functions in general do not update loop +structures. Specialized versions that additionally do so are provided +for the most common tasks. On GIMPLE, 'cleanup_tree_cfg_loop' function +can be used to cleanup CFG while updating the loops structures if +'current_loops' is set. + + At the moment loop structure is preserved from the start of GIMPLE loop +optimizations until the end of RTL loop optimizations. During this time +a loop can be tracked by its 'struct loop' and number. + + +File: gccint.info, Node: Loop querying, Next: Loop manipulation, Prev: Loop representation, Up: Loop Analysis and Representation + +15.2 Loop querying +================== + +The functions to query the information about loops are declared in +'cfgloop.h'. Some of the information can be taken directly from the +structures. 'loop_father' field of each basic block contains the +innermost loop to that the block belongs. The most useful fields of +loop structure (that are kept up-to-date at all times) are: + + * 'header', 'latch': Header and latch basic blocks of the loop. + * 'num_nodes': Number of basic blocks in the loop (including the + basic blocks of the sub-loops). + * 'depth': The depth of the loop in the loops tree, i.e., the number + of super-loops of the loop. + * 'outer', 'inner', 'next': The super-loop, the first sub-loop, and + the sibling of the loop in the loops tree. + + There are other fields in the loop structures, many of them used only +by some of the passes, or not updated during CFG changes; in general, +they should not be accessed directly. + + The most important functions to query loop structures are: + + * 'flow_loops_dump': Dumps the information about loops to a file. + * 'verify_loop_structure': Checks consistency of the loop structures. + * 'loop_latch_edge': Returns the latch edge of a loop. + * 'loop_preheader_edge': If loops have preheaders, returns the + preheader edge of a loop. + * 'flow_loop_nested_p': Tests whether loop is a sub-loop of another + loop. + * 'flow_bb_inside_loop_p': Tests whether a basic block belongs to a + loop (including its sub-loops). + * 'find_common_loop': Finds the common super-loop of two loops. + * 'superloop_at_depth': Returns the super-loop of a loop with the + given depth. + * 'tree_num_loop_insns', 'num_loop_insns': Estimates the number of + insns in the loop, on GIMPLE and on RTL. + * 'loop_exit_edge_p': Tests whether edge is an exit from a loop. + * 'mark_loop_exit_edges': Marks all exit edges of all loops with + 'EDGE_LOOP_EXIT' flag. + * 'get_loop_body', 'get_loop_body_in_dom_order', + 'get_loop_body_in_bfs_order': Enumerates the basic blocks in the + loop in depth-first search order in reversed CFG, ordered by + dominance relation, and breath-first search order, respectively. + * 'single_exit': Returns the single exit edge of the loop, or 'NULL' + if the loop has more than one exit. You can only use this function + if LOOPS_HAVE_MARKED_SINGLE_EXITS property is used. + * 'get_loop_exit_edges': Enumerates the exit edges of a loop. + * 'just_once_each_iteration_p': Returns true if the basic block is + executed exactly once during each iteration of a loop (that is, it + does not belong to a sub-loop, and it dominates the latch of the + loop). + + +File: gccint.info, Node: Loop manipulation, Next: LCSSA, Prev: Loop querying, Up: Loop Analysis and Representation + +15.3 Loop manipulation +====================== + +The loops tree can be manipulated using the following functions: + + * 'flow_loop_tree_node_add': Adds a node to the tree. + * 'flow_loop_tree_node_remove': Removes a node from the tree. + * 'add_bb_to_loop': Adds a basic block to a loop. + * 'remove_bb_from_loops': Removes a basic block from loops. + + Most low-level CFG functions update loops automatically. The following +functions handle some more complicated cases of CFG manipulations: + + * 'remove_path': Removes an edge and all blocks it dominates. + * 'split_loop_exit_edge': Splits exit edge of the loop, ensuring that + PHI node arguments remain in the loop (this ensures that + loop-closed SSA form is preserved). Only useful on GIMPLE. + + Finally, there are some higher-level loop transformations implemented. +While some of them are written so that they should work on non-innermost +loops, they are mostly untested in that case, and at the moment, they +are only reliable for the innermost loops: + + * 'create_iv': Creates a new induction variable. Only works on + GIMPLE. 'standard_iv_increment_position' can be used to find a + suitable place for the iv increment. + * 'duplicate_loop_to_header_edge', + 'tree_duplicate_loop_to_header_edge': These functions (on RTL and + on GIMPLE) duplicate the body of the loop prescribed number of + times on one of the edges entering loop header, thus performing + either loop unrolling or loop peeling. 'can_duplicate_loop_p' + ('can_unroll_loop_p' on GIMPLE) must be true for the duplicated + loop. + * 'loop_version', 'tree_ssa_loop_version': These function create a + copy of a loop, and a branch before them that selects one of them + depending on the prescribed condition. This is useful for + optimizations that need to verify some assumptions in runtime (one + of the copies of the loop is usually left unchanged, while the + other one is transformed in some way). + * 'tree_unroll_loop': Unrolls the loop, including peeling the extra + iterations to make the number of iterations divisible by unroll + factor, updating the exit condition, and removing the exits that + now cannot be taken. Works only on GIMPLE. + + +File: gccint.info, Node: LCSSA, Next: Scalar evolutions, Prev: Loop manipulation, Up: Loop Analysis and Representation + +15.4 Loop-closed SSA form +========================= + +Throughout the loop optimizations on tree level, one extra condition is +enforced on the SSA form: No SSA name is used outside of the loop in +that it is defined. The SSA form satisfying this condition is called +"loop-closed SSA form" - LCSSA. To enforce LCSSA, PHI nodes must be +created at the exits of the loops for the SSA names that are used +outside of them. Only the real operands (not virtual SSA names) are +held in LCSSA, in order to save memory. + + There are various benefits of LCSSA: + + * Many optimizations (value range analysis, final value replacement) + are interested in the values that are defined in the loop and used + outside of it, i.e., exactly those for that we create new PHI + nodes. + * In induction variable analysis, it is not necessary to specify the + loop in that the analysis should be performed - the scalar + evolution analysis always returns the results with respect to the + loop in that the SSA name is defined. + * It makes updating of SSA form during loop transformations simpler. + Without LCSSA, operations like loop unrolling may force creation of + PHI nodes arbitrarily far from the loop, while in LCSSA, the SSA + form can be updated locally. However, since we only keep real + operands in LCSSA, we cannot use this advantage (we could have + local updating of real operands, but it is not much more efficient + than to use generic SSA form updating for it as well; the amount of + changes to SSA is the same). + + However, it also means LCSSA must be updated. This is usually +straightforward, unless you create a new value in loop and use it +outside, or unless you manipulate loop exit edges (functions are +provided to make these manipulations simple). +'rewrite_into_loop_closed_ssa' is used to rewrite SSA form to LCSSA, and +'verify_loop_closed_ssa' to check that the invariant of LCSSA is +preserved. + + +File: gccint.info, Node: Scalar evolutions, Next: loop-iv, Prev: LCSSA, Up: Loop Analysis and Representation + +15.5 Scalar evolutions +====================== + +Scalar evolutions (SCEV) are used to represent results of induction +variable analysis on GIMPLE. They enable us to represent variables with +complicated behavior in a simple and consistent way (we only use it to +express values of polynomial induction variables, but it is possible to +extend it). The interfaces to SCEV analysis are declared in +'tree-scalar-evolution.h'. To use scalar evolutions analysis, +'scev_initialize' must be used. To stop using SCEV, 'scev_finalize' +should be used. SCEV analysis caches results in order to save time and +memory. This cache however is made invalid by most of the loop +transformations, including removal of code. If such a transformation is +performed, 'scev_reset' must be called to clean the caches. + + Given an SSA name, its behavior in loops can be analyzed using the +'analyze_scalar_evolution' function. The returned SCEV however does not +have to be fully analyzed and it may contain references to other SSA +names defined in the loop. To resolve these (potentially recursive) +references, 'instantiate_parameters' or 'resolve_mixers' functions must +be used. 'instantiate_parameters' is useful when you use the results of +SCEV only for some analysis, and when you work with whole nest of loops +at once. It will try replacing all SSA names by their SCEV in all +loops, including the super-loops of the current loop, thus providing a +complete information about the behavior of the variable in the loop +nest. 'resolve_mixers' is useful if you work with only one loop at a +time, and if you possibly need to create code based on the value of the +induction variable. It will only resolve the SSA names defined in the +current loop, leaving the SSA names defined outside unchanged, even if +their evolution in the outer loops is known. + + The SCEV is a normal tree expression, except for the fact that it may +contain several special tree nodes. One of them is 'SCEV_NOT_KNOWN', +used for SSA names whose value cannot be expressed. The other one is +'POLYNOMIAL_CHREC'. Polynomial chrec has three arguments - base, step +and loop (both base and step may contain further polynomial chrecs). +Type of the expression and of base and step must be the same. A +variable has evolution 'POLYNOMIAL_CHREC(base, step, loop)' if it is (in +the specified loop) equivalent to 'x_1' in the following example + + while (...) + { + x_1 = phi (base, x_2); + x_2 = x_1 + step; + } + + Note that this includes the language restrictions on the operations. +For example, if we compile C code and 'x' has signed type, then the +overflow in addition would cause undefined behavior, and we may assume +that this does not happen. Hence, the value with this SCEV cannot +overflow (which restricts the number of iterations of such a loop). + + In many cases, one wants to restrict the attention just to affine +induction variables. In this case, the extra expressive power of SCEV +is not useful, and may complicate the optimizations. In this case, +'simple_iv' function may be used to analyze a value - the result is a +loop-invariant base and step. + + +File: gccint.info, Node: loop-iv, Next: Number of iterations, Prev: Scalar evolutions, Up: Loop Analysis and Representation + +15.6 IV analysis on RTL +======================= + +The induction variable on RTL is simple and only allows analysis of +affine induction variables, and only in one loop at once. The interface +is declared in 'cfgloop.h'. Before analyzing induction variables in a +loop L, 'iv_analysis_loop_init' function must be called on L. After the +analysis (possibly calling 'iv_analysis_loop_init' for several loops) is +finished, 'iv_analysis_done' should be called. The following functions +can be used to access the results of the analysis: + + * 'iv_analyze': Analyzes a single register used in the given insn. + If no use of the register in this insn is found, the following + insns are scanned, so that this function can be called on the insn + returned by get_condition. + * 'iv_analyze_result': Analyzes result of the assignment in the given + insn. + * 'iv_analyze_expr': Analyzes a more complicated expression. All its + operands are analyzed by 'iv_analyze', and hence they must be used + in the specified insn or one of the following insns. + + The description of the induction variable is provided in 'struct +rtx_iv'. In order to handle subregs, the representation is a bit +complicated; if the value of the 'extend' field is not 'UNKNOWN', the +value of the induction variable in the i-th iteration is + + delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)), + + with the following exception: if 'first_special' is true, then the +value in the first iteration (when 'i' is zero) is 'delta + mult * +base'. However, if 'extend' is equal to 'UNKNOWN', then 'first_special' +must be false, 'delta' 0, 'mult' 1 and the value in the i-th iteration +is + + subreg_{mode} (base + i * step) + + The function 'get_iv_value' can be used to perform these calculations. + + +File: gccint.info, Node: Number of iterations, Next: Dependency analysis, Prev: loop-iv, Up: Loop Analysis and Representation + +15.7 Number of iterations analysis +================================== + +Both on GIMPLE and on RTL, there are functions available to determine +the number of iterations of a loop, with a similar interface. The +number of iterations of a loop in GCC is defined as the number of +executions of the loop latch. In many cases, it is not possible to +determine the number of iterations unconditionally - the determined +number is correct only if some assumptions are satisfied. The analysis +tries to verify these conditions using the information contained in the +program; if it fails, the conditions are returned together with the +result. The following information and conditions are provided by the +analysis: + + * 'assumptions': If this condition is false, the rest of the + information is invalid. + * 'noloop_assumptions' on RTL, 'may_be_zero' on GIMPLE: If this + condition is true, the loop exits in the first iteration. + * 'infinite': If this condition is true, the loop is infinite. This + condition is only available on RTL. On GIMPLE, conditions for + finiteness of the loop are included in 'assumptions'. + * 'niter_expr' on RTL, 'niter' on GIMPLE: The expression that gives + number of iterations. The number of iterations is defined as the + number of executions of the loop latch. + + Both on GIMPLE and on RTL, it necessary for the induction variable +analysis framework to be initialized (SCEV on GIMPLE, loop-iv on RTL). +On GIMPLE, the results are stored to 'struct tree_niter_desc' structure. +Number of iterations before the loop is exited through a given exit can +be determined using 'number_of_iterations_exit' function. On RTL, the +results are returned in 'struct niter_desc' structure. The +corresponding function is named 'check_simple_exit'. There are also +functions that pass through all the exits of a loop and try to find one +with easy to determine number of iterations - 'find_loop_niter' on +GIMPLE and 'find_simple_exit' on RTL. Finally, there are functions that +provide the same information, but additionally cache it, so that +repeated calls to number of iterations are not so costly - +'number_of_latch_executions' on GIMPLE and 'get_simple_loop_desc' on +RTL. + + Note that some of these functions may behave slightly differently than +others - some of them return only the expression for the number of +iterations, and fail if there are some assumptions. The function +'number_of_latch_executions' works only for single-exit loops. The +function 'number_of_cond_exit_executions' can be used to determine +number of executions of the exit condition of a single-exit loop (i.e., +the 'number_of_latch_executions' increased by one). + + +File: gccint.info, Node: Dependency analysis, Next: Omega, Prev: Number of iterations, Up: Loop Analysis and Representation + +15.8 Data Dependency Analysis +============================= + +The code for the data dependence analysis can be found in +'tree-data-ref.c' and its interface and data structures are described in +'tree-data-ref.h'. The function that computes the data dependences for +all the array and pointer references for a given loop is +'compute_data_dependences_for_loop'. This function is currently used by +the linear loop transform and the vectorization passes. Before calling +this function, one has to allocate two vectors: a first vector will +contain the set of data references that are contained in the analyzed +loop body, and the second vector will contain the dependence relations +between the data references. Thus if the vector of data references is +of size 'n', the vector containing the dependence relations will contain +'n*n' elements. However if the analyzed loop contains side effects, +such as calls that potentially can interfere with the data references in +the current analyzed loop, the analysis stops while scanning the loop +body for data references, and inserts a single 'chrec_dont_know' in the +dependence relation array. + + The data references are discovered in a particular order during the +scanning of the loop body: the loop body is analyzed in execution order, +and the data references of each statement are pushed at the end of the +data reference array. Two data references syntactically occur in the +program in the same order as in the array of data references. This +syntactic order is important in some classical data dependence tests, +and mapping this order to the elements of this array avoids costly +queries to the loop body representation. + + Three types of data references are currently handled: ARRAY_REF, +INDIRECT_REF and COMPONENT_REF. The data structure for the data +reference is 'data_reference', where 'data_reference_p' is a name of a +pointer to the data reference structure. The structure contains the +following elements: + + * 'base_object_info': Provides information about the base object of + the data reference and its access functions. These access + functions represent the evolution of the data reference in the loop + relative to its base, in keeping with the classical meaning of the + data reference access function for the support of arrays. For + example, for a reference 'a.b[i][j]', the base object is 'a.b' and + the access functions, one for each array subscript, are: '{i_init, + + i_step}_1, {j_init, +, j_step}_2'. + + * 'first_location_in_loop': Provides information about the first + location accessed by the data reference in the loop and about the + access function used to represent evolution relative to this + location. This data is used to support pointers, and is not used + for arrays (for which we have base objects). Pointer accesses are + represented as a one-dimensional access that starts from the first + location accessed in the loop. For example: + + for1 i + for2 j + *((int *)p + i + j) = a[i][j]; + + The access function of the pointer access is '{0, + 4B}_for2' + relative to 'p + i'. The access functions of the array are + '{i_init, + i_step}_for1' and '{j_init, +, j_step}_for2' relative + to 'a'. + + Usually, the object the pointer refers to is either unknown, or we + can't prove that the access is confined to the boundaries of a + certain object. + + Two data references can be compared only if at least one of these + two representations has all its fields filled for both data + references. + + The current strategy for data dependence tests is as follows: If + both 'a' and 'b' are represented as arrays, compare 'a.base_object' + and 'b.base_object'; if they are equal, apply dependence tests (use + access functions based on base_objects). Else if both 'a' and 'b' + are represented as pointers, compare 'a.first_location' and + 'b.first_location'; if they are equal, apply dependence tests (use + access functions based on first location). However, if 'a' and 'b' + are represented differently, only try to prove that the bases are + definitely different. + + * Aliasing information. + * Alignment information. + + The structure describing the relation between two data references is +'data_dependence_relation' and the shorter name for a pointer to such a +structure is 'ddr_p'. This structure contains: + + * a pointer to each data reference, + * a tree node 'are_dependent' that is set to 'chrec_known' if the + analysis has proved that there is no dependence between these two + data references, 'chrec_dont_know' if the analysis was not able to + determine any useful result and potentially there could exist a + dependence between these data references, and 'are_dependent' is + set to 'NULL_TREE' if there exist a dependence relation between the + data references, and the description of this dependence relation is + given in the 'subscripts', 'dir_vects', and 'dist_vects' arrays, + * a boolean that determines whether the dependence relation can be + represented by a classical distance vector, + * an array 'subscripts' that contains a description of each subscript + of the data references. Given two array accesses a subscript is + the tuple composed of the access functions for a given dimension. + For example, given 'A[f1][f2][f3]' and 'B[g1][g2][g3]', there are + three subscripts: '(f1, g1), (f2, g2), (f3, g3)'. + * two arrays 'dir_vects' and 'dist_vects' that contain classical + representations of the data dependences under the form of direction + and distance dependence vectors, + * an array of loops 'loop_nest' that contains the loops to which the + distance and direction vectors refer to. + + Several functions for pretty printing the information extracted by the +data dependence analysis are available: 'dump_ddrs' prints with a +maximum verbosity the details of a data dependence relations array, +'dump_dist_dir_vectors' prints only the classical distance and direction +vectors for a data dependence relations array, and +'dump_data_references' prints the details of the data references +contained in a data reference array. + + +File: gccint.info, Node: Omega, Prev: Dependency analysis, Up: Loop Analysis and Representation + +15.9 Omega a solver for linear programming problems +=================================================== + +The data dependence analysis contains several solvers triggered +sequentially from the less complex ones to the more sophisticated. For +ensuring the consistency of the results of these solvers, a data +dependence check pass has been implemented based on two different +solvers. The second method that has been integrated to GCC is based on +the Omega dependence solver, written in the 1990's by William Pugh and +David Wonnacott. Data dependence tests can be formulated using a subset +of the Presburger arithmetics that can be translated to linear +constraint systems. These linear constraint systems can then be solved +using the Omega solver. + + The Omega solver is using Fourier-Motzkin's algorithm for variable +elimination: a linear constraint system containing 'n' variables is +reduced to a linear constraint system with 'n-1' variables. The Omega +solver can also be used for solving other problems that can be expressed +under the form of a system of linear equalities and inequalities. The +Omega solver is known to have an exponential worst case, also known +under the name of "omega nightmare" in the literature, but in practice, +the omega test is known to be efficient for the common data dependence +tests. + + The interface used by the Omega solver for describing the linear +programming problems is described in 'omega.h', and the solver is +'omega_solve_problem'. + + +File: gccint.info, Node: Machine Desc, Next: Target Macros, Prev: Loop Analysis and Representation, Up: Top + +16 Machine Descriptions +*********************** + +A machine description has two parts: a file of instruction patterns +('.md' file) and a C header file of macro definitions. + + The '.md' file for a target machine contains a pattern for each +instruction that the target machine supports (or at least each +instruction that is worth telling the compiler about). It may also +contain comments. A semicolon causes the rest of the line to be a +comment, unless the semicolon is inside a quoted string. + + See the next chapter for information on the C header file. + +* Menu: + +* Overview:: How the machine description is used. +* Patterns:: How to write instruction patterns. +* Example:: An explained example of a 'define_insn' pattern. +* RTL Template:: The RTL template defines what insns match a pattern. +* Output Template:: The output template says how to make assembler code + from such an insn. +* Output Statement:: For more generality, write C code to output + the assembler code. +* Predicates:: Controlling what kinds of operands can be used + for an insn. +* Constraints:: Fine-tuning operand selection. +* Standard Names:: Names mark patterns to use for code generation. +* Pattern Ordering:: When the order of patterns makes a difference. +* Dependent Patterns:: Having one pattern may make you need another. +* Jump Patterns:: Special considerations for patterns for jump insns. +* Looping Patterns:: How to define patterns for special looping insns. +* Insn Canonicalizations::Canonicalization of Instructions +* Expander Definitions::Generating a sequence of several RTL insns + for a standard operation. +* Insn Splitting:: Splitting Instructions into Multiple Instructions. +* Including Patterns:: Including Patterns in Machine Descriptions. +* Peephole Definitions::Defining machine-specific peephole optimizations. +* Insn Attributes:: Specifying the value of attributes for generated insns. +* Conditional Execution::Generating 'define_insn' patterns for + predication. +* Define Subst:: Generating 'define_insn' and 'define_expand' + patterns from other patterns. +* Constant Definitions::Defining symbolic constants that can be used in the + md file. +* Iterators:: Using iterators to generate patterns from a template. + + +File: gccint.info, Node: Overview, Next: Patterns, Up: Machine Desc + +16.1 Overview of How the Machine Description is Used +==================================================== + +There are three main conversions that happen in the compiler: + + 1. The front end reads the source code and builds a parse tree. + + 2. The parse tree is used to generate an RTL insn list based on named + instruction patterns. + + 3. The insn list is matched against the RTL templates to produce + assembler code. + + For the generate pass, only the names of the insns matter, from either +a named 'define_insn' or a 'define_expand'. The compiler will choose +the pattern with the right name and apply the operands according to the +documentation later in this chapter, without regard for the RTL template +or operand constraints. Note that the names the compiler looks for are +hard-coded in the compiler--it will ignore unnamed patterns and patterns +with names it doesn't know about, but if you don't provide a named +pattern it needs, it will abort. + + If a 'define_insn' is used, the template given is inserted into the +insn list. If a 'define_expand' is used, one of three things happens, +based on the condition logic. The condition logic may manually create +new insns for the insn list, say via 'emit_insn()', and invoke 'DONE'. +For certain named patterns, it may invoke 'FAIL' to tell the compiler to +use an alternate way of performing that task. If it invokes neither +'DONE' nor 'FAIL', the template given in the pattern is inserted, as if +the 'define_expand' were a 'define_insn'. + + Once the insn list is generated, various optimization passes convert, +replace, and rearrange the insns in the insn list. This is where the +'define_split' and 'define_peephole' patterns get used, for example. + + Finally, the insn list's RTL is matched up with the RTL templates in +the 'define_insn' patterns, and those patterns are used to emit the +final assembly code. For this purpose, each named 'define_insn' acts +like it's unnamed, since the names are ignored. + + +File: gccint.info, Node: Patterns, Next: Example, Prev: Overview, Up: Machine Desc + +16.2 Everything about Instruction Patterns +========================================== + +Each instruction pattern contains an incomplete RTL expression, with +pieces to be filled in later, operand constraints that restrict how the +pieces can be filled in, and an output pattern or C code to generate the +assembler output, all wrapped up in a 'define_insn' expression. + + A 'define_insn' is an RTL expression containing four or five operands: + + 1. An optional name. The presence of a name indicate that this + instruction pattern can perform a certain standard job for the + RTL-generation pass of the compiler. This pass knows certain names + and will use the instruction patterns with those names, if the + names are defined in the machine description. + + The absence of a name is indicated by writing an empty string where + the name should go. Nameless instruction patterns are never used + for generating RTL code, but they may permit several simpler insns + to be combined later on. + + Names that are not thus known and used in RTL-generation have no + effect; they are equivalent to no name at all. + + For the purpose of debugging the compiler, you may also specify a + name beginning with the '*' character. Such a name is used only + for identifying the instruction in RTL dumps; it is entirely + equivalent to having a nameless pattern for all other purposes. + + 2. The "RTL template" (*note RTL Template::) is a vector of incomplete + RTL expressions which show what the instruction should look like. + It is incomplete because it may contain 'match_operand', + 'match_operator', and 'match_dup' expressions that stand for + operands of the instruction. + + If the vector has only one element, that element is the template + for the instruction pattern. If the vector has multiple elements, + then the instruction pattern is a 'parallel' expression containing + the elements described. + + 3. A condition. This is a string which contains a C expression that + is the final test to decide whether an insn body matches this + pattern. + + For a named pattern, the condition (if present) may not depend on + the data in the insn being matched, but only the + target-machine-type flags. The compiler needs to test these + conditions during initialization in order to learn exactly which + named instructions are available in a particular run. + + For nameless patterns, the condition is applied only when matching + an individual insn, and only after the insn has matched the + pattern's recognition template. The insn's operands may be found + in the vector 'operands'. For an insn where the condition has once + matched, it can't be used to control register allocation, for + example by excluding certain hard registers or hard register + combinations. + + 4. The "output template": a string that says how to output matching + insns as assembler code. '%' in this string specifies where to + substitute the value of an operand. *Note Output Template::. + + When simple substitution isn't general enough, you can specify a + piece of C code to compute the output. *Note Output Statement::. + + 5. Optionally, a vector containing the values of attributes for insns + matching this pattern. *Note Insn Attributes::. + + +File: gccint.info, Node: Example, Next: RTL Template, Prev: Patterns, Up: Machine Desc + +16.3 Example of 'define_insn' +============================= + +Here is an actual example of an instruction pattern, for the +68000/68020. + + (define_insn "tstsi" + [(set (cc0) + (match_operand:SI 0 "general_operand" "rm"))] + "" + "* + { + if (TARGET_68020 || ! ADDRESS_REG_P (operands[0])) + return \"tstl %0\"; + return \"cmpl #0,%0\"; + }") + +This can also be written using braced strings: + + (define_insn "tstsi" + [(set (cc0) + (match_operand:SI 0 "general_operand" "rm"))] + "" + { + if (TARGET_68020 || ! ADDRESS_REG_P (operands[0])) + return "tstl %0"; + return "cmpl #0,%0"; + }) + + This is an instruction that sets the condition codes based on the value +of a general operand. It has no condition, so any insn whose RTL +description has the form shown may be handled according to this pattern. +The name 'tstsi' means "test a 'SImode' value" and tells the RTL +generation pass that, when it is necessary to test such a value, an insn +to do so can be constructed using this pattern. + + The output control string is a piece of C code which chooses which +output template to return based on the kind of operand and the specific +type of CPU for which code is being generated. + + '"rm"' is an operand constraint. Its meaning is explained below. + + +File: gccint.info, Node: RTL Template, Next: Output Template, Prev: Example, Up: Machine Desc + +16.4 RTL Template +================= + +The RTL template is used to define which insns match the particular +pattern and how to find their operands. For named patterns, the RTL +template also says how to construct an insn from specified operands. + + Construction involves substituting specified operands into a copy of +the template. Matching involves determining the values that serve as +the operands in the insn being matched. Both of these activities are +controlled by special expression types that direct matching and +substitution of the operands. + +'(match_operand:M N PREDICATE CONSTRAINT)' + This expression is a placeholder for operand number N of the insn. + When constructing an insn, operand number N will be substituted at + this point. When matching an insn, whatever appears at this + position in the insn will be taken as operand number N; but it must + satisfy PREDICATE or this instruction pattern will not match at + all. + + Operand numbers must be chosen consecutively counting from zero in + each instruction pattern. There may be only one 'match_operand' + expression in the pattern for each operand number. Usually + operands are numbered in the order of appearance in 'match_operand' + expressions. In the case of a 'define_expand', any operand numbers + used only in 'match_dup' expressions have higher values than all + other operand numbers. + + PREDICATE is a string that is the name of a function that accepts + two arguments, an expression and a machine mode. *Note + Predicates::. During matching, the function will be called with + the putative operand as the expression and M as the mode argument + (if M is not specified, 'VOIDmode' will be used, which normally + causes PREDICATE to accept any mode). If it returns zero, this + instruction pattern fails to match. PREDICATE may be an empty + string; then it means no test is to be done on the operand, so + anything which occurs in this position is valid. + + Most of the time, PREDICATE will reject modes other than M--but not + always. For example, the predicate 'address_operand' uses M as the + mode of memory ref that the address should be valid for. Many + predicates accept 'const_int' nodes even though their mode is + 'VOIDmode'. + + CONSTRAINT controls reloading and the choice of the best register + class to use for a value, as explained later (*note Constraints::). + If the constraint would be an empty string, it can be omitted. + + People are often unclear on the difference between the constraint + and the predicate. The predicate helps decide whether a given insn + matches the pattern. The constraint plays no role in this + decision; instead, it controls various decisions in the case of an + insn which does match. + +'(match_scratch:M N CONSTRAINT)' + This expression is also a placeholder for operand number N and + indicates that operand must be a 'scratch' or 'reg' expression. + + When matching patterns, this is equivalent to + + (match_operand:M N "scratch_operand" PRED) + + but, when generating RTL, it produces a ('scratch':M) expression. + + If the last few expressions in a 'parallel' are 'clobber' + expressions whose operands are either a hard register or + 'match_scratch', the combiner can add or delete them when + necessary. *Note Side Effects::. + +'(match_dup N)' + This expression is also a placeholder for operand number N. It is + used when the operand needs to appear more than once in the insn. + + In construction, 'match_dup' acts just like 'match_operand': the + operand is substituted into the insn being constructed. But in + matching, 'match_dup' behaves differently. It assumes that operand + number N has already been determined by a 'match_operand' appearing + earlier in the recognition template, and it matches only an + identical-looking expression. + + Note that 'match_dup' should not be used to tell the compiler that + a particular register is being used for two operands (example: + 'add' that adds one register to another; the second register is + both an input operand and the output operand). Use a matching + constraint (*note Simple Constraints::) for those. 'match_dup' is + for the cases where one operand is used in two places in the + template, such as an instruction that computes both a quotient and + a remainder, where the opcode takes two input operands but the RTL + template has to refer to each of those twice; once for the quotient + pattern and once for the remainder pattern. + +'(match_operator:M N PREDICATE [OPERANDS...])' + This pattern is a kind of placeholder for a variable RTL expression + code. + + When constructing an insn, it stands for an RTL expression whose + expression code is taken from that of operand N, and whose operands + are constructed from the patterns OPERANDS. + + When matching an expression, it matches an expression if the + function PREDICATE returns nonzero on that expression _and_ the + patterns OPERANDS match the operands of the expression. + + Suppose that the function 'commutative_operator' is defined as + follows, to match any expression whose operator is one of the + commutative arithmetic operators of RTL and whose mode is MODE: + + int + commutative_integer_operator (x, mode) + rtx x; + enum machine_mode mode; + { + enum rtx_code code = GET_CODE (x); + if (GET_MODE (x) != mode) + return 0; + return (GET_RTX_CLASS (code) == RTX_COMM_ARITH + || code == EQ || code == NE); + } + + Then the following pattern will match any RTL expression consisting + of a commutative operator applied to two general operands: + + (match_operator:SI 3 "commutative_operator" + [(match_operand:SI 1 "general_operand" "g") + (match_operand:SI 2 "general_operand" "g")]) + + Here the vector '[OPERANDS...]' contains two patterns because the + expressions to be matched all contain two operands. + + When this pattern does match, the two operands of the commutative + operator are recorded as operands 1 and 2 of the insn. (This is + done by the two instances of 'match_operand'.) Operand 3 of the + insn will be the entire commutative expression: use 'GET_CODE + (operands[3])' to see which commutative operator was used. + + The machine mode M of 'match_operator' works like that of + 'match_operand': it is passed as the second argument to the + predicate function, and that function is solely responsible for + deciding whether the expression to be matched "has" that mode. + + When constructing an insn, argument 3 of the gen-function will + specify the operation (i.e. the expression code) for the expression + to be made. It should be an RTL expression, whose expression code + is copied into a new expression whose operands are arguments 1 and + 2 of the gen-function. The subexpressions of argument 3 are not + used; only its expression code matters. + + When 'match_operator' is used in a pattern for matching an insn, it + usually best if the operand number of the 'match_operator' is + higher than that of the actual operands of the insn. This improves + register allocation because the register allocator often looks at + operands 1 and 2 of insns to see if it can do register tying. + + There is no way to specify constraints in 'match_operator'. The + operand of the insn which corresponds to the 'match_operator' never + has any constraints because it is never reloaded as a whole. + However, if parts of its OPERANDS are matched by 'match_operand' + patterns, those parts may have constraints of their own. + +'(match_op_dup:M N[OPERANDS...])' + Like 'match_dup', except that it applies to operators instead of + operands. When constructing an insn, operand number N will be + substituted at this point. But in matching, 'match_op_dup' behaves + differently. It assumes that operand number N has already been + determined by a 'match_operator' appearing earlier in the + recognition template, and it matches only an identical-looking + expression. + +'(match_parallel N PREDICATE [SUBPAT...])' + This pattern is a placeholder for an insn that consists of a + 'parallel' expression with a variable number of elements. This + expression should only appear at the top level of an insn pattern. + + When constructing an insn, operand number N will be substituted at + this point. When matching an insn, it matches if the body of the + insn is a 'parallel' expression with at least as many elements as + the vector of SUBPAT expressions in the 'match_parallel', if each + SUBPAT matches the corresponding element of the 'parallel', _and_ + the function PREDICATE returns nonzero on the 'parallel' that is + the body of the insn. It is the responsibility of the predicate to + validate elements of the 'parallel' beyond those listed in the + 'match_parallel'. + + A typical use of 'match_parallel' is to match load and store + multiple expressions, which can contain a variable number of + elements in a 'parallel'. For example, + + (define_insn "" + [(match_parallel 0 "load_multiple_operation" + [(set (match_operand:SI 1 "gpc_reg_operand" "=r") + (match_operand:SI 2 "memory_operand" "m")) + (use (reg:SI 179)) + (clobber (reg:SI 179))])] + "" + "loadm 0,0,%1,%2") + + This example comes from 'a29k.md'. The function + 'load_multiple_operation' is defined in 'a29k.c' and checks that + subsequent elements in the 'parallel' are the same as the 'set' in + the pattern, except that they are referencing subsequent registers + and memory locations. + + An insn that matches this pattern might look like: + + (parallel + [(set (reg:SI 20) (mem:SI (reg:SI 100))) + (use (reg:SI 179)) + (clobber (reg:SI 179)) + (set (reg:SI 21) + (mem:SI (plus:SI (reg:SI 100) + (const_int 4)))) + (set (reg:SI 22) + (mem:SI (plus:SI (reg:SI 100) + (const_int 8))))]) + +'(match_par_dup N [SUBPAT...])' + Like 'match_op_dup', but for 'match_parallel' instead of + 'match_operator'. + + +File: gccint.info, Node: Output Template, Next: Output Statement, Prev: RTL Template, Up: Machine Desc + +16.5 Output Templates and Operand Substitution +============================================== + +The "output template" is a string which specifies how to output the +assembler code for an instruction pattern. Most of the template is a +fixed string which is output literally. The character '%' is used to +specify where to substitute an operand; it can also be used to identify +places where different variants of the assembler require different +syntax. + + In the simplest case, a '%' followed by a digit N says to output +operand N at that point in the string. + + '%' followed by a letter and a digit says to output an operand in an +alternate fashion. Four letters have standard, built-in meanings +described below. The machine description macro 'PRINT_OPERAND' can +define additional letters with nonstandard meanings. + + '%cDIGIT' can be used to substitute an operand that is a constant value +without the syntax that normally indicates an immediate operand. + + '%nDIGIT' is like '%cDIGIT' except that the value of the constant is +negated before printing. + + '%aDIGIT' can be used to substitute an operand as if it were a memory +reference, with the actual operand treated as the address. This may be +useful when outputting a "load address" instruction, because often the +assembler syntax for such an instruction requires you to write the +operand as if it were a memory reference. + + '%lDIGIT' is used to substitute a 'label_ref' into a jump instruction. + + '%=' outputs a number which is unique to each instruction in the entire +compilation. This is useful for making local labels to be referred to +more than once in a single template that generates multiple assembler +instructions. + + '%' followed by a punctuation character specifies a substitution that +does not use an operand. Only one case is standard: '%%' outputs a '%' +into the assembler code. Other nonstandard cases can be defined in the +'PRINT_OPERAND' macro. You must also define which punctuation +characters are valid with the 'PRINT_OPERAND_PUNCT_VALID_P' macro. + + The template may generate multiple assembler instructions. Write the +text for the instructions, with '\;' between them. + + When the RTL contains two operands which are required by constraint to +match each other, the output template must refer only to the +lower-numbered operand. Matching operands are not always identical, and +the rest of the compiler arranges to put the proper RTL expression for +printing into the lower-numbered operand. + + One use of nonstandard letters or punctuation following '%' is to +distinguish between different assembler languages for the same machine; +for example, Motorola syntax versus MIT syntax for the 68000. Motorola +syntax requires periods in most opcode names, while MIT syntax does not. +For example, the opcode 'movel' in MIT syntax is 'move.l' in Motorola +syntax. The same file of patterns is used for both kinds of output +syntax, but the character sequence '%.' is used in each place where +Motorola syntax wants a period. The 'PRINT_OPERAND' macro for Motorola +syntax defines the sequence to output a period; the macro for MIT syntax +defines it to do nothing. + + As a special case, a template consisting of the single character '#' +instructs the compiler to first split the insn, and then output the +resulting instructions separately. This helps eliminate redundancy in +the output templates. If you have a 'define_insn' that needs to emit +multiple assembler instructions, and there is a matching 'define_split' +already defined, then you can simply use '#' as the output template +instead of writing an output template that emits the multiple assembler +instructions. + + If the macro 'ASSEMBLER_DIALECT' is defined, you can use construct of +the form '{option0|option1|option2}' in the templates. These describe +multiple variants of assembler language syntax. *Note Instruction +Output::. + + +File: gccint.info, Node: Output Statement, Next: Predicates, Prev: Output Template, Up: Machine Desc + +16.6 C Statements for Assembler Output +====================================== + +Often a single fixed template string cannot produce correct and +efficient assembler code for all the cases that are recognized by a +single instruction pattern. For example, the opcodes may depend on the +kinds of operands; or some unfortunate combinations of operands may +require extra machine instructions. + + If the output control string starts with a '@', then it is actually a +series of templates, each on a separate line. (Blank lines and leading +spaces and tabs are ignored.) The templates correspond to the pattern's +constraint alternatives (*note Multi-Alternative::). For example, if a +target machine has a two-address add instruction 'addr' to add into a +register and another 'addm' to add a register to memory, you might write +this pattern: + + (define_insn "addsi3" + [(set (match_operand:SI 0 "general_operand" "=r,m") + (plus:SI (match_operand:SI 1 "general_operand" "0,0") + (match_operand:SI 2 "general_operand" "g,r")))] + "" + "@ + addr %2,%0 + addm %2,%0") + + If the output control string starts with a '*', then it is not an +output template but rather a piece of C program that should compute a +template. It should execute a 'return' statement to return the +template-string you want. Most such templates use C string literals, +which require doublequote characters to delimit them. To include these +doublequote characters in the string, prefix each one with '\'. + + If the output control string is written as a brace block instead of a +double-quoted string, it is automatically assumed to be C code. In that +case, it is not necessary to put in a leading asterisk, or to escape the +doublequotes surrounding C string literals. + + The operands may be found in the array 'operands', whose C data type is +'rtx []'. + + It is very common to select different ways of generating assembler code +based on whether an immediate operand is within a certain range. Be +careful when doing this, because the result of 'INTVAL' is an integer on +the host machine. If the host machine has more bits in an 'int' than +the target machine has in the mode in which the constant will be used, +then some of the bits you get from 'INTVAL' will be superfluous. For +proper results, you must carefully disregard the values of those bits. + + It is possible to output an assembler instruction and then go on to +output or compute more of them, using the subroutine 'output_asm_insn'. +This receives two arguments: a template-string and a vector of operands. +The vector may be 'operands', or it may be another array of 'rtx' that +you declare locally and initialize yourself. + + When an insn pattern has multiple alternatives in its constraints, +often the appearance of the assembler code is determined mostly by which +alternative was matched. When this is so, the C code can test the +variable 'which_alternative', which is the ordinal number of the +alternative that was actually satisfied (0 for the first, 1 for the +second alternative, etc.). + + For example, suppose there are two opcodes for storing zero, 'clrreg' +for registers and 'clrmem' for memory locations. Here is how a pattern +could use 'which_alternative' to choose between them: + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r,m") + (const_int 0))] + "" + { + return (which_alternative == 0 + ? "clrreg %0" : "clrmem %0"); + }) + + The example above, where the assembler code to generate was _solely_ +determined by the alternative, could also have been specified as +follows, having the output control string start with a '@': + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r,m") + (const_int 0))] + "" + "@ + clrreg %0 + clrmem %0") + + If you just need a little bit of C code in one (or a few) alternatives, +you can use '*' inside of a '@' multi-alternative template: + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r,<,m") + (const_int 0))] + "" + "@ + clrreg %0 + * return stack_mem_p (operands[0]) ? \"push 0\" : \"clrmem %0\"; + clrmem %0") + + +File: gccint.info, Node: Predicates, Next: Constraints, Prev: Output Statement, Up: Machine Desc + +16.7 Predicates +=============== + +A predicate determines whether a 'match_operand' or 'match_operator' +expression matches, and therefore whether the surrounding instruction +pattern will be used for that combination of operands. GCC has a number +of machine-independent predicates, and you can define machine-specific +predicates as needed. By convention, predicates used with +'match_operand' have names that end in '_operand', and those used with +'match_operator' have names that end in '_operator'. + + All predicates are Boolean functions (in the mathematical sense) of two +arguments: the RTL expression that is being considered at that position +in the instruction pattern, and the machine mode that the +'match_operand' or 'match_operator' specifies. In this section, the +first argument is called OP and the second argument MODE. Predicates +can be called from C as ordinary two-argument functions; this can be +useful in output templates or other machine-specific code. + + Operand predicates can allow operands that are not actually acceptable +to the hardware, as long as the constraints give reload the ability to +fix them up (*note Constraints::). However, GCC will usually generate +better code if the predicates specify the requirements of the machine +instructions as closely as possible. Reload cannot fix up operands that +must be constants ("immediate operands"); you must use a predicate that +allows only constants, or else enforce the requirement in the extra +condition. + + Most predicates handle their MODE argument in a uniform manner. If +MODE is 'VOIDmode' (unspecified), then OP can have any mode. If MODE is +anything else, then OP must have the same mode, unless OP is a +'CONST_INT' or integer 'CONST_DOUBLE'. These RTL expressions always +have 'VOIDmode', so it would be counterproductive to check that their +mode matches. Instead, predicates that accept 'CONST_INT' and/or +integer 'CONST_DOUBLE' check that the value stored in the constant will +fit in the requested mode. + + Predicates with this behavior are called "normal". 'genrecog' can +optimize the instruction recognizer based on knowledge of how normal +predicates treat modes. It can also diagnose certain kinds of common +errors in the use of normal predicates; for instance, it is almost +always an error to use a normal predicate without specifying a mode. + + Predicates that do something different with their MODE argument are +called "special". The generic predicates 'address_operand' and +'pmode_register_operand' are special predicates. 'genrecog' does not do +any optimizations or diagnosis when special predicates are used. + +* Menu: + +* Machine-Independent Predicates:: Predicates available to all back ends. +* Defining Predicates:: How to write machine-specific predicate + functions. + + +File: gccint.info, Node: Machine-Independent Predicates, Next: Defining Predicates, Up: Predicates + +16.7.1 Machine-Independent Predicates +------------------------------------- + +These are the generic predicates available to all back ends. They are +defined in 'recog.c'. The first category of predicates allow only +constant, or "immediate", operands. + + -- Function: immediate_operand + This predicate allows any sort of constant that fits in MODE. It + is an appropriate choice for instructions that take operands that + must be constant. + + -- Function: const_int_operand + This predicate allows any 'CONST_INT' expression that fits in MODE. + It is an appropriate choice for an immediate operand that does not + allow a symbol or label. + + -- Function: const_double_operand + This predicate accepts any 'CONST_DOUBLE' expression that has + exactly MODE. If MODE is 'VOIDmode', it will also accept + 'CONST_INT'. It is intended for immediate floating point + constants. + +The second category of predicates allow only some kind of machine +register. + + -- Function: register_operand + This predicate allows any 'REG' or 'SUBREG' expression that is + valid for MODE. It is often suitable for arithmetic instruction + operands on a RISC machine. + + -- Function: pmode_register_operand + This is a slight variant on 'register_operand' which works around a + limitation in the machine-description reader. + + (match_operand N "pmode_register_operand" CONSTRAINT) + + means exactly what + + (match_operand:P N "register_operand" CONSTRAINT) + + would mean, if the machine-description reader accepted ':P' mode + suffixes. Unfortunately, it cannot, because 'Pmode' is an alias + for some other mode, and might vary with machine-specific options. + *Note Misc::. + + -- Function: scratch_operand + This predicate allows hard registers and 'SCRATCH' expressions, but + not pseudo-registers. It is used internally by 'match_scratch'; it + should not be used directly. + +The third category of predicates allow only some kind of memory +reference. + + -- Function: memory_operand + This predicate allows any valid reference to a quantity of mode + MODE in memory, as determined by the weak form of + 'GO_IF_LEGITIMATE_ADDRESS' (*note Addressing Modes::). + + -- Function: address_operand + This predicate is a little unusual; it allows any operand that is a + valid expression for the _address_ of a quantity of mode MODE, + again determined by the weak form of 'GO_IF_LEGITIMATE_ADDRESS'. + To first order, if '(mem:MODE (EXP))' is acceptable to + 'memory_operand', then EXP is acceptable to 'address_operand'. + Note that EXP does not necessarily have the mode MODE. + + -- Function: indirect_operand + This is a stricter form of 'memory_operand' which allows only + memory references with a 'general_operand' as the address + expression. New uses of this predicate are discouraged, because + 'general_operand' is very permissive, so it's hard to tell what an + 'indirect_operand' does or does not allow. If a target has + different requirements for memory operands for different + instructions, it is better to define target-specific predicates + which enforce the hardware's requirements explicitly. + + -- Function: push_operand + This predicate allows a memory reference suitable for pushing a + value onto the stack. This will be a 'MEM' which refers to + 'stack_pointer_rtx', with a side-effect in its address expression + (*note Incdec::); which one is determined by the 'STACK_PUSH_CODE' + macro (*note Frame Layout::). + + -- Function: pop_operand + This predicate allows a memory reference suitable for popping a + value off the stack. Again, this will be a 'MEM' referring to + 'stack_pointer_rtx', with a side-effect in its address expression. + However, this time 'STACK_POP_CODE' is expected. + +The fourth category of predicates allow some combination of the above +operands. + + -- Function: nonmemory_operand + This predicate allows any immediate or register operand valid for + MODE. + + -- Function: nonimmediate_operand + This predicate allows any register or memory operand valid for + MODE. + + -- Function: general_operand + This predicate allows any immediate, register, or memory operand + valid for MODE. + +Finally, there are two generic operator predicates. + + -- Function: comparison_operator + This predicate matches any expression which performs an arithmetic + comparison in MODE; that is, 'COMPARISON_P' is true for the + expression code. + + -- Function: ordered_comparison_operator + This predicate matches any expression which performs an arithmetic + comparison in MODE and whose expression code is valid for integer + modes; that is, the expression code will be one of 'eq', 'ne', + 'lt', 'ltu', 'le', 'leu', 'gt', 'gtu', 'ge', 'geu'. + + +File: gccint.info, Node: Defining Predicates, Prev: Machine-Independent Predicates, Up: Predicates + +16.7.2 Defining Machine-Specific Predicates +------------------------------------------- + +Many machines have requirements for their operands that cannot be +expressed precisely using the generic predicates. You can define +additional predicates using 'define_predicate' and +'define_special_predicate' expressions. These expressions have three +operands: + + * The name of the predicate, as it will be referred to in + 'match_operand' or 'match_operator' expressions. + + * An RTL expression which evaluates to true if the predicate allows + the operand OP, false if it does not. This expression can only use + the following RTL codes: + + 'MATCH_OPERAND' + When written inside a predicate expression, a 'MATCH_OPERAND' + expression evaluates to true if the predicate it names would + allow OP. The operand number and constraint are ignored. Due + to limitations in 'genrecog', you can only refer to generic + predicates and predicates that have already been defined. + + 'MATCH_CODE' + This expression evaluates to true if OP or a specified + subexpression of OP has one of a given list of RTX codes. + + The first operand of this expression is a string constant + containing a comma-separated list of RTX code names (in lower + case). These are the codes for which the 'MATCH_CODE' will be + true. + + The second operand is a string constant which indicates what + subexpression of OP to examine. If it is absent or the empty + string, OP itself is examined. Otherwise, the string constant + must be a sequence of digits and/or lowercase letters. Each + character indicates a subexpression to extract from the + current expression; for the first character this is OP, for + the second and subsequent characters it is the result of the + previous character. A digit N extracts 'XEXP (E, N)'; a + letter L extracts 'XVECEXP (E, 0, N)' where N is the + alphabetic ordinal of L (0 for 'a', 1 for 'b', and so on). + The 'MATCH_CODE' then examines the RTX code of the + subexpression extracted by the complete string. It is not + possible to extract components of an 'rtvec' that is not at + position 0 within its RTX object. + + 'MATCH_TEST' + This expression has one operand, a string constant containing + a C expression. The predicate's arguments, OP and MODE, are + available with those names in the C expression. The + 'MATCH_TEST' evaluates to true if the C expression evaluates + to a nonzero value. 'MATCH_TEST' expressions must not have + side effects. + + 'AND' + 'IOR' + 'NOT' + 'IF_THEN_ELSE' + The basic 'MATCH_' expressions can be combined using these + logical operators, which have the semantics of the C operators + '&&', '||', '!', and '? :' respectively. As in Common Lisp, + you may give an 'AND' or 'IOR' expression an arbitrary number + of arguments; this has exactly the same effect as writing a + chain of two-argument 'AND' or 'IOR' expressions. + + * An optional block of C code, which should execute 'return true' if + the predicate is found to match and 'return false' if it does not. + It must not have any side effects. The predicate arguments, OP and + MODE, are available with those names. + + If a code block is present in a predicate definition, then the RTL + expression must evaluate to true _and_ the code block must execute + 'return true' for the predicate to allow the operand. The RTL + expression is evaluated first; do not re-check anything in the code + block that was checked in the RTL expression. + + The program 'genrecog' scans 'define_predicate' and +'define_special_predicate' expressions to determine which RTX codes are +possibly allowed. You should always make this explicit in the RTL +predicate expression, using 'MATCH_OPERAND' and 'MATCH_CODE'. + + Here is an example of a simple predicate definition, from the IA64 +machine description: + + ;; True if OP is a 'SYMBOL_REF' which refers to the sdata section. + (define_predicate "small_addr_symbolic_operand" + (and (match_code "symbol_ref") + (match_test "SYMBOL_REF_SMALL_ADDR_P (op)"))) + +And here is another, showing the use of the C block. + + ;; True if OP is a register operand that is (or could be) a GR reg. + (define_predicate "gr_register_operand" + (match_operand 0 "register_operand") + { + unsigned int regno; + if (GET_CODE (op) == SUBREG) + op = SUBREG_REG (op); + + regno = REGNO (op); + return (regno >= FIRST_PSEUDO_REGISTER || GENERAL_REGNO_P (regno)); + }) + + Predicates written with 'define_predicate' automatically include a test +that MODE is 'VOIDmode', or OP has the same mode as MODE, or OP is a +'CONST_INT' or 'CONST_DOUBLE'. They do _not_ check specifically for +integer 'CONST_DOUBLE', nor do they test that the value of either kind +of constant fits in the requested mode. This is because target-specific +predicates that take constants usually have to do more stringent value +checks anyway. If you need the exact same treatment of 'CONST_INT' or +'CONST_DOUBLE' that the generic predicates provide, use a +'MATCH_OPERAND' subexpression to call 'const_int_operand', +'const_double_operand', or 'immediate_operand'. + + Predicates written with 'define_special_predicate' do not get any +automatic mode checks, and are treated as having special mode handling +by 'genrecog'. + + The program 'genpreds' is responsible for generating code to test +predicates. It also writes a header file containing function +declarations for all machine-specific predicates. It is not necessary +to declare these predicates in 'CPU-protos.h'. + + +File: gccint.info, Node: Constraints, Next: Standard Names, Prev: Predicates, Up: Machine Desc + +16.8 Operand Constraints +======================== + +Each 'match_operand' in an instruction pattern can specify constraints +for the operands allowed. The constraints allow you to fine-tune +matching within the set of operands allowed by the predicate. + + Constraints can say whether an operand may be in a register, and which +kinds of register; whether the operand can be a memory reference, and +which kinds of address; whether the operand may be an immediate +constant, and which possible values it may have. Constraints can also +require two operands to match. Side-effects aren't allowed in operands +of inline 'asm', unless '<' or '>' constraints are used, because there +is no guarantee that the side-effects will happen exactly once in an +instruction that can update the addressing register. + +* Menu: + +* Simple Constraints:: Basic use of constraints. +* Multi-Alternative:: When an insn has two alternative constraint-patterns. +* Class Preferences:: Constraints guide which hard register to put things in. +* Modifiers:: More precise control over effects of constraints. +* Machine Constraints:: Existing constraints for some particular machines. +* Disable Insn Alternatives:: Disable insn alternatives using the 'enabled' attribute. +* Define Constraints:: How to define machine-specific constraints. +* C Constraint Interface:: How to test constraints from C code. + + +File: gccint.info, Node: Simple Constraints, Next: Multi-Alternative, Up: Constraints + +16.8.1 Simple Constraints +------------------------- + +The simplest kind of constraint is a string full of letters, each of +which describes one kind of operand that is permitted. Here are the +letters that are allowed: + +whitespace + Whitespace characters are ignored and can be inserted at any + position except the first. This enables each alternative for + different operands to be visually aligned in the machine + description even if they have different number of constraints and + modifiers. + +'m' + A memory operand is allowed, with any kind of address that the + machine supports in general. Note that the letter used for the + general memory constraint can be re-defined by a back end using the + 'TARGET_MEM_CONSTRAINT' macro. + +'o' + A memory operand is allowed, but only if the address is + "offsettable". This means that adding a small integer (actually, + the width in bytes of the operand, as determined by its machine + mode) may be added to the address and the result is also a valid + memory address. + + For example, an address which is constant is offsettable; so is an + address that is the sum of a register and a constant (as long as a + slightly larger constant is also within the range of + address-offsets supported by the machine); but an autoincrement or + autodecrement address is not offsettable. More complicated + indirect/indexed addresses may or may not be offsettable depending + on the other addressing modes that the machine supports. + + Note that in an output operand which can be matched by another + operand, the constraint letter 'o' is valid only when accompanied + by both '<' (if the target machine has predecrement addressing) and + '>' (if the target machine has preincrement addressing). + +'V' + A memory operand that is not offsettable. In other words, anything + that would fit the 'm' constraint but not the 'o' constraint. + +'<' + A memory operand with autodecrement addressing (either predecrement + or postdecrement) is allowed. In inline 'asm' this constraint is + only allowed if the operand is used exactly once in an instruction + that can handle the side-effects. Not using an operand with '<' in + constraint string in the inline 'asm' pattern at all or using it in + multiple instructions isn't valid, because the side-effects + wouldn't be performed or would be performed more than once. + Furthermore, on some targets the operand with '<' in constraint + string must be accompanied by special instruction suffixes like + '%U0' instruction suffix on PowerPC or '%P0' on IA-64. + +'>' + A memory operand with autoincrement addressing (either preincrement + or postincrement) is allowed. In inline 'asm' the same + restrictions as for '<' apply. + +'r' + A register operand is allowed provided that it is in a general + register. + +'i' + An immediate integer operand (one with constant value) is allowed. + This includes symbolic constants whose values will be known only at + assembly time or later. + +'n' + An immediate integer operand with a known numeric value is allowed. + Many systems cannot support assembly-time constants for operands + less than a word wide. Constraints for these operands should use + 'n' rather than 'i'. + +'I', 'J', 'K', ... 'P' + Other letters in the range 'I' through 'P' may be defined in a + machine-dependent fashion to permit immediate integer operands with + explicit integer values in specified ranges. For example, on the + 68000, 'I' is defined to stand for the range of values 1 to 8. + This is the range permitted as a shift count in the shift + instructions. + +'E' + An immediate floating operand (expression code 'const_double') is + allowed, but only if the target floating point format is the same + as that of the host machine (on which the compiler is running). + +'F' + An immediate floating operand (expression code 'const_double' or + 'const_vector') is allowed. + +'G', 'H' + 'G' and 'H' may be defined in a machine-dependent fashion to permit + immediate floating operands in particular ranges of values. + +'s' + An immediate integer operand whose value is not an explicit integer + is allowed. + + This might appear strange; if an insn allows a constant operand + with a value not known at compile time, it certainly must allow any + known value. So why use 's' instead of 'i'? Sometimes it allows + better code to be generated. + + For example, on the 68000 in a fullword instruction it is possible + to use an immediate operand; but if the immediate value is between + -128 and 127, better code results from loading the value into a + register and using the register. This is because the load into the + register can be done with a 'moveq' instruction. We arrange for + this to happen by defining the letter 'K' to mean "any integer + outside the range -128 to 127", and then specifying 'Ks' in the + operand constraints. + +'g' + Any register, memory or immediate integer operand is allowed, + except for registers that are not general registers. + +'X' + Any operand whatsoever is allowed, even if it does not satisfy + 'general_operand'. This is normally used in the constraint of a + 'match_scratch' when certain alternatives will not actually require + a scratch register. + +'0', '1', '2', ... '9' + An operand that matches the specified operand number is allowed. + If a digit is used together with letters within the same + alternative, the digit should come last. + + This number is allowed to be more than a single digit. If multiple + digits are encountered consecutively, they are interpreted as a + single decimal integer. There is scant chance for ambiguity, since + to-date it has never been desirable that '10' be interpreted as + matching either operand 1 _or_ operand 0. Should this be desired, + one can use multiple alternatives instead. + + This is called a "matching constraint" and what it really means is + that the assembler has only a single operand that fills two roles + considered separate in the RTL insn. For example, an add insn has + two input operands and one output operand in the RTL, but on most + CISC machines an add instruction really has only two operands, one + of them an input-output operand: + + addl #35,r12 + + Matching constraints are used in these circumstances. More + precisely, the two operands that match must include one input-only + operand and one output-only operand. Moreover, the digit must be a + smaller number than the number of the operand that uses it in the + constraint. + + For operands to match in a particular case usually means that they + are identical-looking RTL expressions. But in a few special cases + specific kinds of dissimilarity are allowed. For example, '*x' as + an input operand will match '*x++' as an output operand. For + proper results in such cases, the output template should always use + the output-operand's number when printing the operand. + +'p' + An operand that is a valid memory address is allowed. This is for + "load address" and "push address" instructions. + + 'p' in the constraint must be accompanied by 'address_operand' as + the predicate in the 'match_operand'. This predicate interprets + the mode specified in the 'match_operand' as the mode of the memory + reference for which the address would be valid. + +OTHER-LETTERS + Other letters can be defined in machine-dependent fashion to stand + for particular classes of registers or other arbitrary operand + types. 'd', 'a' and 'f' are defined on the 68000/68020 to stand + for data, address and floating point registers. + + In order to have valid assembler code, each operand must satisfy its +constraint. But a failure to do so does not prevent the pattern from +applying to an insn. Instead, it directs the compiler to modify the +code so that the constraint will be satisfied. Usually this is done by +copying an operand into a register. + + Contrast, therefore, the two instruction patterns that follow: + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r") + (plus:SI (match_dup 0) + (match_operand:SI 1 "general_operand" "r")))] + "" + "...") + +which has two operands, one of which must appear in two places, and + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r") + (plus:SI (match_operand:SI 1 "general_operand" "0") + (match_operand:SI 2 "general_operand" "r")))] + "" + "...") + +which has three operands, two of which are required by a constraint to +be identical. If we are considering an insn of the form + + (insn N PREV NEXT + (set (reg:SI 3) + (plus:SI (reg:SI 6) (reg:SI 109))) + ...) + +the first pattern would not apply at all, because this insn does not +contain two identical subexpressions in the right place. The pattern +would say, "That does not look like an add instruction; try other +patterns". The second pattern would say, "Yes, that's an add +instruction, but there is something wrong with it". It would direct the +reload pass of the compiler to generate additional insns to make the +constraint true. The results might look like this: + + (insn N2 PREV N + (set (reg:SI 3) (reg:SI 6)) + ...) + + (insn N N2 NEXT + (set (reg:SI 3) + (plus:SI (reg:SI 3) (reg:SI 109))) + ...) + + It is up to you to make sure that each operand, in each pattern, has +constraints that can handle any RTL expression that could be present for +that operand. (When multiple alternatives are in use, each pattern +must, for each possible combination of operand expressions, have at +least one alternative which can handle that combination of operands.) +The constraints don't need to _allow_ any possible operand--when this is +the case, they do not constrain--but they must at least point the way to +reloading any possible operand so that it will fit. + + * If the constraint accepts whatever operands the predicate permits, + there is no problem: reloading is never necessary for this operand. + + For example, an operand whose constraints permit everything except + registers is safe provided its predicate rejects registers. + + An operand whose predicate accepts only constant values is safe + provided its constraints include the letter 'i'. If any possible + constant value is accepted, then nothing less than 'i' will do; if + the predicate is more selective, then the constraints may also be + more selective. + + * Any operand expression can be reloaded by copying it into a + register. So if an operand's constraints allow some kind of + register, it is certain to be safe. It need not permit all classes + of registers; the compiler knows how to copy a register into + another register of the proper class in order to make an + instruction valid. + + * A nonoffsettable memory reference can be reloaded by copying the + address into a register. So if the constraint uses the letter 'o', + all memory references are taken care of. + + * A constant operand can be reloaded by allocating space in memory to + hold it as preinitialized data. Then the memory reference can be + used in place of the constant. So if the constraint uses the + letters 'o' or 'm', constant operands are not a problem. + + * If the constraint permits a constant and a pseudo register used in + an insn was not allocated to a hard register and is equivalent to a + constant, the register will be replaced with the constant. If the + predicate does not permit a constant and the insn is re-recognized + for some reason, the compiler will crash. Thus the predicate must + always recognize any objects allowed by the constraint. + + If the operand's predicate can recognize registers, but the constraint +does not permit them, it can make the compiler crash. When this operand +happens to be a register, the reload pass will be stymied, because it +does not know how to copy a register temporarily into memory. + + If the predicate accepts a unary operator, the constraint applies to +the operand. For example, the MIPS processor at ISA level 3 supports an +instruction which adds two registers in 'SImode' to produce a 'DImode' +result, but only if the registers are correctly sign extended. This +predicate for the input operands accepts a 'sign_extend' of an 'SImode' +register. Write the constraint to indicate the type of register that is +required for the operand of the 'sign_extend'. + + +File: gccint.info, Node: Multi-Alternative, Next: Class Preferences, Prev: Simple Constraints, Up: Constraints + +16.8.2 Multiple Alternative Constraints +--------------------------------------- + +Sometimes a single instruction has multiple alternative sets of possible +operands. For example, on the 68000, a logical-or instruction can +combine register or an immediate value into memory, or it can combine +any kind of operand into a register; but it cannot combine one memory +location into another. + + These constraints are represented as multiple alternatives. An +alternative can be described by a series of letters for each operand. +The overall constraint for an operand is made from the letters for this +operand from the first alternative, a comma, the letters for this +operand from the second alternative, a comma, and so on until the last +alternative. Here is how it is done for fullword logical-or on the +68000: + + (define_insn "iorsi3" + [(set (match_operand:SI 0 "general_operand" "=m,d") + (ior:SI (match_operand:SI 1 "general_operand" "%0,0") + (match_operand:SI 2 "general_operand" "dKs,dmKs")))] + ...) + + The first alternative has 'm' (memory) for operand 0, '0' for operand 1 +(meaning it must match operand 0), and 'dKs' for operand 2. The second +alternative has 'd' (data register) for operand 0, '0' for operand 1, +and 'dmKs' for operand 2. The '=' and '%' in the constraints apply to +all the alternatives; their meaning is explained in the next section +(*note Class Preferences::). + + If all the operands fit any one alternative, the instruction is valid. +Otherwise, for each alternative, the compiler counts how many +instructions must be added to copy the operands so that that alternative +applies. The alternative requiring the least copying is chosen. If two +alternatives need the same amount of copying, the one that comes first +is chosen. These choices can be altered with the '?' and '!' +characters: + +'?' + Disparage slightly the alternative that the '?' appears in, as a + choice when no alternative applies exactly. The compiler regards + this alternative as one unit more costly for each '?' that appears + in it. + +'!' + Disparage severely the alternative that the '!' appears in. This + alternative can still be used if it fits without reloading, but if + reloading is needed, some other alternative will be used. + + When an insn pattern has multiple alternatives in its constraints, +often the appearance of the assembler code is determined mostly by which +alternative was matched. When this is so, the C code for writing the +assembler code can use the variable 'which_alternative', which is the +ordinal number of the alternative that was actually satisfied (0 for the +first, 1 for the second alternative, etc.). *Note Output Statement::. + + +File: gccint.info, Node: Class Preferences, Next: Modifiers, Prev: Multi-Alternative, Up: Constraints + +16.8.3 Register Class Preferences +--------------------------------- + +The operand constraints have another function: they enable the compiler +to decide which kind of hardware register a pseudo register is best +allocated to. The compiler examines the constraints that apply to the +insns that use the pseudo register, looking for the machine-dependent +letters such as 'd' and 'a' that specify classes of registers. The +pseudo register is put in whichever class gets the most "votes". The +constraint letters 'g' and 'r' also vote: they vote in favor of a +general register. The machine description says which registers are +considered general. + + Of course, on some machines all registers are equivalent, and no +register classes are defined. Then none of this complexity is relevant. + + +File: gccint.info, Node: Modifiers, Next: Machine Constraints, Prev: Class Preferences, Up: Constraints + +16.8.4 Constraint Modifier Characters +------------------------------------- + +Here are constraint modifier characters. + +'=' + Means that this operand is write-only for this instruction: the + previous value is discarded and replaced by output data. + +'+' + Means that this operand is both read and written by the + instruction. + + When the compiler fixes up the operands to satisfy the constraints, + it needs to know which operands are inputs to the instruction and + which are outputs from it. '=' identifies an output; '+' + identifies an operand that is both input and output; all other + operands are assumed to be input only. + + If you specify '=' or '+' in a constraint, you put it in the first + character of the constraint string. + +'&' + Means (in a particular alternative) that this operand is an + "earlyclobber" operand, which is modified before the instruction is + finished using the input operands. Therefore, this operand may not + lie in a register that is used as an input operand or as part of + any memory address. + + '&' applies only to the alternative in which it is written. In + constraints with multiple alternatives, sometimes one alternative + requires '&' while others do not. See, for example, the 'movdf' + insn of the 68000. + + An input operand can be tied to an earlyclobber operand if its only + use as an input occurs before the early result is written. Adding + alternatives of this form often allows GCC to produce better code + when only some of the inputs can be affected by the earlyclobber. + See, for example, the 'mulsi3' insn of the ARM. + + '&' does not obviate the need to write '='. + +'%' + Declares the instruction to be commutative for this operand and the + following operand. This means that the compiler may interchange + the two operands if that is the cheapest way to make all operands + fit the constraints. This is often used in patterns for addition + instructions that really have only two operands: the result must go + in one of the arguments. Here for example, is how the 68000 + halfword-add instruction is defined: + + (define_insn "addhi3" + [(set (match_operand:HI 0 "general_operand" "=m,r") + (plus:HI (match_operand:HI 1 "general_operand" "%0,0") + (match_operand:HI 2 "general_operand" "di,g")))] + ...) + GCC can only handle one commutative pair in an asm; if you use + more, the compiler may fail. Note that you need not use the + modifier if the two alternatives are strictly identical; this would + only waste time in the reload pass. The modifier is not + operational after register allocation, so the result of + 'define_peephole2' and 'define_split's performed after reload + cannot rely on '%' to make the intended insn match. + +'#' + Says that all following characters, up to the next comma, are to be + ignored as a constraint. They are significant only for choosing + register preferences. + +'*' + Says that the following character should be ignored when choosing + register preferences. '*' has no effect on the meaning of the + constraint as a constraint, and no effect on reloading. For LRA + '*' additionally disparages slightly the alternative if the + following character matches the operand. + + Here is an example: the 68000 has an instruction to sign-extend a + halfword in a data register, and can also sign-extend a value by + copying it into an address register. While either kind of register + is acceptable, the constraints on an address-register destination + are less strict, so it is best if register allocation makes an + address register its goal. Therefore, '*' is used so that the 'd' + constraint letter (for data register) is ignored when computing + register preferences. + + (define_insn "extendhisi2" + [(set (match_operand:SI 0 "general_operand" "=*d,a") + (sign_extend:SI + (match_operand:HI 1 "general_operand" "0,g")))] + ...) + + +File: gccint.info, Node: Machine Constraints, Next: Disable Insn Alternatives, Prev: Modifiers, Up: Constraints + +16.8.5 Constraints for Particular Machines +------------------------------------------ + +Whenever possible, you should use the general-purpose constraint letters +in 'asm' arguments, since they will convey meaning more readily to +people reading your code. Failing that, use the constraint letters that +usually have very similar meanings across architectures. The most +commonly used constraints are 'm' and 'r' (for memory and +general-purpose registers respectively; *note Simple Constraints::), and +'I', usually the letter indicating the most common immediate-constant +format. + + Each architecture defines additional constraints. These constraints +are used by the compiler itself for instruction generation, as well as +for 'asm' statements; therefore, some of the constraints are not +particularly useful for 'asm'. Here is a summary of some of the +machine-dependent constraints available on some particular machines; it +includes both constraints that are useful for 'asm' and constraints that +aren't. The compiler source file mentioned in the table heading for +each architecture is the definitive reference for the meanings of that +architecture's constraints. + +_AArch64 family--'config/aarch64/constraints.md'_ + 'k' + The stack pointer register ('SP') + + 'w' + Floating point or SIMD vector register + + 'I' + Integer constant that is valid as an immediate operand in an + 'ADD' instruction + + 'J' + Integer constant that is valid as an immediate operand in a + 'SUB' instruction (once negated) + + 'K' + Integer constant that can be used with a 32-bit logical + instruction + + 'L' + Integer constant that can be used with a 64-bit logical + instruction + + 'M' + Integer constant that is valid as an immediate operand in a + 32-bit 'MOV' pseudo instruction. The 'MOV' may be assembled + to one of several different machine instructions depending on + the value + + 'N' + Integer constant that is valid as an immediate operand in a + 64-bit 'MOV' pseudo instruction + + 'S' + An absolute symbolic address or a label reference + + 'Y' + Floating point constant zero + + 'Z' + Integer constant zero + + 'Ush' + The high part (bits 12 and upwards) of the pc-relative address + of a symbol within 4GB of the instruction + + 'Q' + A memory address which uses a single base register with no + offset + + 'Ump' + A memory address suitable for a load/store pair instruction in + SI, DI, SF and DF modes + +_ARC --'config/arc/constraints.md'_ + 'q' + Registers usable in ARCompact 16-bit instructions: 'r0'-'r3', + 'r12'-'r15'. This constraint can only match when the '-mq' + option is in effect. + + 'e' + Registers usable as base-regs of memory addresses in ARCompact + 16-bit memory instructions: 'r0'-'r3', 'r12'-'r15', 'sp'. + This constraint can only match when the '-mq' option is in + effect. + 'D' + ARC FPX (dpfp) 64-bit registers. 'D0', 'D1'. + + 'I' + A signed 12-bit integer constant. + + 'Cal' + constant for arithmetic/logical operations. This might be any + constant that can be put into a long immediate by the assmbler + or linker without involving a PIC relocation. + + 'K' + A 3-bit unsigned integer constant. + + 'L' + A 6-bit unsigned integer constant. + + 'CnL' + One's complement of a 6-bit unsigned integer constant. + + 'CmL' + Two's complement of a 6-bit unsigned integer constant. + + 'M' + A 5-bit unsigned integer constant. + + 'O' + A 7-bit unsigned integer constant. + + 'P' + A 8-bit unsigned integer constant. + + 'H' + Any const_double value. + +_ARM family--'config/arm/constraints.md'_ + 'w' + VFP floating-point register + + 'G' + The floating-point constant 0.0 + + 'I' + Integer that is valid as an immediate operand in a data + processing instruction. That is, an integer in the range 0 to + 255 rotated by a multiple of 2 + + 'J' + Integer in the range -4095 to 4095 + + 'K' + Integer that satisfies constraint 'I' when inverted (ones + complement) + + 'L' + Integer that satisfies constraint 'I' when negated (twos + complement) + + 'M' + Integer in the range 0 to 32 + + 'Q' + A memory reference where the exact address is in a single + register (''m'' is preferable for 'asm' statements) + + 'R' + An item in the constant pool + + 'S' + A symbol in the text segment of the current file + + 'Uv' + A memory reference suitable for VFP load/store insns + (reg+constant offset) + + 'Uy' + A memory reference suitable for iWMMXt load/store + instructions. + + 'Uq' + A memory reference suitable for the ARMv4 ldrsb instruction. + +_AVR family--'config/avr/constraints.md'_ + 'l' + Registers from r0 to r15 + + 'a' + Registers from r16 to r23 + + 'd' + Registers from r16 to r31 + + 'w' + Registers from r24 to r31. These registers can be used in + 'adiw' command + + 'e' + Pointer register (r26-r31) + + 'b' + Base pointer register (r28-r31) + + 'q' + Stack pointer register (SPH:SPL) + + 't' + Temporary register r0 + + 'x' + Register pair X (r27:r26) + + 'y' + Register pair Y (r29:r28) + + 'z' + Register pair Z (r31:r30) + + 'I' + Constant greater than -1, less than 64 + + 'J' + Constant greater than -64, less than 1 + + 'K' + Constant integer 2 + + 'L' + Constant integer 0 + + 'M' + Constant that fits in 8 bits + + 'N' + Constant integer -1 + + 'O' + Constant integer 8, 16, or 24 + + 'P' + Constant integer 1 + + 'G' + A floating point constant 0.0 + + 'Q' + A memory address based on Y or Z pointer with displacement. + +_Epiphany--'config/epiphany/constraints.md'_ + 'U16' + An unsigned 16-bit constant. + + 'K' + An unsigned 5-bit constant. + + 'L' + A signed 11-bit constant. + + 'Cm1' + A signed 11-bit constant added to -1. Can only match when the + '-m1reg-REG' option is active. + + 'Cl1' + Left-shift of -1, i.e., a bit mask with a block of leading + ones, the rest being a block of trailing zeroes. Can only + match when the '-m1reg-REG' option is active. + + 'Cr1' + Right-shift of -1, i.e., a bit mask with a trailing block of + ones, the rest being zeroes. Or to put it another way, one + less than a power of two. Can only match when the + '-m1reg-REG' option is active. + + 'Cal' + Constant for arithmetic/logical operations. This is like 'i', + except that for position independent code, no symbols / + expressions needing relocations are allowed. + + 'Csy' + Symbolic constant for call/jump instruction. + + 'Rcs' + The register class usable in short insns. This is a register + class constraint, and can thus drive register allocation. + This constraint won't match unless '-mprefer-short-insn-regs' + is in effect. + + 'Rsc' + The the register class of registers that can be used to hold a + sibcall call address. I.e., a caller-saved register. + + 'Rct' + Core control register class. + + 'Rgs' + The register group usable in short insns. This constraint + does not use a register class, so that it only passively + matches suitable registers, and doesn't drive register + allocation. + + 'Car' + Constant suitable for the addsi3_r pattern. This is a valid + offset For byte, halfword, or word addressing. + + 'Rra' + Matches the return address if it can be replaced with the link + register. + + 'Rcc' + Matches the integer condition code register. + + 'Sra' + Matches the return address if it is in a stack slot. + + 'Cfm' + Matches control register values to switch fp mode, which are + encapsulated in 'UNSPEC_FP_MODE'. + +_CR16 Architecture--'config/cr16/cr16.h'_ + + 'b' + Registers from r0 to r14 (registers without stack pointer) + + 't' + Register from r0 to r11 (all 16-bit registers) + + 'p' + Register from r12 to r15 (all 32-bit registers) + + 'I' + Signed constant that fits in 4 bits + + 'J' + Signed constant that fits in 5 bits + + 'K' + Signed constant that fits in 6 bits + + 'L' + Unsigned constant that fits in 4 bits + + 'M' + Signed constant that fits in 32 bits + + 'N' + Check for 64 bits wide constants for add/sub instructions + + 'G' + Floating point constant that is legal for store immediate + +_Hewlett-Packard PA-RISC--'config/pa/pa.h'_ + 'a' + General register 1 + + 'f' + Floating point register + + 'q' + Shift amount register + + 'x' + Floating point register (deprecated) + + 'y' + Upper floating point register (32-bit), floating point + register (64-bit) + + 'Z' + Any register + + 'I' + Signed 11-bit integer constant + + 'J' + Signed 14-bit integer constant + + 'K' + Integer constant that can be deposited with a 'zdepi' + instruction + + 'L' + Signed 5-bit integer constant + + 'M' + Integer constant 0 + + 'N' + Integer constant that can be loaded with a 'ldil' instruction + + 'O' + Integer constant whose value plus one is a power of 2 + + 'P' + Integer constant that can be used for 'and' operations in + 'depi' and 'extru' instructions + + 'S' + Integer constant 31 + + 'U' + Integer constant 63 + + 'G' + Floating-point constant 0.0 + + 'A' + A 'lo_sum' data-linkage-table memory operand + + 'Q' + A memory operand that can be used as the destination operand + of an integer store instruction + + 'R' + A scaled or unscaled indexed memory operand + + 'T' + A memory operand for floating-point loads and stores + + 'W' + A register indirect memory operand + +_picoChip family--'picochip.h'_ + 'k' + Stack register. + + 'f' + Pointer register. A register which can be used to access + memory without supplying an offset. Any other register can be + used to access memory, but will need a constant offset. In + the case of the offset being zero, it is more efficient to use + a pointer register, since this reduces code size. + + 't' + A twin register. A register which may be paired with an + adjacent register to create a 32-bit register. + + 'a' + Any absolute memory address (e.g., symbolic constant, symbolic + constant + offset). + + 'I' + 4-bit signed integer. + + 'J' + 4-bit unsigned integer. + + 'K' + 8-bit signed integer. + + 'M' + Any constant whose absolute value is no greater than 4-bits. + + 'N' + 10-bit signed integer + + 'O' + 16-bit signed integer. + +_PowerPC and IBM RS6000--'config/rs6000/constraints.md'_ + 'b' + Address base register + + 'd' + Floating point register (containing 64-bit value) + + 'f' + Floating point register (containing 32-bit value) + + 'v' + Altivec vector register + + 'wa' + Any VSX register if the -mvsx option was used or NO_REGS. + + 'wd' + VSX vector register to hold vector double data or NO_REGS. + + 'wf' + VSX vector register to hold vector float data or NO_REGS. + + 'wg' + If '-mmfpgpr' was used, a floating point register or NO_REGS. + + 'wl' + Floating point register if the LFIWAX instruction is enabled + or NO_REGS. + + 'wm' + VSX register if direct move instructions are enabled, or + NO_REGS. + + 'wn' + No register (NO_REGS). + + 'wr' + General purpose register if 64-bit instructions are enabled or + NO_REGS. + + 'ws' + VSX vector register to hold scalar double values or NO_REGS. + + 'wt' + VSX vector register to hold 128 bit integer or NO_REGS. + + 'wu' + Altivec register to use for float/32-bit int loads/stores or + NO_REGS. + + 'wv' + Altivec register to use for double loads/stores or NO_REGS. + + 'ww' + FP or VSX register to perform float operations under '-mvsx' + or NO_REGS. + + 'wx' + Floating point register if the STFIWX instruction is enabled + or NO_REGS. + + 'wy' + VSX vector register to hold scalar float values or NO_REGS. + + 'wz' + Floating point register if the LFIWZX instruction is enabled + or NO_REGS. + + 'wD' + Int constant that is the element number of the 64-bit scalar + in a vector. + + 'wQ' + A memory address that will work with the 'lq' and 'stq' + instructions. + + 'h' + 'MQ', 'CTR', or 'LINK' register + + 'q' + 'MQ' register + + 'c' + 'CTR' register + + 'l' + 'LINK' register + + 'x' + 'CR' register (condition register) number 0 + + 'y' + 'CR' register (condition register) + + 'z' + 'XER[CA]' carry bit (part of the XER register) + + 'I' + Signed 16-bit constant + + 'J' + Unsigned 16-bit constant shifted left 16 bits (use 'L' instead + for 'SImode' constants) + + 'K' + Unsigned 16-bit constant + + 'L' + Signed 16-bit constant shifted left 16 bits + + 'M' + Constant larger than 31 + + 'N' + Exact power of 2 + + 'O' + Zero + + 'P' + Constant whose negation is a signed 16-bit constant + + 'G' + Floating point constant that can be loaded into a register + with one instruction per word + + 'H' + Integer/Floating point constant that can be loaded into a + register using three instructions + + 'm' + Memory operand. Normally, 'm' does not allow addresses that + update the base register. If '<' or '>' constraint is also + used, they are allowed and therefore on PowerPC targets in + that case it is only safe to use 'm<>' in an 'asm' statement + if that 'asm' statement accesses the operand exactly once. + The 'asm' statement must also use '%U<OPNO>' as a placeholder + for the "update" flag in the corresponding load or store + instruction. For example: + + asm ("st%U0 %1,%0" : "=m<>" (mem) : "r" (val)); + + is correct but: + + asm ("st %1,%0" : "=m<>" (mem) : "r" (val)); + + is not. + + 'es' + A "stable" memory operand; that is, one which does not include + any automodification of the base register. This used to be + useful when 'm' allowed automodification of the base register, + but as those are now only allowed when '<' or '>' is used, + 'es' is basically the same as 'm' without '<' and '>'. + + 'Q' + Memory operand that is an offset from a register (it is + usually better to use 'm' or 'es' in 'asm' statements) + + 'Z' + Memory operand that is an indexed or indirect from a register + (it is usually better to use 'm' or 'es' in 'asm' statements) + + 'R' + AIX TOC entry + + 'a' + Address operand that is an indexed or indirect from a register + ('p' is preferable for 'asm' statements) + + 'S' + Constant suitable as a 64-bit mask operand + + 'T' + Constant suitable as a 32-bit mask operand + + 'U' + System V Release 4 small data area reference + + 't' + AND masks that can be performed by two rldic{l, r} + instructions + + 'W' + Vector constant that does not require memory + + 'j' + Vector constant that is all zeros. + +_Intel 386--'config/i386/constraints.md'_ + 'R' + Legacy register--the eight integer registers available on all + i386 processors ('a', 'b', 'c', 'd', 'si', 'di', 'bp', 'sp'). + + 'q' + Any register accessible as 'Rl'. In 32-bit mode, 'a', 'b', + 'c', and 'd'; in 64-bit mode, any integer register. + + 'Q' + Any register accessible as 'Rh': 'a', 'b', 'c', and 'd'. + + 'l' + Any register that can be used as the index in a base+index + memory access: that is, any general register except the stack + pointer. + + 'a' + The 'a' register. + + 'b' + The 'b' register. + + 'c' + The 'c' register. + + 'd' + The 'd' register. + + 'S' + The 'si' register. + + 'D' + The 'di' register. + + 'A' + The 'a' and 'd' registers. This class is used for + instructions that return double word results in the 'ax:dx' + register pair. Single word values will be allocated either in + 'ax' or 'dx'. For example on i386 the following implements + 'rdtsc': + + unsigned long long rdtsc (void) + { + unsigned long long tick; + __asm__ __volatile__("rdtsc":"=A"(tick)); + return tick; + } + + This is not correct on x86_64 as it would allocate tick in + either 'ax' or 'dx'. You have to use the following variant + instead: + + unsigned long long rdtsc (void) + { + unsigned int tickl, tickh; + __asm__ __volatile__("rdtsc":"=a"(tickl),"=d"(tickh)); + return ((unsigned long long)tickh << 32)|tickl; + } + + 'f' + Any 80387 floating-point (stack) register. + + 't' + Top of 80387 floating-point stack ('%st(0)'). + + 'u' + Second from top of 80387 floating-point stack ('%st(1)'). + + 'y' + Any MMX register. + + 'x' + Any SSE register. + + 'Yz' + First SSE register ('%xmm0'). + + 'Y2' + Any SSE register, when SSE2 is enabled. + + 'Yi' + Any SSE register, when SSE2 and inter-unit moves are enabled. + + 'Ym' + Any MMX register, when inter-unit moves are enabled. + + 'I' + Integer constant in the range 0 ... 31, for 32-bit shifts. + + 'J' + Integer constant in the range 0 ... 63, for 64-bit shifts. + + 'K' + Signed 8-bit integer constant. + + 'L' + '0xFF' or '0xFFFF', for andsi as a zero-extending move. + + 'M' + 0, 1, 2, or 3 (shifts for the 'lea' instruction). + + 'N' + Unsigned 8-bit integer constant (for 'in' and 'out' + instructions). + + 'O' + Integer constant in the range 0 ... 127, for 128-bit shifts. + + 'G' + Standard 80387 floating point constant. + + 'C' + Standard SSE floating point constant. + + 'e' + 32-bit signed integer constant, or a symbolic reference known + to fit that range (for immediate operands in sign-extending + x86-64 instructions). + + 'Z' + 32-bit unsigned integer constant, or a symbolic reference + known to fit that range (for immediate operands in + zero-extending x86-64 instructions). + +_Intel IA-64--'config/ia64/ia64.h'_ + 'a' + General register 'r0' to 'r3' for 'addl' instruction + + 'b' + Branch register + + 'c' + Predicate register ('c' as in "conditional") + + 'd' + Application register residing in M-unit + + 'e' + Application register residing in I-unit + + 'f' + Floating-point register + + 'm' + Memory operand. If used together with '<' or '>', the operand + can have postincrement and postdecrement which require + printing with '%Pn' on IA-64. + + 'G' + Floating-point constant 0.0 or 1.0 + + 'I' + 14-bit signed integer constant + + 'J' + 22-bit signed integer constant + + 'K' + 8-bit signed integer constant for logical instructions + + 'L' + 8-bit adjusted signed integer constant for compare pseudo-ops + + 'M' + 6-bit unsigned integer constant for shift counts + + 'N' + 9-bit signed integer constant for load and store + postincrements + + 'O' + The constant zero + + 'P' + 0 or -1 for 'dep' instruction + + 'Q' + Non-volatile memory for floating-point loads and stores + + 'R' + Integer constant in the range 1 to 4 for 'shladd' instruction + + 'S' + Memory operand except postincrement and postdecrement. This + is now roughly the same as 'm' when not used together with '<' + or '>'. + +_FRV--'config/frv/frv.h'_ + 'a' + Register in the class 'ACC_REGS' ('acc0' to 'acc7'). + + 'b' + Register in the class 'EVEN_ACC_REGS' ('acc0' to 'acc7'). + + 'c' + Register in the class 'CC_REGS' ('fcc0' to 'fcc3' and 'icc0' + to 'icc3'). + + 'd' + Register in the class 'GPR_REGS' ('gr0' to 'gr63'). + + 'e' + Register in the class 'EVEN_REGS' ('gr0' to 'gr63'). Odd + registers are excluded not in the class but through the use of + a machine mode larger than 4 bytes. + + 'f' + Register in the class 'FPR_REGS' ('fr0' to 'fr63'). + + 'h' + Register in the class 'FEVEN_REGS' ('fr0' to 'fr63'). Odd + registers are excluded not in the class but through the use of + a machine mode larger than 4 bytes. + + 'l' + Register in the class 'LR_REG' (the 'lr' register). + + 'q' + Register in the class 'QUAD_REGS' ('gr2' to 'gr63'). Register + numbers not divisible by 4 are excluded not in the class but + through the use of a machine mode larger than 8 bytes. + + 't' + Register in the class 'ICC_REGS' ('icc0' to 'icc3'). + + 'u' + Register in the class 'FCC_REGS' ('fcc0' to 'fcc3'). + + 'v' + Register in the class 'ICR_REGS' ('cc4' to 'cc7'). + + 'w' + Register in the class 'FCR_REGS' ('cc0' to 'cc3'). + + 'x' + Register in the class 'QUAD_FPR_REGS' ('fr0' to 'fr63'). + Register numbers not divisible by 4 are excluded not in the + class but through the use of a machine mode larger than 8 + bytes. + + 'z' + Register in the class 'SPR_REGS' ('lcr' and 'lr'). + + 'A' + Register in the class 'QUAD_ACC_REGS' ('acc0' to 'acc7'). + + 'B' + Register in the class 'ACCG_REGS' ('accg0' to 'accg7'). + + 'C' + Register in the class 'CR_REGS' ('cc0' to 'cc7'). + + 'G' + Floating point constant zero + + 'I' + 6-bit signed integer constant + + 'J' + 10-bit signed integer constant + + 'L' + 16-bit signed integer constant + + 'M' + 16-bit unsigned integer constant + + 'N' + 12-bit signed integer constant that is negative--i.e. in the + range of -2048 to -1 + + 'O' + Constant zero + + 'P' + 12-bit signed integer constant that is greater than zero--i.e. + in the range of 1 to 2047. + +_Blackfin family--'config/bfin/constraints.md'_ + 'a' + P register + + 'd' + D register + + 'z' + A call clobbered P register. + + 'qN' + A single register. If N is in the range 0 to 7, the + corresponding D register. If it is 'A', then the register P0. + + 'D' + Even-numbered D register + + 'W' + Odd-numbered D register + + 'e' + Accumulator register. + + 'A' + Even-numbered accumulator register. + + 'B' + Odd-numbered accumulator register. + + 'b' + I register + + 'v' + B register + + 'f' + M register + + 'c' + Registers used for circular buffering, i.e. I, B, or L + registers. + + 'C' + The CC register. + + 't' + LT0 or LT1. + + 'k' + LC0 or LC1. + + 'u' + LB0 or LB1. + + 'x' + Any D, P, B, M, I or L register. + + 'y' + Additional registers typically used only in prologues and + epilogues: RETS, RETN, RETI, RETX, RETE, ASTAT, SEQSTAT and + USP. + + 'w' + Any register except accumulators or CC. + + 'Ksh' + Signed 16 bit integer (in the range -32768 to 32767) + + 'Kuh' + Unsigned 16 bit integer (in the range 0 to 65535) + + 'Ks7' + Signed 7 bit integer (in the range -64 to 63) + + 'Ku7' + Unsigned 7 bit integer (in the range 0 to 127) + + 'Ku5' + Unsigned 5 bit integer (in the range 0 to 31) + + 'Ks4' + Signed 4 bit integer (in the range -8 to 7) + + 'Ks3' + Signed 3 bit integer (in the range -3 to 4) + + 'Ku3' + Unsigned 3 bit integer (in the range 0 to 7) + + 'PN' + Constant N, where N is a single-digit constant in the range 0 + to 4. + + 'PA' + An integer equal to one of the MACFLAG_XXX constants that is + suitable for use with either accumulator. + + 'PB' + An integer equal to one of the MACFLAG_XXX constants that is + suitable for use only with accumulator A1. + + 'M1' + Constant 255. + + 'M2' + Constant 65535. + + 'J' + An integer constant with exactly a single bit set. + + 'L' + An integer constant with all bits set except exactly one. + + 'H' + + 'Q' + Any SYMBOL_REF. + +_M32C--'config/m32c/m32c.c'_ + 'Rsp' + 'Rfb' + 'Rsb' + '$sp', '$fb', '$sb'. + + 'Rcr' + Any control register, when they're 16 bits wide (nothing if + control registers are 24 bits wide) + + 'Rcl' + Any control register, when they're 24 bits wide. + + 'R0w' + 'R1w' + 'R2w' + 'R3w' + $r0, $r1, $r2, $r3. + + 'R02' + $r0 or $r2, or $r2r0 for 32 bit values. + + 'R13' + $r1 or $r3, or $r3r1 for 32 bit values. + + 'Rdi' + A register that can hold a 64 bit value. + + 'Rhl' + $r0 or $r1 (registers with addressable high/low bytes) + + 'R23' + $r2 or $r3 + + 'Raa' + Address registers + + 'Raw' + Address registers when they're 16 bits wide. + + 'Ral' + Address registers when they're 24 bits wide. + + 'Rqi' + Registers that can hold QI values. + + 'Rad' + Registers that can be used with displacements ($a0, $a1, $sb). + + 'Rsi' + Registers that can hold 32 bit values. + + 'Rhi' + Registers that can hold 16 bit values. + + 'Rhc' + Registers chat can hold 16 bit values, including all control + registers. + + 'Rra' + $r0 through R1, plus $a0 and $a1. + + 'Rfl' + The flags register. + + 'Rmm' + The memory-based pseudo-registers $mem0 through $mem15. + + 'Rpi' + Registers that can hold pointers (16 bit registers for r8c, + m16c; 24 bit registers for m32cm, m32c). + + 'Rpa' + Matches multiple registers in a PARALLEL to form a larger + register. Used to match function return values. + + 'Is3' + -8 ... 7 + + 'IS1' + -128 ... 127 + + 'IS2' + -32768 ... 32767 + + 'IU2' + 0 ... 65535 + + 'In4' + -8 ... -1 or 1 ... 8 + + 'In5' + -16 ... -1 or 1 ... 16 + + 'In6' + -32 ... -1 or 1 ... 32 + + 'IM2' + -65536 ... -1 + + 'Ilb' + An 8 bit value with exactly one bit set. + + 'Ilw' + A 16 bit value with exactly one bit set. + + 'Sd' + The common src/dest memory addressing modes. + + 'Sa' + Memory addressed using $a0 or $a1. + + 'Si' + Memory addressed with immediate addresses. + + 'Ss' + Memory addressed using the stack pointer ($sp). + + 'Sf' + Memory addressed using the frame base register ($fb). + + 'Ss' + Memory addressed using the small base register ($sb). + + 'S1' + $r1h + +_MeP--'config/mep/constraints.md'_ + + 'a' + The $sp register. + + 'b' + The $tp register. + + 'c' + Any control register. + + 'd' + Either the $hi or the $lo register. + + 'em' + Coprocessor registers that can be directly loaded ($c0-$c15). + + 'ex' + Coprocessor registers that can be moved to each other. + + 'er' + Coprocessor registers that can be moved to core registers. + + 'h' + The $hi register. + + 'j' + The $rpc register. + + 'l' + The $lo register. + + 't' + Registers which can be used in $tp-relative addressing. + + 'v' + The $gp register. + + 'x' + The coprocessor registers. + + 'y' + The coprocessor control registers. + + 'z' + The $0 register. + + 'A' + User-defined register set A. + + 'B' + User-defined register set B. + + 'C' + User-defined register set C. + + 'D' + User-defined register set D. + + 'I' + Offsets for $gp-rel addressing. + + 'J' + Constants that can be used directly with boolean insns. + + 'K' + Constants that can be moved directly to registers. + + 'L' + Small constants that can be added to registers. + + 'M' + Long shift counts. + + 'N' + Small constants that can be compared to registers. + + 'O' + Constants that can be loaded into the top half of registers. + + 'S' + Signed 8-bit immediates. + + 'T' + Symbols encoded for $tp-rel or $gp-rel addressing. + + 'U' + Non-constant addresses for loading/saving coprocessor + registers. + + 'W' + The top half of a symbol's value. + + 'Y' + A register indirect address without offset. + + 'Z' + Symbolic references to the control bus. + +_MicroBlaze--'config/microblaze/constraints.md'_ + 'd' + A general register ('r0' to 'r31'). + + 'z' + A status register ('rmsr', '$fcc1' to '$fcc7'). + +_MIPS--'config/mips/constraints.md'_ + 'd' + An address register. This is equivalent to 'r' unless + generating MIPS16 code. + + 'f' + A floating-point register (if available). + + 'h' + Formerly the 'hi' register. This constraint is no longer + supported. + + 'l' + The 'lo' register. Use this register to store values that are + no bigger than a word. + + 'x' + The concatenated 'hi' and 'lo' registers. Use this register + to store doubleword values. + + 'c' + A register suitable for use in an indirect jump. This will + always be '$25' for '-mabicalls'. + + 'v' + Register '$3'. Do not use this constraint in new code; it is + retained only for compatibility with glibc. + + 'y' + Equivalent to 'r'; retained for backwards compatibility. + + 'z' + A floating-point condition code register. + + 'I' + A signed 16-bit constant (for arithmetic instructions). + + 'J' + Integer zero. + + 'K' + An unsigned 16-bit constant (for logic instructions). + + 'L' + A signed 32-bit constant in which the lower 16 bits are zero. + Such constants can be loaded using 'lui'. + + 'M' + A constant that cannot be loaded using 'lui', 'addiu' or + 'ori'. + + 'N' + A constant in the range -65535 to -1 (inclusive). + + 'O' + A signed 15-bit constant. + + 'P' + A constant in the range 1 to 65535 (inclusive). + + 'G' + Floating-point zero. + + 'R' + An address that can be used in a non-macro load or store. + + 'ZC' + When compiling microMIPS code, this constraint matches a + memory operand whose address is formed from a base register + and a 12-bit offset. These operands can be used for microMIPS + instructions such as 'll' and 'sc'. When not compiling for + microMIPS code, 'ZC' is equivalent to 'R'. + + 'ZD' + When compiling microMIPS code, this constraint matches an + address operand that is formed from a base register and a + 12-bit offset. These operands can be used for microMIPS + instructions such as 'prefetch'. When not compiling for + microMIPS code, 'ZD' is equivalent to 'p'. + +_Motorola 680x0--'config/m68k/constraints.md'_ + 'a' + Address register + + 'd' + Data register + + 'f' + 68881 floating-point register, if available + + 'I' + Integer in the range 1 to 8 + + 'J' + 16-bit signed number + + 'K' + Signed number whose magnitude is greater than 0x80 + + 'L' + Integer in the range -8 to -1 + + 'M' + Signed number whose magnitude is greater than 0x100 + + 'N' + Range 24 to 31, rotatert:SI 8 to 1 expressed as rotate + + 'O' + 16 (for rotate using swap) + + 'P' + Range 8 to 15, rotatert:HI 8 to 1 expressed as rotate + + 'R' + Numbers that mov3q can handle + + 'G' + Floating point constant that is not a 68881 constant + + 'S' + Operands that satisfy 'm' when -mpcrel is in effect + + 'T' + Operands that satisfy 's' when -mpcrel is not in effect + + 'Q' + Address register indirect addressing mode + + 'U' + Register offset addressing + + 'W' + const_call_operand + + 'Cs' + symbol_ref or const + + 'Ci' + const_int + + 'C0' + const_int 0 + + 'Cj' + Range of signed numbers that don't fit in 16 bits + + 'Cmvq' + Integers valid for mvq + + 'Capsw' + Integers valid for a moveq followed by a swap + + 'Cmvz' + Integers valid for mvz + + 'Cmvs' + Integers valid for mvs + + 'Ap' + push_operand + + 'Ac' + Non-register operands allowed in clr + +_Moxie--'config/moxie/constraints.md'_ + 'A' + An absolute address + + 'B' + An offset address + + 'W' + A register indirect memory operand + + 'I' + A constant in the range of 0 to 255. + + 'N' + A constant in the range of 0 to -255. + +_MSP430-'config/msp430/constraints.md'_ + + 'R12' + Register R12. + + 'R13' + Register R13. + + 'K' + Integer constant 1. + + 'L' + Integer constant -1^20..1^19. + + 'M' + Integer constant 1-4. + + 'Ya' + Memory references which do not require an extended MOVX + instruction. + + 'Yl' + Memory reference, labels only. + + 'Ys' + Memory reference, stack only. + +_NDS32--'config/nds32/constraints.md'_ + 'w' + LOW register class $r0 to $r7 constraint for V3/V3M ISA. + 'l' + LOW register class $r0 to $r7. + 'd' + MIDDLE register class $r0 to $r11, $r16 to $r19. + 'h' + HIGH register class $r12 to $r14, $r20 to $r31. + 't' + Temporary assist register $ta (i.e. $r15). + 'k' + Stack register $sp. + 'Iu03' + Unsigned immediate 3-bit value. + 'In03' + Negative immediate 3-bit value in the range of -7-0. + 'Iu04' + Unsigned immediate 4-bit value. + 'Is05' + Signed immediate 5-bit value. + 'Iu05' + Unsigned immediate 5-bit value. + 'In05' + Negative immediate 5-bit value in the range of -31-0. + 'Ip05' + Unsigned immediate 5-bit value for movpi45 instruction with + range 16-47. + 'Iu06' + Unsigned immediate 6-bit value constraint for addri36.sp + instruction. + 'Iu08' + Unsigned immediate 8-bit value. + 'Iu09' + Unsigned immediate 9-bit value. + 'Is10' + Signed immediate 10-bit value. + 'Is11' + Signed immediate 11-bit value. + 'Is15' + Signed immediate 15-bit value. + 'Iu15' + Unsigned immediate 15-bit value. + 'Ic15' + A constant which is not in the range of imm15u but ok for bclr + instruction. + 'Ie15' + A constant which is not in the range of imm15u but ok for bset + instruction. + 'It15' + A constant which is not in the range of imm15u but ok for btgl + instruction. + 'Ii15' + A constant whose compliment value is in the range of imm15u + and ok for bitci instruction. + 'Is16' + Signed immediate 16-bit value. + 'Is17' + Signed immediate 17-bit value. + 'Is19' + Signed immediate 19-bit value. + 'Is20' + Signed immediate 20-bit value. + 'Ihig' + The immediate value that can be simply set high 20-bit. + 'Izeb' + The immediate value 0xff. + 'Izeh' + The immediate value 0xffff. + 'Ixls' + The immediate value 0x01. + 'Ix11' + The immediate value 0x7ff. + 'Ibms' + The immediate value with power of 2. + 'Ifex' + The immediate value with power of 2 minus 1. + 'U33' + Memory constraint for 333 format. + 'U45' + Memory constraint for 45 format. + 'U37' + Memory constraint for 37 format. + +_Nios II family--'config/nios2/constraints.md'_ + + 'I' + Integer that is valid as an immediate operand in an + instruction taking a signed 16-bit number. Range -32768 to + 32767. + + 'J' + Integer that is valid as an immediate operand in an + instruction taking an unsigned 16-bit number. Range 0 to + 65535. + + 'K' + Integer that is valid as an immediate operand in an + instruction taking only the upper 16-bits of a 32-bit number. + Range 32-bit numbers with the lower 16-bits being 0. + + 'L' + Integer that is valid as an immediate operand for a shift + instruction. Range 0 to 31. + + 'M' + Integer that is valid as an immediate operand for only the + value 0. Can be used in conjunction with the format modifier + 'z' to use 'r0' instead of '0' in the assembly output. + + 'N' + Integer that is valid as an immediate operand for a custom + instruction opcode. Range 0 to 255. + + 'S' + Matches immediates which are addresses in the small data + section and therefore can be added to 'gp' as a 16-bit + immediate to re-create their 32-bit value. + + 'T' + A 'const' wrapped 'UNSPEC' expression, representing a + supported PIC or TLS relocation. + +_PDP-11--'config/pdp11/constraints.md'_ + 'a' + Floating point registers AC0 through AC3. These can be loaded + from/to memory with a single instruction. + + 'd' + Odd numbered general registers (R1, R3, R5). These are used + for 16-bit multiply operations. + + 'f' + Any of the floating point registers (AC0 through AC5). + + 'G' + Floating point constant 0. + + 'I' + An integer constant that fits in 16 bits. + + 'J' + An integer constant whose low order 16 bits are zero. + + 'K' + An integer constant that does not meet the constraints for + codes 'I' or 'J'. + + 'L' + The integer constant 1. + + 'M' + The integer constant -1. + + 'N' + The integer constant 0. + + 'O' + Integer constants -4 through -1 and 1 through 4; shifts by + these amounts are handled as multiple single-bit shifts rather + than a single variable-length shift. + + 'Q' + A memory reference which requires an additional word (address + or offset) after the opcode. + + 'R' + A memory reference that is encoded within the opcode. + +_RL78--'config/rl78/constraints.md'_ + + 'Int3' + An integer constant in the range 1 ... 7. + 'Int8' + An integer constant in the range 0 ... 255. + 'J' + An integer constant in the range -255 ... 0 + 'K' + The integer constant 1. + 'L' + The integer constant -1. + 'M' + The integer constant 0. + 'N' + The integer constant 2. + 'O' + The integer constant -2. + 'P' + An integer constant in the range 1 ... 15. + 'Qbi' + The built-in compare types-eq, ne, gtu, ltu, geu, and leu. + 'Qsc' + The synthetic compare types-gt, lt, ge, and le. + 'Wab' + A memory reference with an absolute address. + 'Wbc' + A memory reference using 'BC' as a base register, with an + optional offset. + 'Wca' + A memory reference using 'AX', 'BC', 'DE', or 'HL' for the + address, for calls. + 'Wcv' + A memory reference using any 16-bit register pair for the + address, for calls. + 'Wd2' + A memory reference using 'DE' as a base register, with an + optional offset. + 'Wde' + A memory reference using 'DE' as a base register, without any + offset. + 'Wfr' + Any memory reference to an address in the far address space. + 'Wh1' + A memory reference using 'HL' as a base register, with an + optional one-byte offset. + 'Whb' + A memory reference using 'HL' as a base register, with 'B' or + 'C' as the index register. + 'Whl' + A memory reference using 'HL' as a base register, without any + offset. + 'Ws1' + A memory reference using 'SP' as a base register, with an + optional one-byte offset. + 'Y' + Any memory reference to an address in the near address space. + 'A' + The 'AX' register. + 'B' + The 'BC' register. + 'D' + The 'DE' register. + 'R' + 'A' through 'L' registers. + 'S' + The 'SP' register. + 'T' + The 'HL' register. + 'Z08W' + The 16-bit 'R8' register. + 'Z10W' + The 16-bit 'R10' register. + 'Zint' + The registers reserved for interrupts ('R24' to 'R31'). + 'a' + The 'A' register. + 'b' + The 'B' register. + 'c' + The 'C' register. + 'd' + The 'D' register. + 'e' + The 'E' register. + 'h' + The 'H' register. + 'l' + The 'L' register. + 'v' + The virtual registers. + 'w' + The 'PSW' register. + 'x' + The 'X' register. + +_RX--'config/rx/constraints.md'_ + 'Q' + An address which does not involve register indirect addressing + or pre/post increment/decrement addressing. + + 'Symbol' + A symbol reference. + + 'Int08' + A constant in the range -256 to 255, inclusive. + + 'Sint08' + A constant in the range -128 to 127, inclusive. + + 'Sint16' + A constant in the range -32768 to 32767, inclusive. + + 'Sint24' + A constant in the range -8388608 to 8388607, inclusive. + + 'Uint04' + A constant in the range 0 to 15, inclusive. + +_SPARC--'config/sparc/sparc.h'_ + 'f' + Floating-point register on the SPARC-V8 architecture and lower + floating-point register on the SPARC-V9 architecture. + + 'e' + Floating-point register. It is equivalent to 'f' on the + SPARC-V8 architecture and contains both lower and upper + floating-point registers on the SPARC-V9 architecture. + + 'c' + Floating-point condition code register. + + 'd' + Lower floating-point register. It is only valid on the + SPARC-V9 architecture when the Visual Instruction Set is + available. + + 'b' + Floating-point register. It is only valid on the SPARC-V9 + architecture when the Visual Instruction Set is available. + + 'h' + 64-bit global or out register for the SPARC-V8+ architecture. + + 'C' + The constant all-ones, for floating-point. + + 'A' + Signed 5-bit constant + + 'D' + A vector constant + + 'I' + Signed 13-bit constant + + 'J' + Zero + + 'K' + 32-bit constant with the low 12 bits clear (a constant that + can be loaded with the 'sethi' instruction) + + 'L' + A constant in the range supported by 'movcc' instructions + (11-bit signed immediate) + + 'M' + A constant in the range supported by 'movrcc' instructions + (10-bit signed immediate) + + 'N' + Same as 'K', except that it verifies that bits that are not in + the lower 32-bit range are all zero. Must be used instead of + 'K' for modes wider than 'SImode' + + 'O' + The constant 4096 + + 'G' + Floating-point zero + + 'H' + Signed 13-bit constant, sign-extended to 32 or 64 bits + + 'P' + The constant -1 + + 'Q' + Floating-point constant whose integral representation can be + moved into an integer register using a single sethi + instruction + + 'R' + Floating-point constant whose integral representation can be + moved into an integer register using a single mov instruction + + 'S' + Floating-point constant whose integral representation can be + moved into an integer register using a high/lo_sum instruction + sequence + + 'T' + Memory address aligned to an 8-byte boundary + + 'U' + Even register + + 'W' + Memory address for 'e' constraint registers + + 'w' + Memory address with only a base register + + 'Y' + Vector zero + +_SPU--'config/spu/spu.h'_ + 'a' + An immediate which can be loaded with the il/ila/ilh/ilhu + instructions. const_int is treated as a 64 bit value. + + 'c' + An immediate for and/xor/or instructions. const_int is + treated as a 64 bit value. + + 'd' + An immediate for the 'iohl' instruction. const_int is treated + as a 64 bit value. + + 'f' + An immediate which can be loaded with 'fsmbi'. + + 'A' + An immediate which can be loaded with the il/ila/ilh/ilhu + instructions. const_int is treated as a 32 bit value. + + 'B' + An immediate for most arithmetic instructions. const_int is + treated as a 32 bit value. + + 'C' + An immediate for and/xor/or instructions. const_int is + treated as a 32 bit value. + + 'D' + An immediate for the 'iohl' instruction. const_int is treated + as a 32 bit value. + + 'I' + A constant in the range [-64, 63] for shift/rotate + instructions. + + 'J' + An unsigned 7-bit constant for conversion/nop/channel + instructions. + + 'K' + A signed 10-bit constant for most arithmetic instructions. + + 'M' + A signed 16 bit immediate for 'stop'. + + 'N' + An unsigned 16-bit constant for 'iohl' and 'fsmbi'. + + 'O' + An unsigned 7-bit constant whose 3 least significant bits are + 0. + + 'P' + An unsigned 3-bit constant for 16-byte rotates and shifts + + 'R' + Call operand, reg, for indirect calls + + 'S' + Call operand, symbol, for relative calls. + + 'T' + Call operand, const_int, for absolute calls. + + 'U' + An immediate which can be loaded with the il/ila/ilh/ilhu + instructions. const_int is sign extended to 128 bit. + + 'W' + An immediate for shift and rotate instructions. const_int is + treated as a 32 bit value. + + 'Y' + An immediate for and/xor/or instructions. const_int is sign + extended as a 128 bit. + + 'Z' + An immediate for the 'iohl' instruction. const_int is sign + extended to 128 bit. + +_S/390 and zSeries--'config/s390/s390.h'_ + 'a' + Address register (general purpose register except r0) + + 'c' + Condition code register + + 'd' + Data register (arbitrary general purpose register) + + 'f' + Floating-point register + + 'I' + Unsigned 8-bit constant (0-255) + + 'J' + Unsigned 12-bit constant (0-4095) + + 'K' + Signed 16-bit constant (-32768-32767) + + 'L' + Value appropriate as displacement. + '(0..4095)' + for short displacement + '(-524288..524287)' + for long displacement + + 'M' + Constant integer with a value of 0x7fffffff. + + 'N' + Multiple letter constraint followed by 4 parameter letters. + '0..9:' + number of the part counting from most to least + significant + 'H,Q:' + mode of the part + 'D,S,H:' + mode of the containing operand + '0,F:' + value of the other parts (F--all bits set) + The constraint matches if the specified part of a constant has + a value different from its other parts. + + 'Q' + Memory reference without index register and with short + displacement. + + 'R' + Memory reference with index register and short displacement. + + 'S' + Memory reference without index register but with long + displacement. + + 'T' + Memory reference with index register and long displacement. + + 'U' + Pointer with short displacement. + + 'W' + Pointer with long displacement. + + 'Y' + Shift count operand. + +_Score family--'config/score/score.h'_ + 'd' + Registers from r0 to r32. + + 'e' + Registers from r0 to r16. + + 't' + r8--r11 or r22--r27 registers. + + 'h' + hi register. + + 'l' + lo register. + + 'x' + hi + lo register. + + 'q' + cnt register. + + 'y' + lcb register. + + 'z' + scb register. + + 'a' + cnt + lcb + scb register. + + 'c' + cr0--cr15 register. + + 'b' + cp1 registers. + + 'f' + cp2 registers. + + 'i' + cp3 registers. + + 'j' + cp1 + cp2 + cp3 registers. + + 'I' + High 16-bit constant (32-bit constant with 16 LSBs zero). + + 'J' + Unsigned 5 bit integer (in the range 0 to 31). + + 'K' + Unsigned 16 bit integer (in the range 0 to 65535). + + 'L' + Signed 16 bit integer (in the range -32768 to 32767). + + 'M' + Unsigned 14 bit integer (in the range 0 to 16383). + + 'N' + Signed 14 bit integer (in the range -8192 to 8191). + + 'Z' + Any SYMBOL_REF. + +_Xstormy16--'config/stormy16/stormy16.h'_ + 'a' + Register r0. + + 'b' + Register r1. + + 'c' + Register r2. + + 'd' + Register r8. + + 'e' + Registers r0 through r7. + + 't' + Registers r0 and r1. + + 'y' + The carry register. + + 'z' + Registers r8 and r9. + + 'I' + A constant between 0 and 3 inclusive. + + 'J' + A constant that has exactly one bit set. + + 'K' + A constant that has exactly one bit clear. + + 'L' + A constant between 0 and 255 inclusive. + + 'M' + A constant between -255 and 0 inclusive. + + 'N' + A constant between -3 and 0 inclusive. + + 'O' + A constant between 1 and 4 inclusive. + + 'P' + A constant between -4 and -1 inclusive. + + 'Q' + A memory reference that is a stack push. + + 'R' + A memory reference that is a stack pop. + + 'S' + A memory reference that refers to a constant address of known + value. + + 'T' + The register indicated by Rx (not implemented yet). + + 'U' + A constant that is not between 2 and 15 inclusive. + + 'Z' + The constant 0. + +_TI C6X family--'config/c6x/constraints.md'_ + 'a' + Register file A (A0-A31). + + 'b' + Register file B (B0-B31). + + 'A' + Predicate registers in register file A (A0-A2 on C64X and + higher, A1 and A2 otherwise). + + 'B' + Predicate registers in register file B (B0-B2). + + 'C' + A call-used register in register file B (B0-B9, B16-B31). + + 'Da' + Register file A, excluding predicate registers (A3-A31, plus + A0 if not C64X or higher). + + 'Db' + Register file B, excluding predicate registers (B3-B31). + + 'Iu4' + Integer constant in the range 0 ... 15. + + 'Iu5' + Integer constant in the range 0 ... 31. + + 'In5' + Integer constant in the range -31 ... 0. + + 'Is5' + Integer constant in the range -16 ... 15. + + 'I5x' + Integer constant that can be the operand of an ADDA or a SUBA + insn. + + 'IuB' + Integer constant in the range 0 ... 65535. + + 'IsB' + Integer constant in the range -32768 ... 32767. + + 'IsC' + Integer constant in the range -2^{20} ... 2^{20} - 1. + + 'Jc' + Integer constant that is a valid mask for the clr instruction. + + 'Js' + Integer constant that is a valid mask for the set instruction. + + 'Q' + Memory location with A base register. + + 'R' + Memory location with B base register. + + 'S0' + On C64x+ targets, a GP-relative small data reference. + + 'S1' + Any kind of 'SYMBOL_REF', for use in a call address. + + 'Si' + Any kind of immediate operand, unless it matches the S0 + constraint. + + 'T' + Memory location with B base register, but not using a long + offset. + + 'W' + A memory operand with an address that can't be used in an + unaligned access. + + 'Z' + Register B14 (aka DP). + +_TILE-Gx--'config/tilegx/constraints.md'_ + 'R00' + 'R01' + 'R02' + 'R03' + 'R04' + 'R05' + 'R06' + 'R07' + 'R08' + 'R09' + 'R10' + Each of these represents a register constraint for an + individual register, from r0 to r10. + + 'I' + Signed 8-bit integer constant. + + 'J' + Signed 16-bit integer constant. + + 'K' + Unsigned 16-bit integer constant. + + 'L' + Integer constant that fits in one signed byte when incremented + by one (-129 ... 126). + + 'm' + Memory operand. If used together with '<' or '>', the operand + can have postincrement which requires printing with '%In' and + '%in' on TILE-Gx. For example: + + asm ("st_add %I0,%1,%i0" : "=m<>" (*mem) : "r" (val)); + + 'M' + A bit mask suitable for the BFINS instruction. + + 'N' + Integer constant that is a byte tiled out eight times. + + 'O' + The integer zero constant. + + 'P' + Integer constant that is a sign-extended byte tiled out as + four shorts. + + 'Q' + Integer constant that fits in one signed byte when incremented + (-129 ... 126), but excluding -1. + + 'S' + Integer constant that has all 1 bits consecutive and starting + at bit 0. + + 'T' + A 16-bit fragment of a got, tls, or pc-relative reference. + + 'U' + Memory operand except postincrement. This is roughly the same + as 'm' when not used together with '<' or '>'. + + 'W' + An 8-element vector constant with identical elements. + + 'Y' + A 4-element vector constant with identical elements. + + 'Z0' + The integer constant 0xffffffff. + + 'Z1' + The integer constant 0xffffffff00000000. + +_TILEPro--'config/tilepro/constraints.md'_ + 'R00' + 'R01' + 'R02' + 'R03' + 'R04' + 'R05' + 'R06' + 'R07' + 'R08' + 'R09' + 'R10' + Each of these represents a register constraint for an + individual register, from r0 to r10. + + 'I' + Signed 8-bit integer constant. + + 'J' + Signed 16-bit integer constant. + + 'K' + Nonzero integer constant with low 16 bits zero. + + 'L' + Integer constant that fits in one signed byte when incremented + by one (-129 ... 126). + + 'm' + Memory operand. If used together with '<' or '>', the operand + can have postincrement which requires printing with '%In' and + '%in' on TILEPro. For example: + + asm ("swadd %I0,%1,%i0" : "=m<>" (mem) : "r" (val)); + + 'M' + A bit mask suitable for the MM instruction. + + 'N' + Integer constant that is a byte tiled out four times. + + 'O' + The integer zero constant. + + 'P' + Integer constant that is a sign-extended byte tiled out as two + shorts. + + 'Q' + Integer constant that fits in one signed byte when incremented + (-129 ... 126), but excluding -1. + + 'T' + A symbolic operand, or a 16-bit fragment of a got, tls, or + pc-relative reference. + + 'U' + Memory operand except postincrement. This is roughly the same + as 'm' when not used together with '<' or '>'. + + 'W' + A 4-element vector constant with identical elements. + + 'Y' + A 2-element vector constant with identical elements. + +_Xtensa--'config/xtensa/constraints.md'_ + 'a' + General-purpose 32-bit register + + 'b' + One-bit boolean register + + 'A' + MAC16 40-bit accumulator register + + 'I' + Signed 12-bit integer constant, for use in MOVI instructions + + 'J' + Signed 8-bit integer constant, for use in ADDI instructions + + 'K' + Integer constant valid for BccI instructions + + 'L' + Unsigned constant valid for BccUI instructions + + +File: gccint.info, Node: Disable Insn Alternatives, Next: Define Constraints, Prev: Machine Constraints, Up: Constraints + +16.8.6 Disable insn alternatives using the 'enabled' attribute +-------------------------------------------------------------- + +The 'enabled' insn attribute may be used to disable certain insn +alternatives for machine-specific reasons. This is useful when adding +new instructions to an existing pattern which are only available for +certain cpu architecture levels as specified with the '-march=' option. + + If an insn alternative is disabled, then it will never be used. The +compiler treats the constraints for the disabled alternative as +unsatisfiable. + + In order to make use of the 'enabled' attribute a back end has to add +in the machine description files: + + 1. A definition of the 'enabled' insn attribute. The attribute is + defined as usual using the 'define_attr' command. This definition + should be based on other insn attributes and/or target flags. The + 'enabled' attribute is a numeric attribute and should evaluate to + '(const_int 1)' for an enabled alternative and to '(const_int 0)' + otherwise. + 2. A definition of another insn attribute used to describe for what + reason an insn alternative might be available or not. E.g. + 'cpu_facility' as in the example below. + 3. An assignment for the second attribute to each insn definition + combining instructions which are not all available under the same + circumstances. (Note: It obviously only makes sense for + definitions with more than one alternative. Otherwise the insn + pattern should be disabled or enabled using the insn condition.) + + E.g. the following two patterns could easily be merged using the +'enabled' attribute: + + + (define_insn "*movdi_old" + [(set (match_operand:DI 0 "register_operand" "=d") + (match_operand:DI 1 "register_operand" " d"))] + "!TARGET_NEW" + "lgr %0,%1") + + (define_insn "*movdi_new" + [(set (match_operand:DI 0 "register_operand" "=d,f,d") + (match_operand:DI 1 "register_operand" " d,d,f"))] + "TARGET_NEW" + "@ + lgr %0,%1 + ldgr %0,%1 + lgdr %0,%1") + + to: + + + (define_insn "*movdi_combined" + [(set (match_operand:DI 0 "register_operand" "=d,f,d") + (match_operand:DI 1 "register_operand" " d,d,f"))] + "" + "@ + lgr %0,%1 + ldgr %0,%1 + lgdr %0,%1" + [(set_attr "cpu_facility" "*,new,new")]) + + with the 'enabled' attribute defined like this: + + + (define_attr "cpu_facility" "standard,new" (const_string "standard")) + + (define_attr "enabled" "" + (cond [(eq_attr "cpu_facility" "standard") (const_int 1) + (and (eq_attr "cpu_facility" "new") + (ne (symbol_ref "TARGET_NEW") (const_int 0))) + (const_int 1)] + (const_int 0))) + + +File: gccint.info, Node: Define Constraints, Next: C Constraint Interface, Prev: Disable Insn Alternatives, Up: Constraints + +16.8.7 Defining Machine-Specific Constraints +-------------------------------------------- + +Machine-specific constraints fall into two categories: register and +non-register constraints. Within the latter category, constraints which +allow subsets of all possible memory or address operands should be +specially marked, to give 'reload' more information. + + Machine-specific constraints can be given names of arbitrary length, +but they must be entirely composed of letters, digits, underscores +('_'), and angle brackets ('< >'). Like C identifiers, they must begin +with a letter or underscore. + + In order to avoid ambiguity in operand constraint strings, no +constraint can have a name that begins with any other constraint's name. +For example, if 'x' is defined as a constraint name, 'xy' may not be, +and vice versa. As a consequence of this rule, no constraint may begin +with one of the generic constraint letters: 'E F V X g i m n o p r s'. + + Register constraints correspond directly to register classes. *Note +Register Classes::. There is thus not much flexibility in their +definitions. + + -- MD Expression: define_register_constraint name regclass docstring + All three arguments are string constants. NAME is the name of the + constraint, as it will appear in 'match_operand' expressions. If + NAME is a multi-letter constraint its length shall be the same for + all constraints starting with the same letter. REGCLASS can be + either the name of the corresponding register class (*note Register + Classes::), or a C expression which evaluates to the appropriate + register class. If it is an expression, it must have no side + effects, and it cannot look at the operand. The usual use of + expressions is to map some register constraints to 'NO_REGS' when + the register class is not available on a given subarchitecture. + + DOCSTRING is a sentence documenting the meaning of the constraint. + Docstrings are explained further below. + + Non-register constraints are more like predicates: the constraint +definition gives a Boolean expression which indicates whether the +constraint matches. + + -- MD Expression: define_constraint name docstring exp + The NAME and DOCSTRING arguments are the same as for + 'define_register_constraint', but note that the docstring comes + immediately after the name for these expressions. EXP is an RTL + expression, obeying the same rules as the RTL expressions in + predicate definitions. *Note Defining Predicates::, for details. + If it evaluates true, the constraint matches; if it evaluates + false, it doesn't. Constraint expressions should indicate which + RTL codes they might match, just like predicate expressions. + + 'match_test' C expressions have access to the following variables: + + OP + The RTL object defining the operand. + MODE + The machine mode of OP. + IVAL + 'INTVAL (OP)', if OP is a 'const_int'. + HVAL + 'CONST_DOUBLE_HIGH (OP)', if OP is an integer 'const_double'. + LVAL + 'CONST_DOUBLE_LOW (OP)', if OP is an integer 'const_double'. + RVAL + 'CONST_DOUBLE_REAL_VALUE (OP)', if OP is a floating-point + 'const_double'. + + The *VAL variables should only be used once another piece of the + expression has verified that OP is the appropriate kind of RTL + object. + + Most non-register constraints should be defined with +'define_constraint'. The remaining two definition expressions are only +appropriate for constraints that should be handled specially by 'reload' +if they fail to match. + + -- MD Expression: define_memory_constraint name docstring exp + Use this expression for constraints that match a subset of all + memory operands: that is, 'reload' can make them match by + converting the operand to the form '(mem (reg X))', where X is a + base register (from the register class specified by + 'BASE_REG_CLASS', *note Register Classes::). + + For example, on the S/390, some instructions do not accept + arbitrary memory references, but only those that do not make use of + an index register. The constraint letter 'Q' is defined to + represent a memory address of this type. If 'Q' is defined with + 'define_memory_constraint', a 'Q' constraint can handle any memory + operand, because 'reload' knows it can simply copy the memory + address into a base register if required. This is analogous to the + way an 'o' constraint can handle any memory operand. + + The syntax and semantics are otherwise identical to + 'define_constraint'. + + -- MD Expression: define_address_constraint name docstring exp + Use this expression for constraints that match a subset of all + address operands: that is, 'reload' can make the constraint match + by converting the operand to the form '(reg X)', again with X a + base register. + + Constraints defined with 'define_address_constraint' can only be + used with the 'address_operand' predicate, or machine-specific + predicates that work the same way. They are treated analogously to + the generic 'p' constraint. + + The syntax and semantics are otherwise identical to + 'define_constraint'. + + For historical reasons, names beginning with the letters 'G H' are +reserved for constraints that match only 'const_double's, and names +beginning with the letters 'I J K L M N O P' are reserved for +constraints that match only 'const_int's. This may change in the +future. For the time being, constraints with these names must be +written in a stylized form, so that 'genpreds' can tell you did it +correctly: + + (define_constraint "[GHIJKLMNOP]..." + "DOC..." + (and (match_code "const_int") ; 'const_double' for G/H + CONDITION...)) ; usually a 'match_test' + + It is fine to use names beginning with other letters for constraints +that match 'const_double's or 'const_int's. + + Each docstring in a constraint definition should be one or more +complete sentences, marked up in Texinfo format. _They are currently +unused._ In the future they will be copied into the GCC manual, in +*note Machine Constraints::, replacing the hand-maintained tables +currently found in that section. Also, in the future the compiler may +use this to give more helpful diagnostics when poor choice of 'asm' +constraints causes a reload failure. + + If you put the pseudo-Texinfo directive '@internal' at the beginning of +a docstring, then (in the future) it will appear only in the internals +manual's version of the machine-specific constraint tables. Use this +for constraints that should not appear in 'asm' statements. + + +File: gccint.info, Node: C Constraint Interface, Prev: Define Constraints, Up: Constraints + +16.8.8 Testing constraints from C +--------------------------------- + +It is occasionally useful to test a constraint from C code rather than +implicitly via the constraint string in a 'match_operand'. The +generated file 'tm_p.h' declares a few interfaces for working with +machine-specific constraints. None of these interfaces work with the +generic constraints described in *note Simple Constraints::. This may +change in the future. + + *Warning:* 'tm_p.h' may declare other functions that operate on +constraints, besides the ones documented here. Do not use those +functions from machine-dependent code. They exist to implement the old +constraint interface that machine-independent components of the compiler +still expect. They will change or disappear in the future. + + Some valid constraint names are not valid C identifiers, so there is a +mangling scheme for referring to them from C. Constraint names that do +not contain angle brackets or underscores are left unchanged. +Underscores are doubled, each '<' is replaced with '_l', and each '>' +with '_g'. Here are some examples: + + *Original* *Mangled* + x x + P42x P42x + P4_x P4__x + P4>x P4_gx + P4>> P4_g_g + P4_g> P4__g_g + + Throughout this section, the variable C is either a constraint in the +abstract sense, or a constant from 'enum constraint_num'; the variable M +is a mangled constraint name (usually as part of a larger identifier). + + -- Enum: constraint_num + For each machine-specific constraint, there is a corresponding + enumeration constant: 'CONSTRAINT_' plus the mangled name of the + constraint. Functions that take an 'enum constraint_num' as an + argument expect one of these constants. + + Machine-independent constraints do not have associated constants. + This may change in the future. + + -- Function: inline bool satisfies_constraint_ M (rtx EXP) + For each machine-specific, non-register constraint M, there is one + of these functions; it returns 'true' if EXP satisfies the + constraint. These functions are only visible if 'rtl.h' was + included before 'tm_p.h'. + + -- Function: bool constraint_satisfied_p (rtx EXP, enum constraint_num + C) + Like the 'satisfies_constraint_M' functions, but the constraint to + test is given as an argument, C. If C specifies a register + constraint, this function will always return 'false'. + + -- Function: enum reg_class regclass_for_constraint (enum + constraint_num C) + Returns the register class associated with C. If C is not a + register constraint, or those registers are not available for the + currently selected subtarget, returns 'NO_REGS'. + + Here is an example use of 'satisfies_constraint_M'. In peephole +optimizations (*note Peephole Definitions::), operand constraint strings +are ignored, so if there are relevant constraints, they must be tested +in the C condition. In the example, the optimization is applied if +operand 2 does _not_ satisfy the 'K' constraint. (This is a simplified +version of a peephole definition from the i386 machine description.) + + (define_peephole2 + [(match_scratch:SI 3 "r") + (set (match_operand:SI 0 "register_operand" "") + (mult:SI (match_operand:SI 1 "memory_operand" "") + (match_operand:SI 2 "immediate_operand" "")))] + + "!satisfies_constraint_K (operands[2])" + + [(set (match_dup 3) (match_dup 1)) + (set (match_dup 0) (mult:SI (match_dup 3) (match_dup 2)))] + + "") + + +File: gccint.info, Node: Standard Names, Next: Pattern Ordering, Prev: Constraints, Up: Machine Desc + +16.9 Standard Pattern Names For Generation +========================================== + +Here is a table of the instruction names that are meaningful in the RTL +generation pass of the compiler. Giving one of these names to an +instruction pattern tells the RTL generation pass that it can use the +pattern to accomplish a certain task. + +'movM' + Here M stands for a two-letter machine mode name, in lowercase. + This instruction pattern moves data with that machine mode from + operand 1 to operand 0. For example, 'movsi' moves full-word data. + + If operand 0 is a 'subreg' with mode M of a register whose own mode + is wider than M, the effect of this instruction is to store the + specified value in the part of the register that corresponds to + mode M. Bits outside of M, but which are within the same target + word as the 'subreg' are undefined. Bits which are outside the + target word are left unchanged. + + This class of patterns is special in several ways. First of all, + each of these names up to and including full word size _must_ be + defined, because there is no other way to copy a datum from one + place to another. If there are patterns accepting operands in + larger modes, 'movM' must be defined for integer modes of those + sizes. + + Second, these patterns are not used solely in the RTL generation + pass. Even the reload pass can generate move insns to copy values + from stack slots into temporary registers. When it does so, one of + the operands is a hard register and the other is an operand that + can need to be reloaded into a register. + + Therefore, when given such a pair of operands, the pattern must + generate RTL which needs no reloading and needs no temporary + registers--no registers other than the operands. For example, if + you support the pattern with a 'define_expand', then in such a case + the 'define_expand' mustn't call 'force_reg' or any other such + function which might generate new pseudo registers. + + This requirement exists even for subword modes on a RISC machine + where fetching those modes from memory normally requires several + insns and some temporary registers. + + During reload a memory reference with an invalid address may be + passed as an operand. Such an address will be replaced with a + valid address later in the reload pass. In this case, nothing may + be done with the address except to use it as it stands. If it is + copied, it will not be replaced with a valid address. No attempt + should be made to make such an address into a valid address and no + routine (such as 'change_address') that will do so may be called. + Note that 'general_operand' will fail when applied to such an + address. + + The global variable 'reload_in_progress' (which must be explicitly + declared if required) can be used to determine whether such special + handling is required. + + The variety of operands that have reloads depends on the rest of + the machine description, but typically on a RISC machine these can + only be pseudo registers that did not get hard registers, while on + other machines explicit memory references will get optional + reloads. + + If a scratch register is required to move an object to or from + memory, it can be allocated using 'gen_reg_rtx' prior to life + analysis. + + If there are cases which need scratch registers during or after + reload, you must provide an appropriate secondary_reload target + hook. + + The macro 'can_create_pseudo_p' can be used to determine if it is + unsafe to create new pseudo registers. If this variable is + nonzero, then it is unsafe to call 'gen_reg_rtx' to allocate a new + pseudo. + + The constraints on a 'movM' must permit moving any hard register to + any other hard register provided that 'HARD_REGNO_MODE_OK' permits + mode M in both registers and 'TARGET_REGISTER_MOVE_COST' applied to + their classes returns a value of 2. + + It is obligatory to support floating point 'movM' instructions into + and out of any registers that can hold fixed point values, because + unions and structures (which have modes 'SImode' or 'DImode') can + be in those registers and they may have floating point members. + + There may also be a need to support fixed point 'movM' instructions + in and out of floating point registers. Unfortunately, I have + forgotten why this was so, and I don't know whether it is still + true. If 'HARD_REGNO_MODE_OK' rejects fixed point values in + floating point registers, then the constraints of the fixed point + 'movM' instructions must be designed to avoid ever trying to reload + into a floating point register. + +'reload_inM' +'reload_outM' + These named patterns have been obsoleted by the target hook + 'secondary_reload'. + + Like 'movM', but used when a scratch register is required to move + between operand 0 and operand 1. Operand 2 describes the scratch + register. See the discussion of the 'SECONDARY_RELOAD_CLASS' macro + in *note Register Classes::. + + There are special restrictions on the form of the 'match_operand's + used in these patterns. First, only the predicate for the reload + operand is examined, i.e., 'reload_in' examines operand 1, but not + the predicates for operand 0 or 2. Second, there may be only one + alternative in the constraints. Third, only a single register + class letter may be used for the constraint; subsequent constraint + letters are ignored. As a special exception, an empty constraint + string matches the 'ALL_REGS' register class. This may relieve + ports of the burden of defining an 'ALL_REGS' constraint letter + just for these patterns. + +'movstrictM' + Like 'movM' except that if operand 0 is a 'subreg' with mode M of a + register whose natural mode is wider, the 'movstrictM' instruction + is guaranteed not to alter any of the register except the part + which belongs to mode M. + +'movmisalignM' + This variant of a move pattern is designed to load or store a value + from a memory address that is not naturally aligned for its mode. + For a store, the memory will be in operand 0; for a load, the + memory will be in operand 1. The other operand is guaranteed not + to be a memory, so that it's easy to tell whether this is a load or + store. + + This pattern is used by the autovectorizer, and when expanding a + 'MISALIGNED_INDIRECT_REF' expression. + +'load_multiple' + Load several consecutive memory locations into consecutive + registers. Operand 0 is the first of the consecutive registers, + operand 1 is the first memory location, and operand 2 is a + constant: the number of consecutive registers. + + Define this only if the target machine really has such an + instruction; do not define this if the most efficient way of + loading consecutive registers from memory is to do them one at a + time. + + On some machines, there are restrictions as to which consecutive + registers can be stored into memory, such as particular starting or + ending register numbers or only a range of valid counts. For those + machines, use a 'define_expand' (*note Expander Definitions::) and + make the pattern fail if the restrictions are not met. + + Write the generated insn as a 'parallel' with elements being a + 'set' of one register from the appropriate memory location (you may + also need 'use' or 'clobber' elements). Use a 'match_parallel' + (*note RTL Template::) to recognize the insn. See 'rs6000.md' for + examples of the use of this insn pattern. + +'store_multiple' + Similar to 'load_multiple', but store several consecutive registers + into consecutive memory locations. Operand 0 is the first of the + consecutive memory locations, operand 1 is the first register, and + operand 2 is a constant: the number of consecutive registers. + +'vec_load_lanesMN' + Perform an interleaved load of several vectors from memory operand + 1 into register operand 0. Both operands have mode M. The + register operand is viewed as holding consecutive vectors of mode + N, while the memory operand is a flat array that contains the same + number of elements. The operation is equivalent to: + + int c = GET_MODE_SIZE (M) / GET_MODE_SIZE (N); + for (j = 0; j < GET_MODE_NUNITS (N); j++) + for (i = 0; i < c; i++) + operand0[i][j] = operand1[j * c + i]; + + For example, 'vec_load_lanestiv4hi' loads 8 16-bit values from + memory into a register of mode 'TI'. The register contains two + consecutive vectors of mode 'V4HI'. + + This pattern can only be used if: + TARGET_ARRAY_MODE_SUPPORTED_P (N, C) + is true. GCC assumes that, if a target supports this kind of + instruction for some mode N, it also supports unaligned loads for + vectors of mode N. + +'vec_store_lanesMN' + Equivalent to 'vec_load_lanesMN', with the memory and register + operands reversed. That is, the instruction is equivalent to: + + int c = GET_MODE_SIZE (M) / GET_MODE_SIZE (N); + for (j = 0; j < GET_MODE_NUNITS (N); j++) + for (i = 0; i < c; i++) + operand0[j * c + i] = operand1[i][j]; + + for a memory operand 0 and register operand 1. + +'vec_setM' + Set given field in the vector value. Operand 0 is the vector to + modify, operand 1 is new value of field and operand 2 specify the + field index. + +'vec_extractM' + Extract given field from the vector value. Operand 1 is the + vector, operand 2 specify field index and operand 0 place to store + value into. + +'vec_initM' + Initialize the vector to given values. Operand 0 is the vector to + initialize and operand 1 is parallel containing values for + individual fields. + +'vcondMN' + Output a conditional vector move. Operand 0 is the destination to + receive a combination of operand 1 and operand 2, which are of mode + M, dependent on the outcome of the predicate in operand 3 which is + a vector comparison with operands of mode N in operands 4 and 5. + The modes M and N should have the same size. Operand 0 will be set + to the value OP1 & MSK | OP2 & ~MSK where MSK is computed by + element-wise evaluation of the vector comparison with a truth value + of all-ones and a false value of all-zeros. + +'vec_permM' + Output a (variable) vector permutation. Operand 0 is the + destination to receive elements from operand 1 and operand 2, which + are of mode M. Operand 3 is the "selector". It is an integral + mode vector of the same width and number of elements as mode M. + + The input elements are numbered from 0 in operand 1 through 2*N-1 + in operand 2. The elements of the selector must be computed modulo + 2*N. Note that if 'rtx_equal_p(operand1, operand2)', this can be + implemented with just operand 1 and selector elements modulo N. + + In order to make things easy for a number of targets, if there is + no 'vec_perm' pattern for mode M, but there is for mode Q where Q + is a vector of 'QImode' of the same width as M, the middle-end will + lower the mode M 'VEC_PERM_EXPR' to mode Q. + +'vec_perm_constM' + Like 'vec_perm' except that the permutation is a compile-time + constant. That is, operand 3, the "selector", is a 'CONST_VECTOR'. + + Some targets cannot perform a permutation with a variable selector, + but can efficiently perform a constant permutation. Further, the + target hook 'vec_perm_ok' is queried to determine if the specific + constant permutation is available efficiently; the named pattern is + never expanded without 'vec_perm_ok' returning true. + + There is no need for a target to supply both 'vec_permM' and + 'vec_perm_constM' if the former can trivially implement the + operation with, say, the vector constant loaded into a register. + +'pushM1' + Output a push instruction. Operand 0 is value to push. Used only + when 'PUSH_ROUNDING' is defined. For historical reason, this + pattern may be missing and in such case an 'mov' expander is used + instead, with a 'MEM' expression forming the push operation. The + 'mov' expander method is deprecated. + +'addM3' + Add operand 2 and operand 1, storing the result in operand 0. All + operands must have mode M. This can be used even on two-address + machines, by means of constraints requiring operands 1 and 0 to be + the same location. + +'addptrM3' + Like 'addM3' but is guaranteed to only be used for address + calculations. The expanded code is not allowed to clobber the + condition code. It only needs to be defined if 'addM3' sets the + condition code. If adds used for address calculations and normal + adds are not compatible it is required to expand a distinct pattern + (e.g. using an unspec). The pattern is used by LRA to emit + address calculations. 'addM3' is used if 'addptrM3' is not + defined. + +'ssaddM3', 'usaddM3' +'subM3', 'sssubM3', 'ussubM3' +'mulM3', 'ssmulM3', 'usmulM3' +'divM3', 'ssdivM3' +'udivM3', 'usdivM3' +'modM3', 'umodM3' +'uminM3', 'umaxM3' +'andM3', 'iorM3', 'xorM3' + Similar, for other arithmetic operations. + +'fmaM4' + Multiply operand 2 and operand 1, then add operand 3, storing the + result in operand 0 without doing an intermediate rounding step. + All operands must have mode M. This pattern is used to implement + the 'fma', 'fmaf', and 'fmal' builtin functions from the ISO C99 + standard. + +'fmsM4' + Like 'fmaM4', except operand 3 subtracted from the product instead + of added to the product. This is represented in the rtl as + + (fma:M OP1 OP2 (neg:M OP3)) + +'fnmaM4' + Like 'fmaM4' except that the intermediate product is negated before + being added to operand 3. This is represented in the rtl as + + (fma:M (neg:M OP1) OP2 OP3) + +'fnmsM4' + Like 'fmsM4' except that the intermediate product is negated before + subtracting operand 3. This is represented in the rtl as + + (fma:M (neg:M OP1) OP2 (neg:M OP3)) + +'sminM3', 'smaxM3' + Signed minimum and maximum operations. When used with floating + point, if both operands are zeros, or if either operand is 'NaN', + then it is unspecified which of the two operands is returned as the + result. + +'reduc_smin_M', 'reduc_smax_M' + Find the signed minimum/maximum of the elements of a vector. The + vector is operand 1, and the scalar result is stored in the least + significant bits of operand 0 (also a vector). The output and + input vector should have the same modes. + +'reduc_umin_M', 'reduc_umax_M' + Find the unsigned minimum/maximum of the elements of a vector. The + vector is operand 1, and the scalar result is stored in the least + significant bits of operand 0 (also a vector). The output and + input vector should have the same modes. + +'reduc_splus_M' + Compute the sum of the signed elements of a vector. The vector is + operand 1, and the scalar result is stored in the least significant + bits of operand 0 (also a vector). The output and input vector + should have the same modes. + +'reduc_uplus_M' + Compute the sum of the unsigned elements of a vector. The vector + is operand 1, and the scalar result is stored in the least + significant bits of operand 0 (also a vector). The output and + input vector should have the same modes. + +'sdot_prodM' +'udot_prodM' + Compute the sum of the products of two signed/unsigned elements. + Operand 1 and operand 2 are of the same mode. Their product, which + is of a wider mode, is computed and added to operand 3. Operand 3 + is of a mode equal or wider than the mode of the product. The + result is placed in operand 0, which is of the same mode as operand + 3. + +'ssum_widenM3' +'usum_widenM3' + Operands 0 and 2 are of the same mode, which is wider than the mode + of operand 1. Add operand 1 to operand 2 and place the widened + result in operand 0. (This is used express accumulation of + elements into an accumulator of a wider mode.) + +'vec_shl_M', 'vec_shr_M' + Whole vector left/right shift in bits. Operand 1 is a vector to be + shifted. Operand 2 is an integer shift amount in bits. Operand 0 + is where the resulting shifted vector is stored. The output and + input vectors should have the same modes. + +'vec_pack_trunc_M' + Narrow (demote) and merge the elements of two vectors. Operands 1 + and 2 are vectors of the same mode having N integral or floating + point elements of size S. Operand 0 is the resulting vector in + which 2*N elements of size N/2 are concatenated after narrowing + them down using truncation. + +'vec_pack_ssat_M', 'vec_pack_usat_M' + Narrow (demote) and merge the elements of two vectors. Operands 1 + and 2 are vectors of the same mode having N integral elements of + size S. Operand 0 is the resulting vector in which the elements of + the two input vectors are concatenated after narrowing them down + using signed/unsigned saturating arithmetic. + +'vec_pack_sfix_trunc_M', 'vec_pack_ufix_trunc_M' + Narrow, convert to signed/unsigned integral type and merge the + elements of two vectors. Operands 1 and 2 are vectors of the same + mode having N floating point elements of size S. Operand 0 is the + resulting vector in which 2*N elements of size N/2 are + concatenated. + +'vec_unpacks_hi_M', 'vec_unpacks_lo_M' + Extract and widen (promote) the high/low part of a vector of signed + integral or floating point elements. The input vector (operand 1) + has N elements of size S. Widen (promote) the high/low elements of + the vector using signed or floating point extension and place the + resulting N/2 values of size 2*S in the output vector (operand 0). + +'vec_unpacku_hi_M', 'vec_unpacku_lo_M' + Extract and widen (promote) the high/low part of a vector of + unsigned integral elements. The input vector (operand 1) has N + elements of size S. Widen (promote) the high/low elements of the + vector using zero extension and place the resulting N/2 values of + size 2*S in the output vector (operand 0). + +'vec_unpacks_float_hi_M', 'vec_unpacks_float_lo_M' +'vec_unpacku_float_hi_M', 'vec_unpacku_float_lo_M' + Extract, convert to floating point type and widen the high/low part + of a vector of signed/unsigned integral elements. The input vector + (operand 1) has N elements of size S. Convert the high/low + elements of the vector using floating point conversion and place + the resulting N/2 values of size 2*S in the output vector (operand + 0). + +'vec_widen_umult_hi_M', 'vec_widen_umult_lo_M' +'vec_widen_smult_hi_M', 'vec_widen_smult_lo_M' +'vec_widen_umult_even_M', 'vec_widen_umult_odd_M' +'vec_widen_smult_even_M', 'vec_widen_smult_odd_M' + Signed/Unsigned widening multiplication. The two inputs (operands + 1 and 2) are vectors with N signed/unsigned elements of size S. + Multiply the high/low or even/odd elements of the two vectors, and + put the N/2 products of size 2*S in the output vector (operand 0). + A target shouldn't implement even/odd pattern pair if it is less + efficient than lo/hi one. + +'vec_widen_ushiftl_hi_M', 'vec_widen_ushiftl_lo_M' +'vec_widen_sshiftl_hi_M', 'vec_widen_sshiftl_lo_M' + Signed/Unsigned widening shift left. The first input (operand 1) + is a vector with N signed/unsigned elements of size S. Operand 2 + is a constant. Shift the high/low elements of operand 1, and put + the N/2 results of size 2*S in the output vector (operand 0). + +'mulhisi3' + Multiply operands 1 and 2, which have mode 'HImode', and store a + 'SImode' product in operand 0. + +'mulqihi3', 'mulsidi3' + Similar widening-multiplication instructions of other widths. + +'umulqihi3', 'umulhisi3', 'umulsidi3' + Similar widening-multiplication instructions that do unsigned + multiplication. + +'usmulqihi3', 'usmulhisi3', 'usmulsidi3' + Similar widening-multiplication instructions that interpret the + first operand as unsigned and the second operand as signed, then do + a signed multiplication. + +'smulM3_highpart' + Perform a signed multiplication of operands 1 and 2, which have + mode M, and store the most significant half of the product in + operand 0. The least significant half of the product is discarded. + +'umulM3_highpart' + Similar, but the multiplication is unsigned. + +'maddMN4' + Multiply operands 1 and 2, sign-extend them to mode N, add operand + 3, and store the result in operand 0. Operands 1 and 2 have mode M + and operands 0 and 3 have mode N. Both modes must be integer or + fixed-point modes and N must be twice the size of M. + + In other words, 'maddMN4' is like 'mulMN3' except that it also adds + operand 3. + + These instructions are not allowed to 'FAIL'. + +'umaddMN4' + Like 'maddMN4', but zero-extend the multiplication operands instead + of sign-extending them. + +'ssmaddMN4' + Like 'maddMN4', but all involved operations must be + signed-saturating. + +'usmaddMN4' + Like 'umaddMN4', but all involved operations must be + unsigned-saturating. + +'msubMN4' + Multiply operands 1 and 2, sign-extend them to mode N, subtract the + result from operand 3, and store the result in operand 0. Operands + 1 and 2 have mode M and operands 0 and 3 have mode N. Both modes + must be integer or fixed-point modes and N must be twice the size + of M. + + In other words, 'msubMN4' is like 'mulMN3' except that it also + subtracts the result from operand 3. + + These instructions are not allowed to 'FAIL'. + +'umsubMN4' + Like 'msubMN4', but zero-extend the multiplication operands instead + of sign-extending them. + +'ssmsubMN4' + Like 'msubMN4', but all involved operations must be + signed-saturating. + +'usmsubMN4' + Like 'umsubMN4', but all involved operations must be + unsigned-saturating. + +'divmodM4' + Signed division that produces both a quotient and a remainder. + Operand 1 is divided by operand 2 to produce a quotient stored in + operand 0 and a remainder stored in operand 3. + + For machines with an instruction that produces both a quotient and + a remainder, provide a pattern for 'divmodM4' but do not provide + patterns for 'divM3' and 'modM3'. This allows optimization in the + relatively common case when both the quotient and remainder are + computed. + + If an instruction that just produces a quotient or just a remainder + exists and is more efficient than the instruction that produces + both, write the output routine of 'divmodM4' to call + 'find_reg_note' and look for a 'REG_UNUSED' note on the quotient or + remainder and generate the appropriate instruction. + +'udivmodM4' + Similar, but does unsigned division. + +'ashlM3', 'ssashlM3', 'usashlM3' + Arithmetic-shift operand 1 left by a number of bits specified by + operand 2, and store the result in operand 0. Here M is the mode + of operand 0 and operand 1; operand 2's mode is specified by the + instruction pattern, and the compiler will convert the operand to + that mode before generating the instruction. The meaning of + out-of-range shift counts can optionally be specified by + 'TARGET_SHIFT_TRUNCATION_MASK'. *Note + TARGET_SHIFT_TRUNCATION_MASK::. Operand 2 is always a scalar type. + +'ashrM3', 'lshrM3', 'rotlM3', 'rotrM3' + Other shift and rotate instructions, analogous to the 'ashlM3' + instructions. Operand 2 is always a scalar type. + +'vashlM3', 'vashrM3', 'vlshrM3', 'vrotlM3', 'vrotrM3' + Vector shift and rotate instructions that take vectors as operand 2 + instead of a scalar type. + +'bswapM2' + Reverse the order of bytes of operand 1 and store the result in + operand 0. + +'negM2', 'ssnegM2', 'usnegM2' + Negate operand 1 and store the result in operand 0. + +'absM2' + Store the absolute value of operand 1 into operand 0. + +'sqrtM2' + Store the square root of operand 1 into operand 0. + + The 'sqrt' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'sqrtf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'fmodM3' + Store the remainder of dividing operand 1 by operand 2 into operand + 0, rounded towards zero to an integer. + + The 'fmod' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'fmodf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'remainderM3' + Store the remainder of dividing operand 1 by operand 2 into operand + 0, rounded to the nearest integer. + + The 'remainder' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'remainderf' + built-in function uses the mode which corresponds to the C data + type 'float'. + +'cosM2' + Store the cosine of operand 1 into operand 0. + + The 'cos' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'cosf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'sinM2' + Store the sine of operand 1 into operand 0. + + The 'sin' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'sinf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'sincosM3' + Store the cosine of operand 2 into operand 0 and the sine of + operand 2 into operand 1. + + The 'sin' and 'cos' built-in functions of C always use the mode + which corresponds to the C data type 'double' and the 'sinf' and + 'cosf' built-in function use the mode which corresponds to the C + data type 'float'. Targets that can calculate the sine and cosine + simultaneously can implement this pattern as opposed to + implementing individual 'sinM2' and 'cosM2' patterns. The 'sin' + and 'cos' built-in functions will then be expanded to the + 'sincosM3' pattern, with one of the output values left unused. + +'expM2' + Store the exponential of operand 1 into operand 0. + + The 'exp' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'expf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'logM2' + Store the natural logarithm of operand 1 into operand 0. + + The 'log' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'logf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'powM3' + Store the value of operand 1 raised to the exponent operand 2 into + operand 0. + + The 'pow' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'powf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'atan2M3' + Store the arc tangent (inverse tangent) of operand 1 divided by + operand 2 into operand 0, using the signs of both arguments to + determine the quadrant of the result. + + The 'atan2' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'atan2f' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'floorM2' + Store the largest integral value not greater than argument. + + The 'floor' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'floorf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'btruncM2' + Store the argument rounded to integer towards zero. + + The 'trunc' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'truncf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'roundM2' + Store the argument rounded to integer away from zero. + + The 'round' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'roundf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'ceilM2' + Store the argument rounded to integer away from zero. + + The 'ceil' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'ceilf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'nearbyintM2' + Store the argument rounded according to the default rounding mode + + The 'nearbyint' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'nearbyintf' + built-in function uses the mode which corresponds to the C data + type 'float'. + +'rintM2' + Store the argument rounded according to the default rounding mode + and raise the inexact exception when the result differs in value + from the argument + + The 'rint' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'rintf' built-in + function uses the mode which corresponds to the C data type + 'float'. + +'lrintMN2' + Convert operand 1 (valid for floating point mode M) to fixed point + mode N as a signed number according to the current rounding mode + and store in operand 0 (which has mode N). + +'lroundMN2' + Convert operand 1 (valid for floating point mode M) to fixed point + mode N as a signed number rounding to nearest and away from zero + and store in operand 0 (which has mode N). + +'lfloorMN2' + Convert operand 1 (valid for floating point mode M) to fixed point + mode N as a signed number rounding down and store in operand 0 + (which has mode N). + +'lceilMN2' + Convert operand 1 (valid for floating point mode M) to fixed point + mode N as a signed number rounding up and store in operand 0 (which + has mode N). + +'copysignM3' + Store a value with the magnitude of operand 1 and the sign of + operand 2 into operand 0. + + The 'copysign' built-in function of C always uses the mode which + corresponds to the C data type 'double' and the 'copysignf' + built-in function uses the mode which corresponds to the C data + type 'float'. + +'ffsM2' + Store into operand 0 one plus the index of the least significant + 1-bit of operand 1. If operand 1 is zero, store zero. M is the + mode of operand 0; operand 1's mode is specified by the instruction + pattern, and the compiler will convert the operand to that mode + before generating the instruction. + + The 'ffs' built-in function of C always uses the mode which + corresponds to the C data type 'int'. + +'clzM2' + Store into operand 0 the number of leading 0-bits in X, starting at + the most significant bit position. If X is 0, the + 'CLZ_DEFINED_VALUE_AT_ZERO' (*note Misc::) macro defines if the + result is undefined or has a useful value. M is the mode of + operand 0; operand 1's mode is specified by the instruction + pattern, and the compiler will convert the operand to that mode + before generating the instruction. + +'ctzM2' + Store into operand 0 the number of trailing 0-bits in X, starting + at the least significant bit position. If X is 0, the + 'CTZ_DEFINED_VALUE_AT_ZERO' (*note Misc::) macro defines if the + result is undefined or has a useful value. M is the mode of + operand 0; operand 1's mode is specified by the instruction + pattern, and the compiler will convert the operand to that mode + before generating the instruction. + +'popcountM2' + Store into operand 0 the number of 1-bits in X. M is the mode of + operand 0; operand 1's mode is specified by the instruction + pattern, and the compiler will convert the operand to that mode + before generating the instruction. + +'parityM2' + Store into operand 0 the parity of X, i.e. the number of 1-bits in + X modulo 2. M is the mode of operand 0; operand 1's mode is + specified by the instruction pattern, and the compiler will convert + the operand to that mode before generating the instruction. + +'one_cmplM2' + Store the bitwise-complement of operand 1 into operand 0. + +'movmemM' + Block move instruction. The destination and source blocks of + memory are the first two operands, and both are 'mem:BLK's with an + address in mode 'Pmode'. + + The number of bytes to move is the third operand, in mode M. + Usually, you specify 'Pmode' for M. However, if you can generate + better code knowing the range of valid lengths is smaller than + those representable in a full Pmode pointer, you should provide a + pattern with a mode corresponding to the range of values you can + handle efficiently (e.g., 'QImode' for values in the range 0-127; + note we avoid numbers that appear negative) and also a pattern with + 'Pmode'. + + The fourth operand is the known shared alignment of the source and + destination, in the form of a 'const_int' rtx. Thus, if the + compiler knows that both source and destination are word-aligned, + it may provide the value 4 for this operand. + + Optional operands 5 and 6 specify expected alignment and size of + block respectively. The expected alignment differs from alignment + in operand 4 in a way that the blocks are not required to be + aligned according to it in all cases. This expected alignment is + also in bytes, just like operand 4. Expected size, when unknown, + is set to '(const_int -1)'. + + Descriptions of multiple 'movmemM' patterns can only be beneficial + if the patterns for smaller modes have fewer restrictions on their + first, second and fourth operands. Note that the mode M in + 'movmemM' does not impose any restriction on the mode of + individually moved data units in the block. + + These patterns need not give special consideration to the + possibility that the source and destination strings might overlap. + +'movstr' + String copy instruction, with 'stpcpy' semantics. Operand 0 is an + output operand in mode 'Pmode'. The addresses of the destination + and source strings are operands 1 and 2, and both are 'mem:BLK's + with addresses in mode 'Pmode'. The execution of the expansion of + this pattern should store in operand 0 the address in which the + 'NUL' terminator was stored in the destination string. + + This patern has also several optional operands that are same as in + 'setmem'. + +'setmemM' + Block set instruction. The destination string is the first + operand, given as a 'mem:BLK' whose address is in mode 'Pmode'. + The number of bytes to set is the second operand, in mode M. The + value to initialize the memory with is the third operand. Targets + that only support the clearing of memory should reject any value + that is not the constant 0. See 'movmemM' for a discussion of the + choice of mode. + + The fourth operand is the known alignment of the destination, in + the form of a 'const_int' rtx. Thus, if the compiler knows that + the destination is word-aligned, it may provide the value 4 for + this operand. + + Optional operands 5 and 6 specify expected alignment and size of + block respectively. The expected alignment differs from alignment + in operand 4 in a way that the blocks are not required to be + aligned according to it in all cases. This expected alignment is + also in bytes, just like operand 4. Expected size, when unknown, + is set to '(const_int -1)'. Operand 7 is the minimal size of the + block and operand 8 is the maximal size of the block (NULL if it + can not be represented as CONST_INT). Operand 9 is the probable + maximal size (i.e. we can not rely on it for correctness, but it + can be used for choosing proper code sequence for a given size). + + The use for multiple 'setmemM' is as for 'movmemM'. + +'cmpstrnM' + String compare instruction, with five operands. Operand 0 is the + output; it has mode M. The remaining four operands are like the + operands of 'movmemM'. The two memory blocks specified are + compared byte by byte in lexicographic order starting at the + beginning of each string. The instruction is not allowed to + prefetch more than one byte at a time since either string may end + in the first byte and reading past that may access an invalid page + or segment and cause a fault. The comparison terminates early if + the fetched bytes are different or if they are equal to zero. The + effect of the instruction is to store a value in operand 0 whose + sign indicates the result of the comparison. + +'cmpstrM' + String compare instruction, without known maximum length. Operand + 0 is the output; it has mode M. The second and third operand are + the blocks of memory to be compared; both are 'mem:BLK' with an + address in mode 'Pmode'. + + The fourth operand is the known shared alignment of the source and + destination, in the form of a 'const_int' rtx. Thus, if the + compiler knows that both source and destination are word-aligned, + it may provide the value 4 for this operand. + + The two memory blocks specified are compared byte by byte in + lexicographic order starting at the beginning of each string. The + instruction is not allowed to prefetch more than one byte at a time + since either string may end in the first byte and reading past that + may access an invalid page or segment and cause a fault. The + comparison will terminate when the fetched bytes are different or + if they are equal to zero. The effect of the instruction is to + store a value in operand 0 whose sign indicates the result of the + comparison. + +'cmpmemM' + Block compare instruction, with five operands like the operands of + 'cmpstrM'. The two memory blocks specified are compared byte by + byte in lexicographic order starting at the beginning of each + block. Unlike 'cmpstrM' the instruction can prefetch any bytes in + the two memory blocks. Also unlike 'cmpstrM' the comparison will + not stop if both bytes are zero. The effect of the instruction is + to store a value in operand 0 whose sign indicates the result of + the comparison. + +'strlenM' + Compute the length of a string, with three operands. Operand 0 is + the result (of mode M), operand 1 is a 'mem' referring to the first + character of the string, operand 2 is the character to search for + (normally zero), and operand 3 is a constant describing the known + alignment of the beginning of the string. + +'floatMN2' + Convert signed integer operand 1 (valid for fixed point mode M) to + floating point mode N and store in operand 0 (which has mode N). + +'floatunsMN2' + Convert unsigned integer operand 1 (valid for fixed point mode M) + to floating point mode N and store in operand 0 (which has mode N). + +'fixMN2' + Convert operand 1 (valid for floating point mode M) to fixed point + mode N as a signed number and store in operand 0 (which has mode + N). This instruction's result is defined only when the value of + operand 1 is an integer. + + If the machine description defines this pattern, it also needs to + define the 'ftrunc' pattern. + +'fixunsMN2' + Convert operand 1 (valid for floating point mode M) to fixed point + mode N as an unsigned number and store in operand 0 (which has mode + N). This instruction's result is defined only when the value of + operand 1 is an integer. + +'ftruncM2' + Convert operand 1 (valid for floating point mode M) to an integer + value, still represented in floating point mode M, and store it in + operand 0 (valid for floating point mode M). + +'fix_truncMN2' + Like 'fixMN2' but works for any floating point value of mode M by + converting the value to an integer. + +'fixuns_truncMN2' + Like 'fixunsMN2' but works for any floating point value of mode M + by converting the value to an integer. + +'truncMN2' + Truncate operand 1 (valid for mode M) to mode N and store in + operand 0 (which has mode N). Both modes must be fixed point or + both floating point. + +'extendMN2' + Sign-extend operand 1 (valid for mode M) to mode N and store in + operand 0 (which has mode N). Both modes must be fixed point or + both floating point. + +'zero_extendMN2' + Zero-extend operand 1 (valid for mode M) to mode N and store in + operand 0 (which has mode N). Both modes must be fixed point. + +'fractMN2' + Convert operand 1 of mode M to mode N and store in operand 0 (which + has mode N). Mode M and mode N could be fixed-point to + fixed-point, signed integer to fixed-point, fixed-point to signed + integer, floating-point to fixed-point, or fixed-point to + floating-point. When overflows or underflows happen, the results + are undefined. + +'satfractMN2' + Convert operand 1 of mode M to mode N and store in operand 0 (which + has mode N). Mode M and mode N could be fixed-point to + fixed-point, signed integer to fixed-point, or floating-point to + fixed-point. When overflows or underflows happen, the instruction + saturates the results to the maximum or the minimum. + +'fractunsMN2' + Convert operand 1 of mode M to mode N and store in operand 0 (which + has mode N). Mode M and mode N could be unsigned integer to + fixed-point, or fixed-point to unsigned integer. When overflows or + underflows happen, the results are undefined. + +'satfractunsMN2' + Convert unsigned integer operand 1 of mode M to fixed-point mode N + and store in operand 0 (which has mode N). When overflows or + underflows happen, the instruction saturates the results to the + maximum or the minimum. + +'extvM' + Extract a bit-field from register operand 1, sign-extend it, and + store it in operand 0. Operand 2 specifies the width of the field + in bits and operand 3 the starting bit, which counts from the most + significant bit if 'BITS_BIG_ENDIAN' is true and from the least + significant bit otherwise. + + Operands 0 and 1 both have mode M. Operands 2 and 3 have a + target-specific mode. + +'extvmisalignM' + Extract a bit-field from memory operand 1, sign extend it, and + store it in operand 0. Operand 2 specifies the width in bits and + operand 3 the starting bit. The starting bit is always somewhere + in the first byte of operand 1; it counts from the most significant + bit if 'BITS_BIG_ENDIAN' is true and from the least significant bit + otherwise. + + Operand 0 has mode M while operand 1 has 'BLK' mode. Operands 2 + and 3 have a target-specific mode. + + The instruction must not read beyond the last byte of the + bit-field. + +'extzvM' + Like 'extvM' except that the bit-field value is zero-extended. + +'extzvmisalignM' + Like 'extvmisalignM' except that the bit-field value is + zero-extended. + +'insvM' + Insert operand 3 into a bit-field of register operand 0. Operand 1 + specifies the width of the field in bits and operand 2 the starting + bit, which counts from the most significant bit if + 'BITS_BIG_ENDIAN' is true and from the least significant bit + otherwise. + + Operands 0 and 3 both have mode M. Operands 1 and 2 have a + target-specific mode. + +'insvmisalignM' + Insert operand 3 into a bit-field of memory operand 0. Operand 1 + specifies the width of the field in bits and operand 2 the starting + bit. The starting bit is always somewhere in the first byte of + operand 0; it counts from the most significant bit if + 'BITS_BIG_ENDIAN' is true and from the least significant bit + otherwise. + + Operand 3 has mode M while operand 0 has 'BLK' mode. Operands 1 + and 2 have a target-specific mode. + + The instruction must not read or write beyond the last byte of the + bit-field. + +'extv' + Extract a bit-field from operand 1 (a register or memory operand), + where operand 2 specifies the width in bits and operand 3 the + starting bit, and store it in operand 0. Operand 0 must have mode + 'word_mode'. Operand 1 may have mode 'byte_mode' or 'word_mode'; + often 'word_mode' is allowed only for registers. Operands 2 and 3 + must be valid for 'word_mode'. + + The RTL generation pass generates this instruction only with + constants for operands 2 and 3 and the constant is never zero for + operand 2. + + The bit-field value is sign-extended to a full word integer before + it is stored in operand 0. + + This pattern is deprecated; please use 'extvM' and 'extvmisalignM' + instead. + +'extzv' + Like 'extv' except that the bit-field value is zero-extended. + + This pattern is deprecated; please use 'extzvM' and + 'extzvmisalignM' instead. + +'insv' + Store operand 3 (which must be valid for 'word_mode') into a + bit-field in operand 0, where operand 1 specifies the width in bits + and operand 2 the starting bit. Operand 0 may have mode + 'byte_mode' or 'word_mode'; often 'word_mode' is allowed only for + registers. Operands 1 and 2 must be valid for 'word_mode'. + + The RTL generation pass generates this instruction only with + constants for operands 1 and 2 and the constant is never zero for + operand 1. + + This pattern is deprecated; please use 'insvM' and 'insvmisalignM' + instead. + +'movMODEcc' + Conditionally move operand 2 or operand 3 into operand 0 according + to the comparison in operand 1. If the comparison is true, operand + 2 is moved into operand 0, otherwise operand 3 is moved. + + The mode of the operands being compared need not be the same as the + operands being moved. Some machines, sparc64 for example, have + instructions that conditionally move an integer value based on the + floating point condition codes and vice versa. + + If the machine does not have conditional move instructions, do not + define these patterns. + +'addMODEcc' + Similar to 'movMODEcc' but for conditional addition. Conditionally + move operand 2 or (operands 2 + operand 3) into operand 0 according + to the comparison in operand 1. If the comparison is false, + operand 2 is moved into operand 0, otherwise (operand 2 + operand + 3) is moved. + +'cstoreMODE4' + Store zero or nonzero in operand 0 according to whether a + comparison is true. Operand 1 is a comparison operator. Operand 2 + and operand 3 are the first and second operand of the comparison, + respectively. You specify the mode that operand 0 must have when + you write the 'match_operand' expression. The compiler + automatically sees which mode you have used and supplies an operand + of that mode. + + The value stored for a true condition must have 1 as its low bit, + or else must be negative. Otherwise the instruction is not + suitable and you should omit it from the machine description. You + describe to the compiler exactly which value is stored by defining + the macro 'STORE_FLAG_VALUE' (*note Misc::). If a description + cannot be found that can be used for all the possible comparison + operators, you should pick one and use a 'define_expand' to map all + results onto the one you chose. + + These operations may 'FAIL', but should do so only in relatively + uncommon cases; if they would 'FAIL' for common cases involving + integer comparisons, it is best to restrict the predicates to not + allow these operands. Likewise if a given comparison operator will + always fail, independent of the operands (for floating-point modes, + the 'ordered_comparison_operator' predicate is often useful in this + case). + + If this pattern is omitted, the compiler will generate a + conditional branch--for example, it may copy a constant one to the + target and branching around an assignment of zero to the target--or + a libcall. If the predicate for operand 1 only rejects some + operators, it will also try reordering the operands and/or + inverting the result value (e.g. by an exclusive OR). These + possibilities could be cheaper or equivalent to the instructions + used for the 'cstoreMODE4' pattern followed by those required to + convert a positive result from 'STORE_FLAG_VALUE' to 1; in this + case, you can and should make operand 1's predicate reject some + operators in the 'cstoreMODE4' pattern, or remove the pattern + altogether from the machine description. + +'cbranchMODE4' + Conditional branch instruction combined with a compare instruction. + Operand 0 is a comparison operator. Operand 1 and operand 2 are + the first and second operands of the comparison, respectively. + Operand 3 is a 'label_ref' that refers to the label to jump to. + +'jump' + A jump inside a function; an unconditional branch. Operand 0 is + the 'label_ref' of the label to jump to. This pattern name is + mandatory on all machines. + +'call' + Subroutine call instruction returning no value. Operand 0 is the + function to call; operand 1 is the number of bytes of arguments + pushed as a 'const_int'; operand 2 is the number of registers used + as operands. + + On most machines, operand 2 is not actually stored into the RTL + pattern. It is supplied for the sake of some RISC machines which + need to put this information into the assembler code; they can put + it in the RTL instead of operand 1. + + Operand 0 should be a 'mem' RTX whose address is the address of the + function. Note, however, that this address can be a 'symbol_ref' + expression even if it would not be a legitimate memory address on + the target machine. If it is also not a valid argument for a call + instruction, the pattern for this operation should be a + 'define_expand' (*note Expander Definitions::) that places the + address into a register and uses that register in the call + instruction. + +'call_value' + Subroutine call instruction returning a value. Operand 0 is the + hard register in which the value is returned. There are three more + operands, the same as the three operands of the 'call' instruction + (but with numbers increased by one). + + Subroutines that return 'BLKmode' objects use the 'call' insn. + +'call_pop', 'call_value_pop' + Similar to 'call' and 'call_value', except used if defined and if + 'RETURN_POPS_ARGS' is nonzero. They should emit a 'parallel' that + contains both the function call and a 'set' to indicate the + adjustment made to the frame pointer. + + For machines where 'RETURN_POPS_ARGS' can be nonzero, the use of + these patterns increases the number of functions for which the + frame pointer can be eliminated, if desired. + +'untyped_call' + Subroutine call instruction returning a value of any type. Operand + 0 is the function to call; operand 1 is a memory location where the + result of calling the function is to be stored; operand 2 is a + 'parallel' expression where each element is a 'set' expression that + indicates the saving of a function return value into the result + block. + + This instruction pattern should be defined to support + '__builtin_apply' on machines where special instructions are needed + to call a subroutine with arbitrary arguments or to save the value + returned. This instruction pattern is required on machines that + have multiple registers that can hold a return value (i.e. + 'FUNCTION_VALUE_REGNO_P' is true for more than one register). + +'return' + Subroutine return instruction. This instruction pattern name + should be defined only if a single instruction can do all the work + of returning from a function. + + Like the 'movM' patterns, this pattern is also used after the RTL + generation phase. In this case it is to support machines where + multiple instructions are usually needed to return from a function, + but some class of functions only requires one instruction to + implement a return. Normally, the applicable functions are those + which do not need to save any registers or allocate stack space. + + It is valid for this pattern to expand to an instruction using + 'simple_return' if no epilogue is required. + +'simple_return' + Subroutine return instruction. This instruction pattern name + should be defined only if a single instruction can do all the work + of returning from a function on a path where no epilogue is + required. This pattern is very similar to the 'return' instruction + pattern, but it is emitted only by the shrink-wrapping optimization + on paths where the function prologue has not been executed, and a + function return should occur without any of the effects of the + epilogue. Additional uses may be introduced on paths where both + the prologue and the epilogue have executed. + + For such machines, the condition specified in this pattern should + only be true when 'reload_completed' is nonzero and the function's + epilogue would only be a single instruction. For machines with + register windows, the routine 'leaf_function_p' may be used to + determine if a register window push is required. + + Machines that have conditional return instructions should define + patterns such as + + (define_insn "" + [(set (pc) + (if_then_else (match_operator + 0 "comparison_operator" + [(cc0) (const_int 0)]) + (return) + (pc)))] + "CONDITION" + "...") + + where CONDITION would normally be the same condition specified on + the named 'return' pattern. + +'untyped_return' + Untyped subroutine return instruction. This instruction pattern + should be defined to support '__builtin_return' on machines where + special instructions are needed to return a value of any type. + + Operand 0 is a memory location where the result of calling a + function with '__builtin_apply' is stored; operand 1 is a + 'parallel' expression where each element is a 'set' expression that + indicates the restoring of a function return value from the result + block. + +'nop' + No-op instruction. This instruction pattern name should always be + defined to output a no-op in assembler code. '(const_int 0)' will + do as an RTL pattern. + +'indirect_jump' + An instruction to jump to an address which is operand zero. This + pattern name is mandatory on all machines. + +'casesi' + Instruction to jump through a dispatch table, including bounds + checking. This instruction takes five operands: + + 1. The index to dispatch on, which has mode 'SImode'. + + 2. The lower bound for indices in the table, an integer constant. + + 3. The total range of indices in the table--the largest index + minus the smallest one (both inclusive). + + 4. A label that precedes the table itself. + + 5. A label to jump to if the index has a value outside the + bounds. + + The table is an 'addr_vec' or 'addr_diff_vec' inside of a + 'jump_table_data'. The number of elements in the table is one plus + the difference between the upper bound and the lower bound. + +'tablejump' + Instruction to jump to a variable address. This is a low-level + capability which can be used to implement a dispatch table when + there is no 'casesi' pattern. + + This pattern requires two operands: the address or offset, and a + label which should immediately precede the jump table. If the + macro 'CASE_VECTOR_PC_RELATIVE' evaluates to a nonzero value then + the first operand is an offset which counts from the address of the + table; otherwise, it is an absolute address to jump to. In either + case, the first operand has mode 'Pmode'. + + The 'tablejump' insn is always the last insn before the jump table + it uses. Its assembler code normally has no need to use the second + operand, but you should incorporate it in the RTL pattern so that + the jump optimizer will not delete the table as unreachable code. + +'decrement_and_branch_until_zero' + Conditional branch instruction that decrements a register and jumps + if the register is nonzero. Operand 0 is the register to decrement + and test; operand 1 is the label to jump to if the register is + nonzero. *Note Looping Patterns::. + + This optional instruction pattern is only used by the combiner, + typically for loops reversed by the loop optimizer when strength + reduction is enabled. + +'doloop_end' + Conditional branch instruction that decrements a register and jumps + if the register is nonzero. Operand 0 is the register to decrement + and test; operand 1 is the label to jump to if the register is + nonzero. *Note Looping Patterns::. + + This optional instruction pattern should be defined for machines + with low-overhead looping instructions as the loop optimizer will + try to modify suitable loops to utilize it. The target hook + 'TARGET_CAN_USE_DOLOOP_P' controls the conditions under which + low-overhead loops can be used. + +'doloop_begin' + Companion instruction to 'doloop_end' required for machines that + need to perform some initialization, such as loading a special + counter register. Operand 1 is the associated 'doloop_end' pattern + and operand 0 is the register that it decrements. + + If initialization insns do not always need to be emitted, use a + 'define_expand' (*note Expander Definitions::) and make it fail. + +'canonicalize_funcptr_for_compare' + Canonicalize the function pointer in operand 1 and store the result + into operand 0. + + Operand 0 is always a 'reg' and has mode 'Pmode'; operand 1 may be + a 'reg', 'mem', 'symbol_ref', 'const_int', etc and also has mode + 'Pmode'. + + Canonicalization of a function pointer usually involves computing + the address of the function which would be called if the function + pointer were used in an indirect call. + + Only define this pattern if function pointers on the target machine + can have different values but still call the same function when + used in an indirect call. + +'save_stack_block' +'save_stack_function' +'save_stack_nonlocal' +'restore_stack_block' +'restore_stack_function' +'restore_stack_nonlocal' + Most machines save and restore the stack pointer by copying it to + or from an object of mode 'Pmode'. Do not define these patterns on + such machines. + + Some machines require special handling for stack pointer saves and + restores. On those machines, define the patterns corresponding to + the non-standard cases by using a 'define_expand' (*note Expander + Definitions::) that produces the required insns. The three types + of saves and restores are: + + 1. 'save_stack_block' saves the stack pointer at the start of a + block that allocates a variable-sized object, and + 'restore_stack_block' restores the stack pointer when the + block is exited. + + 2. 'save_stack_function' and 'restore_stack_function' do a + similar job for the outermost block of a function and are used + when the function allocates variable-sized objects or calls + 'alloca'. Only the epilogue uses the restored stack pointer, + allowing a simpler save or restore sequence on some machines. + + 3. 'save_stack_nonlocal' is used in functions that contain labels + branched to by nested functions. It saves the stack pointer + in such a way that the inner function can use + 'restore_stack_nonlocal' to restore the stack pointer. The + compiler generates code to restore the frame and argument + pointer registers, but some machines require saving and + restoring additional data such as register window information + or stack backchains. Place insns in these patterns to save + and restore any such required data. + + When saving the stack pointer, operand 0 is the save area and + operand 1 is the stack pointer. The mode used to allocate the save + area defaults to 'Pmode' but you can override that choice by + defining the 'STACK_SAVEAREA_MODE' macro (*note Storage Layout::). + You must specify an integral mode, or 'VOIDmode' if no save area is + needed for a particular type of save (either because no save is + needed or because a machine-specific save area can be used). + Operand 0 is the stack pointer and operand 1 is the save area for + restore operations. If 'save_stack_block' is defined, operand 0 + must not be 'VOIDmode' since these saves can be arbitrarily nested. + + A save area is a 'mem' that is at a constant offset from + 'virtual_stack_vars_rtx' when the stack pointer is saved for use by + nonlocal gotos and a 'reg' in the other two cases. + +'allocate_stack' + Subtract (or add if 'STACK_GROWS_DOWNWARD' is undefined) operand 1 + from the stack pointer to create space for dynamically allocated + data. + + Store the resultant pointer to this space into operand 0. If you + are allocating space from the main stack, do this by emitting a + move insn to copy 'virtual_stack_dynamic_rtx' to operand 0. If you + are allocating the space elsewhere, generate code to copy the + location of the space to operand 0. In the latter case, you must + ensure this space gets freed when the corresponding space on the + main stack is free. + + Do not define this pattern if all that must be done is the + subtraction. Some machines require other operations such as stack + probes or maintaining the back chain. Define this pattern to emit + those operations in addition to updating the stack pointer. + +'check_stack' + If stack checking (*note Stack Checking::) cannot be done on your + system by probing the stack, define this pattern to perform the + needed check and signal an error if the stack has overflowed. The + single operand is the address in the stack farthest from the + current stack pointer that you need to validate. Normally, on + platforms where this pattern is needed, you would obtain the stack + limit from a global or thread-specific variable or register. + +'probe_stack_address' + If stack checking (*note Stack Checking::) can be done on your + system by probing the stack but without the need to actually access + it, define this pattern and signal an error if the stack has + overflowed. The single operand is the memory address in the stack + that needs to be probed. + +'probe_stack' + If stack checking (*note Stack Checking::) can be done on your + system by probing the stack but doing it with a "store zero" + instruction is not valid or optimal, define this pattern to do the + probing differently and signal an error if the stack has + overflowed. The single operand is the memory reference in the + stack that needs to be probed. + +'nonlocal_goto' + Emit code to generate a non-local goto, e.g., a jump from one + function to a label in an outer function. This pattern has four + arguments, each representing a value to be used in the jump. The + first argument is to be loaded into the frame pointer, the second + is the address to branch to (code to dispatch to the actual label), + the third is the address of a location where the stack is saved, + and the last is the address of the label, to be placed in the + location for the incoming static chain. + + On most machines you need not define this pattern, since GCC will + already generate the correct code, which is to load the frame + pointer and static chain, restore the stack (using the + 'restore_stack_nonlocal' pattern, if defined), and jump indirectly + to the dispatcher. You need only define this pattern if this code + will not work on your machine. + +'nonlocal_goto_receiver' + This pattern, if defined, contains code needed at the target of a + nonlocal goto after the code already generated by GCC. You will + not normally need to define this pattern. A typical reason why you + might need this pattern is if some value, such as a pointer to a + global table, must be restored when the frame pointer is restored. + Note that a nonlocal goto only occurs within a unit-of-translation, + so a global table pointer that is shared by all functions of a + given module need not be restored. There are no arguments. + +'exception_receiver' + This pattern, if defined, contains code needed at the site of an + exception handler that isn't needed at the site of a nonlocal goto. + You will not normally need to define this pattern. A typical + reason why you might need this pattern is if some value, such as a + pointer to a global table, must be restored after control flow is + branched to the handler of an exception. There are no arguments. + +'builtin_setjmp_setup' + This pattern, if defined, contains additional code needed to + initialize the 'jmp_buf'. You will not normally need to define + this pattern. A typical reason why you might need this pattern is + if some value, such as a pointer to a global table, must be + restored. Though it is preferred that the pointer value be + recalculated if possible (given the address of a label for + instance). The single argument is a pointer to the 'jmp_buf'. + Note that the buffer is five words long and that the first three + are normally used by the generic mechanism. + +'builtin_setjmp_receiver' + This pattern, if defined, contains code needed at the site of a + built-in setjmp that isn't needed at the site of a nonlocal goto. + You will not normally need to define this pattern. A typical + reason why you might need this pattern is if some value, such as a + pointer to a global table, must be restored. It takes one + argument, which is the label to which builtin_longjmp transferred + control; this pattern may be emitted at a small offset from that + label. + +'builtin_longjmp' + This pattern, if defined, performs the entire action of the + longjmp. You will not normally need to define this pattern unless + you also define 'builtin_setjmp_setup'. The single argument is a + pointer to the 'jmp_buf'. + +'eh_return' + This pattern, if defined, affects the way '__builtin_eh_return', + and thence the call frame exception handling library routines, are + built. It is intended to handle non-trivial actions needed along + the abnormal return path. + + The address of the exception handler to which the function should + return is passed as operand to this pattern. It will normally need + to copied by the pattern to some special register or memory + location. If the pattern needs to determine the location of the + target call frame in order to do so, it may use + 'EH_RETURN_STACKADJ_RTX', if defined; it will have already been + assigned. + + If this pattern is not defined, the default action will be to + simply copy the return address to 'EH_RETURN_HANDLER_RTX'. Either + that macro or this pattern needs to be defined if call frame + exception handling is to be used. + +'prologue' + This pattern, if defined, emits RTL for entry to a function. The + function entry is responsible for setting up the stack frame, + initializing the frame pointer register, saving callee saved + registers, etc. + + Using a prologue pattern is generally preferred over defining + 'TARGET_ASM_FUNCTION_PROLOGUE' to emit assembly code for the + prologue. + + The 'prologue' pattern is particularly useful for targets which + perform instruction scheduling. + +'window_save' + This pattern, if defined, emits RTL for a register window save. It + should be defined if the target machine has register windows but + the window events are decoupled from calls to subroutines. The + canonical example is the SPARC architecture. + +'epilogue' + This pattern emits RTL for exit from a function. The function exit + is responsible for deallocating the stack frame, restoring callee + saved registers and emitting the return instruction. + + Using an epilogue pattern is generally preferred over defining + 'TARGET_ASM_FUNCTION_EPILOGUE' to emit assembly code for the + epilogue. + + The 'epilogue' pattern is particularly useful for targets which + perform instruction scheduling or which have delay slots for their + return instruction. + +'sibcall_epilogue' + This pattern, if defined, emits RTL for exit from a function + without the final branch back to the calling function. This + pattern will be emitted before any sibling call (aka tail call) + sites. + + The 'sibcall_epilogue' pattern must not clobber any arguments used + for parameter passing or any stack slots for arguments passed to + the current function. + +'trap' + This pattern, if defined, signals an error, typically by causing + some kind of signal to be raised. Among other places, it is used + by the Java front end to signal 'invalid array index' exceptions. + +'ctrapMM4' + Conditional trap instruction. Operand 0 is a piece of RTL which + performs a comparison, and operands 1 and 2 are the arms of the + comparison. Operand 3 is the trap code, an integer. + + A typical 'ctrap' pattern looks like + + (define_insn "ctrapsi4" + [(trap_if (match_operator 0 "trap_operator" + [(match_operand 1 "register_operand") + (match_operand 2 "immediate_operand")]) + (match_operand 3 "const_int_operand" "i"))] + "" + "...") + +'prefetch' + + This pattern, if defined, emits code for a non-faulting data + prefetch instruction. Operand 0 is the address of the memory to + prefetch. Operand 1 is a constant 1 if the prefetch is preparing + for a write to the memory address, or a constant 0 otherwise. + Operand 2 is the expected degree of temporal locality of the data + and is a value between 0 and 3, inclusive; 0 means that the data + has no temporal locality, so it need not be left in the cache after + the access; 3 means that the data has a high degree of temporal + locality and should be left in all levels of cache possible; 1 and + 2 mean, respectively, a low or moderate degree of temporal + locality. + + Targets that do not support write prefetches or locality hints can + ignore the values of operands 1 and 2. + +'blockage' + + This pattern defines a pseudo insn that prevents the instruction + scheduler and other passes from moving instructions and using + register equivalences across the boundary defined by the blockage + insn. This needs to be an UNSPEC_VOLATILE pattern or a volatile + ASM. + +'memory_barrier' + + If the target memory model is not fully synchronous, then this + pattern should be defined to an instruction that orders both loads + and stores before the instruction with respect to loads and stores + after the instruction. This pattern has no operands. + +'sync_compare_and_swapMODE' + + This pattern, if defined, emits code for an atomic compare-and-swap + operation. Operand 1 is the memory on which the atomic operation + is performed. Operand 2 is the "old" value to be compared against + the current contents of the memory location. Operand 3 is the + "new" value to store in the memory if the compare succeeds. + Operand 0 is the result of the operation; it should contain the + contents of the memory before the operation. If the compare + succeeds, this should obviously be a copy of operand 2. + + This pattern must show that both operand 0 and operand 1 are + modified. + + This pattern must issue any memory barrier instructions such that + all memory operations before the atomic operation occur before the + atomic operation and all memory operations after the atomic + operation occur after the atomic operation. + + For targets where the success or failure of the compare-and-swap + operation is available via the status flags, it is possible to + avoid a separate compare operation and issue the subsequent branch + or store-flag operation immediately after the compare-and-swap. To + this end, GCC will look for a 'MODE_CC' set in the output of + 'sync_compare_and_swapMODE'; if the machine description includes + such a set, the target should also define special 'cbranchcc4' + and/or 'cstorecc4' instructions. GCC will then be able to take the + destination of the 'MODE_CC' set and pass it to the 'cbranchcc4' or + 'cstorecc4' pattern as the first operand of the comparison (the + second will be '(const_int 0)'). + + For targets where the operating system may provide support for this + operation via library calls, the 'sync_compare_and_swap_optab' may + be initialized to a function with the same interface as the + '__sync_val_compare_and_swap_N' built-in. If the entire set of + __SYNC builtins are supported via library calls, the target can + initialize all of the optabs at once with 'init_sync_libfuncs'. + For the purposes of C++11 'std::atomic::is_lock_free', it is + assumed that these library calls do _not_ use any kind of + interruptable locking. + +'sync_addMODE', 'sync_subMODE' +'sync_iorMODE', 'sync_andMODE' +'sync_xorMODE', 'sync_nandMODE' + + These patterns emit code for an atomic operation on memory. + Operand 0 is the memory on which the atomic operation is performed. + Operand 1 is the second operand to the binary operator. + + This pattern must issue any memory barrier instructions such that + all memory operations before the atomic operation occur before the + atomic operation and all memory operations after the atomic + operation occur after the atomic operation. + + If these patterns are not defined, the operation will be + constructed from a compare-and-swap operation, if defined. + +'sync_old_addMODE', 'sync_old_subMODE' +'sync_old_iorMODE', 'sync_old_andMODE' +'sync_old_xorMODE', 'sync_old_nandMODE' + + These patterns emit code for an atomic operation on memory, and + return the value that the memory contained before the operation. + Operand 0 is the result value, operand 1 is the memory on which the + atomic operation is performed, and operand 2 is the second operand + to the binary operator. + + This pattern must issue any memory barrier instructions such that + all memory operations before the atomic operation occur before the + atomic operation and all memory operations after the atomic + operation occur after the atomic operation. + + If these patterns are not defined, the operation will be + constructed from a compare-and-swap operation, if defined. + +'sync_new_addMODE', 'sync_new_subMODE' +'sync_new_iorMODE', 'sync_new_andMODE' +'sync_new_xorMODE', 'sync_new_nandMODE' + + These patterns are like their 'sync_old_OP' counterparts, except + that they return the value that exists in the memory location after + the operation, rather than before the operation. + +'sync_lock_test_and_setMODE' + + This pattern takes two forms, based on the capabilities of the + target. In either case, operand 0 is the result of the operand, + operand 1 is the memory on which the atomic operation is performed, + and operand 2 is the value to set in the lock. + + In the ideal case, this operation is an atomic exchange operation, + in which the previous value in memory operand is copied into the + result operand, and the value operand is stored in the memory + operand. + + For less capable targets, any value operand that is not the + constant 1 should be rejected with 'FAIL'. In this case the target + may use an atomic test-and-set bit operation. The result operand + should contain 1 if the bit was previously set and 0 if the bit was + previously clear. The true contents of the memory operand are + implementation defined. + + This pattern must issue any memory barrier instructions such that + the pattern as a whole acts as an acquire barrier, that is all + memory operations after the pattern do not occur until the lock is + acquired. + + If this pattern is not defined, the operation will be constructed + from a compare-and-swap operation, if defined. + +'sync_lock_releaseMODE' + + This pattern, if defined, releases a lock set by + 'sync_lock_test_and_setMODE'. Operand 0 is the memory that + contains the lock; operand 1 is the value to store in the lock. + + If the target doesn't implement full semantics for + 'sync_lock_test_and_setMODE', any value operand which is not the + constant 0 should be rejected with 'FAIL', and the true contents of + the memory operand are implementation defined. + + This pattern must issue any memory barrier instructions such that + the pattern as a whole acts as a release barrier, that is the lock + is released only after all previous memory operations have + completed. + + If this pattern is not defined, then a 'memory_barrier' pattern + will be emitted, followed by a store of the value to the memory + operand. + +'atomic_compare_and_swapMODE' + This pattern, if defined, emits code for an atomic compare-and-swap + operation with memory model semantics. Operand 2 is the memory on + which the atomic operation is performed. Operand 0 is an output + operand which is set to true or false based on whether the + operation succeeded. Operand 1 is an output operand which is set + to the contents of the memory before the operation was attempted. + Operand 3 is the value that is expected to be in memory. Operand 4 + is the value to put in memory if the expected value is found there. + Operand 5 is set to 1 if this compare and swap is to be treated as + a weak operation. Operand 6 is the memory model to be used if the + operation is a success. Operand 7 is the memory model to be used + if the operation fails. + + If memory referred to in operand 2 contains the value in operand 3, + then operand 4 is stored in memory pointed to by operand 2 and + fencing based on the memory model in operand 6 is issued. + + If memory referred to in operand 2 does not contain the value in + operand 3, then fencing based on the memory model in operand 7 is + issued. + + If a target does not support weak compare-and-swap operations, or + the port elects not to implement weak operations, the argument in + operand 5 can be ignored. Note a strong implementation must be + provided. + + If this pattern is not provided, the '__atomic_compare_exchange' + built-in functions will utilize the legacy 'sync_compare_and_swap' + pattern with an '__ATOMIC_SEQ_CST' memory model. + +'atomic_loadMODE' + This pattern implements an atomic load operation with memory model + semantics. Operand 1 is the memory address being loaded from. + Operand 0 is the result of the load. Operand 2 is the memory model + to be used for the load operation. + + If not present, the '__atomic_load' built-in function will either + resort to a normal load with memory barriers, or a compare-and-swap + operation if a normal load would not be atomic. + +'atomic_storeMODE' + This pattern implements an atomic store operation with memory model + semantics. Operand 0 is the memory address being stored to. + Operand 1 is the value to be written. Operand 2 is the memory + model to be used for the operation. + + If not present, the '__atomic_store' built-in function will attempt + to perform a normal store and surround it with any required memory + fences. If the store would not be atomic, then an + '__atomic_exchange' is attempted with the result being ignored. + +'atomic_exchangeMODE' + This pattern implements an atomic exchange operation with memory + model semantics. Operand 1 is the memory location the operation is + performed on. Operand 0 is an output operand which is set to the + original value contained in the memory pointed to by operand 1. + Operand 2 is the value to be stored. Operand 3 is the memory model + to be used. + + If this pattern is not present, the built-in function + '__atomic_exchange' will attempt to preform the operation with a + compare and swap loop. + +'atomic_addMODE', 'atomic_subMODE' +'atomic_orMODE', 'atomic_andMODE' +'atomic_xorMODE', 'atomic_nandMODE' + + These patterns emit code for an atomic operation on memory with + memory model semantics. Operand 0 is the memory on which the + atomic operation is performed. Operand 1 is the second operand to + the binary operator. Operand 2 is the memory model to be used by + the operation. + + If these patterns are not defined, attempts will be made to use + legacy 'sync' patterns, or equivalent patterns which return a + result. If none of these are available a compare-and-swap loop + will be used. + +'atomic_fetch_addMODE', 'atomic_fetch_subMODE' +'atomic_fetch_orMODE', 'atomic_fetch_andMODE' +'atomic_fetch_xorMODE', 'atomic_fetch_nandMODE' + + These patterns emit code for an atomic operation on memory with + memory model semantics, and return the original value. Operand 0 + is an output operand which contains the value of the memory + location before the operation was performed. Operand 1 is the + memory on which the atomic operation is performed. Operand 2 is + the second operand to the binary operator. Operand 3 is the memory + model to be used by the operation. + + If these patterns are not defined, attempts will be made to use + legacy 'sync' patterns. If none of these are available a + compare-and-swap loop will be used. + +'atomic_add_fetchMODE', 'atomic_sub_fetchMODE' +'atomic_or_fetchMODE', 'atomic_and_fetchMODE' +'atomic_xor_fetchMODE', 'atomic_nand_fetchMODE' + + These patterns emit code for an atomic operation on memory with + memory model semantics and return the result after the operation is + performed. Operand 0 is an output operand which contains the value + after the operation. Operand 1 is the memory on which the atomic + operation is performed. Operand 2 is the second operand to the + binary operator. Operand 3 is the memory model to be used by the + operation. + + If these patterns are not defined, attempts will be made to use + legacy 'sync' patterns, or equivalent patterns which return the + result before the operation followed by the arithmetic operation + required to produce the result. If none of these are available a + compare-and-swap loop will be used. + +'atomic_test_and_set' + + This pattern emits code for '__builtin_atomic_test_and_set'. + Operand 0 is an output operand which is set to true if the previous + previous contents of the byte was "set", and false otherwise. + Operand 1 is the 'QImode' memory to be modified. Operand 2 is the + memory model to be used. + + The specific value that defines "set" is implementation defined, + and is normally based on what is performed by the native atomic + test and set instruction. + +'mem_thread_fenceMODE' + This pattern emits code required to implement a thread fence with + memory model semantics. Operand 0 is the memory model to be used. + + If this pattern is not specified, all memory models except + '__ATOMIC_RELAXED' will result in issuing a 'sync_synchronize' + barrier pattern. + +'mem_signal_fenceMODE' + This pattern emits code required to implement a signal fence with + memory model semantics. Operand 0 is the memory model to be used. + + This pattern should impact the compiler optimizers the same way + that mem_signal_fence does, but it does not need to issue any + barrier instructions. + + If this pattern is not specified, all memory models except + '__ATOMIC_RELAXED' will result in issuing a 'sync_synchronize' + barrier pattern. + +'get_thread_pointerMODE' +'set_thread_pointerMODE' + These patterns emit code that reads/sets the TLS thread pointer. + Currently, these are only needed if the target needs to support the + '__builtin_thread_pointer' and '__builtin_set_thread_pointer' + builtins. + + The get/set patterns have a single output/input operand + respectively, with MODE intended to be 'Pmode'. + +'stack_protect_set' + + This pattern, if defined, moves a 'ptr_mode' value from the memory + in operand 1 to the memory in operand 0 without leaving the value + in a register afterward. This is to avoid leaking the value some + place that an attacker might use to rewrite the stack guard slot + after having clobbered it. + + If this pattern is not defined, then a plain move pattern is + generated. + +'stack_protect_test' + + This pattern, if defined, compares a 'ptr_mode' value from the + memory in operand 1 with the memory in operand 0 without leaving + the value in a register afterward and branches to operand 2 if the + values were equal. + + If this pattern is not defined, then a plain compare pattern and + conditional branch pattern is used. + +'clear_cache' + + This pattern, if defined, flushes the instruction cache for a + region of memory. The region is bounded to by the Pmode pointers + in operand 0 inclusive and operand 1 exclusive. + + If this pattern is not defined, a call to the library function + '__clear_cache' is used. + + +File: gccint.info, Node: Pattern Ordering, Next: Dependent Patterns, Prev: Standard Names, Up: Machine Desc + +16.10 When the Order of Patterns Matters +======================================== + +Sometimes an insn can match more than one instruction pattern. Then the +pattern that appears first in the machine description is the one used. +Therefore, more specific patterns (patterns that will match fewer +things) and faster instructions (those that will produce better code +when they do match) should usually go first in the description. + + In some cases the effect of ordering the patterns can be used to hide a +pattern when it is not valid. For example, the 68000 has an instruction +for converting a fullword to floating point and another for converting a +byte to floating point. An instruction converting an integer to +floating point could match either one. We put the pattern to convert +the fullword first to make sure that one will be used rather than the +other. (Otherwise a large integer might be generated as a single-byte +immediate quantity, which would not work.) Instead of using this +pattern ordering it would be possible to make the pattern for +convert-a-byte smart enough to deal properly with any constant value. + + +File: gccint.info, Node: Dependent Patterns, Next: Jump Patterns, Prev: Pattern Ordering, Up: Machine Desc + +16.11 Interdependence of Patterns +================================= + +In some cases machines support instructions identical except for the +machine mode of one or more operands. For example, there may be +"sign-extend halfword" and "sign-extend byte" instructions whose +patterns are + + (set (match_operand:SI 0 ...) + (extend:SI (match_operand:HI 1 ...))) + + (set (match_operand:SI 0 ...) + (extend:SI (match_operand:QI 1 ...))) + +Constant integers do not specify a machine mode, so an instruction to +extend a constant value could match either pattern. The pattern it +actually will match is the one that appears first in the file. For +correct results, this must be the one for the widest possible mode +('HImode', here). If the pattern matches the 'QImode' instruction, the +results will be incorrect if the constant value does not actually fit +that mode. + + Such instructions to extend constants are rarely generated because they +are optimized away, but they do occasionally happen in nonoptimized +compilations. + + If a constraint in a pattern allows a constant, the reload pass may +replace a register with a constant permitted by the constraint in some +cases. Similarly for memory references. Because of this substitution, +you should not provide separate patterns for increment and decrement +instructions. Instead, they should be generated from the same pattern +that supports register-register add insns by examining the operands and +generating the appropriate machine instruction. + + +File: gccint.info, Node: Jump Patterns, Next: Looping Patterns, Prev: Dependent Patterns, Up: Machine Desc + +16.12 Defining Jump Instruction Patterns +======================================== + +GCC does not assume anything about how the machine realizes jumps. The +machine description should define a single pattern, usually a +'define_expand', which expands to all the required insns. + + Usually, this would be a comparison insn to set the condition code and +a separate branch insn testing the condition code and branching or not +according to its value. For many machines, however, separating compares +and branches is limiting, which is why the more flexible approach with +one 'define_expand' is used in GCC. The machine description becomes +clearer for architectures that have compare-and-branch instructions but +no condition code. It also works better when different sets of +comparison operators are supported by different kinds of conditional +branches (e.g. integer vs. floating-point), or by conditional branches +with respect to conditional stores. + + Two separate insns are always used if the machine description +represents a condition code register using the legacy RTL expression +'(cc0)', and on most machines that use a separate condition code +register (*note Condition Code::). For machines that use '(cc0)', in +fact, the set and use of the condition code must be separate and +adjacent(1), thus allowing flags in 'cc_status' to be used (*note +Condition Code::) and so that the comparison and branch insns could be +located from each other by using the functions 'prev_cc0_setter' and +'next_cc0_user'. + + Even in this case having a single entry point for conditional branches +is advantageous, because it handles equally well the case where a single +comparison instruction records the results of both signed and unsigned +comparison of the given operands (with the branch insns coming in +distinct signed and unsigned flavors) as in the x86 or SPARC, and the +case where there are distinct signed and unsigned compare instructions +and only one set of conditional branch instructions as in the PowerPC. + + ---------- Footnotes ---------- + + (1) 'note' insns can separate them, though. + + +File: gccint.info, Node: Looping Patterns, Next: Insn Canonicalizations, Prev: Jump Patterns, Up: Machine Desc + +16.13 Defining Looping Instruction Patterns +=========================================== + +Some machines have special jump instructions that can be utilized to +make loops more efficient. A common example is the 68000 'dbra' +instruction which performs a decrement of a register and a branch if the +result was greater than zero. Other machines, in particular digital +signal processors (DSPs), have special block repeat instructions to +provide low-overhead loop support. For example, the TI TMS320C3x/C4x +DSPs have a block repeat instruction that loads special registers to +mark the top and end of a loop and to count the number of loop +iterations. This avoids the need for fetching and executing a +'dbra'-like instruction and avoids pipeline stalls associated with the +jump. + + GCC has three special named patterns to support low overhead looping. +They are 'decrement_and_branch_until_zero', 'doloop_begin', and +'doloop_end'. The first pattern, 'decrement_and_branch_until_zero', is +not emitted during RTL generation but may be emitted during the +instruction combination phase. This requires the assistance of the loop +optimizer, using information collected during strength reduction, to +reverse a loop to count down to zero. Some targets also require the +loop optimizer to add a 'REG_NONNEG' note to indicate that the iteration +count is always positive. This is needed if the target performs a +signed loop termination test. For example, the 68000 uses a pattern +similar to the following for its 'dbra' instruction: + + (define_insn "decrement_and_branch_until_zero" + [(set (pc) + (if_then_else + (ge (plus:SI (match_operand:SI 0 "general_operand" "+d*am") + (const_int -1)) + (const_int 0)) + (label_ref (match_operand 1 "" "")) + (pc))) + (set (match_dup 0) + (plus:SI (match_dup 0) + (const_int -1)))] + "find_reg_note (insn, REG_NONNEG, 0)" + "...") + + Note that since the insn is both a jump insn and has an output, it must +deal with its own reloads, hence the 'm' constraints. Also note that +since this insn is generated by the instruction combination phase +combining two sequential insns together into an implicit parallel insn, +the iteration counter needs to be biased by the same amount as the +decrement operation, in this case -1. Note that the following similar +pattern will not be matched by the combiner. + + (define_insn "decrement_and_branch_until_zero" + [(set (pc) + (if_then_else + (ge (match_operand:SI 0 "general_operand" "+d*am") + (const_int 1)) + (label_ref (match_operand 1 "" "")) + (pc))) + (set (match_dup 0) + (plus:SI (match_dup 0) + (const_int -1)))] + "find_reg_note (insn, REG_NONNEG, 0)" + "...") + + The other two special looping patterns, 'doloop_begin' and +'doloop_end', are emitted by the loop optimizer for certain well-behaved +loops with a finite number of loop iterations using information +collected during strength reduction. + + The 'doloop_end' pattern describes the actual looping instruction (or +the implicit looping operation) and the 'doloop_begin' pattern is an +optional companion pattern that can be used for initialization needed +for some low-overhead looping instructions. + + Note that some machines require the actual looping instruction to be +emitted at the top of the loop (e.g., the TMS320C3x/C4x DSPs). Emitting +the true RTL for a looping instruction at the top of the loop can cause +problems with flow analysis. So instead, a dummy 'doloop' insn is +emitted at the end of the loop. The machine dependent reorg pass checks +for the presence of this 'doloop' insn and then searches back to the top +of the loop, where it inserts the true looping insn (provided there are +no instructions in the loop which would cause problems). Any additional +labels can be emitted at this point. In addition, if the desired +special iteration counter register was not allocated, this machine +dependent reorg pass could emit a traditional compare and jump +instruction pair. + + The essential difference between the 'decrement_and_branch_until_zero' +and the 'doloop_end' patterns is that the loop optimizer allocates an +additional pseudo register for the latter as an iteration counter. This +pseudo register cannot be used within the loop (i.e., general induction +variables cannot be derived from it), however, in many cases the loop +induction variable may become redundant and removed by the flow pass. + + +File: gccint.info, Node: Insn Canonicalizations, Next: Expander Definitions, Prev: Looping Patterns, Up: Machine Desc + +16.14 Canonicalization of Instructions +====================================== + +There are often cases where multiple RTL expressions could represent an +operation performed by a single machine instruction. This situation is +most commonly encountered with logical, branch, and multiply-accumulate +instructions. In such cases, the compiler attempts to convert these +multiple RTL expressions into a single canonical form to reduce the +number of insn patterns required. + + In addition to algebraic simplifications, following canonicalizations +are performed: + + * For commutative and comparison operators, a constant is always made + the second operand. If a machine only supports a constant as the + second operand, only patterns that match a constant in the second + operand need be supplied. + + * For associative operators, a sequence of operators will always + chain to the left; for instance, only the left operand of an + integer 'plus' can itself be a 'plus'. 'and', 'ior', 'xor', + 'plus', 'mult', 'smin', 'smax', 'umin', and 'umax' are associative + when applied to integers, and sometimes to floating-point. + + * For these operators, if only one operand is a 'neg', 'not', 'mult', + 'plus', or 'minus' expression, it will be the first operand. + + * In combinations of 'neg', 'mult', 'plus', and 'minus', the 'neg' + operations (if any) will be moved inside the operations as far as + possible. For instance, '(neg (mult A B))' is canonicalized as + '(mult (neg A) B)', but '(plus (mult (neg B) C) A)' is + canonicalized as '(minus A (mult B C))'. + + * For the 'compare' operator, a constant is always the second operand + if the first argument is a condition code register or '(cc0)'. + + * An operand of 'neg', 'not', 'mult', 'plus', or 'minus' is made the + first operand under the same conditions as above. + + * '(ltu (plus A B) B)' is converted to '(ltu (plus A B) A)'. + Likewise with 'geu' instead of 'ltu'. + + * '(minus X (const_int N))' is converted to '(plus X (const_int + -N))'. + + * Within address computations (i.e., inside 'mem'), a left shift is + converted into the appropriate multiplication by a power of two. + + * De Morgan's Law is used to move bitwise negation inside a bitwise + logical-and or logical-or operation. If this results in only one + operand being a 'not' expression, it will be the first one. + + A machine that has an instruction that performs a bitwise + logical-and of one operand with the bitwise negation of the other + should specify the pattern for that instruction as + + (define_insn "" + [(set (match_operand:M 0 ...) + (and:M (not:M (match_operand:M 1 ...)) + (match_operand:M 2 ...)))] + "..." + "...") + + Similarly, a pattern for a "NAND" instruction should be written + + (define_insn "" + [(set (match_operand:M 0 ...) + (ior:M (not:M (match_operand:M 1 ...)) + (not:M (match_operand:M 2 ...))))] + "..." + "...") + + In both cases, it is not necessary to include patterns for the many + logically equivalent RTL expressions. + + * The only possible RTL expressions involving both bitwise + exclusive-or and bitwise negation are '(xor:M X Y)' and '(not:M + (xor:M X Y))'. + + * The sum of three items, one of which is a constant, will only + appear in the form + + (plus:M (plus:M X Y) CONSTANT) + + * Equality comparisons of a group of bits (usually a single bit) with + zero will be written using 'zero_extract' rather than the + equivalent 'and' or 'sign_extract' operations. + + * '(sign_extend:M1 (mult:M2 (sign_extend:M2 X) (sign_extend:M2 Y)))' + is converted to '(mult:M1 (sign_extend:M1 X) (sign_extend:M1 Y))', + and likewise for 'zero_extend'. + + * '(sign_extend:M1 (mult:M2 (ashiftrt:M2 X S) (sign_extend:M2 Y)))' + is converted to '(mult:M1 (sign_extend:M1 (ashiftrt:M2 X S)) + (sign_extend:M1 Y))', and likewise for patterns using 'zero_extend' + and 'lshiftrt'. If the second operand of 'mult' is also a shift, + then that is extended also. This transformation is only applied + when it can be proven that the original operation had sufficient + precision to prevent overflow. + + Further canonicalization rules are defined in the function +'commutative_operand_precedence' in 'gcc/rtlanal.c'. + + +File: gccint.info, Node: Expander Definitions, Next: Insn Splitting, Prev: Insn Canonicalizations, Up: Machine Desc + +16.15 Defining RTL Sequences for Code Generation +================================================ + +On some target machines, some standard pattern names for RTL generation +cannot be handled with single insn, but a sequence of RTL insns can +represent them. For these target machines, you can write a +'define_expand' to specify how to generate the sequence of RTL. + + A 'define_expand' is an RTL expression that looks almost like a +'define_insn'; but, unlike the latter, a 'define_expand' is used only +for RTL generation and it can produce more than one RTL insn. + + A 'define_expand' RTX has four operands: + + * The name. Each 'define_expand' must have a name, since the only + use for it is to refer to it by name. + + * The RTL template. This is a vector of RTL expressions representing + a sequence of separate instructions. Unlike 'define_insn', there + is no implicit surrounding 'PARALLEL'. + + * The condition, a string containing a C expression. This expression + is used to express how the availability of this pattern depends on + subclasses of target machine, selected by command-line options when + GCC is run. This is just like the condition of a 'define_insn' + that has a standard name. Therefore, the condition (if present) + may not depend on the data in the insn being matched, but only the + target-machine-type flags. The compiler needs to test these + conditions during initialization in order to learn exactly which + named instructions are available in a particular run. + + * The preparation statements, a string containing zero or more C + statements which are to be executed before RTL code is generated + from the RTL template. + + Usually these statements prepare temporary registers for use as + internal operands in the RTL template, but they can also generate + RTL insns directly by calling routines such as 'emit_insn', etc. + Any such insns precede the ones that come from the RTL template. + + * Optionally, a vector containing the values of attributes. *Note + Insn Attributes::. + + Every RTL insn emitted by a 'define_expand' must match some +'define_insn' in the machine description. Otherwise, the compiler will +crash when trying to generate code for the insn or trying to optimize +it. + + The RTL template, in addition to controlling generation of RTL insns, +also describes the operands that need to be specified when this pattern +is used. In particular, it gives a predicate for each operand. + + A true operand, which needs to be specified in order to generate RTL +from the pattern, should be described with a 'match_operand' in its +first occurrence in the RTL template. This enters information on the +operand's predicate into the tables that record such things. GCC uses +the information to preload the operand into a register if that is +required for valid RTL code. If the operand is referred to more than +once, subsequent references should use 'match_dup'. + + The RTL template may also refer to internal "operands" which are +temporary registers or labels used only within the sequence made by the +'define_expand'. Internal operands are substituted into the RTL +template with 'match_dup', never with 'match_operand'. The values of +the internal operands are not passed in as arguments by the compiler +when it requests use of this pattern. Instead, they are computed within +the pattern, in the preparation statements. These statements compute +the values and store them into the appropriate elements of 'operands' so +that 'match_dup' can find them. + + There are two special macros defined for use in the preparation +statements: 'DONE' and 'FAIL'. Use them with a following semicolon, as +a statement. + +'DONE' + Use the 'DONE' macro to end RTL generation for the pattern. The + only RTL insns resulting from the pattern on this occasion will be + those already emitted by explicit calls to 'emit_insn' within the + preparation statements; the RTL template will not be generated. + +'FAIL' + Make the pattern fail on this occasion. When a pattern fails, it + means that the pattern was not truly available. The calling + routines in the compiler will try other strategies for code + generation using other patterns. + + Failure is currently supported only for binary (addition, + multiplication, shifting, etc.) and bit-field ('extv', 'extzv', + and 'insv') operations. + + If the preparation falls through (invokes neither 'DONE' nor 'FAIL'), +then the 'define_expand' acts like a 'define_insn' in that the RTL +template is used to generate the insn. + + The RTL template is not used for matching, only for generating the +initial insn list. If the preparation statement always invokes 'DONE' +or 'FAIL', the RTL template may be reduced to a simple list of operands, +such as this example: + + (define_expand "addsi3" + [(match_operand:SI 0 "register_operand" "") + (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "register_operand" "")] + "" + " + { + handle_add (operands[0], operands[1], operands[2]); + DONE; + }") + + Here is an example, the definition of left-shift for the SPUR chip: + + (define_expand "ashlsi3" + [(set (match_operand:SI 0 "register_operand" "") + (ashift:SI + (match_operand:SI 1 "register_operand" "") + (match_operand:SI 2 "nonmemory_operand" "")))] + "" + " + + { + if (GET_CODE (operands[2]) != CONST_INT + || (unsigned) INTVAL (operands[2]) > 3) + FAIL; + }") + +This example uses 'define_expand' so that it can generate an RTL insn +for shifting when the shift-count is in the supported range of 0 to 3 +but fail in other cases where machine insns aren't available. When it +fails, the compiler tries another strategy using different patterns +(such as, a library call). + + If the compiler were able to handle nontrivial condition-strings in +patterns with names, then it would be possible to use a 'define_insn' in +that case. Here is another case (zero-extension on the 68000) which +makes more use of the power of 'define_expand': + + (define_expand "zero_extendhisi2" + [(set (match_operand:SI 0 "general_operand" "") + (const_int 0)) + (set (strict_low_part + (subreg:HI + (match_dup 0) + 0)) + (match_operand:HI 1 "general_operand" ""))] + "" + "operands[1] = make_safe_from (operands[1], operands[0]);") + +Here two RTL insns are generated, one to clear the entire output operand +and the other to copy the input operand into its low half. This +sequence is incorrect if the input operand refers to [the old value of] +the output operand, so the preparation statement makes sure this isn't +so. The function 'make_safe_from' copies the 'operands[1]' into a +temporary register if it refers to 'operands[0]'. It does this by +emitting another RTL insn. + + Finally, a third example shows the use of an internal operand. +Zero-extension on the SPUR chip is done by 'and'-ing the result against +a halfword mask. But this mask cannot be represented by a 'const_int' +because the constant value is too large to be legitimate on this +machine. So it must be copied into a register with 'force_reg' and then +the register used in the 'and'. + + (define_expand "zero_extendhisi2" + [(set (match_operand:SI 0 "register_operand" "") + (and:SI (subreg:SI + (match_operand:HI 1 "register_operand" "") + 0) + (match_dup 2)))] + "" + "operands[2] + = force_reg (SImode, GEN_INT (65535)); ") + + _Note:_ If the 'define_expand' is used to serve a standard binary or +unary arithmetic operation or a bit-field operation, then the last insn +it generates must not be a 'code_label', 'barrier' or 'note'. It must +be an 'insn', 'jump_insn' or 'call_insn'. If you don't need a real insn +at the end, emit an insn to copy the result of the operation into +itself. Such an insn will generate no code, but it can avoid problems +in the compiler. + + +File: gccint.info, Node: Insn Splitting, Next: Including Patterns, Prev: Expander Definitions, Up: Machine Desc + +16.16 Defining How to Split Instructions +======================================== + +There are two cases where you should specify how to split a pattern into +multiple insns. On machines that have instructions requiring delay +slots (*note Delay Slots::) or that have instructions whose output is +not available for multiple cycles (*note Processor pipeline +description::), the compiler phases that optimize these cases need to be +able to move insns into one-instruction delay slots. However, some +insns may generate more than one machine instruction. These insns +cannot be placed into a delay slot. + + Often you can rewrite the single insn as a list of individual insns, +each corresponding to one machine instruction. The disadvantage of +doing so is that it will cause the compilation to be slower and require +more space. If the resulting insns are too complex, it may also +suppress some optimizations. The compiler splits the insn if there is a +reason to believe that it might improve instruction or delay slot +scheduling. + + The insn combiner phase also splits putative insns. If three insns are +merged into one insn with a complex expression that cannot be matched by +some 'define_insn' pattern, the combiner phase attempts to split the +complex pattern into two insns that are recognized. Usually it can +break the complex pattern into two patterns by splitting out some +subexpression. However, in some other cases, such as performing an +addition of a large constant in two insns on a RISC machine, the way to +split the addition into two insns is machine-dependent. + + The 'define_split' definition tells the compiler how to split a complex +insn into several simpler insns. It looks like this: + + (define_split + [INSN-PATTERN] + "CONDITION" + [NEW-INSN-PATTERN-1 + NEW-INSN-PATTERN-2 + ...] + "PREPARATION-STATEMENTS") + + INSN-PATTERN is a pattern that needs to be split and CONDITION is the +final condition to be tested, as in a 'define_insn'. When an insn +matching INSN-PATTERN and satisfying CONDITION is found, it is replaced +in the insn list with the insns given by NEW-INSN-PATTERN-1, +NEW-INSN-PATTERN-2, etc. + + The PREPARATION-STATEMENTS are similar to those statements that are +specified for 'define_expand' (*note Expander Definitions::) and are +executed before the new RTL is generated to prepare for the generated +code or emit some insns whose pattern is not fixed. Unlike those in +'define_expand', however, these statements must not generate any new +pseudo-registers. Once reload has completed, they also must not +allocate any space in the stack frame. + + Patterns are matched against INSN-PATTERN in two different +circumstances. If an insn needs to be split for delay slot scheduling +or insn scheduling, the insn is already known to be valid, which means +that it must have been matched by some 'define_insn' and, if +'reload_completed' is nonzero, is known to satisfy the constraints of +that 'define_insn'. In that case, the new insn patterns must also be +insns that are matched by some 'define_insn' and, if 'reload_completed' +is nonzero, must also satisfy the constraints of those definitions. + + As an example of this usage of 'define_split', consider the following +example from 'a29k.md', which splits a 'sign_extend' from 'HImode' to +'SImode' into a pair of shift insns: + + (define_split + [(set (match_operand:SI 0 "gen_reg_operand" "") + (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))] + "" + [(set (match_dup 0) + (ashift:SI (match_dup 1) + (const_int 16))) + (set (match_dup 0) + (ashiftrt:SI (match_dup 0) + (const_int 16)))] + " + { operands[1] = gen_lowpart (SImode, operands[1]); }") + + When the combiner phase tries to split an insn pattern, it is always +the case that the pattern is _not_ matched by any 'define_insn'. The +combiner pass first tries to split a single 'set' expression and then +the same 'set' expression inside a 'parallel', but followed by a +'clobber' of a pseudo-reg to use as a scratch register. In these cases, +the combiner expects exactly two new insn patterns to be generated. It +will verify that these patterns match some 'define_insn' definitions, so +you need not do this test in the 'define_split' (of course, there is no +point in writing a 'define_split' that will never produce insns that +match). + + Here is an example of this use of 'define_split', taken from +'rs6000.md': + + (define_split + [(set (match_operand:SI 0 "gen_reg_operand" "") + (plus:SI (match_operand:SI 1 "gen_reg_operand" "") + (match_operand:SI 2 "non_add_cint_operand" "")))] + "" + [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3))) + (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))] + " + { + int low = INTVAL (operands[2]) & 0xffff; + int high = (unsigned) INTVAL (operands[2]) >> 16; + + if (low & 0x8000) + high++, low |= 0xffff0000; + + operands[3] = GEN_INT (high << 16); + operands[4] = GEN_INT (low); + }") + + Here the predicate 'non_add_cint_operand' matches any 'const_int' that +is _not_ a valid operand of a single add insn. The add with the smaller +displacement is written so that it can be substituted into the address +of a subsequent operation. + + An example that uses a scratch register, from the same file, generates +an equality comparison of a register and a large constant: + + (define_split + [(set (match_operand:CC 0 "cc_reg_operand" "") + (compare:CC (match_operand:SI 1 "gen_reg_operand" "") + (match_operand:SI 2 "non_short_cint_operand" ""))) + (clobber (match_operand:SI 3 "gen_reg_operand" ""))] + "find_single_use (operands[0], insn, 0) + && (GET_CODE (*find_single_use (operands[0], insn, 0)) == EQ + || GET_CODE (*find_single_use (operands[0], insn, 0)) == NE)" + [(set (match_dup 3) (xor:SI (match_dup 1) (match_dup 4))) + (set (match_dup 0) (compare:CC (match_dup 3) (match_dup 5)))] + " + { + /* Get the constant we are comparing against, C, and see what it + looks like sign-extended to 16 bits. Then see what constant + could be XOR'ed with C to get the sign-extended value. */ + + int c = INTVAL (operands[2]); + int sextc = (c << 16) >> 16; + int xorv = c ^ sextc; + + operands[4] = GEN_INT (xorv); + operands[5] = GEN_INT (sextc); + }") + + To avoid confusion, don't write a single 'define_split' that accepts +some insns that match some 'define_insn' as well as some insns that +don't. Instead, write two separate 'define_split' definitions, one for +the insns that are valid and one for the insns that are not valid. + + The splitter is allowed to split jump instructions into sequence of +jumps or create new jumps in while splitting non-jump instructions. As +the central flowgraph and branch prediction information needs to be +updated, several restriction apply. + + Splitting of jump instruction into sequence that over by another jump +instruction is always valid, as compiler expect identical behavior of +new jump. When new sequence contains multiple jump instructions or new +labels, more assistance is needed. Splitter is required to create only +unconditional jumps, or simple conditional jump instructions. +Additionally it must attach a 'REG_BR_PROB' note to each conditional +jump. A global variable 'split_branch_probability' holds the +probability of the original branch in case it was a simple conditional +jump, -1 otherwise. To simplify recomputing of edge frequencies, the +new sequence is required to have only forward jumps to the newly created +labels. + + For the common case where the pattern of a define_split exactly matches +the pattern of a define_insn, use 'define_insn_and_split'. It looks +like this: + + (define_insn_and_split + [INSN-PATTERN] + "CONDITION" + "OUTPUT-TEMPLATE" + "SPLIT-CONDITION" + [NEW-INSN-PATTERN-1 + NEW-INSN-PATTERN-2 + ...] + "PREPARATION-STATEMENTS" + [INSN-ATTRIBUTES]) + + INSN-PATTERN, CONDITION, OUTPUT-TEMPLATE, and INSN-ATTRIBUTES are used +as in 'define_insn'. The NEW-INSN-PATTERN vector and the +PREPARATION-STATEMENTS are used as in a 'define_split'. The +SPLIT-CONDITION is also used as in 'define_split', with the additional +behavior that if the condition starts with '&&', the condition used for +the split will be the constructed as a logical "and" of the split +condition with the insn condition. For example, from i386.md: + + (define_insn_and_split "zero_extendhisi2_and" + [(set (match_operand:SI 0 "register_operand" "=r") + (zero_extend:SI (match_operand:HI 1 "register_operand" "0"))) + (clobber (reg:CC 17))] + "TARGET_ZERO_EXTEND_WITH_AND && !optimize_size" + "#" + "&& reload_completed" + [(parallel [(set (match_dup 0) + (and:SI (match_dup 0) (const_int 65535))) + (clobber (reg:CC 17))])] + "" + [(set_attr "type" "alu1")]) + + In this case, the actual split condition will be +'TARGET_ZERO_EXTEND_WITH_AND && !optimize_size && reload_completed'. + + The 'define_insn_and_split' construction provides exactly the same +functionality as two separate 'define_insn' and 'define_split' patterns. +It exists for compactness, and as a maintenance tool to prevent having +to ensure the two patterns' templates match. + + +File: gccint.info, Node: Including Patterns, Next: Peephole Definitions, Prev: Insn Splitting, Up: Machine Desc + +16.17 Including Patterns in Machine Descriptions. +================================================= + +The 'include' pattern tells the compiler tools where to look for +patterns that are in files other than in the file '.md'. This is used +only at build time and there is no preprocessing allowed. + + It looks like: + + + (include + PATHNAME) + + For example: + + + (include "filestuff") + + Where PATHNAME is a string that specifies the location of the file, +specifies the include file to be in 'gcc/config/target/filestuff'. The +directory 'gcc/config/target' is regarded as the default directory. + + Machine descriptions may be split up into smaller more manageable +subsections and placed into subdirectories. + + By specifying: + + + (include "BOGUS/filestuff") + + the include file is specified to be in +'gcc/config/TARGET/BOGUS/filestuff'. + + Specifying an absolute path for the include file such as; + + (include "/u2/BOGUS/filestuff") + + is permitted but is not encouraged. + +16.17.1 RTL Generation Tool Options for Directory Search +-------------------------------------------------------- + +The '-IDIR' option specifies directories to search for machine +descriptions. For example: + + + genrecog -I/p1/abc/proc1 -I/p2/abcd/pro2 target.md + + Add the directory DIR to the head of the list of directories to be +searched for header files. This can be used to override a system +machine definition file, substituting your own version, since these +directories are searched before the default machine description file +directories. If you use more than one '-I' option, the directories are +scanned in left-to-right order; the standard default directory come +after. + + +File: gccint.info, Node: Peephole Definitions, Next: Insn Attributes, Prev: Including Patterns, Up: Machine Desc + +16.18 Machine-Specific Peephole Optimizers +========================================== + +In addition to instruction patterns the 'md' file may contain +definitions of machine-specific peephole optimizations. + + The combiner does not notice certain peephole optimizations when the +data flow in the program does not suggest that it should try them. For +example, sometimes two consecutive insns related in purpose can be +combined even though the second one does not appear to use a register +computed in the first one. A machine-specific peephole optimizer can +detect such opportunities. + + There are two forms of peephole definitions that may be used. The +original 'define_peephole' is run at assembly output time to match insns +and substitute assembly text. Use of 'define_peephole' is deprecated. + + A newer 'define_peephole2' matches insns and substitutes new insns. +The 'peephole2' pass is run after register allocation but before +scheduling, which may result in much better code for targets that do +scheduling. + +* Menu: + +* define_peephole:: RTL to Text Peephole Optimizers +* define_peephole2:: RTL to RTL Peephole Optimizers + + +File: gccint.info, Node: define_peephole, Next: define_peephole2, Up: Peephole Definitions + +16.18.1 RTL to Text Peephole Optimizers +--------------------------------------- + +A definition looks like this: + + (define_peephole + [INSN-PATTERN-1 + INSN-PATTERN-2 + ...] + "CONDITION" + "TEMPLATE" + "OPTIONAL-INSN-ATTRIBUTES") + +The last string operand may be omitted if you are not using any +machine-specific information in this machine description. If present, +it must obey the same rules as in a 'define_insn'. + + In this skeleton, INSN-PATTERN-1 and so on are patterns to match +consecutive insns. The optimization applies to a sequence of insns when +INSN-PATTERN-1 matches the first one, INSN-PATTERN-2 matches the next, +and so on. + + Each of the insns matched by a peephole must also match a +'define_insn'. Peepholes are checked only at the last stage just before +code generation, and only optionally. Therefore, any insn which would +match a peephole but no 'define_insn' will cause a crash in code +generation in an unoptimized compilation, or at various optimization +stages. + + The operands of the insns are matched with 'match_operands', +'match_operator', and 'match_dup', as usual. What is not usual is that +the operand numbers apply to all the insn patterns in the definition. +So, you can check for identical operands in two insns by using +'match_operand' in one insn and 'match_dup' in the other. + + The operand constraints used in 'match_operand' patterns do not have +any direct effect on the applicability of the peephole, but they will be +validated afterward, so make sure your constraints are general enough to +apply whenever the peephole matches. If the peephole matches but the +constraints are not satisfied, the compiler will crash. + + It is safe to omit constraints in all the operands of the peephole; or +you can write constraints which serve as a double-check on the criteria +previously tested. + + Once a sequence of insns matches the patterns, the CONDITION is +checked. This is a C expression which makes the final decision whether +to perform the optimization (we do so if the expression is nonzero). If +CONDITION is omitted (in other words, the string is empty) then the +optimization is applied to every sequence of insns that matches the +patterns. + + The defined peephole optimizations are applied after register +allocation is complete. Therefore, the peephole definition can check +which operands have ended up in which kinds of registers, just by +looking at the operands. + + The way to refer to the operands in CONDITION is to write 'operands[I]' +for operand number I (as matched by '(match_operand I ...)'). Use the +variable 'insn' to refer to the last of the insns being matched; use +'prev_active_insn' to find the preceding insns. + + When optimizing computations with intermediate results, you can use +CONDITION to match only when the intermediate results are not used +elsewhere. Use the C expression 'dead_or_set_p (INSN, OP)', where INSN +is the insn in which you expect the value to be used for the last time +(from the value of 'insn', together with use of 'prev_nonnote_insn'), +and OP is the intermediate value (from 'operands[I]'). + + Applying the optimization means replacing the sequence of insns with +one new insn. The TEMPLATE controls ultimate output of assembler code +for this combined insn. It works exactly like the template of a +'define_insn'. Operand numbers in this template are the same ones used +in matching the original sequence of insns. + + The result of a defined peephole optimizer does not need to match any +of the insn patterns in the machine description; it does not even have +an opportunity to match them. The peephole optimizer definition itself +serves as the insn pattern to control how the insn is output. + + Defined peephole optimizers are run as assembler code is being output, +so the insns they produce are never combined or rearranged in any way. + + Here is an example, taken from the 68000 machine description: + + (define_peephole + [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4))) + (set (match_operand:DF 0 "register_operand" "=f") + (match_operand:DF 1 "register_operand" "ad"))] + "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])" + { + rtx xoperands[2]; + xoperands[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1); + #ifdef MOTOROLA + output_asm_insn ("move.l %1,(sp)", xoperands); + output_asm_insn ("move.l %1,-(sp)", operands); + return "fmove.d (sp)+,%0"; + #else + output_asm_insn ("movel %1,sp@", xoperands); + output_asm_insn ("movel %1,sp@-", operands); + return "fmoved sp@+,%0"; + #endif + }) + + The effect of this optimization is to change + + jbsr _foobar + addql #4,sp + movel d1,sp@- + movel d0,sp@- + fmoved sp@+,fp0 + +into + + jbsr _foobar + movel d1,sp@ + movel d0,sp@- + fmoved sp@+,fp0 + + INSN-PATTERN-1 and so on look _almost_ like the second operand of +'define_insn'. There is one important difference: the second operand of +'define_insn' consists of one or more RTX's enclosed in square brackets. +Usually, there is only one: then the same action can be written as an +element of a 'define_peephole'. But when there are multiple actions in +a 'define_insn', they are implicitly enclosed in a 'parallel'. Then you +must explicitly write the 'parallel', and the square brackets within it, +in the 'define_peephole'. Thus, if an insn pattern looks like this, + + (define_insn "divmodsi4" + [(set (match_operand:SI 0 "general_operand" "=d") + (div:SI (match_operand:SI 1 "general_operand" "0") + (match_operand:SI 2 "general_operand" "dmsK"))) + (set (match_operand:SI 3 "general_operand" "=d") + (mod:SI (match_dup 1) (match_dup 2)))] + "TARGET_68020" + "divsl%.l %2,%3:%0") + +then the way to mention this insn in a peephole is as follows: + + (define_peephole + [... + (parallel + [(set (match_operand:SI 0 "general_operand" "=d") + (div:SI (match_operand:SI 1 "general_operand" "0") + (match_operand:SI 2 "general_operand" "dmsK"))) + (set (match_operand:SI 3 "general_operand" "=d") + (mod:SI (match_dup 1) (match_dup 2)))]) + ...] + ...) + + +File: gccint.info, Node: define_peephole2, Prev: define_peephole, Up: Peephole Definitions + +16.18.2 RTL to RTL Peephole Optimizers +-------------------------------------- + +The 'define_peephole2' definition tells the compiler how to substitute +one sequence of instructions for another sequence, what additional +scratch registers may be needed and what their lifetimes must be. + + (define_peephole2 + [INSN-PATTERN-1 + INSN-PATTERN-2 + ...] + "CONDITION" + [NEW-INSN-PATTERN-1 + NEW-INSN-PATTERN-2 + ...] + "PREPARATION-STATEMENTS") + + The definition is almost identical to 'define_split' (*note Insn +Splitting::) except that the pattern to match is not a single +instruction, but a sequence of instructions. + + It is possible to request additional scratch registers for use in the +output template. If appropriate registers are not free, the pattern +will simply not match. + + Scratch registers are requested with a 'match_scratch' pattern at the +top level of the input pattern. The allocated register (initially) will +be dead at the point requested within the original sequence. If the +scratch is used at more than a single point, a 'match_dup' pattern at +the top level of the input pattern marks the last position in the input +sequence at which the register must be available. + + Here is an example from the IA-32 machine description: + + (define_peephole2 + [(match_scratch:SI 2 "r") + (parallel [(set (match_operand:SI 0 "register_operand" "") + (match_operator:SI 3 "arith_or_logical_operator" + [(match_dup 0) + (match_operand:SI 1 "memory_operand" "")])) + (clobber (reg:CC 17))])] + "! optimize_size && ! TARGET_READ_MODIFY" + [(set (match_dup 2) (match_dup 1)) + (parallel [(set (match_dup 0) + (match_op_dup 3 [(match_dup 0) (match_dup 2)])) + (clobber (reg:CC 17))])] + "") + +This pattern tries to split a load from its use in the hopes that we'll +be able to schedule around the memory load latency. It allocates a +single 'SImode' register of class 'GENERAL_REGS' ('"r"') that needs to +be live only at the point just before the arithmetic. + + A real example requiring extended scratch lifetimes is harder to come +by, so here's a silly made-up example: + + (define_peephole2 + [(match_scratch:SI 4 "r") + (set (match_operand:SI 0 "" "") (match_operand:SI 1 "" "")) + (set (match_operand:SI 2 "" "") (match_dup 1)) + (match_dup 4) + (set (match_operand:SI 3 "" "") (match_dup 1))] + "/* determine 1 does not overlap 0 and 2 */" + [(set (match_dup 4) (match_dup 1)) + (set (match_dup 0) (match_dup 4)) + (set (match_dup 2) (match_dup 4)) + (set (match_dup 3) (match_dup 4))] + "") + +If we had not added the '(match_dup 4)' in the middle of the input +sequence, it might have been the case that the register we chose at the +beginning of the sequence is killed by the first or second 'set'. + + +File: gccint.info, Node: Insn Attributes, Next: Conditional Execution, Prev: Peephole Definitions, Up: Machine Desc + +16.19 Instruction Attributes +============================ + +In addition to describing the instruction supported by the target +machine, the 'md' file also defines a group of "attributes" and a set of +values for each. Every generated insn is assigned a value for each +attribute. One possible attribute would be the effect that the insn has +on the machine's condition code. This attribute can then be used by +'NOTICE_UPDATE_CC' to track the condition codes. + +* Menu: + +* Defining Attributes:: Specifying attributes and their values. +* Expressions:: Valid expressions for attribute values. +* Tagging Insns:: Assigning attribute values to insns. +* Attr Example:: An example of assigning attributes. +* Insn Lengths:: Computing the length of insns. +* Constant Attributes:: Defining attributes that are constant. +* Mnemonic Attribute:: Obtain the instruction mnemonic as attribute value. +* Delay Slots:: Defining delay slots required for a machine. +* Processor pipeline description:: Specifying information for insn scheduling. + + +File: gccint.info, Node: Defining Attributes, Next: Expressions, Up: Insn Attributes + +16.19.1 Defining Attributes and their Values +-------------------------------------------- + +The 'define_attr' expression is used to define each attribute required +by the target machine. It looks like: + + (define_attr NAME LIST-OF-VALUES DEFAULT) + + NAME is a string specifying the name of the attribute being defined. +Some attributes are used in a special way by the rest of the compiler. +The 'enabled' attribute can be used to conditionally enable or disable +insn alternatives (*note Disable Insn Alternatives::). The 'predicable' +attribute, together with a suitable 'define_cond_exec' (*note +Conditional Execution::), can be used to automatically generate +conditional variants of instruction patterns. The 'mnemonic' attribute +can be used to check for the instruction mnemonic (*note Mnemonic +Attribute::). The compiler internally uses the names 'ce_enabled' and +'nonce_enabled', so they should not be used elsewhere as alternative +names. + + LIST-OF-VALUES is either a string that specifies a comma-separated list +of values that can be assigned to the attribute, or a null string to +indicate that the attribute takes numeric values. + + DEFAULT is an attribute expression that gives the value of this +attribute for insns that match patterns whose definition does not +include an explicit value for this attribute. *Note Attr Example::, for +more information on the handling of defaults. *Note Constant +Attributes::, for information on attributes that do not depend on any +particular insn. + + For each defined attribute, a number of definitions are written to the +'insn-attr.h' file. For cases where an explicit set of values is +specified for an attribute, the following are defined: + + * A '#define' is written for the symbol 'HAVE_ATTR_NAME'. + + * An enumerated class is defined for 'attr_NAME' with elements of the + form 'UPPER-NAME_UPPER-VALUE' where the attribute name and value + are first converted to uppercase. + + * A function 'get_attr_NAME' is defined that is passed an insn and + returns the attribute value for that insn. + + For example, if the following is present in the 'md' file: + + (define_attr "type" "branch,fp,load,store,arith" ...) + +the following lines will be written to the file 'insn-attr.h'. + + #define HAVE_ATTR_type 1 + enum attr_type {TYPE_BRANCH, TYPE_FP, TYPE_LOAD, + TYPE_STORE, TYPE_ARITH}; + extern enum attr_type get_attr_type (); + + If the attribute takes numeric values, no 'enum' type will be defined +and the function to obtain the attribute's value will return 'int'. + + There are attributes which are tied to a specific meaning. These +attributes are not free to use for other purposes: + +'length' + The 'length' attribute is used to calculate the length of emitted + code chunks. This is especially important when verifying branch + distances. *Note Insn Lengths::. + +'enabled' + The 'enabled' attribute can be defined to prevent certain + alternatives of an insn definition from being used during code + generation. *Note Disable Insn Alternatives::. + +'mnemonic' + The 'mnemonic' attribute can be defined to implement instruction + specific checks in e.g. the pipeline description. *Note Mnemonic + Attribute::. + + For each of these special attributes, the corresponding +'HAVE_ATTR_NAME' '#define' is also written when the attribute is not +defined; in that case, it is defined as '0'. + + Another way of defining an attribute is to use: + + (define_enum_attr "ATTR" "ENUM" DEFAULT) + + This works in just the same way as 'define_attr', except that the list +of values is taken from a separate enumeration called ENUM (*note +define_enum::). This form allows you to use the same list of values for +several attributes without having to repeat the list each time. For +example: + + (define_enum "processor" [ + model_a + model_b + ... + ]) + (define_enum_attr "arch" "processor" + (const (symbol_ref "target_arch"))) + (define_enum_attr "tune" "processor" + (const (symbol_ref "target_tune"))) + + defines the same attributes as: + + (define_attr "arch" "model_a,model_b,..." + (const (symbol_ref "target_arch"))) + (define_attr "tune" "model_a,model_b,..." + (const (symbol_ref "target_tune"))) + + but without duplicating the processor list. The second example defines +two separate C enums ('attr_arch' and 'attr_tune') whereas the first +defines a single C enum ('processor'). + + +File: gccint.info, Node: Expressions, Next: Tagging Insns, Prev: Defining Attributes, Up: Insn Attributes + +16.19.2 Attribute Expressions +----------------------------- + +RTL expressions used to define attributes use the codes described above +plus a few specific to attribute definitions, to be discussed below. +Attribute value expressions must have one of the following forms: + +'(const_int I)' + The integer I specifies the value of a numeric attribute. I must + be non-negative. + + The value of a numeric attribute can be specified either with a + 'const_int', or as an integer represented as a string in + 'const_string', 'eq_attr' (see below), 'attr', 'symbol_ref', simple + arithmetic expressions, and 'set_attr' overrides on specific + instructions (*note Tagging Insns::). + +'(const_string VALUE)' + The string VALUE specifies a constant attribute value. If VALUE is + specified as '"*"', it means that the default value of the + attribute is to be used for the insn containing this expression. + '"*"' obviously cannot be used in the DEFAULT expression of a + 'define_attr'. + + If the attribute whose value is being specified is numeric, VALUE + must be a string containing a non-negative integer (normally + 'const_int' would be used in this case). Otherwise, it must + contain one of the valid values for the attribute. + +'(if_then_else TEST TRUE-VALUE FALSE-VALUE)' + TEST specifies an attribute test, whose format is defined below. + The value of this expression is TRUE-VALUE if TEST is true, + otherwise it is FALSE-VALUE. + +'(cond [TEST1 VALUE1 ...] DEFAULT)' + The first operand of this expression is a vector containing an even + number of expressions and consisting of pairs of TEST and VALUE + expressions. The value of the 'cond' expression is that of the + VALUE corresponding to the first true TEST expression. If none of + the TEST expressions are true, the value of the 'cond' expression + is that of the DEFAULT expression. + + TEST expressions can have one of the following forms: + +'(const_int I)' + This test is true if I is nonzero and false otherwise. + +'(not TEST)' +'(ior TEST1 TEST2)' +'(and TEST1 TEST2)' + These tests are true if the indicated logical function is true. + +'(match_operand:M N PRED CONSTRAINTS)' + This test is true if operand N of the insn whose attribute value is + being determined has mode M (this part of the test is ignored if M + is 'VOIDmode') and the function specified by the string PRED + returns a nonzero value when passed operand N and mode M (this part + of the test is ignored if PRED is the null string). + + The CONSTRAINTS operand is ignored and should be the null string. + +'(match_test C-EXPR)' + The test is true if C expression C-EXPR is true. In non-constant + attributes, C-EXPR has access to the following variables: + + INSN + The rtl instruction under test. + WHICH_ALTERNATIVE + The 'define_insn' alternative that INSN matches. *Note Output + Statement::. + OPERANDS + An array of INSN's rtl operands. + + C-EXPR behaves like the condition in a C 'if' statement, so there + is no need to explicitly convert the expression into a boolean 0 or + 1 value. For example, the following two tests are equivalent: + + (match_test "x & 2") + (match_test "(x & 2) != 0") + +'(le ARITH1 ARITH2)' +'(leu ARITH1 ARITH2)' +'(lt ARITH1 ARITH2)' +'(ltu ARITH1 ARITH2)' +'(gt ARITH1 ARITH2)' +'(gtu ARITH1 ARITH2)' +'(ge ARITH1 ARITH2)' +'(geu ARITH1 ARITH2)' +'(ne ARITH1 ARITH2)' +'(eq ARITH1 ARITH2)' + These tests are true if the indicated comparison of the two + arithmetic expressions is true. Arithmetic expressions are formed + with 'plus', 'minus', 'mult', 'div', 'mod', 'abs', 'neg', 'and', + 'ior', 'xor', 'not', 'ashift', 'lshiftrt', and 'ashiftrt' + expressions. + + 'const_int' and 'symbol_ref' are always valid terms (*note Insn + Lengths::,for additional forms). 'symbol_ref' is a string denoting + a C expression that yields an 'int' when evaluated by the + 'get_attr_...' routine. It should normally be a global variable. + +'(eq_attr NAME VALUE)' + NAME is a string specifying the name of an attribute. + + VALUE is a string that is either a valid value for attribute NAME, + a comma-separated list of values, or '!' followed by a value or + list. If VALUE does not begin with a '!', this test is true if the + value of the NAME attribute of the current insn is in the list + specified by VALUE. If VALUE begins with a '!', this test is true + if the attribute's value is _not_ in the specified list. + + For example, + + (eq_attr "type" "load,store") + + is equivalent to + + (ior (eq_attr "type" "load") (eq_attr "type" "store")) + + If NAME specifies an attribute of 'alternative', it refers to the + value of the compiler variable 'which_alternative' (*note Output + Statement::) and the values must be small integers. For example, + + (eq_attr "alternative" "2,3") + + is equivalent to + + (ior (eq (symbol_ref "which_alternative") (const_int 2)) + (eq (symbol_ref "which_alternative") (const_int 3))) + + Note that, for most attributes, an 'eq_attr' test is simplified in + cases where the value of the attribute being tested is known for + all insns matching a particular pattern. This is by far the most + common case. + +'(attr_flag NAME)' + The value of an 'attr_flag' expression is true if the flag + specified by NAME is true for the 'insn' currently being scheduled. + + NAME is a string specifying one of a fixed set of flags to test. + Test the flags 'forward' and 'backward' to determine the direction + of a conditional branch. + + This example describes a conditional branch delay slot which can be + nullified for forward branches that are taken (annul-true) or for + backward branches which are not taken (annul-false). + + (define_delay (eq_attr "type" "cbranch") + [(eq_attr "in_branch_delay" "true") + (and (eq_attr "in_branch_delay" "true") + (attr_flag "forward")) + (and (eq_attr "in_branch_delay" "true") + (attr_flag "backward"))]) + + The 'forward' and 'backward' flags are false if the current 'insn' + being scheduled is not a conditional branch. + + 'attr_flag' is only used during delay slot scheduling and has no + meaning to other passes of the compiler. + +'(attr NAME)' + The value of another attribute is returned. This is most useful + for numeric attributes, as 'eq_attr' and 'attr_flag' produce more + efficient code for non-numeric attributes. + + +File: gccint.info, Node: Tagging Insns, Next: Attr Example, Prev: Expressions, Up: Insn Attributes + +16.19.3 Assigning Attribute Values to Insns +------------------------------------------- + +The value assigned to an attribute of an insn is primarily determined by +which pattern is matched by that insn (or which 'define_peephole' +generated it). Every 'define_insn' and 'define_peephole' can have an +optional last argument to specify the values of attributes for matching +insns. The value of any attribute not specified in a particular insn is +set to the default value for that attribute, as specified in its +'define_attr'. Extensive use of default values for attributes permits +the specification of the values for only one or two attributes in the +definition of most insn patterns, as seen in the example in the next +section. + + The optional last argument of 'define_insn' and 'define_peephole' is a +vector of expressions, each of which defines the value for a single +attribute. The most general way of assigning an attribute's value is to +use a 'set' expression whose first operand is an 'attr' expression +giving the name of the attribute being set. The second operand of the +'set' is an attribute expression (*note Expressions::) giving the value +of the attribute. + + When the attribute value depends on the 'alternative' attribute (i.e., +which is the applicable alternative in the constraint of the insn), the +'set_attr_alternative' expression can be used. It allows the +specification of a vector of attribute expressions, one for each +alternative. + + When the generality of arbitrary attribute expressions is not required, +the simpler 'set_attr' expression can be used, which allows specifying a +string giving either a single attribute value or a list of attribute +values, one for each alternative. + + The form of each of the above specifications is shown below. In each +case, NAME is a string specifying the attribute to be set. + +'(set_attr NAME VALUE-STRING)' + VALUE-STRING is either a string giving the desired attribute value, + or a string containing a comma-separated list giving the values for + succeeding alternatives. The number of elements must match the + number of alternatives in the constraint of the insn pattern. + + Note that it may be useful to specify '*' for some alternative, in + which case the attribute will assume its default value for insns + matching that alternative. + +'(set_attr_alternative NAME [VALUE1 VALUE2 ...])' + Depending on the alternative of the insn, the value will be one of + the specified values. This is a shorthand for using a 'cond' with + tests on the 'alternative' attribute. + +'(set (attr NAME) VALUE)' + The first operand of this 'set' must be the special RTL expression + 'attr', whose sole operand is a string giving the name of the + attribute being set. VALUE is the value of the attribute. + + The following shows three different ways of representing the same +attribute value specification: + + (set_attr "type" "load,store,arith") + + (set_attr_alternative "type" + [(const_string "load") (const_string "store") + (const_string "arith")]) + + (set (attr "type") + (cond [(eq_attr "alternative" "1") (const_string "load") + (eq_attr "alternative" "2") (const_string "store")] + (const_string "arith"))) + + The 'define_asm_attributes' expression provides a mechanism to specify +the attributes assigned to insns produced from an 'asm' statement. It +has the form: + + (define_asm_attributes [ATTR-SETS]) + +where ATTR-SETS is specified the same as for both the 'define_insn' and +the 'define_peephole' expressions. + + These values will typically be the "worst case" attribute values. For +example, they might indicate that the condition code will be clobbered. + + A specification for a 'length' attribute is handled specially. The way +to compute the length of an 'asm' insn is to multiply the length +specified in the expression 'define_asm_attributes' by the number of +machine instructions specified in the 'asm' statement, determined by +counting the number of semicolons and newlines in the string. +Therefore, the value of the 'length' attribute specified in a +'define_asm_attributes' should be the maximum possible length of a +single machine instruction. + + +File: gccint.info, Node: Attr Example, Next: Insn Lengths, Prev: Tagging Insns, Up: Insn Attributes + +16.19.4 Example of Attribute Specifications +------------------------------------------- + +The judicious use of defaulting is important in the efficient use of +insn attributes. Typically, insns are divided into "types" and an +attribute, customarily called 'type', is used to represent this value. +This attribute is normally used only to define the default value for +other attributes. An example will clarify this usage. + + Assume we have a RISC machine with a condition code and in which only +full-word operations are performed in registers. Let us assume that we +can divide all insns into loads, stores, (integer) arithmetic +operations, floating point operations, and branches. + + Here we will concern ourselves with determining the effect of an insn +on the condition code and will limit ourselves to the following possible +effects: The condition code can be set unpredictably (clobbered), not be +changed, be set to agree with the results of the operation, or only +changed if the item previously set into the condition code has been +modified. + + Here is part of a sample 'md' file for such a machine: + + (define_attr "type" "load,store,arith,fp,branch" (const_string "arith")) + + (define_attr "cc" "clobber,unchanged,set,change0" + (cond [(eq_attr "type" "load") + (const_string "change0") + (eq_attr "type" "store,branch") + (const_string "unchanged") + (eq_attr "type" "arith") + (if_then_else (match_operand:SI 0 "" "") + (const_string "set") + (const_string "clobber"))] + (const_string "clobber"))) + + (define_insn "" + [(set (match_operand:SI 0 "general_operand" "=r,r,m") + (match_operand:SI 1 "general_operand" "r,m,r"))] + "" + "@ + move %0,%1 + load %0,%1 + store %0,%1" + [(set_attr "type" "arith,load,store")]) + + Note that we assume in the above example that arithmetic operations +performed on quantities smaller than a machine word clobber the +condition code since they will set the condition code to a value +corresponding to the full-word result. + + +File: gccint.info, Node: Insn Lengths, Next: Constant Attributes, Prev: Attr Example, Up: Insn Attributes + +16.19.5 Computing the Length of an Insn +--------------------------------------- + +For many machines, multiple types of branch instructions are provided, +each for different length branch displacements. In most cases, the +assembler will choose the correct instruction to use. However, when the +assembler cannot do so, GCC can when a special attribute, the 'length' +attribute, is defined. This attribute must be defined to have numeric +values by specifying a null string in its 'define_attr'. + + In the case of the 'length' attribute, two additional forms of +arithmetic terms are allowed in test expressions: + +'(match_dup N)' + This refers to the address of operand N of the current insn, which + must be a 'label_ref'. + +'(pc)' + This refers to the address of the _current_ insn. It might have + been more consistent with other usage to make this the address of + the _next_ insn but this would be confusing because the length of + the current insn is to be computed. + + For normal insns, the length will be determined by value of the +'length' attribute. In the case of 'addr_vec' and 'addr_diff_vec' insn +patterns, the length is computed as the number of vectors multiplied by +the size of each vector. + + Lengths are measured in addressable storage units (bytes). + + The following macros can be used to refine the length computation: + +'ADJUST_INSN_LENGTH (INSN, LENGTH)' + If defined, modifies the length assigned to instruction INSN as a + function of the context in which it is used. LENGTH is an lvalue + that contains the initially computed length of the insn and should + be updated with the correct length of the insn. + + This macro will normally not be required. A case in which it is + required is the ROMP. On this machine, the size of an 'addr_vec' + insn must be increased by two to compensate for the fact that + alignment may be required. + + The routine that returns 'get_attr_length' (the value of the 'length' +attribute) can be used by the output routine to determine the form of +the branch instruction to be written, as the example below illustrates. + + As an example of the specification of variable-length branches, +consider the IBM 360. If we adopt the convention that a register will +be set to the starting address of a function, we can jump to labels +within 4k of the start using a four-byte instruction. Otherwise, we +need a six-byte sequence to load the address from memory and then branch +to it. + + On such a machine, a pattern for a branch instruction might be +specified as follows: + + (define_insn "jump" + [(set (pc) + (label_ref (match_operand 0 "" "")))] + "" + { + return (get_attr_length (insn) == 4 + ? "b %l0" : "l r15,=a(%l0); br r15"); + } + [(set (attr "length") + (if_then_else (lt (match_dup 0) (const_int 4096)) + (const_int 4) + (const_int 6)))]) + + +File: gccint.info, Node: Constant Attributes, Next: Mnemonic Attribute, Prev: Insn Lengths, Up: Insn Attributes + +16.19.6 Constant Attributes +--------------------------- + +A special form of 'define_attr', where the expression for the default +value is a 'const' expression, indicates an attribute that is constant +for a given run of the compiler. Constant attributes may be used to +specify which variety of processor is used. For example, + + (define_attr "cpu" "m88100,m88110,m88000" + (const + (cond [(symbol_ref "TARGET_88100") (const_string "m88100") + (symbol_ref "TARGET_88110") (const_string "m88110")] + (const_string "m88000")))) + + (define_attr "memory" "fast,slow" + (const + (if_then_else (symbol_ref "TARGET_FAST_MEM") + (const_string "fast") + (const_string "slow")))) + + The routine generated for constant attributes has no parameters as it +does not depend on any particular insn. RTL expressions used to define +the value of a constant attribute may use the 'symbol_ref' form, but may +not use either the 'match_operand' form or 'eq_attr' forms involving +insn attributes. + + +File: gccint.info, Node: Mnemonic Attribute, Next: Delay Slots, Prev: Constant Attributes, Up: Insn Attributes + +16.19.7 Mnemonic Attribute +-------------------------- + +The 'mnemonic' attribute is a string type attribute holding the +instruction mnemonic for an insn alternative. The attribute values will +automatically be generated by the machine description parser if there is +an attribute definition in the md file: + + (define_attr "mnemonic" "unknown" (const_string "unknown")) + + The default value can be freely chosen as long as it does not collide +with any of the instruction mnemonics. This value will be used whenever +the machine description parser is not able to determine the mnemonic +string. This might be the case for output templates containing more +than a single instruction as in '"mvcle\t%0,%1,0\;jo\t.-4"'. + + The 'mnemonic' attribute set is not generated automatically if the +instruction string is generated via C code. + + An existing 'mnemonic' attribute set in an insn definition will not be +overriden by the md file parser. That way it is possible to manually +set the instruction mnemonics for the cases where the md file parser +fails to determine it automatically. + + The 'mnemonic' attribute is useful for dealing with instruction +specific properties in the pipeline description without defining +additional insn attributes. + + (define_attr "ooo_expanded" "" + (cond [(eq_attr "mnemonic" "dlr,dsgr,d,dsgf,stam,dsgfr,dlgr") + (const_int 1)] + (const_int 0))) + + +File: gccint.info, Node: Delay Slots, Next: Processor pipeline description, Prev: Mnemonic Attribute, Up: Insn Attributes + +16.19.8 Delay Slot Scheduling +----------------------------- + +The insn attribute mechanism can be used to specify the requirements for +delay slots, if any, on a target machine. An instruction is said to +require a "delay slot" if some instructions that are physically after +the instruction are executed as if they were located before it. Classic +examples are branch and call instructions, which often execute the +following instruction before the branch or call is performed. + + On some machines, conditional branch instructions can optionally +"annul" instructions in the delay slot. This means that the instruction +will not be executed for certain branch outcomes. Both instructions +that annul if the branch is true and instructions that annul if the +branch is false are supported. + + Delay slot scheduling differs from instruction scheduling in that +determining whether an instruction needs a delay slot is dependent only +on the type of instruction being generated, not on data flow between the +instructions. See the next section for a discussion of data-dependent +instruction scheduling. + + The requirement of an insn needing one or more delay slots is indicated +via the 'define_delay' expression. It has the following form: + + (define_delay TEST + [DELAY-1 ANNUL-TRUE-1 ANNUL-FALSE-1 + DELAY-2 ANNUL-TRUE-2 ANNUL-FALSE-2 + ...]) + + TEST is an attribute test that indicates whether this 'define_delay' +applies to a particular insn. If so, the number of required delay slots +is determined by the length of the vector specified as the second +argument. An insn placed in delay slot N must satisfy attribute test +DELAY-N. ANNUL-TRUE-N is an attribute test that specifies which insns +may be annulled if the branch is true. Similarly, ANNUL-FALSE-N +specifies which insns in the delay slot may be annulled if the branch is +false. If annulling is not supported for that delay slot, '(nil)' +should be coded. + + For example, in the common case where branch and call insns require a +single delay slot, which may contain any insn other than a branch or +call, the following would be placed in the 'md' file: + + (define_delay (eq_attr "type" "branch,call") + [(eq_attr "type" "!branch,call") (nil) (nil)]) + + Multiple 'define_delay' expressions may be specified. In this case, +each such expression specifies different delay slot requirements and +there must be no insn for which tests in two 'define_delay' expressions +are both true. + + For example, if we have a machine that requires one delay slot for +branches but two for calls, no delay slot can contain a branch or call +insn, and any valid insn in the delay slot for the branch can be +annulled if the branch is true, we might represent this as follows: + + (define_delay (eq_attr "type" "branch") + [(eq_attr "type" "!branch,call") + (eq_attr "type" "!branch,call") + (nil)]) + + (define_delay (eq_attr "type" "call") + [(eq_attr "type" "!branch,call") (nil) (nil) + (eq_attr "type" "!branch,call") (nil) (nil)]) + + +File: gccint.info, Node: Processor pipeline description, Prev: Delay Slots, Up: Insn Attributes + +16.19.9 Specifying processor pipeline description +------------------------------------------------- + +To achieve better performance, most modern processors (super-pipelined, +superscalar RISC, and VLIW processors) have many "functional units" on +which several instructions can be executed simultaneously. An +instruction starts execution if its issue conditions are satisfied. If +not, the instruction is stalled until its conditions are satisfied. +Such "interlock (pipeline) delay" causes interruption of the fetching of +successor instructions (or demands nop instructions, e.g. for some MIPS +processors). + + There are two major kinds of interlock delays in modern processors. +The first one is a data dependence delay determining "instruction +latency time". The instruction execution is not started until all +source data have been evaluated by prior instructions (there are more +complex cases when the instruction execution starts even when the data +are not available but will be ready in given time after the instruction +execution start). Taking the data dependence delays into account is +simple. The data dependence (true, output, and anti-dependence) delay +between two instructions is given by a constant. In most cases this +approach is adequate. The second kind of interlock delays is a +reservation delay. The reservation delay means that two instructions +under execution will be in need of shared processors resources, i.e. +buses, internal registers, and/or functional units, which are reserved +for some time. Taking this kind of delay into account is complex +especially for modern RISC processors. + + The task of exploiting more processor parallelism is solved by an +instruction scheduler. For a better solution to this problem, the +instruction scheduler has to have an adequate description of the +processor parallelism (or "pipeline description"). GCC machine +descriptions describe processor parallelism and functional unit +reservations for groups of instructions with the aid of "regular +expressions". + + The GCC instruction scheduler uses a "pipeline hazard recognizer" to +figure out the possibility of the instruction issue by the processor on +a given simulated processor cycle. The pipeline hazard recognizer is +automatically generated from the processor pipeline description. The +pipeline hazard recognizer generated from the machine description is +based on a deterministic finite state automaton (DFA): the instruction +issue is possible if there is a transition from one automaton state to +another one. This algorithm is very fast, and furthermore, its speed is +not dependent on processor complexity(1). + + The rest of this section describes the directives that constitute an +automaton-based processor pipeline description. The order of these +constructions within the machine description file is not important. + + The following optional construction describes names of automata +generated and used for the pipeline hazards recognition. Sometimes the +generated finite state automaton used by the pipeline hazard recognizer +is large. If we use more than one automaton and bind functional units +to the automata, the total size of the automata is usually less than the +size of the single automaton. If there is no one such construction, +only one finite state automaton is generated. + + (define_automaton AUTOMATA-NAMES) + + AUTOMATA-NAMES is a string giving names of the automata. The names are +separated by commas. All the automata should have unique names. The +automaton name is used in the constructions 'define_cpu_unit' and +'define_query_cpu_unit'. + + Each processor functional unit used in the description of instruction +reservations should be described by the following construction. + + (define_cpu_unit UNIT-NAMES [AUTOMATON-NAME]) + + UNIT-NAMES is a string giving the names of the functional units +separated by commas. Don't use name 'nothing', it is reserved for other +goals. + + AUTOMATON-NAME is a string giving the name of the automaton with which +the unit is bound. The automaton should be described in construction +'define_automaton'. You should give "automaton-name", if there is a +defined automaton. + + The assignment of units to automata are constrained by the uses of the +units in insn reservations. The most important constraint is: if a unit +reservation is present on a particular cycle of an alternative for an +insn reservation, then some unit from the same automaton must be present +on the same cycle for the other alternatives of the insn reservation. +The rest of the constraints are mentioned in the description of the +subsequent constructions. + + The following construction describes CPU functional units analogously +to 'define_cpu_unit'. The reservation of such units can be queried for +an automaton state. The instruction scheduler never queries reservation +of functional units for given automaton state. So as a rule, you don't +need this construction. This construction could be used for future code +generation goals (e.g. to generate VLIW insn templates). + + (define_query_cpu_unit UNIT-NAMES [AUTOMATON-NAME]) + + UNIT-NAMES is a string giving names of the functional units separated +by commas. + + AUTOMATON-NAME is a string giving the name of the automaton with which +the unit is bound. + + The following construction is the major one to describe pipeline +characteristics of an instruction. + + (define_insn_reservation INSN-NAME DEFAULT_LATENCY + CONDITION REGEXP) + + DEFAULT_LATENCY is a number giving latency time of the instruction. +There is an important difference between the old description and the +automaton based pipeline description. The latency time is used for all +dependencies when we use the old description. In the automaton based +pipeline description, the given latency time is only used for true +dependencies. The cost of anti-dependencies is always zero and the cost +of output dependencies is the difference between latency times of the +producing and consuming insns (if the difference is negative, the cost +is considered to be zero). You can always change the default costs for +any description by using the target hook 'TARGET_SCHED_ADJUST_COST' +(*note Scheduling::). + + INSN-NAME is a string giving the internal name of the insn. The +internal names are used in constructions 'define_bypass' and in the +automaton description file generated for debugging. The internal name +has nothing in common with the names in 'define_insn'. It is a good +practice to use insn classes described in the processor manual. + + CONDITION defines what RTL insns are described by this construction. +You should remember that you will be in trouble if CONDITION for two or +more different 'define_insn_reservation' constructions is TRUE for an +insn. In this case what reservation will be used for the insn is not +defined. Such cases are not checked during generation of the pipeline +hazards recognizer because in general recognizing that two conditions +may have the same value is quite difficult (especially if the conditions +contain 'symbol_ref'). It is also not checked during the pipeline +hazard recognizer work because it would slow down the recognizer +considerably. + + REGEXP is a string describing the reservation of the cpu's functional +units by the instruction. The reservations are described by a regular +expression according to the following syntax: + + regexp = regexp "," oneof + | oneof + + oneof = oneof "|" allof + | allof + + allof = allof "+" repeat + | repeat + + repeat = element "*" number + | element + + element = cpu_function_unit_name + | reservation_name + | result_name + | "nothing" + | "(" regexp ")" + + * ',' is used for describing the start of the next cycle in the + reservation. + + * '|' is used for describing a reservation described by the first + regular expression *or* a reservation described by the second + regular expression *or* etc. + + * '+' is used for describing a reservation described by the first + regular expression *and* a reservation described by the second + regular expression *and* etc. + + * '*' is used for convenience and simply means a sequence in which + the regular expression are repeated NUMBER times with cycle + advancing (see ','). + + * 'cpu_function_unit_name' denotes reservation of the named + functional unit. + + * 'reservation_name' -- see description of construction + 'define_reservation'. + + * 'nothing' denotes no unit reservations. + + Sometimes unit reservations for different insns contain common parts. +In such case, you can simplify the pipeline description by describing +the common part by the following construction + + (define_reservation RESERVATION-NAME REGEXP) + + RESERVATION-NAME is a string giving name of REGEXP. Functional unit +names and reservation names are in the same name space. So the +reservation names should be different from the functional unit names and +can not be the reserved name 'nothing'. + + The following construction is used to describe exceptions in the +latency time for given instruction pair. This is so called bypasses. + + (define_bypass NUMBER OUT_INSN_NAMES IN_INSN_NAMES + [GUARD]) + + NUMBER defines when the result generated by the instructions given in +string OUT_INSN_NAMES will be ready for the instructions given in string +IN_INSN_NAMES. Each of these strings is a comma-separated list of +filename-style globs and they refer to the names of +'define_insn_reservation's. For example: + (define_bypass 1 "cpu1_load_*, cpu1_store_*" "cpu1_load_*") + defines a bypass between instructions that start with 'cpu1_load_' or +'cpu1_store_' and those that start with 'cpu1_load_'. + + GUARD is an optional string giving the name of a C function which +defines an additional guard for the bypass. The function will get the +two insns as parameters. If the function returns zero the bypass will +be ignored for this case. The additional guard is necessary to +recognize complicated bypasses, e.g. when the consumer is only an +address of insn 'store' (not a stored value). + + If there are more one bypass with the same output and input insns, the +chosen bypass is the first bypass with a guard in description whose +guard function returns nonzero. If there is no such bypass, then bypass +without the guard function is chosen. + + The following five constructions are usually used to describe VLIW +processors, or more precisely, to describe a placement of small +instructions into VLIW instruction slots. They can be used for RISC +processors, too. + + (exclusion_set UNIT-NAMES UNIT-NAMES) + (presence_set UNIT-NAMES PATTERNS) + (final_presence_set UNIT-NAMES PATTERNS) + (absence_set UNIT-NAMES PATTERNS) + (final_absence_set UNIT-NAMES PATTERNS) + + UNIT-NAMES is a string giving names of functional units separated by +commas. + + PATTERNS is a string giving patterns of functional units separated by +comma. Currently pattern is one unit or units separated by +white-spaces. + + The first construction ('exclusion_set') means that each functional +unit in the first string can not be reserved simultaneously with a unit +whose name is in the second string and vice versa. For example, the +construction is useful for describing processors (e.g. some SPARC +processors) with a fully pipelined floating point functional unit which +can execute simultaneously only single floating point insns or only +double floating point insns. + + The second construction ('presence_set') means that each functional +unit in the first string can not be reserved unless at least one of +pattern of units whose names are in the second string is reserved. This +is an asymmetric relation. For example, it is useful for description +that VLIW 'slot1' is reserved after 'slot0' reservation. We could +describe it by the following construction + + (presence_set "slot1" "slot0") + + Or 'slot1' is reserved only after 'slot0' and unit 'b0' reservation. +In this case we could write + + (presence_set "slot1" "slot0 b0") + + The third construction ('final_presence_set') is analogous to +'presence_set'. The difference between them is when checking is done. +When an instruction is issued in given automaton state reflecting all +current and planned unit reservations, the automaton state is changed. +The first state is a source state, the second one is a result state. +Checking for 'presence_set' is done on the source state reservation, +checking for 'final_presence_set' is done on the result reservation. +This construction is useful to describe a reservation which is actually +two subsequent reservations. For example, if we use + + (presence_set "slot1" "slot0") + + the following insn will be never issued (because 'slot1' requires +'slot0' which is absent in the source state). + + (define_reservation "insn_and_nop" "slot0 + slot1") + + but it can be issued if we use analogous 'final_presence_set'. + + The forth construction ('absence_set') means that each functional unit +in the first string can be reserved only if each pattern of units whose +names are in the second string is not reserved. This is an asymmetric +relation (actually 'exclusion_set' is analogous to this one but it is +symmetric). For example it might be useful in a VLIW description to say +that 'slot0' cannot be reserved after either 'slot1' or 'slot2' have +been reserved. This can be described as: + + (absence_set "slot0" "slot1, slot2") + + Or 'slot2' can not be reserved if 'slot0' and unit 'b0' are reserved or +'slot1' and unit 'b1' are reserved. In this case we could write + + (absence_set "slot2" "slot0 b0, slot1 b1") + + All functional units mentioned in a set should belong to the same +automaton. + + The last construction ('final_absence_set') is analogous to +'absence_set' but checking is done on the result (state) reservation. +See comments for 'final_presence_set'. + + You can control the generator of the pipeline hazard recognizer with +the following construction. + + (automata_option OPTIONS) + + OPTIONS is a string giving options which affect the generated code. +Currently there are the following options: + + * "no-minimization" makes no minimization of the automaton. This is + only worth to do when we are debugging the description and need to + look more accurately at reservations of states. + + * "time" means printing time statistics about the generation of + automata. + + * "stats" means printing statistics about the generated automata such + as the number of DFA states, NDFA states and arcs. + + * "v" means a generation of the file describing the result automata. + The file has suffix '.dfa' and can be used for the description + verification and debugging. + + * "w" means a generation of warning instead of error for non-critical + errors. + + * "no-comb-vect" prevents the automaton generator from generating two + data structures and comparing them for space efficiency. Using a + comb vector to represent transitions may be better, but it can be + very expensive to construct. This option is useful if the build + process spends an unacceptably long time in genautomata. + + * "ndfa" makes nondeterministic finite state automata. This affects + the treatment of operator '|' in the regular expressions. The + usual treatment of the operator is to try the first alternative + and, if the reservation is not possible, the second alternative. + The nondeterministic treatment means trying all alternatives, some + of them may be rejected by reservations in the subsequent insns. + + * "collapse-ndfa" modifies the behaviour of the generator when + producing an automaton. An additional state transition to collapse + a nondeterministic NDFA state to a deterministic DFA state is + generated. It can be triggered by passing 'const0_rtx' to + state_transition. In such an automaton, cycle advance transitions + are available only for these collapsed states. This option is + useful for ports that want to use the 'ndfa' option, but also want + to use 'define_query_cpu_unit' to assign units to insns issued in a + cycle. + + * "progress" means output of a progress bar showing how many states + were generated so far for automaton being processed. This is + useful during debugging a DFA description. If you see too many + generated states, you could interrupt the generator of the pipeline + hazard recognizer and try to figure out a reason for generation of + the huge automaton. + + As an example, consider a superscalar RISC machine which can issue +three insns (two integer insns and one floating point insn) on the cycle +but can finish only two insns. To describe this, we define the +following functional units. + + (define_cpu_unit "i0_pipeline, i1_pipeline, f_pipeline") + (define_cpu_unit "port0, port1") + + All simple integer insns can be executed in any integer pipeline and +their result is ready in two cycles. The simple integer insns are +issued into the first pipeline unless it is reserved, otherwise they are +issued into the second pipeline. Integer division and multiplication +insns can be executed only in the second integer pipeline and their +results are ready correspondingly in 8 and 4 cycles. The integer +division is not pipelined, i.e. the subsequent integer division insn can +not be issued until the current division insn finished. Floating point +insns are fully pipelined and their results are ready in 3 cycles. +Where the result of a floating point insn is used by an integer insn, an +additional delay of one cycle is incurred. To describe all of this we +could specify + + (define_cpu_unit "div") + + (define_insn_reservation "simple" 2 (eq_attr "type" "int") + "(i0_pipeline | i1_pipeline), (port0 | port1)") + + (define_insn_reservation "mult" 4 (eq_attr "type" "mult") + "i1_pipeline, nothing*2, (port0 | port1)") + + (define_insn_reservation "div" 8 (eq_attr "type" "div") + "i1_pipeline, div*7, div + (port0 | port1)") + + (define_insn_reservation "float" 3 (eq_attr "type" "float") + "f_pipeline, nothing, (port0 | port1)) + + (define_bypass 4 "float" "simple,mult,div") + + To simplify the description we could describe the following reservation + + (define_reservation "finish" "port0|port1") + + and use it in all 'define_insn_reservation' as in the following +construction + + (define_insn_reservation "simple" 2 (eq_attr "type" "int") + "(i0_pipeline | i1_pipeline), finish") + + ---------- Footnotes ---------- + + (1) However, the size of the automaton depends on processor +complexity. To limit this effect, machine descriptions can split +orthogonal parts of the machine description among several automata: but +then, since each of these must be stepped independently, this does cause +a small decrease in the algorithm's performance. + + +File: gccint.info, Node: Conditional Execution, Next: Define Subst, Prev: Insn Attributes, Up: Machine Desc + +16.20 Conditional Execution +=========================== + +A number of architectures provide for some form of conditional +execution, or predication. The hallmark of this feature is the ability +to nullify most of the instructions in the instruction set. When the +instruction set is large and not entirely symmetric, it can be quite +tedious to describe these forms directly in the '.md' file. An +alternative is the 'define_cond_exec' template. + + (define_cond_exec + [PREDICATE-PATTERN] + "CONDITION" + "OUTPUT-TEMPLATE" + "OPTIONAL-INSN-ATTRIBUES") + + PREDICATE-PATTERN is the condition that must be true for the insn to be +executed at runtime and should match a relational operator. One can use +'match_operator' to match several relational operators at once. Any +'match_operand' operands must have no more than one alternative. + + CONDITION is a C expression that must be true for the generated pattern +to match. + + OUTPUT-TEMPLATE is a string similar to the 'define_insn' output +template (*note Output Template::), except that the '*' and '@' special +cases do not apply. This is only useful if the assembly text for the +predicate is a simple prefix to the main insn. In order to handle the +general case, there is a global variable 'current_insn_predicate' that +will contain the entire predicate if the current insn is predicated, and +will otherwise be 'NULL'. + + OPTIONAL-INSN-ATTRIBUTES is an optional vector of attributes that gets +appended to the insn attributes of the produced cond_exec rtx. It can +be used to add some distinguishing attribute to cond_exec rtxs produced +that way. An example usage would be to use this attribute in +conjunction with attributes on the main pattern to disable particular +alternatives under certain conditions. + + When 'define_cond_exec' is used, an implicit reference to the +'predicable' instruction attribute is made. *Note Insn Attributes::. +This attribute must be a boolean (i.e. have exactly two elements in its +LIST-OF-VALUES), with the possible values being 'no' and 'yes'. The +default and all uses in the insns must be a simple constant, not a +complex expressions. It may, however, depend on the alternative, by +using a comma-separated list of values. If that is the case, the port +should also define an 'enabled' attribute (*note Disable Insn +Alternatives::), which should also allow only 'no' and 'yes' as its +values. + + For each 'define_insn' for which the 'predicable' attribute is true, a +new 'define_insn' pattern will be generated that matches a predicated +version of the instruction. For example, + + (define_insn "addsi" + [(set (match_operand:SI 0 "register_operand" "r") + (plus:SI (match_operand:SI 1 "register_operand" "r") + (match_operand:SI 2 "register_operand" "r")))] + "TEST1" + "add %2,%1,%0") + + (define_cond_exec + [(ne (match_operand:CC 0 "register_operand" "c") + (const_int 0))] + "TEST2" + "(%0)") + +generates a new pattern + + (define_insn "" + [(cond_exec + (ne (match_operand:CC 3 "register_operand" "c") (const_int 0)) + (set (match_operand:SI 0 "register_operand" "r") + (plus:SI (match_operand:SI 1 "register_operand" "r") + (match_operand:SI 2 "register_operand" "r"))))] + "(TEST2) && (TEST1)" + "(%3) add %2,%1,%0") + + +File: gccint.info, Node: Define Subst, Next: Constant Definitions, Prev: Conditional Execution, Up: Machine Desc + +16.21 RTL Templates Transformations +=================================== + +For some hardware architectures there are common cases when the RTL +templates for the instructions can be derived from the other RTL +templates using simple transformations. E.g., 'i386.md' contains an RTL +template for the ordinary 'sub' instruction-- '*subsi_1', and for the +'sub' instruction with subsequent zero-extension--'*subsi_1_zext'. Such +cases can be easily implemented by a single meta-template capable of +generating a modified case based on the initial one: + + (define_subst "NAME" + [INPUT-TEMPLATE] + "CONDITION" + [OUTPUT-TEMPLATE]) + INPUT-TEMPLATE is a pattern describing the source RTL template, which +will be transformed. + + CONDITION is a C expression that is conjunct with the condition from +the input-template to generate a condition to be used in the +output-template. + + OUTPUT-TEMPLATE is a pattern that will be used in the resulting +template. + + 'define_subst' mechanism is tightly coupled with the notion of the +subst attribute (*note Subst Iterators::). The use of 'define_subst' is +triggered by a reference to a subst attribute in the transforming RTL +template. This reference initiates duplication of the source RTL +template and substitution of the attributes with their values. The +source RTL template is left unchanged, while the copy is transformed by +'define_subst'. This transformation can fail in the case when the +source RTL template is not matched against the input-template of the +'define_subst'. In such case the copy is deleted. + + 'define_subst' can be used only in 'define_insn' and 'define_expand', +it cannot be used in other expressions (e.g. in +'define_insn_and_split'). + +* Menu: + +* Define Subst Example:: Example of 'define_subst' work. +* Define Subst Pattern Matching:: Process of template comparison. +* Define Subst Output Template:: Generation of output template. + + +File: gccint.info, Node: Define Subst Example, Next: Define Subst Pattern Matching, Up: Define Subst + +16.21.1 'define_subst' Example +------------------------------ + +To illustrate how 'define_subst' works, let us examine a simple template +transformation. + + Suppose there are two kinds of instructions: one that touches flags and +the other that does not. The instructions of the second type could be +generated with the following 'define_subst': + + (define_subst "add_clobber_subst" + [(set (match_operand:SI 0 "" "") + (match_operand:SI 1 "" ""))] + "" + [(set (match_dup 0) + (match_dup 1)) + (clobber (reg:CC FLAGS_REG))] + + This 'define_subst' can be applied to any RTL pattern containing 'set' +of mode SI and generates a copy with clobber when it is applied. + + Assume there is an RTL template for a 'max' instruction to be used in +'define_subst' mentioned above: + + (define_insn "maxsi" + [(set (match_operand:SI 0 "register_operand" "=r") + (max:SI + (match_operand:SI 1 "register_operand" "r") + (match_operand:SI 2 "register_operand" "r")))] + "" + "max\t{%2, %1, %0|%0, %1, %2}" + [...]) + + To mark the RTL template for 'define_subst' application, +subst-attributes are used. They should be declared in advance: + + (define_subst_attr "add_clobber_name" "add_clobber_subst" "_noclobber" "_clobber") + + Here 'add_clobber_name' is the attribute name, 'add_clobber_subst' is +the name of the corresponding 'define_subst', the third argument +('_noclobber') is the attribute value that would be substituted into the +unchanged version of the source RTL template, and the last argument +('_clobber') is the value that would be substituted into the second, +transformed, version of the RTL template. + + Once the subst-attribute has been defined, it should be used in RTL +templates which need to be processed by the 'define_subst'. So, the +original RTL template should be changed: + + (define_insn "maxsi<add_clobber_name>" + [(set (match_operand:SI 0 "register_operand" "=r") + (max:SI + (match_operand:SI 1 "register_operand" "r") + (match_operand:SI 2 "register_operand" "r")))] + "" + "max\t{%2, %1, %0|%0, %1, %2}" + [...]) + + The result of the 'define_subst' usage would look like the following: + + (define_insn "maxsi_noclobber" + [(set (match_operand:SI 0 "register_operand" "=r") + (max:SI + (match_operand:SI 1 "register_operand" "r") + (match_operand:SI 2 "register_operand" "r")))] + "" + "max\t{%2, %1, %0|%0, %1, %2}" + [...]) + (define_insn "maxsi_clobber" + [(set (match_operand:SI 0 "register_operand" "=r") + (max:SI + (match_operand:SI 1 "register_operand" "r") + (match_operand:SI 2 "register_operand" "r"))) + (clobber (reg:CC FLAGS_REG))] + "" + "max\t{%2, %1, %0|%0, %1, %2}" + [...]) + + +File: gccint.info, Node: Define Subst Pattern Matching, Next: Define Subst Output Template, Prev: Define Subst Example, Up: Define Subst + +16.21.2 Pattern Matching in 'define_subst' +------------------------------------------ + +All expressions, allowed in 'define_insn' or 'define_expand', are +allowed in the input-template of 'define_subst', except 'match_par_dup', +'match_scratch', 'match_parallel'. The meanings of expressions in the +input-template were changed: + + 'match_operand' matches any expression (possibly, a subtree in +RTL-template), if modes of the 'match_operand' and this expression are +the same, or mode of the 'match_operand' is 'VOIDmode', or this +expression is 'match_dup', 'match_op_dup'. If the expression is +'match_operand' too, and predicate of 'match_operand' from the input +pattern is not empty, then the predicates are compared. That can be +used for more accurate filtering of accepted RTL-templates. + + 'match_operator' matches common operators (like 'plus', 'minus'), +'unspec', 'unspec_volatile' operators and 'match_operator's from the +original pattern if the modes match and 'match_operator' from the input +pattern has the same number of operands as the operator from the +original pattern. + + +File: gccint.info, Node: Define Subst Output Template, Prev: Define Subst Pattern Matching, Up: Define Subst + +16.21.3 Generation of output template in 'define_subst' +------------------------------------------------------- + +If all necessary checks for 'define_subst' application pass, a new +RTL-pattern, based on the output-template, is created to replace the old +template. Like in input-patterns, meanings of some RTL expressions are +changed when they are used in output-patterns of a 'define_subst'. +Thus, 'match_dup' is used for copying the whole expression from the +original pattern, which matched corresponding 'match_operand' from the +input pattern. + + 'match_dup N' is used in the output template to be replaced with the +expression from the original pattern, which matched 'match_operand N' +from the input pattern. As a consequence, 'match_dup' cannot be used to +point to 'match_operand's from the output pattern, it should always +refer to a 'match_operand' from the input pattern. + + In the output template one can refer to the expressions from the +original pattern and create new ones. For instance, some operands could +be added by means of standard 'match_operand'. + + After replacing 'match_dup' with some RTL-subtree from the original +pattern, it could happen that several 'match_operand's in the output +pattern have the same indexes. It is unknown, how many and what indexes +would be used in the expression which would replace 'match_dup', so such +conflicts in indexes are inevitable. To overcome this issue, +'match_operands' and 'match_operators', which were introduced into the +output pattern, are renumerated when all 'match_dup's are replaced. + + Number of alternatives in 'match_operand's introduced into the output +template 'M' could differ from the number of alternatives in the +original pattern 'N', so in the resultant pattern there would be 'N*M' +alternatives. Thus, constraints from the original pattern would be +duplicated 'N' times, constraints from the output pattern would be +duplicated 'M' times, producing all possible combinations. + + +File: gccint.info, Node: Constant Definitions, Next: Iterators, Prev: Define Subst, Up: Machine Desc + +16.22 Constant Definitions +========================== + +Using literal constants inside instruction patterns reduces legibility +and can be a maintenance problem. + + To overcome this problem, you may use the 'define_constants' +expression. It contains a vector of name-value pairs. From that point +on, wherever any of the names appears in the MD file, it is as if the +corresponding value had been written instead. You may use +'define_constants' multiple times; each appearance adds more constants +to the table. It is an error to redefine a constant with a different +value. + + To come back to the a29k load multiple example, instead of + + (define_insn "" + [(match_parallel 0 "load_multiple_operation" + [(set (match_operand:SI 1 "gpc_reg_operand" "=r") + (match_operand:SI 2 "memory_operand" "m")) + (use (reg:SI 179)) + (clobber (reg:SI 179))])] + "" + "loadm 0,0,%1,%2") + + You could write: + + (define_constants [ + (R_BP 177) + (R_FC 178) + (R_CR 179) + (R_Q 180) + ]) + + (define_insn "" + [(match_parallel 0 "load_multiple_operation" + [(set (match_operand:SI 1 "gpc_reg_operand" "=r") + (match_operand:SI 2 "memory_operand" "m")) + (use (reg:SI R_CR)) + (clobber (reg:SI R_CR))])] + "" + "loadm 0,0,%1,%2") + + The constants that are defined with a define_constant are also output +in the insn-codes.h header file as #defines. + + You can also use the machine description file to define enumerations. +Like the constants defined by 'define_constant', these enumerations are +visible to both the machine description file and the main C code. + + The syntax is as follows: + + (define_c_enum "NAME" [ + VALUE0 + VALUE1 + ... + VALUEN + ]) + + This definition causes the equivalent of the following C code to appear +in 'insn-constants.h': + + enum NAME { + VALUE0 = 0, + VALUE1 = 1, + ... + VALUEN = N + }; + #define NUM_CNAME_VALUES (N + 1) + + where CNAME is the capitalized form of NAME. It also makes each VALUEI +available in the machine description file, just as if it had been +declared with: + + (define_constants [(VALUEI I)]) + + Each VALUEI is usually an upper-case identifier and usually begins with +CNAME. + + You can split the enumeration definition into as many statements as you +like. The above example is directly equivalent to: + + (define_c_enum "NAME" [VALUE0]) + (define_c_enum "NAME" [VALUE1]) + ... + (define_c_enum "NAME" [VALUEN]) + + Splitting the enumeration helps to improve the modularity of each +individual '.md' file. For example, if a port defines its +synchronization instructions in a separate 'sync.md' file, it is +convenient to define all synchronization-specific enumeration values in +'sync.md' rather than in the main '.md' file. + + Some enumeration names have special significance to GCC: + +'unspecv' + If an enumeration called 'unspecv' is defined, GCC will use it when + printing out 'unspec_volatile' expressions. For example: + + (define_c_enum "unspecv" [ + UNSPECV_BLOCKAGE + ]) + + causes GCC to print '(unspec_volatile ... 0)' as: + + (unspec_volatile ... UNSPECV_BLOCKAGE) + +'unspec' + If an enumeration called 'unspec' is defined, GCC will use it when + printing out 'unspec' expressions. GCC will also use it when + printing out 'unspec_volatile' expressions unless an 'unspecv' + enumeration is also defined. You can therefore decide whether to + keep separate enumerations for volatile and non-volatile + expressions or whether to use the same enumeration for both. + + Another way of defining an enumeration is to use 'define_enum': + + (define_enum "NAME" [ + VALUE0 + VALUE1 + ... + VALUEN + ]) + + This directive implies: + + (define_c_enum "NAME" [ + CNAME_CVALUE0 + CNAME_CVALUE1 + ... + CNAME_CVALUEN + ]) + + where CVALUEI is the capitalized form of VALUEI. However, unlike +'define_c_enum', the enumerations defined by 'define_enum' can be used +in attribute specifications (*note define_enum_attr::). + + +File: gccint.info, Node: Iterators, Prev: Constant Definitions, Up: Machine Desc + +16.23 Iterators +=============== + +Ports often need to define similar patterns for more than one machine +mode or for more than one rtx code. GCC provides some simple iterator +facilities to make this process easier. + +* Menu: + +* Mode Iterators:: Generating variations of patterns for different modes. +* Code Iterators:: Doing the same for codes. +* Int Iterators:: Doing the same for integers. +* Subst Iterators:: Generating variations of patterns for define_subst. + + +File: gccint.info, Node: Mode Iterators, Next: Code Iterators, Up: Iterators + +16.23.1 Mode Iterators +---------------------- + +Ports often need to define similar patterns for two or more different +modes. For example: + + * If a processor has hardware support for both single and double + floating-point arithmetic, the 'SFmode' patterns tend to be very + similar to the 'DFmode' ones. + + * If a port uses 'SImode' pointers in one configuration and 'DImode' + pointers in another, it will usually have very similar 'SImode' and + 'DImode' patterns for manipulating pointers. + + Mode iterators allow several patterns to be instantiated from one '.md' +file template. They can be used with any type of rtx-based construct, +such as a 'define_insn', 'define_split', or 'define_peephole2'. + +* Menu: + +* Defining Mode Iterators:: Defining a new mode iterator. +* Substitutions:: Combining mode iterators with substitutions +* Examples:: Examples + + +File: gccint.info, Node: Defining Mode Iterators, Next: Substitutions, Up: Mode Iterators + +16.23.1.1 Defining Mode Iterators +................................. + +The syntax for defining a mode iterator is: + + (define_mode_iterator NAME [(MODE1 "COND1") ... (MODEN "CONDN")]) + + This allows subsequent '.md' file constructs to use the mode suffix +':NAME'. Every construct that does so will be expanded N times, once +with every use of ':NAME' replaced by ':MODE1', once with every use +replaced by ':MODE2', and so on. In the expansion for a particular +MODEI, every C condition will also require that CONDI be true. + + For example: + + (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")]) + + defines a new mode suffix ':P'. Every construct that uses ':P' will be +expanded twice, once with every ':P' replaced by ':SI' and once with +every ':P' replaced by ':DI'. The ':SI' version will only apply if +'Pmode == SImode' and the ':DI' version will only apply if 'Pmode == +DImode'. + + As with other '.md' conditions, an empty string is treated as "always +true". '(MODE "")' can also be abbreviated to 'MODE'. For example: + + (define_mode_iterator GPR [SI (DI "TARGET_64BIT")]) + + means that the ':DI' expansion only applies if 'TARGET_64BIT' but that +the ':SI' expansion has no such constraint. + + Iterators are applied in the order they are defined. This can be +significant if two iterators are used in a construct that requires +substitutions. *Note Substitutions::. + + +File: gccint.info, Node: Substitutions, Next: Examples, Prev: Defining Mode Iterators, Up: Mode Iterators + +16.23.1.2 Substitution in Mode Iterators +........................................ + +If an '.md' file construct uses mode iterators, each version of the +construct will often need slightly different strings or modes. For +example: + + * When a 'define_expand' defines several 'addM3' patterns (*note + Standard Names::), each expander will need to use the appropriate + mode name for M. + + * When a 'define_insn' defines several instruction patterns, each + instruction will often use a different assembler mnemonic. + + * When a 'define_insn' requires operands with different modes, using + an iterator for one of the operand modes usually requires a + specific mode for the other operand(s). + + GCC supports such variations through a system of "mode attributes". +There are two standard attributes: 'mode', which is the name of the mode +in lower case, and 'MODE', which is the same thing in upper case. You +can define other attributes using: + + (define_mode_attr NAME [(MODE1 "VALUE1") ... (MODEN "VALUEN")]) + + where NAME is the name of the attribute and VALUEI is the value +associated with MODEI. + + When GCC replaces some :ITERATOR with :MODE, it will scan each string +and mode in the pattern for sequences of the form '<ITERATOR:ATTR>', +where ATTR is the name of a mode attribute. If the attribute is defined +for MODE, the whole '<...>' sequence will be replaced by the appropriate +attribute value. + + For example, suppose an '.md' file has: + + (define_mode_iterator P [(SI "Pmode == SImode") (DI "Pmode == DImode")]) + (define_mode_attr load [(SI "lw") (DI "ld")]) + + If one of the patterns that uses ':P' contains the string +'"<P:load>\t%0,%1"', the 'SI' version of that pattern will use +'"lw\t%0,%1"' and the 'DI' version will use '"ld\t%0,%1"'. + + Here is an example of using an attribute for a mode: + + (define_mode_iterator LONG [SI DI]) + (define_mode_attr SHORT [(SI "HI") (DI "SI")]) + (define_insn ... + (sign_extend:LONG (match_operand:<LONG:SHORT> ...)) ...) + + The 'ITERATOR:' prefix may be omitted, in which case the substitution +will be attempted for every iterator expansion. + + +File: gccint.info, Node: Examples, Prev: Substitutions, Up: Mode Iterators + +16.23.1.3 Mode Iterator Examples +................................ + +Here is an example from the MIPS port. It defines the following modes +and attributes (among others): + + (define_mode_iterator GPR [SI (DI "TARGET_64BIT")]) + (define_mode_attr d [(SI "") (DI "d")]) + + and uses the following template to define both 'subsi3' and 'subdi3': + + (define_insn "sub<mode>3" + [(set (match_operand:GPR 0 "register_operand" "=d") + (minus:GPR (match_operand:GPR 1 "register_operand" "d") + (match_operand:GPR 2 "register_operand" "d")))] + "" + "<d>subu\t%0,%1,%2" + [(set_attr "type" "arith") + (set_attr "mode" "<MODE>")]) + + This is exactly equivalent to: + + (define_insn "subsi3" + [(set (match_operand:SI 0 "register_operand" "=d") + (minus:SI (match_operand:SI 1 "register_operand" "d") + (match_operand:SI 2 "register_operand" "d")))] + "" + "subu\t%0,%1,%2" + [(set_attr "type" "arith") + (set_attr "mode" "SI")]) + + (define_insn "subdi3" + [(set (match_operand:DI 0 "register_operand" "=d") + (minus:DI (match_operand:DI 1 "register_operand" "d") + (match_operand:DI 2 "register_operand" "d")))] + "" + "dsubu\t%0,%1,%2" + [(set_attr "type" "arith") + (set_attr "mode" "DI")]) + + +File: gccint.info, Node: Code Iterators, Next: Int Iterators, Prev: Mode Iterators, Up: Iterators + +16.23.2 Code Iterators +---------------------- + +Code iterators operate in a similar way to mode iterators. *Note Mode +Iterators::. + + The construct: + + (define_code_iterator NAME [(CODE1 "COND1") ... (CODEN "CONDN")]) + + defines a pseudo rtx code NAME that can be instantiated as CODEI if +condition CONDI is true. Each CODEI must have the same rtx format. +*Note RTL Classes::. + + As with mode iterators, each pattern that uses NAME will be expanded N +times, once with all uses of NAME replaced by CODE1, once with all uses +replaced by CODE2, and so on. *Note Defining Mode Iterators::. + + It is possible to define attributes for codes as well as for modes. +There are two standard code attributes: 'code', the name of the code in +lower case, and 'CODE', the name of the code in upper case. Other +attributes are defined using: + + (define_code_attr NAME [(CODE1 "VALUE1") ... (CODEN "VALUEN")]) + + Here's an example of code iterators in action, taken from the MIPS +port: + + (define_code_iterator any_cond [unordered ordered unlt unge uneq ltgt unle ungt + eq ne gt ge lt le gtu geu ltu leu]) + + (define_expand "b<code>" + [(set (pc) + (if_then_else (any_cond:CC (cc0) + (const_int 0)) + (label_ref (match_operand 0 "")) + (pc)))] + "" + { + gen_conditional_branch (operands, <CODE>); + DONE; + }) + + This is equivalent to: + + (define_expand "bunordered" + [(set (pc) + (if_then_else (unordered:CC (cc0) + (const_int 0)) + (label_ref (match_operand 0 "")) + (pc)))] + "" + { + gen_conditional_branch (operands, UNORDERED); + DONE; + }) + + (define_expand "bordered" + [(set (pc) + (if_then_else (ordered:CC (cc0) + (const_int 0)) + (label_ref (match_operand 0 "")) + (pc)))] + "" + { + gen_conditional_branch (operands, ORDERED); + DONE; + }) + + ... + + +File: gccint.info, Node: Int Iterators, Next: Subst Iterators, Prev: Code Iterators, Up: Iterators + +16.23.3 Int Iterators +--------------------- + +Int iterators operate in a similar way to code iterators. *Note Code +Iterators::. + + The construct: + + (define_int_iterator NAME [(INT1 "COND1") ... (INTN "CONDN")]) + + defines a pseudo integer constant NAME that can be instantiated as INTI +if condition CONDI is true. Each INT must have the same rtx format. +*Note RTL Classes::. Int iterators can appear in only those rtx fields +that have 'i' as the specifier. This means that each INT has to be a +constant defined using define_constant or define_c_enum. + + As with mode and code iterators, each pattern that uses NAME will be +expanded N times, once with all uses of NAME replaced by INT1, once with +all uses replaced by INT2, and so on. *Note Defining Mode Iterators::. + + It is possible to define attributes for ints as well as for codes and +modes. Attributes are defined using: + + (define_int_attr NAME [(INT1 "VALUE1") ... (INTN "VALUEN")]) + + Here's an example of int iterators in action, taken from the ARM port: + + (define_int_iterator QABSNEG [UNSPEC_VQABS UNSPEC_VQNEG]) + + (define_int_attr absneg [(UNSPEC_VQABS "abs") (UNSPEC_VQNEG "neg")]) + + (define_insn "neon_vq<absneg><mode>" + [(set (match_operand:VDQIW 0 "s_register_operand" "=w") + (unspec:VDQIW [(match_operand:VDQIW 1 "s_register_operand" "w") + (match_operand:SI 2 "immediate_operand" "i")] + QABSNEG))] + "TARGET_NEON" + "vq<absneg>.<V_s_elem>\t%<V_reg>0, %<V_reg>1" + [(set_attr "type" "neon_vqneg_vqabs")] + ) + + This is equivalent to: + + (define_insn "neon_vqabs<mode>" + [(set (match_operand:VDQIW 0 "s_register_operand" "=w") + (unspec:VDQIW [(match_operand:VDQIW 1 "s_register_operand" "w") + (match_operand:SI 2 "immediate_operand" "i")] + UNSPEC_VQABS))] + "TARGET_NEON" + "vqabs.<V_s_elem>\t%<V_reg>0, %<V_reg>1" + [(set_attr "type" "neon_vqneg_vqabs")] + ) + + (define_insn "neon_vqneg<mode>" + [(set (match_operand:VDQIW 0 "s_register_operand" "=w") + (unspec:VDQIW [(match_operand:VDQIW 1 "s_register_operand" "w") + (match_operand:SI 2 "immediate_operand" "i")] + UNSPEC_VQNEG))] + "TARGET_NEON" + "vqneg.<V_s_elem>\t%<V_reg>0, %<V_reg>1" + [(set_attr "type" "neon_vqneg_vqabs")] + ) + + +File: gccint.info, Node: Subst Iterators, Prev: Int Iterators, Up: Iterators + +16.23.4 Subst Iterators +----------------------- + +Subst iterators are special type of iterators with the following +restrictions: they could not be declared explicitly, they always have +only two values, and they do not have explicit dedicated name. +Subst-iterators are triggered only when corresponding subst-attribute is +used in RTL-pattern. + + Subst iterators transform templates in the following way: the templates +are duplicated, the subst-attributes in these templates are replaced +with the corresponding values, and a new attribute is implicitly added +to the given 'define_insn'/'define_expand'. The name of the added +attribute matches the name of 'define_subst'. Such attributes are +declared implicitly, and it is not allowed to have a 'define_attr' named +as a 'define_subst'. + + Each subst iterator is linked to a 'define_subst'. It is declared +implicitly by the first appearance of the corresponding +'define_subst_attr', and it is not allowed to define it explicitly. + + Declarations of subst-attributes have the following syntax: + + (define_subst_attr "NAME" + "SUBST-NAME" + "NO-SUBST-VALUE" + "SUBST-APPLIED-VALUE") + + NAME is a string with which the given subst-attribute could be referred +to. + + SUBST-NAME shows which 'define_subst' should be applied to an +RTL-template if the given subst-attribute is present in the +RTL-template. + + NO-SUBST-VALUE is a value with which subst-attribute would be replaced +in the first copy of the original RTL-template. + + SUBST-APPLIED-VALUE is a value with which subst-attribute would be +replaced in the second copy of the original RTL-template. + + +File: gccint.info, Node: Target Macros, Next: Host Config, Prev: Machine Desc, Up: Top + +17 Target Description Macros and Functions +****************************************** + +In addition to the file 'MACHINE.md', a machine description includes a C +header file conventionally given the name 'MACHINE.h' and a C source +file named 'MACHINE.c'. The header file defines numerous macros that +convey the information about the target machine that does not fit into +the scheme of the '.md' file. The file 'tm.h' should be a link to +'MACHINE.h'. The header file 'config.h' includes 'tm.h' and most +compiler source files include 'config.h'. The source file defines a +variable 'targetm', which is a structure containing pointers to +functions and data relating to the target machine. 'MACHINE.c' should +also contain their definitions, if they are not defined elsewhere in +GCC, and other functions called through the macros defined in the '.h' +file. + +* Menu: + +* Target Structure:: The 'targetm' variable. +* Driver:: Controlling how the driver runs the compilation passes. +* Run-time Target:: Defining '-m' options like '-m68000' and '-m68020'. +* Per-Function Data:: Defining data structures for per-function information. +* Storage Layout:: Defining sizes and alignments of data. +* Type Layout:: Defining sizes and properties of basic user data types. +* Registers:: Naming and describing the hardware registers. +* Register Classes:: Defining the classes of hardware registers. +* Old Constraints:: The old way to define machine-specific constraints. +* Stack and Calling:: Defining which way the stack grows and by how much. +* Varargs:: Defining the varargs macros. +* Trampolines:: Code set up at run time to enter a nested function. +* Library Calls:: Controlling how library routines are implicitly called. +* Addressing Modes:: Defining addressing modes valid for memory operands. +* Anchored Addresses:: Defining how '-fsection-anchors' should work. +* Condition Code:: Defining how insns update the condition code. +* Costs:: Defining relative costs of different operations. +* Scheduling:: Adjusting the behavior of the instruction scheduler. +* Sections:: Dividing storage into text, data, and other sections. +* PIC:: Macros for position independent code. +* Assembler Format:: Defining how to write insns and pseudo-ops to output. +* Debugging Info:: Defining the format of debugging output. +* Floating Point:: Handling floating point for cross-compilers. +* Mode Switching:: Insertion of mode-switching instructions. +* Target Attributes:: Defining target-specific uses of '__attribute__'. +* Emulated TLS:: Emulated TLS support. +* MIPS Coprocessors:: MIPS coprocessor support and how to customize it. +* PCH Target:: Validity checking for precompiled headers. +* C++ ABI:: Controlling C++ ABI changes. +* Named Address Spaces:: Adding support for named address spaces +* Misc:: Everything else. + + +File: gccint.info, Node: Target Structure, Next: Driver, Up: Target Macros + +17.1 The Global 'targetm' Variable +================================== + + -- Variable: struct gcc_target targetm + The target '.c' file must define the global 'targetm' variable + which contains pointers to functions and data relating to the + target machine. The variable is declared in 'target.h'; + 'target-def.h' defines the macro 'TARGET_INITIALIZER' which is used + to initialize the variable, and macros for the default initializers + for elements of the structure. The '.c' file should override those + macros for which the default definition is inappropriate. For + example: + #include "target.h" + #include "target-def.h" + + /* Initialize the GCC target structure. */ + + #undef TARGET_COMP_TYPE_ATTRIBUTES + #define TARGET_COMP_TYPE_ATTRIBUTES MACHINE_comp_type_attributes + + struct gcc_target targetm = TARGET_INITIALIZER; + + Where a macro should be defined in the '.c' file in this manner to form +part of the 'targetm' structure, it is documented below as a "Target +Hook" with a prototype. Many macros will change in future from being +defined in the '.h' file to being part of the 'targetm' structure. + + Similarly, there is a 'targetcm' variable for hooks that are specific +to front ends for C-family languages, documented as "C Target Hook". +This is declared in 'c-family/c-target.h', the initializer +'TARGETCM_INITIALIZER' in 'c-family/c-target-def.h'. If targets +initialize 'targetcm' themselves, they should set +'target_has_targetcm=yes' in 'config.gcc'; otherwise a default +definition is used. + + Similarly, there is a 'targetm_common' variable for hooks that are +shared between the compiler driver and the compilers proper, documented +as "Common Target Hook". This is declared in 'common/common-target.h', +the initializer 'TARGETM_COMMON_INITIALIZER' in +'common/common-target-def.h'. If targets initialize 'targetm_common' +themselves, they should set 'target_has_targetm_common=yes' in +'config.gcc'; otherwise a default definition is used. + + +File: gccint.info, Node: Driver, Next: Run-time Target, Prev: Target Structure, Up: Target Macros + +17.2 Controlling the Compilation Driver, 'gcc' +============================================== + +You can control the compilation driver. + + -- Macro: DRIVER_SELF_SPECS + A list of specs for the driver itself. It should be a suitable + initializer for an array of strings, with no surrounding braces. + + The driver applies these specs to its own command line between + loading default 'specs' files (but not command-line specified ones) + and choosing the multilib directory or running any subcommands. It + applies them in the order given, so each spec can depend on the + options added by earlier ones. It is also possible to remove + options using '%<OPTION' in the usual way. + + This macro can be useful when a port has several interdependent + target options. It provides a way of standardizing the command + line so that the other specs are easier to write. + + Do not define this macro if it does not need to do anything. + + -- Macro: OPTION_DEFAULT_SPECS + A list of specs used to support configure-time default options + (i.e. '--with' options) in the driver. It should be a suitable + initializer for an array of structures, each containing two + strings, without the outermost pair of surrounding braces. + + The first item in the pair is the name of the default. This must + match the code in 'config.gcc' for the target. The second item is + a spec to apply if a default with this name was specified. The + string '%(VALUE)' in the spec will be replaced by the value of the + default everywhere it occurs. + + The driver will apply these specs to its own command line between + loading default 'specs' files and processing 'DRIVER_SELF_SPECS', + using the same mechanism as 'DRIVER_SELF_SPECS'. + + Do not define this macro if it does not need to do anything. + + -- Macro: CPP_SPEC + A C string constant that tells the GCC driver program options to + pass to CPP. It can also specify how to translate options you give + to GCC into options for GCC to pass to the CPP. + + Do not define this macro if it does not need to do anything. + + -- Macro: CPLUSPLUS_CPP_SPEC + This macro is just like 'CPP_SPEC', but is used for C++, rather + than C. If you do not define this macro, then the value of + 'CPP_SPEC' (if any) will be used instead. + + -- Macro: CC1_SPEC + A C string constant that tells the GCC driver program options to + pass to 'cc1', 'cc1plus', 'f771', and the other language front + ends. It can also specify how to translate options you give to GCC + into options for GCC to pass to front ends. + + Do not define this macro if it does not need to do anything. + + -- Macro: CC1PLUS_SPEC + A C string constant that tells the GCC driver program options to + pass to 'cc1plus'. It can also specify how to translate options + you give to GCC into options for GCC to pass to the 'cc1plus'. + + Do not define this macro if it does not need to do anything. Note + that everything defined in CC1_SPEC is already passed to 'cc1plus' + so there is no need to duplicate the contents of CC1_SPEC in + CC1PLUS_SPEC. + + -- Macro: ASM_SPEC + A C string constant that tells the GCC driver program options to + pass to the assembler. It can also specify how to translate + options you give to GCC into options for GCC to pass to the + assembler. See the file 'sun3.h' for an example of this. + + Do not define this macro if it does not need to do anything. + + -- Macro: ASM_FINAL_SPEC + A C string constant that tells the GCC driver program how to run + any programs which cleanup after the normal assembler. Normally, + this is not needed. See the file 'mips.h' for an example of this. + + Do not define this macro if it does not need to do anything. + + -- Macro: AS_NEEDS_DASH_FOR_PIPED_INPUT + Define this macro, with no value, if the driver should give the + assembler an argument consisting of a single dash, '-', to instruct + it to read from its standard input (which will be a pipe connected + to the output of the compiler proper). This argument is given + after any '-o' option specifying the name of the output file. + + If you do not define this macro, the assembler is assumed to read + its standard input if given no non-option arguments. If your + assembler cannot read standard input at all, use a '%{pipe:%e}' + construct; see 'mips.h' for instance. + + -- Macro: LINK_SPEC + A C string constant that tells the GCC driver program options to + pass to the linker. It can also specify how to translate options + you give to GCC into options for GCC to pass to the linker. + + Do not define this macro if it does not need to do anything. + + -- Macro: LIB_SPEC + Another C string constant used much like 'LINK_SPEC'. The + difference between the two is that 'LIB_SPEC' is used at the end of + the command given to the linker. + + If this macro is not defined, a default is provided that loads the + standard C library from the usual place. See 'gcc.c'. + + -- Macro: LIBGCC_SPEC + Another C string constant that tells the GCC driver program how and + when to place a reference to 'libgcc.a' into the linker command + line. This constant is placed both before and after the value of + 'LIB_SPEC'. + + If this macro is not defined, the GCC driver provides a default + that passes the string '-lgcc' to the linker. + + -- Macro: REAL_LIBGCC_SPEC + By default, if 'ENABLE_SHARED_LIBGCC' is defined, the 'LIBGCC_SPEC' + is not directly used by the driver program but is instead modified + to refer to different versions of 'libgcc.a' depending on the + values of the command line flags '-static', '-shared', + '-static-libgcc', and '-shared-libgcc'. On targets where these + modifications are inappropriate, define 'REAL_LIBGCC_SPEC' instead. + 'REAL_LIBGCC_SPEC' tells the driver how to place a reference to + 'libgcc' on the link command line, but, unlike 'LIBGCC_SPEC', it is + used unmodified. + + -- Macro: USE_LD_AS_NEEDED + A macro that controls the modifications to 'LIBGCC_SPEC' mentioned + in 'REAL_LIBGCC_SPEC'. If nonzero, a spec will be generated that + uses '--as-needed' or equivalent options and the shared 'libgcc' in + place of the static exception handler library, when linking without + any of '-static', '-static-libgcc', or '-shared-libgcc'. + + -- Macro: LINK_EH_SPEC + If defined, this C string constant is added to 'LINK_SPEC'. When + 'USE_LD_AS_NEEDED' is zero or undefined, it also affects the + modifications to 'LIBGCC_SPEC' mentioned in 'REAL_LIBGCC_SPEC'. + + -- Macro: STARTFILE_SPEC + Another C string constant used much like 'LINK_SPEC'. The + difference between the two is that 'STARTFILE_SPEC' is used at the + very beginning of the command given to the linker. + + If this macro is not defined, a default is provided that loads the + standard C startup file from the usual place. See 'gcc.c'. + + -- Macro: ENDFILE_SPEC + Another C string constant used much like 'LINK_SPEC'. The + difference between the two is that 'ENDFILE_SPEC' is used at the + very end of the command given to the linker. + + Do not define this macro if it does not need to do anything. + + -- Macro: THREAD_MODEL_SPEC + GCC '-v' will print the thread model GCC was configured to use. + However, this doesn't work on platforms that are multilibbed on + thread models, such as AIX 4.3. On such platforms, define + 'THREAD_MODEL_SPEC' such that it evaluates to a string without + blanks that names one of the recognized thread models. '%*', the + default value of this macro, will expand to the value of + 'thread_file' set in 'config.gcc'. + + -- Macro: SYSROOT_SUFFIX_SPEC + Define this macro to add a suffix to the target sysroot when GCC is + configured with a sysroot. This will cause GCC to search for + usr/lib, et al, within sysroot+suffix. + + -- Macro: SYSROOT_HEADERS_SUFFIX_SPEC + Define this macro to add a headers_suffix to the target sysroot + when GCC is configured with a sysroot. This will cause GCC to pass + the updated sysroot+headers_suffix to CPP, causing it to search for + usr/include, et al, within sysroot+headers_suffix. + + -- Macro: EXTRA_SPECS + Define this macro to provide additional specifications to put in + the 'specs' file that can be used in various specifications like + 'CC1_SPEC'. + + The definition should be an initializer for an array of structures, + containing a string constant, that defines the specification name, + and a string constant that provides the specification. + + Do not define this macro if it does not need to do anything. + + 'EXTRA_SPECS' is useful when an architecture contains several + related targets, which have various '..._SPECS' which are similar + to each other, and the maintainer would like one central place to + keep these definitions. + + For example, the PowerPC System V.4 targets use 'EXTRA_SPECS' to + define either '_CALL_SYSV' when the System V calling sequence is + used or '_CALL_AIX' when the older AIX-based calling sequence is + used. + + The 'config/rs6000/rs6000.h' target file defines: + + #define EXTRA_SPECS \ + { "cpp_sysv_default", CPP_SYSV_DEFAULT }, + + #define CPP_SYS_DEFAULT "" + + The 'config/rs6000/sysv.h' target file defines: + #undef CPP_SPEC + #define CPP_SPEC \ + "%{posix: -D_POSIX_SOURCE } \ + %{mcall-sysv: -D_CALL_SYSV } \ + %{!mcall-sysv: %(cpp_sysv_default) } \ + %{msoft-float: -D_SOFT_FLOAT} %{mcpu=403: -D_SOFT_FLOAT}" + + #undef CPP_SYSV_DEFAULT + #define CPP_SYSV_DEFAULT "-D_CALL_SYSV" + + while the 'config/rs6000/eabiaix.h' target file defines + 'CPP_SYSV_DEFAULT' as: + + #undef CPP_SYSV_DEFAULT + #define CPP_SYSV_DEFAULT "-D_CALL_AIX" + + -- Macro: LINK_LIBGCC_SPECIAL_1 + Define this macro if the driver program should find the library + 'libgcc.a'. If you do not define this macro, the driver program + will pass the argument '-lgcc' to tell the linker to do the search. + + -- Macro: LINK_GCC_C_SEQUENCE_SPEC + The sequence in which libgcc and libc are specified to the linker. + By default this is '%G %L %G'. + + -- Macro: LINK_COMMAND_SPEC + A C string constant giving the complete command line need to + execute the linker. When you do this, you will need to update your + port each time a change is made to the link command line within + 'gcc.c'. Therefore, define this macro only if you need to + completely redefine the command line for invoking the linker and + there is no other way to accomplish the effect you need. + Overriding this macro may be avoidable by overriding + 'LINK_GCC_C_SEQUENCE_SPEC' instead. + + -- Common Target Hook: bool TARGET_ALWAYS_STRIP_DOTDOT + True if '..' components should always be removed from directory + names computed relative to GCC's internal directories, false + (default) if such components should be preserved and directory + names containing them passed to other tools such as the linker. + + -- Macro: MULTILIB_DEFAULTS + Define this macro as a C expression for the initializer of an array + of string to tell the driver program which options are defaults for + this target and thus do not need to be handled specially when using + 'MULTILIB_OPTIONS'. + + Do not define this macro if 'MULTILIB_OPTIONS' is not defined in + the target makefile fragment or if none of the options listed in + 'MULTILIB_OPTIONS' are set by default. *Note Target Fragment::. + + -- Macro: RELATIVE_PREFIX_NOT_LINKDIR + Define this macro to tell 'gcc' that it should only translate a + '-B' prefix into a '-L' linker option if the prefix indicates an + absolute file name. + + -- Macro: MD_EXEC_PREFIX + If defined, this macro is an additional prefix to try after + 'STANDARD_EXEC_PREFIX'. 'MD_EXEC_PREFIX' is not searched when the + compiler is built as a cross compiler. If you define + 'MD_EXEC_PREFIX', then be sure to add it to the list of directories + used to find the assembler in 'configure.in'. + + -- Macro: STANDARD_STARTFILE_PREFIX + Define this macro as a C string constant if you wish to override + the standard choice of 'libdir' as the default prefix to try when + searching for startup files such as 'crt0.o'. + 'STANDARD_STARTFILE_PREFIX' is not searched when the compiler is + built as a cross compiler. + + -- Macro: STANDARD_STARTFILE_PREFIX_1 + Define this macro as a C string constant if you wish to override + the standard choice of '/lib' as a prefix to try after the default + prefix when searching for startup files such as 'crt0.o'. + 'STANDARD_STARTFILE_PREFIX_1' is not searched when the compiler is + built as a cross compiler. + + -- Macro: STANDARD_STARTFILE_PREFIX_2 + Define this macro as a C string constant if you wish to override + the standard choice of '/lib' as yet another prefix to try after + the default prefix when searching for startup files such as + 'crt0.o'. 'STANDARD_STARTFILE_PREFIX_2' is not searched when the + compiler is built as a cross compiler. + + -- Macro: MD_STARTFILE_PREFIX + If defined, this macro supplies an additional prefix to try after + the standard prefixes. 'MD_EXEC_PREFIX' is not searched when the + compiler is built as a cross compiler. + + -- Macro: MD_STARTFILE_PREFIX_1 + If defined, this macro supplies yet another prefix to try after the + standard prefixes. It is not searched when the compiler is built + as a cross compiler. + + -- Macro: INIT_ENVIRONMENT + Define this macro as a C string constant if you wish to set + environment variables for programs called by the driver, such as + the assembler and loader. The driver passes the value of this + macro to 'putenv' to initialize the necessary environment + variables. + + -- Macro: LOCAL_INCLUDE_DIR + Define this macro as a C string constant if you wish to override + the standard choice of '/usr/local/include' as the default prefix + to try when searching for local header files. 'LOCAL_INCLUDE_DIR' + comes before 'NATIVE_SYSTEM_HEADER_DIR' (set in 'config.gcc', + normally '/usr/include') in the search order. + + Cross compilers do not search either '/usr/local/include' or its + replacement. + + -- Macro: NATIVE_SYSTEM_HEADER_COMPONENT + The "component" corresponding to 'NATIVE_SYSTEM_HEADER_DIR'. See + 'INCLUDE_DEFAULTS', below, for the description of components. If + you do not define this macro, no component is used. + + -- Macro: INCLUDE_DEFAULTS + Define this macro if you wish to override the entire default search + path for include files. For a native compiler, the default search + path usually consists of 'GCC_INCLUDE_DIR', 'LOCAL_INCLUDE_DIR', + 'GPLUSPLUS_INCLUDE_DIR', and 'NATIVE_SYSTEM_HEADER_DIR'. In + addition, 'GPLUSPLUS_INCLUDE_DIR' and 'GCC_INCLUDE_DIR' are defined + automatically by 'Makefile', and specify private search areas for + GCC. The directory 'GPLUSPLUS_INCLUDE_DIR' is used only for C++ + programs. + + The definition should be an initializer for an array of structures. + Each array element should have four elements: the directory name (a + string constant), the component name (also a string constant), a + flag for C++-only directories, and a flag showing that the includes + in the directory don't need to be wrapped in 'extern 'C'' when + compiling C++. Mark the end of the array with a null element. + + The component name denotes what GNU package the include file is + part of, if any, in all uppercase letters. For example, it might + be 'GCC' or 'BINUTILS'. If the package is part of a + vendor-supplied operating system, code the component name as '0'. + + For example, here is the definition used for VAX/VMS: + + #define INCLUDE_DEFAULTS \ + { \ + { "GNU_GXX_INCLUDE:", "G++", 1, 1}, \ + { "GNU_CC_INCLUDE:", "GCC", 0, 0}, \ + { "SYS$SYSROOT:[SYSLIB.]", 0, 0, 0}, \ + { ".", 0, 0, 0}, \ + { 0, 0, 0, 0} \ + } + + Here is the order of prefixes tried for exec files: + + 1. Any prefixes specified by the user with '-B'. + + 2. The environment variable 'GCC_EXEC_PREFIX' or, if 'GCC_EXEC_PREFIX' + is not set and the compiler has not been installed in the + configure-time PREFIX, the location in which the compiler has + actually been installed. + + 3. The directories specified by the environment variable + 'COMPILER_PATH'. + + 4. The macro 'STANDARD_EXEC_PREFIX', if the compiler has been + installed in the configured-time PREFIX. + + 5. The location '/usr/libexec/gcc/', but only if this is a native + compiler. + + 6. The location '/usr/lib/gcc/', but only if this is a native + compiler. + + 7. The macro 'MD_EXEC_PREFIX', if defined, but only if this is a + native compiler. + + Here is the order of prefixes tried for startfiles: + + 1. Any prefixes specified by the user with '-B'. + + 2. The environment variable 'GCC_EXEC_PREFIX' or its automatically + determined value based on the installed toolchain location. + + 3. The directories specified by the environment variable + 'LIBRARY_PATH' (or port-specific name; native only, cross compilers + do not use this). + + 4. The macro 'STANDARD_EXEC_PREFIX', but only if the toolchain is + installed in the configured PREFIX or this is a native compiler. + + 5. The location '/usr/lib/gcc/', but only if this is a native + compiler. + + 6. The macro 'MD_EXEC_PREFIX', if defined, but only if this is a + native compiler. + + 7. The macro 'MD_STARTFILE_PREFIX', if defined, but only if this is a + native compiler, or we have a target system root. + + 8. The macro 'MD_STARTFILE_PREFIX_1', if defined, but only if this is + a native compiler, or we have a target system root. + + 9. The macro 'STANDARD_STARTFILE_PREFIX', with any sysroot + modifications. If this path is relative it will be prefixed by + 'GCC_EXEC_PREFIX' and the machine suffix or 'STANDARD_EXEC_PREFIX' + and the machine suffix. + + 10. The macro 'STANDARD_STARTFILE_PREFIX_1', but only if this is a + native compiler, or we have a target system root. The default for + this macro is '/lib/'. + + 11. The macro 'STANDARD_STARTFILE_PREFIX_2', but only if this is a + native compiler, or we have a target system root. The default for + this macro is '/usr/lib/'. + + +File: gccint.info, Node: Run-time Target, Next: Per-Function Data, Prev: Driver, Up: Target Macros + +17.3 Run-time Target Specification +================================== + +Here are run-time target specifications. + + -- Macro: TARGET_CPU_CPP_BUILTINS () + This function-like macro expands to a block of code that defines + built-in preprocessor macros and assertions for the target CPU, + using the functions 'builtin_define', 'builtin_define_std' and + 'builtin_assert'. When the front end calls this macro it provides + a trailing semicolon, and since it has finished command line option + processing your code can use those results freely. + + 'builtin_assert' takes a string in the form you pass to the + command-line option '-A', such as 'cpu=mips', and creates the + assertion. 'builtin_define' takes a string in the form accepted by + option '-D' and unconditionally defines the macro. + + 'builtin_define_std' takes a string representing the name of an + object-like macro. If it doesn't lie in the user's namespace, + 'builtin_define_std' defines it unconditionally. Otherwise, it + defines a version with two leading underscores, and another version + with two leading and trailing underscores, and defines the original + only if an ISO standard was not requested on the command line. For + example, passing 'unix' defines '__unix', '__unix__' and possibly + 'unix'; passing '_mips' defines '__mips', '__mips__' and possibly + '_mips', and passing '_ABI64' defines only '_ABI64'. + + You can also test for the C dialect being compiled. The variable + 'c_language' is set to one of 'clk_c', 'clk_cplusplus' or + 'clk_objective_c'. Note that if we are preprocessing assembler, + this variable will be 'clk_c' but the function-like macro + 'preprocessing_asm_p()' will return true, so you might want to + check for that first. If you need to check for strict ANSI, the + variable 'flag_iso' can be used. The function-like macro + 'preprocessing_trad_p()' can be used to check for traditional + preprocessing. + + -- Macro: TARGET_OS_CPP_BUILTINS () + Similarly to 'TARGET_CPU_CPP_BUILTINS' but this macro is optional + and is used for the target operating system instead. + + -- Macro: TARGET_OBJFMT_CPP_BUILTINS () + Similarly to 'TARGET_CPU_CPP_BUILTINS' but this macro is optional + and is used for the target object format. 'elfos.h' uses this + macro to define '__ELF__', so you probably do not need to define it + yourself. + + -- Variable: extern int target_flags + This variable is declared in 'options.h', which is included before + any target-specific headers. + + -- Common Target Hook: int TARGET_DEFAULT_TARGET_FLAGS + This variable specifies the initial value of 'target_flags'. Its + default setting is 0. + + -- Common Target Hook: bool TARGET_HANDLE_OPTION (struct gcc_options + *OPTS, struct gcc_options *OPTS_SET, const struct + cl_decoded_option *DECODED, location_t LOC) + This hook is called whenever the user specifies one of the + target-specific options described by the '.opt' definition files + (*note Options::). It has the opportunity to do some + option-specific processing and should return true if the option is + valid. The default definition does nothing but return true. + + DECODED specifies the option and its arguments. OPTS and OPTS_SET + are the 'gcc_options' structures to be used for storing option + state, and LOC is the location at which the option was passed + ('UNKNOWN_LOCATION' except for options passed via attributes). + + -- C Target Hook: bool TARGET_HANDLE_C_OPTION (size_t CODE, const char + *ARG, int VALUE) + This target hook is called whenever the user specifies one of the + target-specific C language family options described by the '.opt' + definition files(*note Options::). It has the opportunity to do + some option-specific processing and should return true if the + option is valid. The arguments are like for + 'TARGET_HANDLE_OPTION'. The default definition does nothing but + return false. + + In general, you should use 'TARGET_HANDLE_OPTION' to handle + options. However, if processing an option requires routines that + are only available in the C (and related language) front ends, then + you should use 'TARGET_HANDLE_C_OPTION' instead. + + -- C Target Hook: tree TARGET_OBJC_CONSTRUCT_STRING_OBJECT (tree + STRING) + Targets may provide a string object type that can be used within + and between C, C++ and their respective Objective-C dialects. A + string object might, for example, embed encoding and length + information. These objects are considered opaque to the compiler + and handled as references. An ideal implementation makes the + composition of the string object match that of the Objective-C + 'NSString' ('NXString' for GNUStep), allowing efficient + interworking between C-only and Objective-C code. If a target + implements string objects then this hook should return a reference + to such an object constructed from the normal 'C' string + representation provided in STRING. At present, the hook is used by + Objective-C only, to obtain a common-format string object when the + target provides one. + + -- C Target Hook: void TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE + (const char *CLASSNAME) + Declare that Objective C class CLASSNAME is referenced by the + current TU. + + -- C Target Hook: void TARGET_OBJC_DECLARE_CLASS_DEFINITION (const char + *CLASSNAME) + Declare that Objective C class CLASSNAME is defined by the current + TU. + + -- C Target Hook: bool TARGET_STRING_OBJECT_REF_TYPE_P (const_tree + STRINGREF) + If a target implements string objects then this hook should return + 'true' if STRINGREF is a valid reference to such an object. + + -- C Target Hook: void TARGET_CHECK_STRING_OBJECT_FORMAT_ARG (tree + FORMAT_ARG, tree ARGS_LIST) + If a target implements string objects then this hook should should + provide a facility to check the function arguments in ARGS_LIST + against the format specifiers in FORMAT_ARG where the type of + FORMAT_ARG is one recognized as a valid string reference type. + + -- Target Hook: void TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE (void) + This target function is similar to the hook + 'TARGET_OPTION_OVERRIDE' but is called when the optimize level is + changed via an attribute or pragma or when it is reset at the end + of the code affected by the attribute or pragma. It is not called + at the beginning of compilation when 'TARGET_OPTION_OVERRIDE' is + called so if you want to perform these actions then, you should + have 'TARGET_OPTION_OVERRIDE' call + 'TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE'. + + -- Macro: C_COMMON_OVERRIDE_OPTIONS + This is similar to the 'TARGET_OPTION_OVERRIDE' hook but is only + used in the C language frontends (C, Objective-C, C++, + Objective-C++) and so can be used to alter option flag variables + which only exist in those frontends. + + -- Common Target Hook: const struct default_options * + TARGET_OPTION_OPTIMIZATION_TABLE + Some machines may desire to change what optimizations are performed + for various optimization levels. This variable, if defined, + describes options to enable at particular sets of optimization + levels. These options are processed once just after the + optimization level is determined and before the remainder of the + command options have been parsed, so may be overridden by other + options passed explicitly. + + This processing is run once at program startup and when the + optimization options are changed via '#pragma GCC optimize' or by + using the 'optimize' attribute. + + -- Common Target Hook: void TARGET_OPTION_INIT_STRUCT (struct + gcc_options *OPTS) + Set target-dependent initial values of fields in OPTS. + + -- Common Target Hook: void TARGET_OPTION_DEFAULT_PARAMS (void) + Set target-dependent default values for '--param' settings, using + calls to 'set_default_param_value'. + + -- Macro: SWITCHABLE_TARGET + Some targets need to switch between substantially different + subtargets during compilation. For example, the MIPS target has + one subtarget for the traditional MIPS architecture and another for + MIPS16. Source code can switch between these two subarchitectures + using the 'mips16' and 'nomips16' attributes. + + Such subtargets can differ in things like the set of available + registers, the set of available instructions, the costs of various + operations, and so on. GCC caches a lot of this type of + information in global variables, and recomputing them for each + subtarget takes a significant amount of time. The compiler + therefore provides a facility for maintaining several versions of + the global variables and quickly switching between them; see + 'target-globals.h' for details. + + Define this macro to 1 if your target needs this facility. The + default is 0. + + -- Target Hook: bool TARGET_FLOAT_EXCEPTIONS_ROUNDING_SUPPORTED_P + (void) + Returns true if the target supports IEEE 754 floating-point + exceptions and rounding modes, false otherwise. This is intended + to relate to the 'float' and 'double' types, but not necessarily + 'long double'. By default, returns true if the 'adddf3' + instruction pattern is available and false otherwise, on the + assumption that hardware floating point supports exceptions and + rounding modes but software floating point does not. + + +File: gccint.info, Node: Per-Function Data, Next: Storage Layout, Prev: Run-time Target, Up: Target Macros + +17.4 Defining data structures for per-function information. +=========================================================== + +If the target needs to store information on a per-function basis, GCC +provides a macro and a couple of variables to allow this. Note, just +using statics to store the information is a bad idea, since GCC supports +nested functions, so you can be halfway through encoding one function +when another one comes along. + + GCC defines a data structure called 'struct function' which contains +all of the data specific to an individual function. This structure +contains a field called 'machine' whose type is 'struct machine_function +*', which can be used by targets to point to their own specific data. + + If a target needs per-function specific data it should define the type +'struct machine_function' and also the macro 'INIT_EXPANDERS'. This +macro should be used to initialize the function pointer +'init_machine_status'. This pointer is explained below. + + One typical use of per-function, target specific data is to create an +RTX to hold the register containing the function's return address. This +RTX can then be used to implement the '__builtin_return_address' +function, for level 0. + + Note--earlier implementations of GCC used a single data area to hold +all of the per-function information. Thus when processing of a nested +function began the old per-function data had to be pushed onto a stack, +and when the processing was finished, it had to be popped off the stack. +GCC used to provide function pointers called 'save_machine_status' and +'restore_machine_status' to handle the saving and restoring of the +target specific information. Since the single data area approach is no +longer used, these pointers are no longer supported. + + -- Macro: INIT_EXPANDERS + Macro called to initialize any target specific information. This + macro is called once per function, before generation of any RTL has + begun. The intention of this macro is to allow the initialization + of the function pointer 'init_machine_status'. + + -- Variable: void (*)(struct function *) init_machine_status + If this function pointer is non-'NULL' it will be called once per + function, before function compilation starts, in order to allow the + target to perform any target specific initialization of the 'struct + function' structure. It is intended that this would be used to + initialize the 'machine' of that structure. + + 'struct machine_function' structures are expected to be freed by + GC. Generally, any memory that they reference must be allocated by + using GC allocation, including the structure itself. + + +File: gccint.info, Node: Storage Layout, Next: Type Layout, Prev: Per-Function Data, Up: Target Macros + +17.5 Storage Layout +=================== + +Note that the definitions of the macros in this table which are sizes or +alignments measured in bits do not need to be constant. They can be C +expressions that refer to static variables, such as the 'target_flags'. +*Note Run-time Target::. + + -- Macro: BITS_BIG_ENDIAN + Define this macro to have the value 1 if the most significant bit + in a byte has the lowest number; otherwise define it to have the + value zero. This means that bit-field instructions count from the + most significant bit. If the machine has no bit-field + instructions, then this must still be defined, but it doesn't + matter which value it is defined to. This macro need not be a + constant. + + This macro does not affect the way structure fields are packed into + bytes or words; that is controlled by 'BYTES_BIG_ENDIAN'. + + -- Macro: BYTES_BIG_ENDIAN + Define this macro to have the value 1 if the most significant byte + in a word has the lowest number. This macro need not be a + constant. + + -- Macro: WORDS_BIG_ENDIAN + Define this macro to have the value 1 if, in a multiword object, + the most significant word has the lowest number. This applies to + both memory locations and registers; see 'REG_WORDS_BIG_ENDIAN' if + the order of words in memory is not the same as the order in + registers. This macro need not be a constant. + + -- Macro: REG_WORDS_BIG_ENDIAN + On some machines, the order of words in a multiword object differs + between registers in memory. In such a situation, define this + macro to describe the order of words in a register. The macro + 'WORDS_BIG_ENDIAN' controls the order of words in memory. + + -- Macro: FLOAT_WORDS_BIG_ENDIAN + Define this macro to have the value 1 if 'DFmode', 'XFmode' or + 'TFmode' floating point numbers are stored in memory with the word + containing the sign bit at the lowest address; otherwise define it + to have the value 0. This macro need not be a constant. + + You need not define this macro if the ordering is the same as for + multi-word integers. + + -- Macro: BITS_PER_WORD + Number of bits in a word. If you do not define this macro, the + default is 'BITS_PER_UNIT * UNITS_PER_WORD'. + + -- Macro: MAX_BITS_PER_WORD + Maximum number of bits in a word. If this is undefined, the + default is 'BITS_PER_WORD'. Otherwise, it is the constant value + that is the largest value that 'BITS_PER_WORD' can have at + run-time. + + -- Macro: UNITS_PER_WORD + Number of storage units in a word; normally the size of a + general-purpose register, a power of two from 1 or 8. + + -- Macro: MIN_UNITS_PER_WORD + Minimum number of units in a word. If this is undefined, the + default is 'UNITS_PER_WORD'. Otherwise, it is the constant value + that is the smallest value that 'UNITS_PER_WORD' can have at + run-time. + + -- Macro: POINTER_SIZE + Width of a pointer, in bits. You must specify a value no wider + than the width of 'Pmode'. If it is not equal to the width of + 'Pmode', you must define 'POINTERS_EXTEND_UNSIGNED'. If you do not + specify a value the default is 'BITS_PER_WORD'. + + -- Macro: POINTERS_EXTEND_UNSIGNED + A C expression that determines how pointers should be extended from + 'ptr_mode' to either 'Pmode' or 'word_mode'. It is greater than + zero if pointers should be zero-extended, zero if they should be + sign-extended, and negative if some other sort of conversion is + needed. In the last case, the extension is done by the target's + 'ptr_extend' instruction. + + You need not define this macro if the 'ptr_mode', 'Pmode' and + 'word_mode' are all the same width. + + -- Macro: PROMOTE_MODE (M, UNSIGNEDP, TYPE) + A macro to update M and UNSIGNEDP when an object whose type is TYPE + and which has the specified mode and signedness is to be stored in + a register. This macro is only called when TYPE is a scalar type. + + On most RISC machines, which only have operations that operate on a + full register, define this macro to set M to 'word_mode' if M is an + integer mode narrower than 'BITS_PER_WORD'. In most cases, only + integer modes should be widened because wider-precision + floating-point operations are usually more expensive than their + narrower counterparts. + + For most machines, the macro definition does not change UNSIGNEDP. + However, some machines, have instructions that preferentially + handle either signed or unsigned quantities of certain modes. For + example, on the DEC Alpha, 32-bit loads from memory and 32-bit add + instructions sign-extend the result to 64 bits. On such machines, + set UNSIGNEDP according to which kind of extension is more + efficient. + + Do not define this macro if it would never modify M. + + -- Target Hook: enum machine_mode TARGET_PROMOTE_FUNCTION_MODE + (const_tree TYPE, enum machine_mode MODE, int *PUNSIGNEDP, + const_tree FUNTYPE, int FOR_RETURN) + Like 'PROMOTE_MODE', but it is applied to outgoing function + arguments or function return values. The target hook should return + the new mode and possibly change '*PUNSIGNEDP' if the promotion + should change signedness. This function is called only for scalar + _or pointer_ types. + + FOR_RETURN allows to distinguish the promotion of arguments and + return values. If it is '1', a return value is being promoted and + 'TARGET_FUNCTION_VALUE' must perform the same promotions done here. + If it is '2', the returned mode should be that of the register in + which an incoming parameter is copied, or the outgoing result is + computed; then the hook should return the same mode as + 'promote_mode', though the signedness may be different. + + TYPE can be NULL when promoting function arguments of libcalls. + + The default is to not promote arguments and return values. You can + also define the hook to + 'default_promote_function_mode_always_promote' if you would like to + apply the same rules given by 'PROMOTE_MODE'. + + -- Macro: PARM_BOUNDARY + Normal alignment required for function parameters on the stack, in + bits. All stack parameters receive at least this much alignment + regardless of data type. On most machines, this is the same as the + size of an integer. + + -- Macro: STACK_BOUNDARY + Define this macro to the minimum alignment enforced by hardware for + the stack pointer on this machine. The definition is a C + expression for the desired alignment (measured in bits). This + value is used as a default if 'PREFERRED_STACK_BOUNDARY' is not + defined. On most machines, this should be the same as + 'PARM_BOUNDARY'. + + -- Macro: PREFERRED_STACK_BOUNDARY + Define this macro if you wish to preserve a certain alignment for + the stack pointer, greater than what the hardware enforces. The + definition is a C expression for the desired alignment (measured in + bits). This macro must evaluate to a value equal to or larger than + 'STACK_BOUNDARY'. + + -- Macro: INCOMING_STACK_BOUNDARY + Define this macro if the incoming stack boundary may be different + from 'PREFERRED_STACK_BOUNDARY'. This macro must evaluate to a + value equal to or larger than 'STACK_BOUNDARY'. + + -- Macro: FUNCTION_BOUNDARY + Alignment required for a function entry point, in bits. + + -- Macro: BIGGEST_ALIGNMENT + Biggest alignment that any data type can require on this machine, + in bits. Note that this is not the biggest alignment that is + supported, just the biggest alignment that, when violated, may + cause a fault. + + -- Macro: MALLOC_ABI_ALIGNMENT + Alignment, in bits, a C conformant malloc implementation has to + provide. If not defined, the default value is 'BITS_PER_WORD'. + + -- Macro: ATTRIBUTE_ALIGNED_VALUE + Alignment used by the '__attribute__ ((aligned))' construct. If + not defined, the default value is 'BIGGEST_ALIGNMENT'. + + -- Macro: MINIMUM_ATOMIC_ALIGNMENT + If defined, the smallest alignment, in bits, that can be given to + an object that can be referenced in one operation, without + disturbing any nearby object. Normally, this is 'BITS_PER_UNIT', + but may be larger on machines that don't have byte or half-word + store operations. + + -- Macro: BIGGEST_FIELD_ALIGNMENT + Biggest alignment that any structure or union field can require on + this machine, in bits. If defined, this overrides + 'BIGGEST_ALIGNMENT' for structure and union fields only, unless the + field alignment has been set by the '__attribute__ ((aligned (N)))' + construct. + + -- Macro: ADJUST_FIELD_ALIGN (FIELD, COMPUTED) + An expression for the alignment of a structure field FIELD if the + alignment computed in the usual way (including applying of + 'BIGGEST_ALIGNMENT' and 'BIGGEST_FIELD_ALIGNMENT' to the alignment) + is COMPUTED. It overrides alignment only if the field alignment + has not been set by the '__attribute__ ((aligned (N)))' construct. + + -- Macro: MAX_STACK_ALIGNMENT + Biggest stack alignment guaranteed by the backend. Use this macro + to specify the maximum alignment of a variable on stack. + + If not defined, the default value is 'STACK_BOUNDARY'. + + -- Macro: MAX_OFILE_ALIGNMENT + Biggest alignment supported by the object file format of this + machine. Use this macro to limit the alignment which can be + specified using the '__attribute__ ((aligned (N)))' construct. If + not defined, the default value is 'BIGGEST_ALIGNMENT'. + + On systems that use ELF, the default (in 'config/elfos.h') is the + largest supported 32-bit ELF section alignment representable on a + 32-bit host e.g. '(((unsigned HOST_WIDEST_INT) 1 << 28) * 8)'. On + 32-bit ELF the largest supported section alignment in bits is + '(0x80000000 * 8)', but this is not representable on 32-bit hosts. + + -- Macro: DATA_ALIGNMENT (TYPE, BASIC-ALIGN) + If defined, a C expression to compute the alignment for a variable + in the static store. TYPE is the data type, and BASIC-ALIGN is the + alignment that the object would ordinarily have. The value of this + macro is used instead of that alignment to align the object. + + If this macro is not defined, then BASIC-ALIGN is used. + + One use of this macro is to increase alignment of medium-size data + to make it all fit in fewer cache lines. Another is to cause + character arrays to be word-aligned so that 'strcpy' calls that + copy constants to character arrays can be done inline. + + -- Macro: DATA_ABI_ALIGNMENT (TYPE, BASIC-ALIGN) + Similar to 'DATA_ALIGNMENT', but for the cases where the ABI + mandates some alignment increase, instead of optimization only + purposes. E.g. AMD x86-64 psABI says that variables with array + type larger than 15 bytes must be aligned to 16 byte boundaries. + + If this macro is not defined, then BASIC-ALIGN is used. + + -- Macro: CONSTANT_ALIGNMENT (CONSTANT, BASIC-ALIGN) + If defined, a C expression to compute the alignment given to a + constant that is being placed in memory. CONSTANT is the constant + and BASIC-ALIGN is the alignment that the object would ordinarily + have. The value of this macro is used instead of that alignment to + align the object. + + If this macro is not defined, then BASIC-ALIGN is used. + + The typical use of this macro is to increase alignment for string + constants to be word aligned so that 'strcpy' calls that copy + constants can be done inline. + + -- Macro: LOCAL_ALIGNMENT (TYPE, BASIC-ALIGN) + If defined, a C expression to compute the alignment for a variable + in the local store. TYPE is the data type, and BASIC-ALIGN is the + alignment that the object would ordinarily have. The value of this + macro is used instead of that alignment to align the object. + + If this macro is not defined, then BASIC-ALIGN is used. + + One use of this macro is to increase alignment of medium-size data + to make it all fit in fewer cache lines. + + If the value of this macro has a type, it should be an unsigned + type. + + -- Target Hook: HOST_WIDE_INT TARGET_VECTOR_ALIGNMENT (const_tree TYPE) + This hook can be used to define the alignment for a vector of type + TYPE, in order to comply with a platform ABI. The default is to + require natural alignment for vector types. The alignment returned + by this hook must be a power-of-two multiple of the default + alignment of the vector element type. + + -- Macro: STACK_SLOT_ALIGNMENT (TYPE, MODE, BASIC-ALIGN) + If defined, a C expression to compute the alignment for stack slot. + TYPE is the data type, MODE is the widest mode available, and + BASIC-ALIGN is the alignment that the slot would ordinarily have. + The value of this macro is used instead of that alignment to align + the slot. + + If this macro is not defined, then BASIC-ALIGN is used when TYPE is + 'NULL'. Otherwise, 'LOCAL_ALIGNMENT' will be used. + + This macro is to set alignment of stack slot to the maximum + alignment of all possible modes which the slot may have. + + If the value of this macro has a type, it should be an unsigned + type. + + -- Macro: LOCAL_DECL_ALIGNMENT (DECL) + If defined, a C expression to compute the alignment for a local + variable DECL. + + If this macro is not defined, then 'LOCAL_ALIGNMENT (TREE_TYPE + (DECL), DECL_ALIGN (DECL))' is used. + + One use of this macro is to increase alignment of medium-size data + to make it all fit in fewer cache lines. + + If the value of this macro has a type, it should be an unsigned + type. + + -- Macro: MINIMUM_ALIGNMENT (EXP, MODE, ALIGN) + If defined, a C expression to compute the minimum required + alignment for dynamic stack realignment purposes for EXP (a type or + decl), MODE, assuming normal alignment ALIGN. + + If this macro is not defined, then ALIGN will be used. + + -- Macro: EMPTY_FIELD_BOUNDARY + Alignment in bits to be given to a structure bit-field that follows + an empty field such as 'int : 0;'. + + If 'PCC_BITFIELD_TYPE_MATTERS' is true, it overrides this macro. + + -- Macro: STRUCTURE_SIZE_BOUNDARY + Number of bits which any structure or union's size must be a + multiple of. Each structure or union's size is rounded up to a + multiple of this. + + If you do not define this macro, the default is the same as + 'BITS_PER_UNIT'. + + -- Macro: STRICT_ALIGNMENT + Define this macro to be the value 1 if instructions will fail to + work if given data not on the nominal alignment. If instructions + will merely go slower in that case, define this macro as 0. + + -- Macro: PCC_BITFIELD_TYPE_MATTERS + Define this if you wish to imitate the way many other C compilers + handle alignment of bit-fields and the structures that contain + them. + + The behavior is that the type written for a named bit-field ('int', + 'short', or other integer type) imposes an alignment for the entire + structure, as if the structure really did contain an ordinary field + of that type. In addition, the bit-field is placed within the + structure so that it would fit within such a field, not crossing a + boundary for it. + + Thus, on most machines, a named bit-field whose type is written as + 'int' would not cross a four-byte boundary, and would force + four-byte alignment for the whole structure. (The alignment used + may not be four bytes; it is controlled by the other alignment + parameters.) + + An unnamed bit-field will not affect the alignment of the + containing structure. + + If the macro is defined, its definition should be a C expression; a + nonzero value for the expression enables this behavior. + + Note that if this macro is not defined, or its value is zero, some + bit-fields may cross more than one alignment boundary. The + compiler can support such references if there are 'insv', 'extv', + and 'extzv' insns that can directly reference memory. + + The other known way of making bit-fields work is to define + 'STRUCTURE_SIZE_BOUNDARY' as large as 'BIGGEST_ALIGNMENT'. Then + every structure can be accessed with fullwords. + + Unless the machine has bit-field instructions or you define + 'STRUCTURE_SIZE_BOUNDARY' that way, you must define + 'PCC_BITFIELD_TYPE_MATTERS' to have a nonzero value. + + If your aim is to make GCC use the same conventions for laying out + bit-fields as are used by another compiler, here is how to + investigate what the other compiler does. Compile and run this + program: + + struct foo1 + { + char x; + char :0; + char y; + }; + + struct foo2 + { + char x; + int :0; + char y; + }; + + main () + { + printf ("Size of foo1 is %d\n", + sizeof (struct foo1)); + printf ("Size of foo2 is %d\n", + sizeof (struct foo2)); + exit (0); + } + + If this prints 2 and 5, then the compiler's behavior is what you + would get from 'PCC_BITFIELD_TYPE_MATTERS'. + + -- Macro: BITFIELD_NBYTES_LIMITED + Like 'PCC_BITFIELD_TYPE_MATTERS' except that its effect is limited + to aligning a bit-field within the structure. + + -- Target Hook: bool TARGET_ALIGN_ANON_BITFIELD (void) + When 'PCC_BITFIELD_TYPE_MATTERS' is true this hook will determine + whether unnamed bitfields affect the alignment of the containing + structure. The hook should return true if the structure should + inherit the alignment requirements of an unnamed bitfield's type. + + -- Target Hook: bool TARGET_NARROW_VOLATILE_BITFIELD (void) + This target hook should return 'true' if accesses to volatile + bitfields should use the narrowest mode possible. It should return + 'false' if these accesses should use the bitfield container type. + + The default is 'false'. + + -- Target Hook: bool TARGET_MEMBER_TYPE_FORCES_BLK (const_tree FIELD, + enum machine_mode MODE) + Return true if a structure, union or array containing FIELD should + be accessed using 'BLKMODE'. + + If FIELD is the only field in the structure, MODE is its mode, + otherwise MODE is VOIDmode. MODE is provided in the case where + structures of one field would require the structure's mode to + retain the field's mode. + + Normally, this is not needed. + + -- Macro: ROUND_TYPE_ALIGN (TYPE, COMPUTED, SPECIFIED) + Define this macro as an expression for the alignment of a type + (given by TYPE as a tree node) if the alignment computed in the + usual way is COMPUTED and the alignment explicitly specified was + SPECIFIED. + + The default is to use SPECIFIED if it is larger; otherwise, use the + smaller of COMPUTED and 'BIGGEST_ALIGNMENT' + + -- Macro: MAX_FIXED_MODE_SIZE + An integer expression for the size in bits of the largest integer + machine mode that should actually be used. All integer machine + modes of this size or smaller can be used for structures and unions + with the appropriate sizes. If this macro is undefined, + 'GET_MODE_BITSIZE (DImode)' is assumed. + + -- Macro: STACK_SAVEAREA_MODE (SAVE_LEVEL) + If defined, an expression of type 'enum machine_mode' that + specifies the mode of the save area operand of a 'save_stack_LEVEL' + named pattern (*note Standard Names::). SAVE_LEVEL is one of + 'SAVE_BLOCK', 'SAVE_FUNCTION', or 'SAVE_NONLOCAL' and selects which + of the three named patterns is having its mode specified. + + You need not define this macro if it always returns 'Pmode'. You + would most commonly define this macro if the 'save_stack_LEVEL' + patterns need to support both a 32- and a 64-bit mode. + + -- Macro: STACK_SIZE_MODE + If defined, an expression of type 'enum machine_mode' that + specifies the mode of the size increment operand of an + 'allocate_stack' named pattern (*note Standard Names::). + + You need not define this macro if it always returns 'word_mode'. + You would most commonly define this macro if the 'allocate_stack' + pattern needs to support both a 32- and a 64-bit mode. + + -- Target Hook: enum machine_mode TARGET_LIBGCC_CMP_RETURN_MODE (void) + This target hook should return the mode to be used for the return + value of compare instructions expanded to libgcc calls. If not + defined 'word_mode' is returned which is the right choice for a + majority of targets. + + -- Target Hook: enum machine_mode TARGET_LIBGCC_SHIFT_COUNT_MODE (void) + This target hook should return the mode to be used for the shift + count operand of shift instructions expanded to libgcc calls. If + not defined 'word_mode' is returned which is the right choice for a + majority of targets. + + -- Target Hook: enum machine_mode TARGET_UNWIND_WORD_MODE (void) + Return machine mode to be used for '_Unwind_Word' type. The + default is to use 'word_mode'. + + -- Macro: ROUND_TOWARDS_ZERO + If defined, this macro should be true if the prevailing rounding + mode is towards zero. + + Defining this macro only affects the way 'libgcc.a' emulates + floating-point arithmetic. + + Not defining this macro is equivalent to returning zero. + + -- Macro: LARGEST_EXPONENT_IS_NORMAL (SIZE) + This macro should return true if floats with SIZE bits do not have + a NaN or infinity representation, but use the largest exponent for + normal numbers instead. + + Defining this macro only affects the way 'libgcc.a' emulates + floating-point arithmetic. + + The default definition of this macro returns false for all sizes. + + -- Target Hook: bool TARGET_MS_BITFIELD_LAYOUT_P (const_tree + RECORD_TYPE) + This target hook returns 'true' if bit-fields in the given + RECORD_TYPE are to be laid out following the rules of Microsoft + Visual C/C++, namely: (i) a bit-field won't share the same storage + unit with the previous bit-field if their underlying types have + different sizes, and the bit-field will be aligned to the highest + alignment of the underlying types of itself and of the previous + bit-field; (ii) a zero-sized bit-field will affect the alignment of + the whole enclosing structure, even if it is unnamed; except that + (iii) a zero-sized bit-field will be disregarded unless it follows + another bit-field of nonzero size. If this hook returns 'true', + other macros that control bit-field layout are ignored. + + When a bit-field is inserted into a packed record, the whole size + of the underlying type is used by one or more same-size adjacent + bit-fields (that is, if its long:3, 32 bits is used in the record, + and any additional adjacent long bit-fields are packed into the + same chunk of 32 bits. However, if the size changes, a new field + of that size is allocated). In an unpacked record, this is the + same as using alignment, but not equivalent when packing. + + If both MS bit-fields and '__attribute__((packed))' are used, the + latter will take precedence. If '__attribute__((packed))' is used + on a single field when MS bit-fields are in use, it will take + precedence for that field, but the alignment of the rest of the + structure may affect its placement. + + -- Target Hook: bool TARGET_DECIMAL_FLOAT_SUPPORTED_P (void) + Returns true if the target supports decimal floating point. + + -- Target Hook: bool TARGET_FIXED_POINT_SUPPORTED_P (void) + Returns true if the target supports fixed-point arithmetic. + + -- Target Hook: void TARGET_EXPAND_TO_RTL_HOOK (void) + This hook is called just before expansion into rtl, allowing the + target to perform additional initializations or analysis before the + expansion. For example, the rs6000 port uses it to allocate a + scratch stack slot for use in copying SDmode values between memory + and floating point registers whenever the function being expanded + has any SDmode usage. + + -- Target Hook: void TARGET_INSTANTIATE_DECLS (void) + This hook allows the backend to perform additional instantiations + on rtl that are not actually in any insns yet, but will be later. + + -- Target Hook: const char * TARGET_MANGLE_TYPE (const_tree TYPE) + If your target defines any fundamental types, or any types your + target uses should be mangled differently from the default, define + this hook to return the appropriate encoding for these types as + part of a C++ mangled name. The TYPE argument is the tree + structure representing the type to be mangled. The hook may be + applied to trees which are not target-specific fundamental types; + it should return 'NULL' for all such types, as well as arguments it + does not recognize. If the return value is not 'NULL', it must + point to a statically-allocated string constant. + + Target-specific fundamental types might be new fundamental types or + qualified versions of ordinary fundamental types. Encode new + fundamental types as 'u N NAME', where NAME is the name used for + the type in source code, and N is the length of NAME in decimal. + Encode qualified versions of ordinary types as 'U N NAME CODE', + where NAME is the name used for the type qualifier in source code, + N is the length of NAME as above, and CODE is the code used to + represent the unqualified version of this type. (See + 'write_builtin_type' in 'cp/mangle.c' for the list of codes.) In + both cases the spaces are for clarity; do not include any spaces in + your string. + + This hook is applied to types prior to typedef resolution. If the + mangled name for a particular type depends only on that type's main + variant, you can perform typedef resolution yourself using + 'TYPE_MAIN_VARIANT' before mangling. + + The default version of this hook always returns 'NULL', which is + appropriate for a target that does not define any new fundamental + types. + + +File: gccint.info, Node: Type Layout, Next: Registers, Prev: Storage Layout, Up: Target Macros + +17.6 Layout of Source Language Data Types +========================================= + +These macros define the sizes and other characteristics of the standard +basic data types used in programs being compiled. Unlike the macros in +the previous section, these apply to specific features of C and related +languages, rather than to fundamental aspects of storage layout. + + -- Macro: INT_TYPE_SIZE + A C expression for the size in bits of the type 'int' on the target + machine. If you don't define this, the default is one word. + + -- Macro: SHORT_TYPE_SIZE + A C expression for the size in bits of the type 'short' on the + target machine. If you don't define this, the default is half a + word. (If this would be less than one storage unit, it is rounded + up to one unit.) + + -- Macro: LONG_TYPE_SIZE + A C expression for the size in bits of the type 'long' on the + target machine. If you don't define this, the default is one word. + + -- Macro: ADA_LONG_TYPE_SIZE + On some machines, the size used for the Ada equivalent of the type + 'long' by a native Ada compiler differs from that used by C. In + that situation, define this macro to be a C expression to be used + for the size of that type. If you don't define this, the default + is the value of 'LONG_TYPE_SIZE'. + + -- Macro: LONG_LONG_TYPE_SIZE + A C expression for the size in bits of the type 'long long' on the + target machine. If you don't define this, the default is two + words. If you want to support GNU Ada on your machine, the value + of this macro must be at least 64. + + -- Macro: CHAR_TYPE_SIZE + A C expression for the size in bits of the type 'char' on the + target machine. If you don't define this, the default is + 'BITS_PER_UNIT'. + + -- Macro: BOOL_TYPE_SIZE + A C expression for the size in bits of the C++ type 'bool' and C99 + type '_Bool' on the target machine. If you don't define this, and + you probably shouldn't, the default is 'CHAR_TYPE_SIZE'. + + -- Macro: FLOAT_TYPE_SIZE + A C expression for the size in bits of the type 'float' on the + target machine. If you don't define this, the default is one word. + + -- Macro: DOUBLE_TYPE_SIZE + A C expression for the size in bits of the type 'double' on the + target machine. If you don't define this, the default is two + words. + + -- Macro: LONG_DOUBLE_TYPE_SIZE + A C expression for the size in bits of the type 'long double' on + the target machine. If you don't define this, the default is two + words. + + -- Macro: SHORT_FRACT_TYPE_SIZE + A C expression for the size in bits of the type 'short _Fract' on + the target machine. If you don't define this, the default is + 'BITS_PER_UNIT'. + + -- Macro: FRACT_TYPE_SIZE + A C expression for the size in bits of the type '_Fract' on the + target machine. If you don't define this, the default is + 'BITS_PER_UNIT * 2'. + + -- Macro: LONG_FRACT_TYPE_SIZE + A C expression for the size in bits of the type 'long _Fract' on + the target machine. If you don't define this, the default is + 'BITS_PER_UNIT * 4'. + + -- Macro: LONG_LONG_FRACT_TYPE_SIZE + A C expression for the size in bits of the type 'long long _Fract' + on the target machine. If you don't define this, the default is + 'BITS_PER_UNIT * 8'. + + -- Macro: SHORT_ACCUM_TYPE_SIZE + A C expression for the size in bits of the type 'short _Accum' on + the target machine. If you don't define this, the default is + 'BITS_PER_UNIT * 2'. + + -- Macro: ACCUM_TYPE_SIZE + A C expression for the size in bits of the type '_Accum' on the + target machine. If you don't define this, the default is + 'BITS_PER_UNIT * 4'. + + -- Macro: LONG_ACCUM_TYPE_SIZE + A C expression for the size in bits of the type 'long _Accum' on + the target machine. If you don't define this, the default is + 'BITS_PER_UNIT * 8'. + + -- Macro: LONG_LONG_ACCUM_TYPE_SIZE + A C expression for the size in bits of the type 'long long _Accum' + on the target machine. If you don't define this, the default is + 'BITS_PER_UNIT * 16'. + + -- Macro: LIBGCC2_LONG_DOUBLE_TYPE_SIZE + Define this macro if 'LONG_DOUBLE_TYPE_SIZE' is not constant or if + you want routines in 'libgcc2.a' for a size other than + 'LONG_DOUBLE_TYPE_SIZE'. If you don't define this, the default is + 'LONG_DOUBLE_TYPE_SIZE'. + + -- Macro: LIBGCC2_HAS_DF_MODE + Define this macro if neither 'DOUBLE_TYPE_SIZE' nor + 'LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 'DFmode' but you want 'DFmode' + routines in 'libgcc2.a' anyway. If you don't define this and + either 'DOUBLE_TYPE_SIZE' or 'LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 64 + then the default is 1, otherwise it is 0. + + -- Macro: LIBGCC2_HAS_XF_MODE + Define this macro if 'LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is not + 'XFmode' but you want 'XFmode' routines in 'libgcc2.a' anyway. If + you don't define this and 'LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 80 + then the default is 1, otherwise it is 0. + + -- Macro: LIBGCC2_HAS_TF_MODE + Define this macro if 'LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is not + 'TFmode' but you want 'TFmode' routines in 'libgcc2.a' anyway. If + you don't define this and 'LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is 128 + then the default is 1, otherwise it is 0. + + -- Macro: LIBGCC2_GNU_PREFIX + This macro corresponds to the 'TARGET_LIBFUNC_GNU_PREFIX' target + hook and should be defined if that hook is overriden to be true. + It causes function names in libgcc to be changed to use a '__gnu_' + prefix for their name rather than the default '__'. A port which + uses this macro should also arrange to use 't-gnu-prefix' in the + libgcc 'config.host'. + + -- Macro: SF_SIZE + -- Macro: DF_SIZE + -- Macro: XF_SIZE + -- Macro: TF_SIZE + Define these macros to be the size in bits of the mantissa of + 'SFmode', 'DFmode', 'XFmode' and 'TFmode' values, if the defaults + in 'libgcc2.h' are inappropriate. By default, 'FLT_MANT_DIG' is + used for 'SF_SIZE', 'LDBL_MANT_DIG' for 'XF_SIZE' and 'TF_SIZE', + and 'DBL_MANT_DIG' or 'LDBL_MANT_DIG' for 'DF_SIZE' according to + whether 'DOUBLE_TYPE_SIZE' or 'LIBGCC2_LONG_DOUBLE_TYPE_SIZE' is + 64. + + -- Macro: TARGET_FLT_EVAL_METHOD + A C expression for the value for 'FLT_EVAL_METHOD' in 'float.h', + assuming, if applicable, that the floating-point control word is in + its default state. If you do not define this macro the value of + 'FLT_EVAL_METHOD' will be zero. + + -- Macro: WIDEST_HARDWARE_FP_SIZE + A C expression for the size in bits of the widest floating-point + format supported by the hardware. If you define this macro, you + must specify a value less than or equal to the value of + 'LONG_DOUBLE_TYPE_SIZE'. If you do not define this macro, the + value of 'LONG_DOUBLE_TYPE_SIZE' is the default. + + -- Macro: DEFAULT_SIGNED_CHAR + An expression whose value is 1 or 0, according to whether the type + 'char' should be signed or unsigned by default. The user can + always override this default with the options '-fsigned-char' and + '-funsigned-char'. + + -- Target Hook: bool TARGET_DEFAULT_SHORT_ENUMS (void) + This target hook should return true if the compiler should give an + 'enum' type only as many bytes as it takes to represent the range + of possible values of that type. It should return false if all + 'enum' types should be allocated like 'int'. + + The default is to return false. + + -- Macro: SIZE_TYPE + A C expression for a string describing the name of the data type to + use for size values. The typedef name 'size_t' is defined using + the contents of the string. + + The string can contain more than one keyword. If so, separate them + with spaces, and write first any length keyword, then 'unsigned' if + appropriate, and finally 'int'. The string must exactly match one + of the data type names defined in the function + 'c_common_nodes_and_builtins' in the file 'c-family/c-common.c'. + You may not omit 'int' or change the order--that would cause the + compiler to crash on startup. + + If you don't define this macro, the default is '"long unsigned + int"'. + + -- Macro: SIZETYPE + GCC defines internal types ('sizetype', 'ssizetype', 'bitsizetype' + and 'sbitsizetype') for expressions dealing with size. This macro + is a C expression for a string describing the name of the data type + from which the precision of 'sizetype' is extracted. + + The string has the same restrictions as 'SIZE_TYPE' string. + + If you don't define this macro, the default is 'SIZE_TYPE'. + + -- Macro: PTRDIFF_TYPE + A C expression for a string describing the name of the data type to + use for the result of subtracting two pointers. The typedef name + 'ptrdiff_t' is defined using the contents of the string. See + 'SIZE_TYPE' above for more information. + + If you don't define this macro, the default is '"long int"'. + + -- Macro: WCHAR_TYPE + A C expression for a string describing the name of the data type to + use for wide characters. The typedef name 'wchar_t' is defined + using the contents of the string. See 'SIZE_TYPE' above for more + information. + + If you don't define this macro, the default is '"int"'. + + -- Macro: WCHAR_TYPE_SIZE + A C expression for the size in bits of the data type for wide + characters. This is used in 'cpp', which cannot make use of + 'WCHAR_TYPE'. + + -- Macro: WINT_TYPE + A C expression for a string describing the name of the data type to + use for wide characters passed to 'printf' and returned from + 'getwc'. The typedef name 'wint_t' is defined using the contents + of the string. See 'SIZE_TYPE' above for more information. + + If you don't define this macro, the default is '"unsigned int"'. + + -- Macro: INTMAX_TYPE + A C expression for a string describing the name of the data type + that can represent any value of any standard or extended signed + integer type. The typedef name 'intmax_t' is defined using the + contents of the string. See 'SIZE_TYPE' above for more + information. + + If you don't define this macro, the default is the first of + '"int"', '"long int"', or '"long long int"' that has as much + precision as 'long long int'. + + -- Macro: UINTMAX_TYPE + A C expression for a string describing the name of the data type + that can represent any value of any standard or extended unsigned + integer type. The typedef name 'uintmax_t' is defined using the + contents of the string. See 'SIZE_TYPE' above for more + information. + + If you don't define this macro, the default is the first of + '"unsigned int"', '"long unsigned int"', or '"long long unsigned + int"' that has as much precision as 'long long unsigned int'. + + -- Macro: SIG_ATOMIC_TYPE + -- Macro: INT8_TYPE + -- Macro: INT16_TYPE + -- Macro: INT32_TYPE + -- Macro: INT64_TYPE + -- Macro: UINT8_TYPE + -- Macro: UINT16_TYPE + -- Macro: UINT32_TYPE + -- Macro: UINT64_TYPE + -- Macro: INT_LEAST8_TYPE + -- Macro: INT_LEAST16_TYPE + -- Macro: INT_LEAST32_TYPE + -- Macro: INT_LEAST64_TYPE + -- Macro: UINT_LEAST8_TYPE + -- Macro: UINT_LEAST16_TYPE + -- Macro: UINT_LEAST32_TYPE + -- Macro: UINT_LEAST64_TYPE + -- Macro: INT_FAST8_TYPE + -- Macro: INT_FAST16_TYPE + -- Macro: INT_FAST32_TYPE + -- Macro: INT_FAST64_TYPE + -- Macro: UINT_FAST8_TYPE + -- Macro: UINT_FAST16_TYPE + -- Macro: UINT_FAST32_TYPE + -- Macro: UINT_FAST64_TYPE + -- Macro: INTPTR_TYPE + -- Macro: UINTPTR_TYPE + C expressions for the standard types 'sig_atomic_t', 'int8_t', + 'int16_t', 'int32_t', 'int64_t', 'uint8_t', 'uint16_t', 'uint32_t', + 'uint64_t', 'int_least8_t', 'int_least16_t', 'int_least32_t', + 'int_least64_t', 'uint_least8_t', 'uint_least16_t', + 'uint_least32_t', 'uint_least64_t', 'int_fast8_t', 'int_fast16_t', + 'int_fast32_t', 'int_fast64_t', 'uint_fast8_t', 'uint_fast16_t', + 'uint_fast32_t', 'uint_fast64_t', 'intptr_t', and 'uintptr_t'. See + 'SIZE_TYPE' above for more information. + + If any of these macros evaluates to a null pointer, the + corresponding type is not supported; if GCC is configured to + provide '<stdint.h>' in such a case, the header provided may not + conform to C99, depending on the type in question. The defaults + for all of these macros are null pointers. + + -- Macro: TARGET_PTRMEMFUNC_VBIT_LOCATION + The C++ compiler represents a pointer-to-member-function with a + struct that looks like: + + struct { + union { + void (*fn)(); + ptrdiff_t vtable_index; + }; + ptrdiff_t delta; + }; + + The C++ compiler must use one bit to indicate whether the function + that will be called through a pointer-to-member-function is + virtual. Normally, we assume that the low-order bit of a function + pointer must always be zero. Then, by ensuring that the + vtable_index is odd, we can distinguish which variant of the union + is in use. But, on some platforms function pointers can be odd, + and so this doesn't work. In that case, we use the low-order bit + of the 'delta' field, and shift the remainder of the 'delta' field + to the left. + + GCC will automatically make the right selection about where to + store this bit using the 'FUNCTION_BOUNDARY' setting for your + platform. However, some platforms such as ARM/Thumb have + 'FUNCTION_BOUNDARY' set such that functions always start at even + addresses, but the lowest bit of pointers to functions indicate + whether the function at that address is in ARM or Thumb mode. If + this is the case of your architecture, you should define this macro + to 'ptrmemfunc_vbit_in_delta'. + + In general, you should not have to define this macro. On + architectures in which function addresses are always even, + according to 'FUNCTION_BOUNDARY', GCC will automatically define + this macro to 'ptrmemfunc_vbit_in_pfn'. + + -- Macro: TARGET_VTABLE_USES_DESCRIPTORS + Normally, the C++ compiler uses function pointers in vtables. This + macro allows the target to change to use "function descriptors" + instead. Function descriptors are found on targets for whom a + function pointer is actually a small data structure. Normally the + data structure consists of the actual code address plus a data + pointer to which the function's data is relative. + + If vtables are used, the value of this macro should be the number + of words that the function descriptor occupies. + + -- Macro: TARGET_VTABLE_ENTRY_ALIGN + By default, the vtable entries are void pointers, the so the + alignment is the same as pointer alignment. The value of this + macro specifies the alignment of the vtable entry in bits. It + should be defined only when special alignment is necessary. */ + + -- Macro: TARGET_VTABLE_DATA_ENTRY_DISTANCE + There are a few non-descriptor entries in the vtable at offsets + below zero. If these entries must be padded (say, to preserve the + alignment specified by 'TARGET_VTABLE_ENTRY_ALIGN'), set this to + the number of words in each data entry. + + +File: gccint.info, Node: Registers, Next: Register Classes, Prev: Type Layout, Up: Target Macros + +17.7 Register Usage +=================== + +This section explains how to describe what registers the target machine +has, and how (in general) they can be used. + + The description of which registers a specific instruction can use is +done with register classes; see *note Register Classes::. For +information on using registers to access a stack frame, see *note Frame +Registers::. For passing values in registers, see *note Register +Arguments::. For returning values in registers, see *note Scalar +Return::. + +* Menu: + +* Register Basics:: Number and kinds of registers. +* Allocation Order:: Order in which registers are allocated. +* Values in Registers:: What kinds of values each reg can hold. +* Leaf Functions:: Renumbering registers for leaf functions. +* Stack Registers:: Handling a register stack such as 80387. + + +File: gccint.info, Node: Register Basics, Next: Allocation Order, Up: Registers + +17.7.1 Basic Characteristics of Registers +----------------------------------------- + +Registers have various characteristics. + + -- Macro: FIRST_PSEUDO_REGISTER + Number of hardware registers known to the compiler. They receive + numbers 0 through 'FIRST_PSEUDO_REGISTER-1'; thus, the first pseudo + register's number really is assigned the number + 'FIRST_PSEUDO_REGISTER'. + + -- Macro: FIXED_REGISTERS + An initializer that says which registers are used for fixed + purposes all throughout the compiled code and are therefore not + available for general allocation. These would include the stack + pointer, the frame pointer (except on machines where that can be + used as a general register when no frame pointer is needed), the + program counter on machines where that is considered one of the + addressable registers, and any other numbered register with a + standard use. + + This information is expressed as a sequence of numbers, separated + by commas and surrounded by braces. The Nth number is 1 if + register N is fixed, 0 otherwise. + + The table initialized from this macro, and the table initialized by + the following one, may be overridden at run time either + automatically, by the actions of the macro + 'CONDITIONAL_REGISTER_USAGE', or by the user with the command + options '-ffixed-REG', '-fcall-used-REG' and '-fcall-saved-REG'. + + -- Macro: CALL_USED_REGISTERS + Like 'FIXED_REGISTERS' but has 1 for each register that is + clobbered (in general) by function calls as well as for fixed + registers. This macro therefore identifies the registers that are + not available for general allocation of values that must live + across function calls. + + If a register has 0 in 'CALL_USED_REGISTERS', the compiler + automatically saves it on function entry and restores it on + function exit, if the register is used within the function. + + -- Macro: CALL_REALLY_USED_REGISTERS + Like 'CALL_USED_REGISTERS' except this macro doesn't require that + the entire set of 'FIXED_REGISTERS' be included. + ('CALL_USED_REGISTERS' must be a superset of 'FIXED_REGISTERS'). + This macro is optional. If not specified, it defaults to the value + of 'CALL_USED_REGISTERS'. + + -- Macro: HARD_REGNO_CALL_PART_CLOBBERED (REGNO, MODE) + A C expression that is nonzero if it is not permissible to store a + value of mode MODE in hard register number REGNO across a call + without some part of it being clobbered. For most machines this + macro need not be defined. It is only required for machines that + do not preserve the entire contents of a register across a call. + + -- Target Hook: void TARGET_CONDITIONAL_REGISTER_USAGE (void) + This hook may conditionally modify five variables 'fixed_regs', + 'call_used_regs', 'global_regs', 'reg_names', and + 'reg_class_contents', to take into account any dependence of these + register sets on target flags. The first three of these are of + type 'char []' (interpreted as Boolean vectors). 'global_regs' is + a 'const char *[]', and 'reg_class_contents' is a 'HARD_REG_SET'. + Before the macro is called, 'fixed_regs', 'call_used_regs', + 'reg_class_contents', and 'reg_names' have been initialized from + 'FIXED_REGISTERS', 'CALL_USED_REGISTERS', 'REG_CLASS_CONTENTS', and + 'REGISTER_NAMES', respectively. 'global_regs' has been cleared, + and any '-ffixed-REG', '-fcall-used-REG' and '-fcall-saved-REG' + command options have been applied. + + If the usage of an entire class of registers depends on the target + flags, you may indicate this to GCC by using this macro to modify + 'fixed_regs' and 'call_used_regs' to 1 for each of the registers in + the classes which should not be used by GCC. Also define the macro + 'REG_CLASS_FROM_LETTER' / 'REG_CLASS_FROM_CONSTRAINT' to return + 'NO_REGS' if it is called with a letter for a class that shouldn't + be used. + + (However, if this class is not included in 'GENERAL_REGS' and all + of the insn patterns whose constraints permit this class are + controlled by target switches, then GCC will automatically avoid + using these registers when the target switches are opposed to + them.) + + -- Macro: INCOMING_REGNO (OUT) + Define this macro if the target machine has register windows. This + C expression returns the register number as seen by the called + function corresponding to the register number OUT as seen by the + calling function. Return OUT if register number OUT is not an + outbound register. + + -- Macro: OUTGOING_REGNO (IN) + Define this macro if the target machine has register windows. This + C expression returns the register number as seen by the calling + function corresponding to the register number IN as seen by the + called function. Return IN if register number IN is not an inbound + register. + + -- Macro: LOCAL_REGNO (REGNO) + Define this macro if the target machine has register windows. This + C expression returns true if the register is call-saved but is in + the register window. Unlike most call-saved registers, such + registers need not be explicitly restored on function exit or + during non-local gotos. + + -- Macro: PC_REGNUM + If the program counter has a register number, define this as that + register number. Otherwise, do not define it. + + +File: gccint.info, Node: Allocation Order, Next: Values in Registers, Prev: Register Basics, Up: Registers + +17.7.2 Order of Allocation of Registers +--------------------------------------- + +Registers are allocated in order. + + -- Macro: REG_ALLOC_ORDER + If defined, an initializer for a vector of integers, containing the + numbers of hard registers in the order in which GCC should prefer + to use them (from most preferred to least). + + If this macro is not defined, registers are used lowest numbered + first (all else being equal). + + One use of this macro is on machines where the highest numbered + registers must always be saved and the save-multiple-registers + instruction supports only sequences of consecutive registers. On + such machines, define 'REG_ALLOC_ORDER' to be an initializer that + lists the highest numbered allocable register first. + + -- Macro: ADJUST_REG_ALLOC_ORDER + A C statement (sans semicolon) to choose the order in which to + allocate hard registers for pseudo-registers local to a basic + block. + + Store the desired register order in the array 'reg_alloc_order'. + Element 0 should be the register to allocate first; element 1, the + next register; and so on. + + The macro body should not assume anything about the contents of + 'reg_alloc_order' before execution of the macro. + + On most machines, it is not necessary to define this macro. + + -- Macro: HONOR_REG_ALLOC_ORDER + Normally, IRA tries to estimate the costs for saving a register in + the prologue and restoring it in the epilogue. This discourages it + from using call-saved registers. If a machine wants to ensure that + IRA allocates registers in the order given by REG_ALLOC_ORDER even + if some call-saved registers appear earlier than call-used ones, + this macro should be defined. + + -- Macro: IRA_HARD_REGNO_ADD_COST_MULTIPLIER (REGNO) + In some case register allocation order is not enough for the + Integrated Register Allocator (IRA) to generate a good code. If + this macro is defined, it should return a floating point value + based on REGNO. The cost of using REGNO for a pseudo will be + increased by approximately the pseudo's usage frequency times the + value returned by this macro. Not defining this macro is + equivalent to having it always return '0.0'. + + On most machines, it is not necessary to define this macro. + + +File: gccint.info, Node: Values in Registers, Next: Leaf Functions, Prev: Allocation Order, Up: Registers + +17.7.3 How Values Fit in Registers +---------------------------------- + +This section discusses the macros that describe which kinds of values +(specifically, which machine modes) each register can hold, and how many +consecutive registers are needed for a given mode. + + -- Macro: HARD_REGNO_NREGS (REGNO, MODE) + A C expression for the number of consecutive hard registers, + starting at register number REGNO, required to hold a value of mode + MODE. This macro must never return zero, even if a register cannot + hold the requested mode - indicate that with HARD_REGNO_MODE_OK + and/or CANNOT_CHANGE_MODE_CLASS instead. + + On a machine where all registers are exactly one word, a suitable + definition of this macro is + + #define HARD_REGNO_NREGS(REGNO, MODE) \ + ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \ + / UNITS_PER_WORD) + + -- Macro: HARD_REGNO_NREGS_HAS_PADDING (REGNO, MODE) + A C expression that is nonzero if a value of mode MODE, stored in + memory, ends with padding that causes it to take up more space than + in registers starting at register number REGNO (as determined by + multiplying GCC's notion of the size of the register when + containing this mode by the number of registers returned by + 'HARD_REGNO_NREGS'). By default this is zero. + + For example, if a floating-point value is stored in three 32-bit + registers but takes up 128 bits in memory, then this would be + nonzero. + + This macros only needs to be defined if there are cases where + 'subreg_get_info' would otherwise wrongly determine that a 'subreg' + can be represented by an offset to the register number, when in + fact such a 'subreg' would contain some of the padding not stored + in registers and so not be representable. + + -- Macro: HARD_REGNO_NREGS_WITH_PADDING (REGNO, MODE) + For values of REGNO and MODE for which + 'HARD_REGNO_NREGS_HAS_PADDING' returns nonzero, a C expression + returning the greater number of registers required to hold the + value including any padding. In the example above, the value would + be four. + + -- Macro: REGMODE_NATURAL_SIZE (MODE) + Define this macro if the natural size of registers that hold values + of mode MODE is not the word size. It is a C expression that + should give the natural size in bytes for the specified mode. It + is used by the register allocator to try to optimize its results. + This happens for example on SPARC 64-bit where the natural size of + floating-point registers is still 32-bit. + + -- Macro: HARD_REGNO_MODE_OK (REGNO, MODE) + A C expression that is nonzero if it is permissible to store a + value of mode MODE in hard register number REGNO (or in several + registers starting with that one). For a machine where all + registers are equivalent, a suitable definition is + + #define HARD_REGNO_MODE_OK(REGNO, MODE) 1 + + You need not include code to check for the numbers of fixed + registers, because the allocation mechanism considers them to be + always occupied. + + On some machines, double-precision values must be kept in even/odd + register pairs. You can implement that by defining this macro to + reject odd register numbers for such modes. + + The minimum requirement for a mode to be OK in a register is that + the 'movMODE' instruction pattern support moves between the + register and other hard register in the same class and that moving + a value into the register and back out not alter it. + + Since the same instruction used to move 'word_mode' will work for + all narrower integer modes, it is not necessary on any machine for + 'HARD_REGNO_MODE_OK' to distinguish between these modes, provided + you define patterns 'movhi', etc., to take advantage of this. This + is useful because of the interaction between 'HARD_REGNO_MODE_OK' + and 'MODES_TIEABLE_P'; it is very desirable for all integer modes + to be tieable. + + Many machines have special registers for floating point arithmetic. + Often people assume that floating point machine modes are allowed + only in floating point registers. This is not true. Any registers + that can hold integers can safely _hold_ a floating point machine + mode, whether or not floating arithmetic can be done on it in those + registers. Integer move instructions can be used to move the + values. + + On some machines, though, the converse is true: fixed-point machine + modes may not go in floating registers. This is true if the + floating registers normalize any value stored in them, because + storing a non-floating value there would garble it. In this case, + 'HARD_REGNO_MODE_OK' should reject fixed-point machine modes in + floating registers. But if the floating registers do not + automatically normalize, if you can store any bit pattern in one + and retrieve it unchanged without a trap, then any machine mode may + go in a floating register, so you can define this macro to say so. + + The primary significance of special floating registers is rather + that they are the registers acceptable in floating point arithmetic + instructions. However, this is of no concern to + 'HARD_REGNO_MODE_OK'. You handle it by writing the proper + constraints for those instructions. + + On some machines, the floating registers are especially slow to + access, so that it is better to store a value in a stack frame than + in such a register if floating point arithmetic is not being done. + As long as the floating registers are not in class 'GENERAL_REGS', + they will not be used unless some pattern's constraint asks for + one. + + -- Macro: HARD_REGNO_RENAME_OK (FROM, TO) + A C expression that is nonzero if it is OK to rename a hard + register FROM to another hard register TO. + + One common use of this macro is to prevent renaming of a register + to another register that is not saved by a prologue in an interrupt + handler. + + The default is always nonzero. + + -- Macro: MODES_TIEABLE_P (MODE1, MODE2) + A C expression that is nonzero if a value of mode MODE1 is + accessible in mode MODE2 without copying. + + If 'HARD_REGNO_MODE_OK (R, MODE1)' and 'HARD_REGNO_MODE_OK (R, + MODE2)' are always the same for any R, then 'MODES_TIEABLE_P + (MODE1, MODE2)' should be nonzero. If they differ for any R, you + should define this macro to return zero unless some other mechanism + ensures the accessibility of the value in a narrower mode. + + You should define this macro to return nonzero in as many cases as + possible since doing so will allow GCC to perform better register + allocation. + + -- Target Hook: bool TARGET_HARD_REGNO_SCRATCH_OK (unsigned int REGNO) + This target hook should return 'true' if it is OK to use a hard + register REGNO as scratch reg in peephole2. + + One common use of this macro is to prevent using of a register that + is not saved by a prologue in an interrupt handler. + + The default version of this hook always returns 'true'. + + -- Macro: AVOID_CCMODE_COPIES + Define this macro if the compiler should avoid copies to/from + 'CCmode' registers. You should only define this macro if support + for copying to/from 'CCmode' is incomplete. + + +File: gccint.info, Node: Leaf Functions, Next: Stack Registers, Prev: Values in Registers, Up: Registers + +17.7.4 Handling Leaf Functions +------------------------------ + +On some machines, a leaf function (i.e., one which makes no calls) can +run more efficiently if it does not make its own register window. Often +this means it is required to receive its arguments in the registers +where they are passed by the caller, instead of the registers where they +would normally arrive. + + The special treatment for leaf functions generally applies only when +other conditions are met; for example, often they may use only those +registers for its own variables and temporaries. We use the term "leaf +function" to mean a function that is suitable for this special handling, +so that functions with no calls are not necessarily "leaf functions". + + GCC assigns register numbers before it knows whether the function is +suitable for leaf function treatment. So it needs to renumber the +registers in order to output a leaf function. The following macros +accomplish this. + + -- Macro: LEAF_REGISTERS + Name of a char vector, indexed by hard register number, which + contains 1 for a register that is allowable in a candidate for leaf + function treatment. + + If leaf function treatment involves renumbering the registers, then + the registers marked here should be the ones before + renumbering--those that GCC would ordinarily allocate. The + registers which will actually be used in the assembler code, after + renumbering, should not be marked with 1 in this vector. + + Define this macro only if the target machine offers a way to + optimize the treatment of leaf functions. + + -- Macro: LEAF_REG_REMAP (REGNO) + A C expression whose value is the register number to which REGNO + should be renumbered, when a function is treated as a leaf + function. + + If REGNO is a register number which should not appear in a leaf + function before renumbering, then the expression should yield -1, + which will cause the compiler to abort. + + Define this macro only if the target machine offers a way to + optimize the treatment of leaf functions, and registers need to be + renumbered to do this. + + 'TARGET_ASM_FUNCTION_PROLOGUE' and 'TARGET_ASM_FUNCTION_EPILOGUE' must +usually treat leaf functions specially. They can test the C variable +'current_function_is_leaf' which is nonzero for leaf functions. +'current_function_is_leaf' is set prior to local register allocation and +is valid for the remaining compiler passes. They can also test the C +variable 'current_function_uses_only_leaf_regs' which is nonzero for +leaf functions which only use leaf registers. +'current_function_uses_only_leaf_regs' is valid after all passes that +modify the instructions have been run and is only useful if +'LEAF_REGISTERS' is defined. + + +File: gccint.info, Node: Stack Registers, Prev: Leaf Functions, Up: Registers + +17.7.5 Registers That Form a Stack +---------------------------------- + +There are special features to handle computers where some of the +"registers" form a stack. Stack registers are normally written by +pushing onto the stack, and are numbered relative to the top of the +stack. + + Currently, GCC can only handle one group of stack-like registers, and +they must be consecutively numbered. Furthermore, the existing support +for stack-like registers is specific to the 80387 floating point +coprocessor. If you have a new architecture that uses stack-like +registers, you will need to do substantial work on 'reg-stack.c' and +write your machine description to cooperate with it, as well as defining +these macros. + + -- Macro: STACK_REGS + Define this if the machine has any stack-like registers. + + -- Macro: STACK_REG_COVER_CLASS + This is a cover class containing the stack registers. Define this + if the machine has any stack-like registers. + + -- Macro: FIRST_STACK_REG + The number of the first stack-like register. This one is the top + of the stack. + + -- Macro: LAST_STACK_REG + The number of the last stack-like register. This one is the bottom + of the stack. + + +File: gccint.info, Node: Register Classes, Next: Old Constraints, Prev: Registers, Up: Target Macros + +17.8 Register Classes +===================== + +On many machines, the numbered registers are not all equivalent. For +example, certain registers may not be allowed for indexed addressing; +certain registers may not be allowed in some instructions. These +machine restrictions are described to the compiler using "register +classes". + + You define a number of register classes, giving each one a name and +saying which of the registers belong to it. Then you can specify +register classes that are allowed as operands to particular instruction +patterns. + + In general, each register will belong to several classes. In fact, one +class must be named 'ALL_REGS' and contain all the registers. Another +class must be named 'NO_REGS' and contain no registers. Often the union +of two classes will be another class; however, this is not required. + + One of the classes must be named 'GENERAL_REGS'. There is nothing +terribly special about the name, but the operand constraint letters 'r' +and 'g' specify this class. If 'GENERAL_REGS' is the same as +'ALL_REGS', just define it as a macro which expands to 'ALL_REGS'. + + Order the classes so that if class X is contained in class Y then X has +a lower class number than Y. + + The way classes other than 'GENERAL_REGS' are specified in operand +constraints is through machine-dependent operand constraint letters. +You can define such letters to correspond to various classes, then use +them in operand constraints. + + You must define the narrowest register classes for allocatable +registers, so that each class either has no subclasses, or that for some +mode, the move cost between registers within the class is cheaper than +moving a register in the class to or from memory (*note Costs::). + + You should define a class for the union of two classes whenever some +instruction allows both classes. For example, if an instruction allows +either a floating point (coprocessor) register or a general register for +a certain operand, you should define a class 'FLOAT_OR_GENERAL_REGS' +which includes both of them. Otherwise you will get suboptimal code, or +even internal compiler errors when reload cannot find a register in the +class computed via 'reg_class_subunion'. + + You must also specify certain redundant information about the register +classes: for each class, which classes contain it and which ones are +contained in it; for each pair of classes, the largest class contained +in their union. + + When a value occupying several consecutive registers is expected in a +certain class, all the registers used must belong to that class. +Therefore, register classes cannot be used to enforce a requirement for +a register pair to start with an even-numbered register. The way to +specify this requirement is with 'HARD_REGNO_MODE_OK'. + + Register classes used for input-operands of bitwise-and or shift +instructions have a special requirement: each such class must have, for +each fixed-point machine mode, a subclass whose registers can transfer +that mode to or from memory. For example, on some machines, the +operations for single-byte values ('QImode') are limited to certain +registers. When this is so, each register class that is used in a +bitwise-and or shift instruction must have a subclass consisting of +registers from which single-byte values can be loaded or stored. This +is so that 'PREFERRED_RELOAD_CLASS' can always have a possible value to +return. + + -- Data type: enum reg_class + An enumerated type that must be defined with all the register class + names as enumerated values. 'NO_REGS' must be first. 'ALL_REGS' + must be the last register class, followed by one more enumerated + value, 'LIM_REG_CLASSES', which is not a register class but rather + tells how many classes there are. + + Each register class has a number, which is the value of casting the + class name to type 'int'. The number serves as an index in many of + the tables described below. + + -- Macro: N_REG_CLASSES + The number of distinct register classes, defined as follows: + + #define N_REG_CLASSES (int) LIM_REG_CLASSES + + -- Macro: REG_CLASS_NAMES + An initializer containing the names of the register classes as C + string constants. These names are used in writing some of the + debugging dumps. + + -- Macro: REG_CLASS_CONTENTS + An initializer containing the contents of the register classes, as + integers which are bit masks. The Nth integer specifies the + contents of class N. The way the integer MASK is interpreted is + that register R is in the class if 'MASK & (1 << R)' is 1. + + When the machine has more than 32 registers, an integer does not + suffice. Then the integers are replaced by sub-initializers, + braced groupings containing several integers. Each sub-initializer + must be suitable as an initializer for the type 'HARD_REG_SET' + which is defined in 'hard-reg-set.h'. In this situation, the first + integer in each sub-initializer corresponds to registers 0 through + 31, the second integer to registers 32 through 63, and so on. + + -- Macro: REGNO_REG_CLASS (REGNO) + A C expression whose value is a register class containing hard + register REGNO. In general there is more than one such class; + choose a class which is "minimal", meaning that no smaller class + also contains the register. + + -- Macro: BASE_REG_CLASS + A macro whose definition is the name of the class to which a valid + base register must belong. A base register is one used in an + address which is the register value plus a displacement. + + -- Macro: MODE_BASE_REG_CLASS (MODE) + This is a variation of the 'BASE_REG_CLASS' macro which allows the + selection of a base register in a mode dependent manner. If MODE + is VOIDmode then it should return the same value as + 'BASE_REG_CLASS'. + + -- Macro: MODE_BASE_REG_REG_CLASS (MODE) + A C expression whose value is the register class to which a valid + base register must belong in order to be used in a base plus index + register address. You should define this macro if base plus index + addresses have different requirements than other base register + uses. + + -- Macro: MODE_CODE_BASE_REG_CLASS (MODE, ADDRESS_SPACE, OUTER_CODE, + INDEX_CODE) + A C expression whose value is the register class to which a valid + base register for a memory reference in mode MODE to address space + ADDRESS_SPACE must belong. OUTER_CODE and INDEX_CODE define the + context in which the base register occurs. OUTER_CODE is the code + of the immediately enclosing expression ('MEM' for the top level of + an address, 'ADDRESS' for something that occurs in an + 'address_operand'). INDEX_CODE is the code of the corresponding + index expression if OUTER_CODE is 'PLUS'; 'SCRATCH' otherwise. + + -- Macro: INDEX_REG_CLASS + A macro whose definition is the name of the class to which a valid + index register must belong. An index register is one used in an + address where its value is either multiplied by a scale factor or + added to another register (as well as added to a displacement). + + -- Macro: REGNO_OK_FOR_BASE_P (NUM) + A C expression which is nonzero if register number NUM is suitable + for use as a base register in operand addresses. + + -- Macro: REGNO_MODE_OK_FOR_BASE_P (NUM, MODE) + A C expression that is just like 'REGNO_OK_FOR_BASE_P', except that + that expression may examine the mode of the memory reference in + MODE. You should define this macro if the mode of the memory + reference affects whether a register may be used as a base + register. If you define this macro, the compiler will use it + instead of 'REGNO_OK_FOR_BASE_P'. The mode may be 'VOIDmode' for + addresses that appear outside a 'MEM', i.e., as an + 'address_operand'. + + -- Macro: REGNO_MODE_OK_FOR_REG_BASE_P (NUM, MODE) + A C expression which is nonzero if register number NUM is suitable + for use as a base register in base plus index operand addresses, + accessing memory in mode MODE. It may be either a suitable hard + register or a pseudo register that has been allocated such a hard + register. You should define this macro if base plus index + addresses have different requirements than other base register + uses. + + Use of this macro is deprecated; please use the more general + 'REGNO_MODE_CODE_OK_FOR_BASE_P'. + + -- Macro: REGNO_MODE_CODE_OK_FOR_BASE_P (NUM, MODE, ADDRESS_SPACE, + OUTER_CODE, INDEX_CODE) + A C expression which is nonzero if register number NUM is suitable + for use as a base register in operand addresses, accessing memory + in mode MODE in address space ADDRESS_SPACE. This is similar to + 'REGNO_MODE_OK_FOR_BASE_P', except that that expression may examine + the context in which the register appears in the memory reference. + OUTER_CODE is the code of the immediately enclosing expression + ('MEM' if at the top level of the address, 'ADDRESS' for something + that occurs in an 'address_operand'). INDEX_CODE is the code of + the corresponding index expression if OUTER_CODE is 'PLUS'; + 'SCRATCH' otherwise. The mode may be 'VOIDmode' for addresses that + appear outside a 'MEM', i.e., as an 'address_operand'. + + -- Macro: REGNO_OK_FOR_INDEX_P (NUM) + A C expression which is nonzero if register number NUM is suitable + for use as an index register in operand addresses. It may be + either a suitable hard register or a pseudo register that has been + allocated such a hard register. + + The difference between an index register and a base register is + that the index register may be scaled. If an address involves the + sum of two registers, neither one of them scaled, then either one + may be labeled the "base" and the other the "index"; but whichever + labeling is used must fit the machine's constraints of which + registers may serve in each capacity. The compiler will try both + labelings, looking for one that is valid, and will reload one or + both registers only if neither labeling works. + + -- Target Hook: reg_class_t TARGET_PREFERRED_RENAME_CLASS (reg_class_t + RCLASS) + A target hook that places additional preference on the register + class to use when it is necessary to rename a register in class + RCLASS to another class, or perhaps NO_REGS, if no preferred + register class is found or hook 'preferred_rename_class' is not + implemented. Sometimes returning a more restrictive class makes + better code. For example, on ARM, thumb-2 instructions using + 'LO_REGS' may be smaller than instructions using 'GENERIC_REGS'. + By returning 'LO_REGS' from 'preferred_rename_class', code size can + be reduced. + + -- Target Hook: reg_class_t TARGET_PREFERRED_RELOAD_CLASS (rtx X, + reg_class_t RCLASS) + A target hook that places additional restrictions on the register + class to use when it is necessary to copy value X into a register + in class RCLASS. The value is a register class; perhaps RCLASS, or + perhaps another, smaller class. + + The default version of this hook always returns value of 'rclass' + argument. + + Sometimes returning a more restrictive class makes better code. + For example, on the 68000, when X is an integer constant that is in + range for a 'moveq' instruction, the value of this macro is always + 'DATA_REGS' as long as RCLASS includes the data registers. + Requiring a data register guarantees that a 'moveq' will be used. + + One case where 'TARGET_PREFERRED_RELOAD_CLASS' must not return + RCLASS is if X is a legitimate constant which cannot be loaded into + some register class. By returning 'NO_REGS' you can force X into a + memory location. For example, rs6000 can load immediate values + into general-purpose registers, but does not have an instruction + for loading an immediate value into a floating-point register, so + 'TARGET_PREFERRED_RELOAD_CLASS' returns 'NO_REGS' when X is a + floating-point constant. If the constant can't be loaded into any + kind of register, code generation will be better if + 'TARGET_LEGITIMATE_CONSTANT_P' makes the constant illegitimate + instead of using 'TARGET_PREFERRED_RELOAD_CLASS'. + + If an insn has pseudos in it after register allocation, reload will + go through the alternatives and call repeatedly + 'TARGET_PREFERRED_RELOAD_CLASS' to find the best one. Returning + 'NO_REGS', in this case, makes reload add a '!' in front of the + constraint: the x86 back-end uses this feature to discourage usage + of 387 registers when math is done in the SSE registers (and vice + versa). + + -- Macro: PREFERRED_RELOAD_CLASS (X, CLASS) + A C expression that places additional restrictions on the register + class to use when it is necessary to copy value X into a register + in class CLASS. The value is a register class; perhaps CLASS, or + perhaps another, smaller class. On many machines, the following + definition is safe: + + #define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS + + Sometimes returning a more restrictive class makes better code. + For example, on the 68000, when X is an integer constant that is in + range for a 'moveq' instruction, the value of this macro is always + 'DATA_REGS' as long as CLASS includes the data registers. + Requiring a data register guarantees that a 'moveq' will be used. + + One case where 'PREFERRED_RELOAD_CLASS' must not return CLASS is if + X is a legitimate constant which cannot be loaded into some + register class. By returning 'NO_REGS' you can force X into a + memory location. For example, rs6000 can load immediate values + into general-purpose registers, but does not have an instruction + for loading an immediate value into a floating-point register, so + 'PREFERRED_RELOAD_CLASS' returns 'NO_REGS' when X is a + floating-point constant. If the constant can't be loaded into any + kind of register, code generation will be better if + 'TARGET_LEGITIMATE_CONSTANT_P' makes the constant illegitimate + instead of using 'TARGET_PREFERRED_RELOAD_CLASS'. + + If an insn has pseudos in it after register allocation, reload will + go through the alternatives and call repeatedly + 'PREFERRED_RELOAD_CLASS' to find the best one. Returning + 'NO_REGS', in this case, makes reload add a '!' in front of the + constraint: the x86 back-end uses this feature to discourage usage + of 387 registers when math is done in the SSE registers (and vice + versa). + + -- Target Hook: reg_class_t TARGET_PREFERRED_OUTPUT_RELOAD_CLASS (rtx + X, reg_class_t RCLASS) + Like 'TARGET_PREFERRED_RELOAD_CLASS', but for output reloads + instead of input reloads. + + The default version of this hook always returns value of 'rclass' + argument. + + You can also use 'TARGET_PREFERRED_OUTPUT_RELOAD_CLASS' to + discourage reload from using some alternatives, like + 'TARGET_PREFERRED_RELOAD_CLASS'. + + -- Macro: LIMIT_RELOAD_CLASS (MODE, CLASS) + A C expression that places additional restrictions on the register + class to use when it is necessary to be able to hold a value of + mode MODE in a reload register for which class CLASS would + ordinarily be used. + + Unlike 'PREFERRED_RELOAD_CLASS', this macro should be used when + there are certain modes that simply can't go in certain reload + classes. + + The value is a register class; perhaps CLASS, or perhaps another, + smaller class. + + Don't define this macro unless the target machine has limitations + which require the macro to do something nontrivial. + + -- Target Hook: reg_class_t TARGET_SECONDARY_RELOAD (bool IN_P, rtx X, + reg_class_t RELOAD_CLASS, enum machine_mode RELOAD_MODE, + secondary_reload_info *SRI) + Many machines have some registers that cannot be copied directly to + or from memory or even from other types of registers. An example + is the 'MQ' register, which on most machines, can only be copied to + or from general registers, but not memory. Below, we shall be + using the term 'intermediate register' when a move operation cannot + be performed directly, but has to be done by copying the source + into the intermediate register first, and then copying the + intermediate register to the destination. An intermediate register + always has the same mode as source and destination. Since it holds + the actual value being copied, reload might apply optimizations to + re-use an intermediate register and eliding the copy from the + source when it can determine that the intermediate register still + holds the required value. + + Another kind of secondary reload is required on some machines which + allow copying all registers to and from memory, but require a + scratch register for stores to some memory locations (e.g., those + with symbolic address on the RT, and those with certain symbolic + address on the SPARC when compiling PIC). Scratch registers need + not have the same mode as the value being copied, and usually hold + a different value than that being copied. Special patterns in the + md file are needed to describe how the copy is performed with the + help of the scratch register; these patterns also describe the + number, register class(es) and mode(s) of the scratch register(s). + + In some cases, both an intermediate and a scratch register are + required. + + For input reloads, this target hook is called with nonzero IN_P, + and X is an rtx that needs to be copied to a register of class + RELOAD_CLASS in RELOAD_MODE. For output reloads, this target hook + is called with zero IN_P, and a register of class RELOAD_CLASS + needs to be copied to rtx X in RELOAD_MODE. + + If copying a register of RELOAD_CLASS from/to X requires an + intermediate register, the hook 'secondary_reload' should return + the register class required for this intermediate register. If no + intermediate register is required, it should return NO_REGS. If + more than one intermediate register is required, describe the one + that is closest in the copy chain to the reload register. + + If scratch registers are needed, you also have to describe how to + perform the copy from/to the reload register to/from this closest + intermediate register. Or if no intermediate register is required, + but still a scratch register is needed, describe the copy from/to + the reload register to/from the reload operand X. + + You do this by setting 'sri->icode' to the instruction code of a + pattern in the md file which performs the move. Operands 0 and 1 + are the output and input of this copy, respectively. Operands from + operand 2 onward are for scratch operands. These scratch operands + must have a mode, and a single-register-class output constraint. + + When an intermediate register is used, the 'secondary_reload' hook + will be called again to determine how to copy the intermediate + register to/from the reload operand X, so your hook must also have + code to handle the register class of the intermediate operand. + + X might be a pseudo-register or a 'subreg' of a pseudo-register, + which could either be in a hard register or in memory. Use + 'true_regnum' to find out; it will return -1 if the pseudo is in + memory and the hard register number if it is in a register. + + Scratch operands in memory (constraint '"=m"' / '"=&m"') are + currently not supported. For the time being, you will have to + continue to use 'SECONDARY_MEMORY_NEEDED' for that purpose. + + 'copy_cost' also uses this target hook to find out how values are + copied. If you want it to include some extra cost for the need to + allocate (a) scratch register(s), set 'sri->extra_cost' to the + additional cost. Or if two dependent moves are supposed to have a + lower cost than the sum of the individual moves due to expected + fortuitous scheduling and/or special forwarding logic, you can set + 'sri->extra_cost' to a negative amount. + + -- Macro: SECONDARY_RELOAD_CLASS (CLASS, MODE, X) + -- Macro: SECONDARY_INPUT_RELOAD_CLASS (CLASS, MODE, X) + -- Macro: SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X) + These macros are obsolete, new ports should use the target hook + 'TARGET_SECONDARY_RELOAD' instead. + + These are obsolete macros, replaced by the + 'TARGET_SECONDARY_RELOAD' target hook. Older ports still define + these macros to indicate to the reload phase that it may need to + allocate at least one register for a reload in addition to the + register to contain the data. Specifically, if copying X to a + register CLASS in MODE requires an intermediate register, you were + supposed to define 'SECONDARY_INPUT_RELOAD_CLASS' to return the + largest register class all of whose registers can be used as + intermediate registers or scratch registers. + + If copying a register CLASS in MODE to X requires an intermediate + or scratch register, 'SECONDARY_OUTPUT_RELOAD_CLASS' was supposed + to be defined be defined to return the largest register class + required. If the requirements for input and output reloads were + the same, the macro 'SECONDARY_RELOAD_CLASS' should have been used + instead of defining both macros identically. + + The values returned by these macros are often 'GENERAL_REGS'. + Return 'NO_REGS' if no spare register is needed; i.e., if X can be + directly copied to or from a register of CLASS in MODE without + requiring a scratch register. Do not define this macro if it would + always return 'NO_REGS'. + + If a scratch register is required (either with or without an + intermediate register), you were supposed to define patterns for + 'reload_inM' or 'reload_outM', as required (*note Standard Names::. + These patterns, which were normally implemented with a + 'define_expand', should be similar to the 'movM' patterns, except + that operand 2 is the scratch register. + + These patterns need constraints for the reload register and scratch + register that contain a single register class. If the original + reload register (whose class is CLASS) can meet the constraint + given in the pattern, the value returned by these macros is used + for the class of the scratch register. Otherwise, two additional + reload registers are required. Their classes are obtained from the + constraints in the insn pattern. + + X might be a pseudo-register or a 'subreg' of a pseudo-register, + which could either be in a hard register or in memory. Use + 'true_regnum' to find out; it will return -1 if the pseudo is in + memory and the hard register number if it is in a register. + + These macros should not be used in the case where a particular + class of registers can only be copied to memory and not to another + class of registers. In that case, secondary reload registers are + not needed and would not be helpful. Instead, a stack location + must be used to perform the copy and the 'movM' pattern should use + memory as an intermediate storage. This case often occurs between + floating-point and general registers. + + -- Macro: SECONDARY_MEMORY_NEEDED (CLASS1, CLASS2, M) + Certain machines have the property that some registers cannot be + copied to some other registers without using memory. Define this + macro on those machines to be a C expression that is nonzero if + objects of mode M in registers of CLASS1 can only be copied to + registers of class CLASS2 by storing a register of CLASS1 into + memory and loading that memory location into a register of CLASS2. + + Do not define this macro if its value would always be zero. + + -- Macro: SECONDARY_MEMORY_NEEDED_RTX (MODE) + Normally when 'SECONDARY_MEMORY_NEEDED' is defined, the compiler + allocates a stack slot for a memory location needed for register + copies. If this macro is defined, the compiler instead uses the + memory location defined by this macro. + + Do not define this macro if you do not define + 'SECONDARY_MEMORY_NEEDED'. + + -- Macro: SECONDARY_MEMORY_NEEDED_MODE (MODE) + When the compiler needs a secondary memory location to copy between + two registers of mode MODE, it normally allocates sufficient memory + to hold a quantity of 'BITS_PER_WORD' bits and performs the store + and load operations in a mode that many bits wide and whose class + is the same as that of MODE. + + This is right thing to do on most machines because it ensures that + all bits of the register are copied and prevents accesses to the + registers in a narrower mode, which some machines prohibit for + floating-point registers. + + However, this default behavior is not correct on some machines, + such as the DEC Alpha, that store short integers in floating-point + registers differently than in integer registers. On those + machines, the default widening will not work correctly and you must + define this macro to suppress that widening in some cases. See the + file 'alpha.h' for details. + + Do not define this macro if you do not define + 'SECONDARY_MEMORY_NEEDED' or if widening MODE to a mode that is + 'BITS_PER_WORD' bits wide is correct for your machine. + + -- Target Hook: bool TARGET_CLASS_LIKELY_SPILLED_P (reg_class_t RCLASS) + A target hook which returns 'true' if pseudos that have been + assigned to registers of class RCLASS would likely be spilled + because registers of RCLASS are needed for spill registers. + + The default version of this target hook returns 'true' if RCLASS + has exactly one register and 'false' otherwise. On most machines, + this default should be used. For generally register-starved + machines, such as i386, or machines with right register + constraints, such as SH, this hook can be used to avoid excessive + spilling. + + This hook is also used by some of the global intra-procedural code + transformations to throtle code motion, to avoid increasing + register pressure. + + -- Target Hook: unsigned char TARGET_CLASS_MAX_NREGS (reg_class_t + RCLASS, enum machine_mode MODE) + A target hook returns the maximum number of consecutive registers + of class RCLASS needed to hold a value of mode MODE. + + This is closely related to the macro 'HARD_REGNO_NREGS'. In fact, + the value returned by 'TARGET_CLASS_MAX_NREGS (RCLASS, MODE)' + target hook should be the maximum value of 'HARD_REGNO_NREGS + (REGNO, MODE)' for all REGNO values in the class RCLASS. + + This target hook helps control the handling of multiple-word values + in the reload pass. + + The default version of this target hook returns the size of MODE in + words. + + -- Macro: CLASS_MAX_NREGS (CLASS, MODE) + A C expression for the maximum number of consecutive registers of + class CLASS needed to hold a value of mode MODE. + + This is closely related to the macro 'HARD_REGNO_NREGS'. In fact, + the value of the macro 'CLASS_MAX_NREGS (CLASS, MODE)' should be + the maximum value of 'HARD_REGNO_NREGS (REGNO, MODE)' for all REGNO + values in the class CLASS. + + This macro helps control the handling of multiple-word values in + the reload pass. + + -- Macro: CANNOT_CHANGE_MODE_CLASS (FROM, TO, CLASS) + If defined, a C expression that returns nonzero for a CLASS for + which a change from mode FROM to mode TO is invalid. + + For the example, loading 32-bit integer or floating-point objects + into floating-point registers on the Alpha extends them to 64 bits. + Therefore loading a 64-bit object and then storing it as a 32-bit + object does not store the low-order 32 bits, as would be the case + for a normal register. Therefore, 'alpha.h' defines + 'CANNOT_CHANGE_MODE_CLASS' as below: + + #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \ + (GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \ + ? reg_classes_intersect_p (FLOAT_REGS, (CLASS)) : 0) + + -- Target Hook: bool TARGET_LRA_P (void) + A target hook which returns true if we use LRA instead of reload + pass. It means that LRA was ported to the target. The default + version of this target hook returns always false. + + -- Target Hook: int TARGET_REGISTER_PRIORITY (int) + A target hook which returns the register priority number to which + the register HARD_REGNO belongs to. The bigger the number, the + more preferable the hard register usage (when all other conditions + are the same). This hook can be used to prefer some hard register + over others in LRA. For example, some x86-64 register usage needs + additional prefix which makes instructions longer. The hook can + return lower priority number for such registers make them less + favorable and as result making the generated code smaller. The + default version of this target hook returns always zero. + + -- Target Hook: bool TARGET_REGISTER_USAGE_LEVELING_P (void) + A target hook which returns true if we need register usage + leveling. That means if a few hard registers are equally good for + the assignment, we choose the least used hard register. The + register usage leveling may be profitable for some targets. Don't + use the usage leveling for targets with conditional execution or + targets with big register files as it hurts if-conversion and + cross-jumping optimizations. The default version of this target + hook returns always false. + + -- Target Hook: bool TARGET_DIFFERENT_ADDR_DISPLACEMENT_P (void) + A target hook which returns true if an address with the same + structure can have different maximal legitimate displacement. For + example, the displacement can depend on memory mode or on operand + combinations in the insn. The default version of this target hook + returns always false. + + -- Target Hook: reg_class_t TARGET_SPILL_CLASS (reg_class_t, enum + MACHINE_MODE) + This hook defines a class of registers which could be used for + spilling pseudos of the given mode and class, or 'NO_REGS' if only + memory should be used. Not defining this hook is equivalent to + returning 'NO_REGS' for all inputs. + + -- Target Hook: enum machine_mode TARGET_CSTORE_MODE (enum insn_code + ICODE) + This hook defines the machine mode to use for the boolean result of + conditional store patterns. The ICODE argument is the instruction + code for the cstore being performed. Not definiting this hook is + the same as accepting the mode encoded into operand 0 of the cstore + expander patterns. + + +File: gccint.info, Node: Old Constraints, Next: Stack and Calling, Prev: Register Classes, Up: Target Macros + +17.9 Obsolete Macros for Defining Constraints +============================================= + +Machine-specific constraints can be defined with these macros instead of +the machine description constructs described in *note Define +Constraints::. This mechanism is obsolete. New ports should not use +it; old ports should convert to the new mechanism. + + -- Macro: CONSTRAINT_LEN (CHAR, STR) + For the constraint at the start of STR, which starts with the + letter C, return the length. This allows you to have register + class / constant / extra constraints that are longer than a single + letter; you don't need to define this macro if you can do with + single-letter constraints only. The definition of this macro + should use DEFAULT_CONSTRAINT_LEN for all the characters that you + don't want to handle specially. There are some sanity checks in + genoutput.c that check the constraint lengths for the md file, so + you can also use this macro to help you while you are transitioning + from a byzantine single-letter-constraint scheme: when you return a + negative length for a constraint you want to re-use, genoutput will + complain about every instance where it is used in the md file. + + -- Macro: REG_CLASS_FROM_LETTER (CHAR) + A C expression which defines the machine-dependent operand + constraint letters for register classes. If CHAR is such a letter, + the value should be the register class corresponding to it. + Otherwise, the value should be 'NO_REGS'. The register letter 'r', + corresponding to class 'GENERAL_REGS', will not be passed to this + macro; you do not need to handle it. + + -- Macro: REG_CLASS_FROM_CONSTRAINT (CHAR, STR) + Like 'REG_CLASS_FROM_LETTER', but you also get the constraint + string passed in STR, so that you can use suffixes to distinguish + between different variants. + + -- Macro: CONST_OK_FOR_LETTER_P (VALUE, C) + A C expression that defines the machine-dependent operand + constraint letters ('I', 'J', 'K', ... 'P') that specify particular + ranges of integer values. If C is one of those letters, the + expression should check that VALUE, an integer, is in the + appropriate range and return 1 if so, 0 otherwise. If C is not one + of those letters, the value should be 0 regardless of VALUE. + + -- Macro: CONST_OK_FOR_CONSTRAINT_P (VALUE, C, STR) + Like 'CONST_OK_FOR_LETTER_P', but you also get the constraint + string passed in STR, so that you can use suffixes to distinguish + between different variants. + + -- Macro: CONST_DOUBLE_OK_FOR_LETTER_P (VALUE, C) + A C expression that defines the machine-dependent operand + constraint letters that specify particular ranges of 'const_double' + values ('G' or 'H'). + + If C is one of those letters, the expression should check that + VALUE, an RTX of code 'const_double', is in the appropriate range + and return 1 if so, 0 otherwise. If C is not one of those letters, + the value should be 0 regardless of VALUE. + + 'const_double' is used for all floating-point constants and for + 'DImode' fixed-point constants. A given letter can accept either + or both kinds of values. It can use 'GET_MODE' to distinguish + between these kinds. + + -- Macro: CONST_DOUBLE_OK_FOR_CONSTRAINT_P (VALUE, C, STR) + Like 'CONST_DOUBLE_OK_FOR_LETTER_P', but you also get the + constraint string passed in STR, so that you can use suffixes to + distinguish between different variants. + + -- Macro: EXTRA_CONSTRAINT (VALUE, C) + A C expression that defines the optional machine-dependent + constraint letters that can be used to segregate specific types of + operands, usually memory references, for the target machine. Any + letter that is not elsewhere defined and not matched by + 'REG_CLASS_FROM_LETTER' / 'REG_CLASS_FROM_CONSTRAINT' may be used. + Normally this macro will not be defined. + + If it is required for a particular target machine, it should return + 1 if VALUE corresponds to the operand type represented by the + constraint letter C. If C is not defined as an extra constraint, + the value returned should be 0 regardless of VALUE. + + For example, on the ROMP, load instructions cannot have their + output in r0 if the memory reference contains a symbolic address. + Constraint letter 'Q' is defined as representing a memory address + that does _not_ contain a symbolic address. An alternative is + specified with a 'Q' constraint on the input and 'r' on the output. + The next alternative specifies 'm' on the input and a register + class that does not include r0 on the output. + + -- Macro: EXTRA_CONSTRAINT_STR (VALUE, C, STR) + Like 'EXTRA_CONSTRAINT', but you also get the constraint string + passed in STR, so that you can use suffixes to distinguish between + different variants. + + -- Macro: EXTRA_MEMORY_CONSTRAINT (C, STR) + A C expression that defines the optional machine-dependent + constraint letters, amongst those accepted by 'EXTRA_CONSTRAINT', + that should be treated like memory constraints by the reload pass. + + It should return 1 if the operand type represented by the + constraint at the start of STR, the first letter of which is the + letter C, comprises a subset of all memory references including all + those whose address is simply a base register. This allows the + reload pass to reload an operand, if it does not directly + correspond to the operand type of C, by copying its address into a + base register. + + For example, on the S/390, some instructions do not accept + arbitrary memory references, but only those that do not make use of + an index register. The constraint letter 'Q' is defined via + 'EXTRA_CONSTRAINT' as representing a memory address of this type. + If the letter 'Q' is marked as 'EXTRA_MEMORY_CONSTRAINT', a 'Q' + constraint can handle any memory operand, because the reload pass + knows it can be reloaded by copying the memory address into a base + register if required. This is analogous to the way an 'o' + constraint can handle any memory operand. + + -- Macro: EXTRA_ADDRESS_CONSTRAINT (C, STR) + A C expression that defines the optional machine-dependent + constraint letters, amongst those accepted by 'EXTRA_CONSTRAINT' / + 'EXTRA_CONSTRAINT_STR', that should be treated like address + constraints by the reload pass. + + It should return 1 if the operand type represented by the + constraint at the start of STR, which starts with the letter C, + comprises a subset of all memory addresses including all those that + consist of just a base register. This allows the reload pass to + reload an operand, if it does not directly correspond to the + operand type of STR, by copying it into a base register. + + Any constraint marked as 'EXTRA_ADDRESS_CONSTRAINT' can only be + used with the 'address_operand' predicate. It is treated + analogously to the 'p' constraint. + + +File: gccint.info, Node: Stack and Calling, Next: Varargs, Prev: Old Constraints, Up: Target Macros + +17.10 Stack Layout and Calling Conventions +========================================== + +This describes the stack layout and calling conventions. + +* Menu: + +* Frame Layout:: +* Exception Handling:: +* Stack Checking:: +* Frame Registers:: +* Elimination:: +* Stack Arguments:: +* Register Arguments:: +* Scalar Return:: +* Aggregate Return:: +* Caller Saves:: +* Function Entry:: +* Profiling:: +* Tail Calls:: +* Stack Smashing Protection:: + + +File: gccint.info, Node: Frame Layout, Next: Exception Handling, Up: Stack and Calling + +17.10.1 Basic Stack Layout +-------------------------- + +Here is the basic stack layout. + + -- Macro: STACK_GROWS_DOWNWARD + Define this macro if pushing a word onto the stack moves the stack + pointer to a smaller address. + + When we say, "define this macro if ...", it means that the compiler + checks this macro only with '#ifdef' so the precise definition used + does not matter. + + -- Macro: STACK_PUSH_CODE + This macro defines the operation used when something is pushed on + the stack. In RTL, a push operation will be '(set (mem + (STACK_PUSH_CODE (reg sp))) ...)' + + The choices are 'PRE_DEC', 'POST_DEC', 'PRE_INC', and 'POST_INC'. + Which of these is correct depends on the stack direction and on + whether the stack pointer points to the last item on the stack or + whether it points to the space for the next item on the stack. + + The default is 'PRE_DEC' when 'STACK_GROWS_DOWNWARD' is defined, + which is almost always right, and 'PRE_INC' otherwise, which is + often wrong. + + -- Macro: FRAME_GROWS_DOWNWARD + Define this macro to nonzero value if the addresses of local + variable slots are at negative offsets from the frame pointer. + + -- Macro: ARGS_GROW_DOWNWARD + Define this macro if successive arguments to a function occupy + decreasing addresses on the stack. + + -- Macro: STARTING_FRAME_OFFSET + Offset from the frame pointer to the first local variable slot to + be allocated. + + If 'FRAME_GROWS_DOWNWARD', find the next slot's offset by + subtracting the first slot's length from 'STARTING_FRAME_OFFSET'. + Otherwise, it is found by adding the length of the first slot to + the value 'STARTING_FRAME_OFFSET'. + + -- Macro: STACK_ALIGNMENT_NEEDED + Define to zero to disable final alignment of the stack during + reload. The nonzero default for this macro is suitable for most + ports. + + On ports where 'STARTING_FRAME_OFFSET' is nonzero or where there is + a register save block following the local block that doesn't + require alignment to 'STACK_BOUNDARY', it may be beneficial to + disable stack alignment and do it in the backend. + + -- Macro: STACK_POINTER_OFFSET + Offset from the stack pointer register to the first location at + which outgoing arguments are placed. If not specified, the default + value of zero is used. This is the proper value for most machines. + + If 'ARGS_GROW_DOWNWARD', this is the offset to the location above + the first location at which outgoing arguments are placed. + + -- Macro: FIRST_PARM_OFFSET (FUNDECL) + Offset from the argument pointer register to the first argument's + address. On some machines it may depend on the data type of the + function. + + If 'ARGS_GROW_DOWNWARD', this is the offset to the location above + the first argument's address. + + -- Macro: STACK_DYNAMIC_OFFSET (FUNDECL) + Offset from the stack pointer register to an item dynamically + allocated on the stack, e.g., by 'alloca'. + + The default value for this macro is 'STACK_POINTER_OFFSET' plus the + length of the outgoing arguments. The default is correct for most + machines. See 'function.c' for details. + + -- Macro: INITIAL_FRAME_ADDRESS_RTX + A C expression whose value is RTL representing the address of the + initial stack frame. This address is passed to 'RETURN_ADDR_RTX' + and 'DYNAMIC_CHAIN_ADDRESS'. If you don't define this macro, a + reasonable default value will be used. Define this macro in order + to make frame pointer elimination work in the presence of + '__builtin_frame_address (count)' and '__builtin_return_address + (count)' for 'count' not equal to zero. + + -- Macro: DYNAMIC_CHAIN_ADDRESS (FRAMEADDR) + A C expression whose value is RTL representing the address in a + stack frame where the pointer to the caller's frame is stored. + Assume that FRAMEADDR is an RTL expression for the address of the + stack frame itself. + + If you don't define this macro, the default is to return the value + of FRAMEADDR--that is, the stack frame address is also the address + of the stack word that points to the previous frame. + + -- Macro: SETUP_FRAME_ADDRESSES + If defined, a C expression that produces the machine-specific code + to setup the stack so that arbitrary frames can be accessed. For + example, on the SPARC, we must flush all of the register windows to + the stack before we can access arbitrary stack frames. You will + seldom need to define this macro. + + -- Target Hook: rtx TARGET_BUILTIN_SETJMP_FRAME_VALUE (void) + This target hook should return an rtx that is used to store the + address of the current frame into the built in 'setjmp' buffer. + The default value, 'virtual_stack_vars_rtx', is correct for most + machines. One reason you may need to define this target hook is if + 'hard_frame_pointer_rtx' is the appropriate value on your machine. + + -- Macro: FRAME_ADDR_RTX (FRAMEADDR) + A C expression whose value is RTL representing the value of the + frame address for the current frame. FRAMEADDR is the frame + pointer of the current frame. This is used for + __builtin_frame_address. You need only define this macro if the + frame address is not the same as the frame pointer. Most machines + do not need to define it. + + -- Macro: RETURN_ADDR_RTX (COUNT, FRAMEADDR) + A C expression whose value is RTL representing the value of the + return address for the frame COUNT steps up from the current frame, + after the prologue. FRAMEADDR is the frame pointer of the COUNT + frame, or the frame pointer of the COUNT - 1 frame if + 'RETURN_ADDR_IN_PREVIOUS_FRAME' is defined. + + The value of the expression must always be the correct address when + COUNT is zero, but may be 'NULL_RTX' if there is no way to + determine the return address of other frames. + + -- Macro: RETURN_ADDR_IN_PREVIOUS_FRAME + Define this if the return address of a particular stack frame is + accessed from the frame pointer of the previous stack frame. + + -- Macro: INCOMING_RETURN_ADDR_RTX + A C expression whose value is RTL representing the location of the + incoming return address at the beginning of any function, before + the prologue. This RTL is either a 'REG', indicating that the + return value is saved in 'REG', or a 'MEM' representing a location + in the stack. + + You only need to define this macro if you want to support call + frame debugging information like that provided by DWARF 2. + + If this RTL is a 'REG', you should also define + 'DWARF_FRAME_RETURN_COLUMN' to 'DWARF_FRAME_REGNUM (REGNO)'. + + -- Macro: DWARF_ALT_FRAME_RETURN_COLUMN + A C expression whose value is an integer giving a DWARF 2 column + number that may be used as an alternative return column. The + column must not correspond to any gcc hard register (that is, it + must not be in the range of 'DWARF_FRAME_REGNUM'). + + This macro can be useful if 'DWARF_FRAME_RETURN_COLUMN' is set to a + general register, but an alternative column needs to be used for + signal frames. Some targets have also used different frame return + columns over time. + + -- Macro: DWARF_ZERO_REG + A C expression whose value is an integer giving a DWARF 2 register + number that is considered to always have the value zero. This + should only be defined if the target has an architected zero + register, and someone decided it was a good idea to use that + register number to terminate the stack backtrace. New ports should + avoid this. + + -- Target Hook: void TARGET_DWARF_HANDLE_FRAME_UNSPEC (const char + *LABEL, rtx PATTERN, int INDEX) + This target hook allows the backend to emit frame-related insns + that contain UNSPECs or UNSPEC_VOLATILEs. The DWARF 2 call frame + debugging info engine will invoke it on insns of the form + (set (reg) (unspec [...] UNSPEC_INDEX)) + and + (set (reg) (unspec_volatile [...] UNSPECV_INDEX)). + to let the backend emit the call frame instructions. LABEL is the + CFI label attached to the insn, PATTERN is the pattern of the insn + and INDEX is 'UNSPEC_INDEX' or 'UNSPECV_INDEX'. + + -- Macro: INCOMING_FRAME_SP_OFFSET + A C expression whose value is an integer giving the offset, in + bytes, from the value of the stack pointer register to the top of + the stack frame at the beginning of any function, before the + prologue. The top of the frame is defined to be the value of the + stack pointer in the previous frame, just before the call + instruction. + + You only need to define this macro if you want to support call + frame debugging information like that provided by DWARF 2. + + -- Macro: ARG_POINTER_CFA_OFFSET (FUNDECL) + A C expression whose value is an integer giving the offset, in + bytes, from the argument pointer to the canonical frame address + (cfa). The final value should coincide with that calculated by + 'INCOMING_FRAME_SP_OFFSET'. Which is unfortunately not usable + during virtual register instantiation. + + The default value for this macro is 'FIRST_PARM_OFFSET (fundecl) + + crtl->args.pretend_args_size', which is correct for most machines; + in general, the arguments are found immediately before the stack + frame. Note that this is not the case on some targets that save + registers into the caller's frame, such as SPARC and rs6000, and so + such targets need to define this macro. + + You only need to define this macro if the default is incorrect, and + you want to support call frame debugging information like that + provided by DWARF 2. + + -- Macro: FRAME_POINTER_CFA_OFFSET (FUNDECL) + If defined, a C expression whose value is an integer giving the + offset in bytes from the frame pointer to the canonical frame + address (cfa). The final value should coincide with that + calculated by 'INCOMING_FRAME_SP_OFFSET'. + + Normally the CFA is calculated as an offset from the argument + pointer, via 'ARG_POINTER_CFA_OFFSET', but if the argument pointer + is variable due to the ABI, this may not be possible. If this + macro is defined, it implies that the virtual register + instantiation should be based on the frame pointer instead of the + argument pointer. Only one of 'FRAME_POINTER_CFA_OFFSET' and + 'ARG_POINTER_CFA_OFFSET' should be defined. + + -- Macro: CFA_FRAME_BASE_OFFSET (FUNDECL) + If defined, a C expression whose value is an integer giving the + offset in bytes from the canonical frame address (cfa) to the frame + base used in DWARF 2 debug information. The default is zero. A + different value may reduce the size of debug information on some + ports. + + +File: gccint.info, Node: Exception Handling, Next: Stack Checking, Prev: Frame Layout, Up: Stack and Calling + +17.10.2 Exception Handling Support +---------------------------------- + + -- Macro: EH_RETURN_DATA_REGNO (N) + A C expression whose value is the Nth register number used for data + by exception handlers, or 'INVALID_REGNUM' if fewer than N + registers are usable. + + The exception handling library routines communicate with the + exception handlers via a set of agreed upon registers. Ideally + these registers should be call-clobbered; it is possible to use + call-saved registers, but may negatively impact code size. The + target must support at least 2 data registers, but should define 4 + if there are enough free registers. + + You must define this macro if you want to support call frame + exception handling like that provided by DWARF 2. + + -- Macro: EH_RETURN_STACKADJ_RTX + A C expression whose value is RTL representing a location in which + to store a stack adjustment to be applied before function return. + This is used to unwind the stack to an exception handler's call + frame. It will be assigned zero on code paths that return + normally. + + Typically this is a call-clobbered hard register that is otherwise + untouched by the epilogue, but could also be a stack slot. + + Do not define this macro if the stack pointer is saved and restored + by the regular prolog and epilog code in the call frame itself; in + this case, the exception handling library routines will update the + stack location to be restored in place. Otherwise, you must define + this macro if you want to support call frame exception handling + like that provided by DWARF 2. + + -- Macro: EH_RETURN_HANDLER_RTX + A C expression whose value is RTL representing a location in which + to store the address of an exception handler to which we should + return. It will not be assigned on code paths that return + normally. + + Typically this is the location in the call frame at which the + normal return address is stored. For targets that return by + popping an address off the stack, this might be a memory address + just below the _target_ call frame rather than inside the current + call frame. If defined, 'EH_RETURN_STACKADJ_RTX' will have already + been assigned, so it may be used to calculate the location of the + target call frame. + + Some targets have more complex requirements than storing to an + address calculable during initial code generation. In that case + the 'eh_return' instruction pattern should be used instead. + + If you want to support call frame exception handling, you must + define either this macro or the 'eh_return' instruction pattern. + + -- Macro: RETURN_ADDR_OFFSET + If defined, an integer-valued C expression for which rtl will be + generated to add it to the exception handler address before it is + searched in the exception handling tables, and to subtract it again + from the address before using it to return to the exception + handler. + + -- Macro: ASM_PREFERRED_EH_DATA_FORMAT (CODE, GLOBAL) + This macro chooses the encoding of pointers embedded in the + exception handling sections. If at all possible, this should be + defined such that the exception handling section will not require + dynamic relocations, and so may be read-only. + + CODE is 0 for data, 1 for code labels, 2 for function pointers. + GLOBAL is true if the symbol may be affected by dynamic + relocations. The macro should return a combination of the + 'DW_EH_PE_*' defines as found in 'dwarf2.h'. + + If this macro is not defined, pointers will not be encoded but + represented directly. + + -- Macro: ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX (FILE, ENCODING, SIZE, + ADDR, DONE) + This macro allows the target to emit whatever special magic is + required to represent the encoding chosen by + 'ASM_PREFERRED_EH_DATA_FORMAT'. Generic code takes care of + pc-relative and indirect encodings; this must be defined if the + target uses text-relative or data-relative encodings. + + This is a C statement that branches to DONE if the format was + handled. ENCODING is the format chosen, SIZE is the number of + bytes that the format occupies, ADDR is the 'SYMBOL_REF' to be + emitted. + + -- Macro: MD_FALLBACK_FRAME_STATE_FOR (CONTEXT, FS) + This macro allows the target to add CPU and operating system + specific code to the call-frame unwinder for use when there is no + unwind data available. The most common reason to implement this + macro is to unwind through signal frames. + + This macro is called from 'uw_frame_state_for' in 'unwind-dw2.c', + 'unwind-dw2-xtensa.c' and 'unwind-ia64.c'. CONTEXT is an + '_Unwind_Context'; FS is an '_Unwind_FrameState'. Examine + 'context->ra' for the address of the code being executed and + 'context->cfa' for the stack pointer value. If the frame can be + decoded, the register save addresses should be updated in FS and + the macro should evaluate to '_URC_NO_REASON'. If the frame cannot + be decoded, the macro should evaluate to '_URC_END_OF_STACK'. + + For proper signal handling in Java this macro is accompanied by + 'MAKE_THROW_FRAME', defined in 'libjava/include/*-signal.h' + headers. + + -- Macro: MD_HANDLE_UNWABI (CONTEXT, FS) + This macro allows the target to add operating system specific code + to the call-frame unwinder to handle the IA-64 '.unwabi' unwinding + directive, usually used for signal or interrupt frames. + + This macro is called from 'uw_update_context' in libgcc's + 'unwind-ia64.c'. CONTEXT is an '_Unwind_Context'; FS is an + '_Unwind_FrameState'. Examine 'fs->unwabi' for the abi and context + in the '.unwabi' directive. If the '.unwabi' directive can be + handled, the register save addresses should be updated in FS. + + -- Macro: TARGET_USES_WEAK_UNWIND_INFO + A C expression that evaluates to true if the target requires unwind + info to be given comdat linkage. Define it to be '1' if comdat + linkage is necessary. The default is '0'. + + +File: gccint.info, Node: Stack Checking, Next: Frame Registers, Prev: Exception Handling, Up: Stack and Calling + +17.10.3 Specifying How Stack Checking is Done +--------------------------------------------- + +GCC will check that stack references are within the boundaries of the +stack, if the option '-fstack-check' is specified, in one of three ways: + + 1. If the value of the 'STACK_CHECK_BUILTIN' macro is nonzero, GCC + will assume that you have arranged for full stack checking to be + done at appropriate places in the configuration files. GCC will + not do other special processing. + + 2. If 'STACK_CHECK_BUILTIN' is zero and the value of the + 'STACK_CHECK_STATIC_BUILTIN' macro is nonzero, GCC will assume that + you have arranged for static stack checking (checking of the static + stack frame of functions) to be done at appropriate places in the + configuration files. GCC will only emit code to do dynamic stack + checking (checking on dynamic stack allocations) using the third + approach below. + + 3. If neither of the above are true, GCC will generate code to + periodically "probe" the stack pointer using the values of the + macros defined below. + + If neither STACK_CHECK_BUILTIN nor STACK_CHECK_STATIC_BUILTIN is +defined, GCC will change its allocation strategy for large objects if +the option '-fstack-check' is specified: they will always be allocated +dynamically if their size exceeds 'STACK_CHECK_MAX_VAR_SIZE' bytes. + + -- Macro: STACK_CHECK_BUILTIN + A nonzero value if stack checking is done by the configuration + files in a machine-dependent manner. You should define this macro + if stack checking is required by the ABI of your machine or if you + would like to do stack checking in some more efficient way than the + generic approach. The default value of this macro is zero. + + -- Macro: STACK_CHECK_STATIC_BUILTIN + A nonzero value if static stack checking is done by the + configuration files in a machine-dependent manner. You should + define this macro if you would like to do static stack checking in + some more efficient way than the generic approach. The default + value of this macro is zero. + + -- Macro: STACK_CHECK_PROBE_INTERVAL_EXP + An integer specifying the interval at which GCC must generate stack + probe instructions, defined as 2 raised to this integer. You will + normally define this macro so that the interval be no larger than + the size of the "guard pages" at the end of a stack area. The + default value of 12 (4096-byte interval) is suitable for most + systems. + + -- Macro: STACK_CHECK_MOVING_SP + An integer which is nonzero if GCC should move the stack pointer + page by page when doing probes. This can be necessary on systems + where the stack pointer contains the bottom address of the memory + area accessible to the executing thread at any point in time. In + this situation an alternate signal stack is required in order to be + able to recover from a stack overflow. The default value of this + macro is zero. + + -- Macro: STACK_CHECK_PROTECT + The number of bytes of stack needed to recover from a stack + overflow, for languages where such a recovery is supported. The + default value of 75 words with the 'setjmp'/'longjmp'-based + exception handling mechanism and 8192 bytes with other exception + handling mechanisms should be adequate for most machines. + + The following macros are relevant only if neither STACK_CHECK_BUILTIN +nor STACK_CHECK_STATIC_BUILTIN is defined; you can omit them altogether +in the opposite case. + + -- Macro: STACK_CHECK_MAX_FRAME_SIZE + The maximum size of a stack frame, in bytes. GCC will generate + probe instructions in non-leaf functions to ensure at least this + many bytes of stack are available. If a stack frame is larger than + this size, stack checking will not be reliable and GCC will issue a + warning. The default is chosen so that GCC only generates one + instruction on most systems. You should normally not change the + default value of this macro. + + -- Macro: STACK_CHECK_FIXED_FRAME_SIZE + GCC uses this value to generate the above warning message. It + represents the amount of fixed frame used by a function, not + including space for any callee-saved registers, temporaries and + user variables. You need only specify an upper bound for this + amount and will normally use the default of four words. + + -- Macro: STACK_CHECK_MAX_VAR_SIZE + The maximum size, in bytes, of an object that GCC will place in the + fixed area of the stack frame when the user specifies + '-fstack-check'. GCC computed the default from the values of the + above macros and you will normally not need to override that + default. + + +File: gccint.info, Node: Frame Registers, Next: Elimination, Prev: Stack Checking, Up: Stack and Calling + +17.10.4 Registers That Address the Stack Frame +---------------------------------------------- + +This discusses registers that address the stack frame. + + -- Macro: STACK_POINTER_REGNUM + The register number of the stack pointer register, which must also + be a fixed register according to 'FIXED_REGISTERS'. On most + machines, the hardware determines which register this is. + + -- Macro: FRAME_POINTER_REGNUM + The register number of the frame pointer register, which is used to + access automatic variables in the stack frame. On some machines, + the hardware determines which register this is. On other machines, + you can choose any register you wish for this purpose. + + -- Macro: HARD_FRAME_POINTER_REGNUM + On some machines the offset between the frame pointer and starting + offset of the automatic variables is not known until after register + allocation has been done (for example, because the saved registers + are between these two locations). On those machines, define + 'FRAME_POINTER_REGNUM' the number of a special, fixed register to + be used internally until the offset is known, and define + 'HARD_FRAME_POINTER_REGNUM' to be the actual hard register number + used for the frame pointer. + + You should define this macro only in the very rare circumstances + when it is not possible to calculate the offset between the frame + pointer and the automatic variables until after register allocation + has been completed. When this macro is defined, you must also + indicate in your definition of 'ELIMINABLE_REGS' how to eliminate + 'FRAME_POINTER_REGNUM' into either 'HARD_FRAME_POINTER_REGNUM' or + 'STACK_POINTER_REGNUM'. + + Do not define this macro if it would be the same as + 'FRAME_POINTER_REGNUM'. + + -- Macro: ARG_POINTER_REGNUM + The register number of the arg pointer register, which is used to + access the function's argument list. On some machines, this is the + same as the frame pointer register. On some machines, the hardware + determines which register this is. On other machines, you can + choose any register you wish for this purpose. If this is not the + same register as the frame pointer register, then you must mark it + as a fixed register according to 'FIXED_REGISTERS', or arrange to + be able to eliminate it (*note Elimination::). + + -- Macro: HARD_FRAME_POINTER_IS_FRAME_POINTER + Define this to a preprocessor constant that is nonzero if + 'hard_frame_pointer_rtx' and 'frame_pointer_rtx' should be the + same. The default definition is '(HARD_FRAME_POINTER_REGNUM == + FRAME_POINTER_REGNUM)'; you only need to define this macro if that + definition is not suitable for use in preprocessor conditionals. + + -- Macro: HARD_FRAME_POINTER_IS_ARG_POINTER + Define this to a preprocessor constant that is nonzero if + 'hard_frame_pointer_rtx' and 'arg_pointer_rtx' should be the same. + The default definition is '(HARD_FRAME_POINTER_REGNUM == + ARG_POINTER_REGNUM)'; you only need to define this macro if that + definition is not suitable for use in preprocessor conditionals. + + -- Macro: RETURN_ADDRESS_POINTER_REGNUM + The register number of the return address pointer register, which + is used to access the current function's return address from the + stack. On some machines, the return address is not at a fixed + offset from the frame pointer or stack pointer or argument pointer. + This register can be defined to point to the return address on the + stack, and then be converted by 'ELIMINABLE_REGS' into either the + frame pointer or stack pointer. + + Do not define this macro unless there is no other way to get the + return address from the stack. + + -- Macro: STATIC_CHAIN_REGNUM + -- Macro: STATIC_CHAIN_INCOMING_REGNUM + Register numbers used for passing a function's static chain + pointer. If register windows are used, the register number as seen + by the called function is 'STATIC_CHAIN_INCOMING_REGNUM', while the + register number as seen by the calling function is + 'STATIC_CHAIN_REGNUM'. If these registers are the same, + 'STATIC_CHAIN_INCOMING_REGNUM' need not be defined. + + The static chain register need not be a fixed register. + + If the static chain is passed in memory, these macros should not be + defined; instead, the 'TARGET_STATIC_CHAIN' hook should be used. + + -- Target Hook: rtx TARGET_STATIC_CHAIN (const_tree FNDECL, bool + INCOMING_P) + This hook replaces the use of 'STATIC_CHAIN_REGNUM' et al for + targets that may use different static chain locations for different + nested functions. This may be required if the target has function + attributes that affect the calling conventions of the function and + those calling conventions use different static chain locations. + + The default version of this hook uses 'STATIC_CHAIN_REGNUM' et al. + + If the static chain is passed in memory, this hook should be used + to provide rtx giving 'mem' expressions that denote where they are + stored. Often the 'mem' expression as seen by the caller will be + at an offset from the stack pointer and the 'mem' expression as + seen by the callee will be at an offset from the frame pointer. + The variables 'stack_pointer_rtx', 'frame_pointer_rtx', and + 'arg_pointer_rtx' will have been initialized and should be used to + refer to those items. + + -- Macro: DWARF_FRAME_REGISTERS + This macro specifies the maximum number of hard registers that can + be saved in a call frame. This is used to size data structures + used in DWARF2 exception handling. + + Prior to GCC 3.0, this macro was needed in order to establish a + stable exception handling ABI in the face of adding new hard + registers for ISA extensions. In GCC 3.0 and later, the EH ABI is + insulated from changes in the number of hard registers. + Nevertheless, this macro can still be used to reduce the runtime + memory requirements of the exception handling routines, which can + be substantial if the ISA contains a lot of registers that are not + call-saved. + + If this macro is not defined, it defaults to + 'FIRST_PSEUDO_REGISTER'. + + -- Macro: PRE_GCC3_DWARF_FRAME_REGISTERS + + This macro is similar to 'DWARF_FRAME_REGISTERS', but is provided + for backward compatibility in pre GCC 3.0 compiled code. + + If this macro is not defined, it defaults to + 'DWARF_FRAME_REGISTERS'. + + -- Macro: DWARF_REG_TO_UNWIND_COLUMN (REGNO) + + Define this macro if the target's representation for dwarf + registers is different than the internal representation for unwind + column. Given a dwarf register, this macro should return the + internal unwind column number to use instead. + + See the PowerPC's SPE target for an example. + + -- Macro: DWARF_FRAME_REGNUM (REGNO) + + Define this macro if the target's representation for dwarf + registers used in .eh_frame or .debug_frame is different from that + used in other debug info sections. Given a GCC hard register + number, this macro should return the .eh_frame register number. + The default is 'DBX_REGISTER_NUMBER (REGNO)'. + + -- Macro: DWARF2_FRAME_REG_OUT (REGNO, FOR_EH) + + Define this macro to map register numbers held in the call frame + info that GCC has collected using 'DWARF_FRAME_REGNUM' to those + that should be output in .debug_frame ('FOR_EH' is zero) and + .eh_frame ('FOR_EH' is nonzero). The default is to return 'REGNO'. + + -- Macro: REG_VALUE_IN_UNWIND_CONTEXT + + Define this macro if the target stores register values as + '_Unwind_Word' type in unwind context. It should be defined if + target register size is larger than the size of 'void *'. The + default is to store register values as 'void *' type. + + -- Macro: ASSUME_EXTENDED_UNWIND_CONTEXT + + Define this macro to be 1 if the target always uses extended unwind + context with version, args_size and by_value fields. If it is + undefined, it will be defined to 1 when + 'REG_VALUE_IN_UNWIND_CONTEXT' is defined and 0 otherwise. + + +File: gccint.info, Node: Elimination, Next: Stack Arguments, Prev: Frame Registers, Up: Stack and Calling + +17.10.5 Eliminating Frame Pointer and Arg Pointer +------------------------------------------------- + +This is about eliminating the frame pointer and arg pointer. + + -- Target Hook: bool TARGET_FRAME_POINTER_REQUIRED (void) + This target hook should return 'true' if a function must have and + use a frame pointer. This target hook is called in the reload + pass. If its return value is 'true' the function will have a frame + pointer. + + This target hook can in principle examine the current function and + decide according to the facts, but on most machines the constant + 'false' or the constant 'true' suffices. Use 'false' when the + machine allows code to be generated with no frame pointer, and + doing so saves some time or space. Use 'true' when there is no + possible advantage to avoiding a frame pointer. + + In certain cases, the compiler does not know how to produce valid + code without a frame pointer. The compiler recognizes those cases + and automatically gives the function a frame pointer regardless of + what 'TARGET_FRAME_POINTER_REQUIRED' returns. You don't need to + worry about them. + + In a function that does not require a frame pointer, the frame + pointer register can be allocated for ordinary usage, unless you + mark it as a fixed register. See 'FIXED_REGISTERS' for more + information. + + Default return value is 'false'. + + -- Macro: INITIAL_FRAME_POINTER_OFFSET (DEPTH-VAR) + A C statement to store in the variable DEPTH-VAR the difference + between the frame pointer and the stack pointer values immediately + after the function prologue. The value would be computed from + information such as the result of 'get_frame_size ()' and the + tables of registers 'regs_ever_live' and 'call_used_regs'. + + If 'ELIMINABLE_REGS' is defined, this macro will be not be used and + need not be defined. Otherwise, it must be defined even if + 'TARGET_FRAME_POINTER_REQUIRED' always returns true; in that case, + you may set DEPTH-VAR to anything. + + -- Macro: ELIMINABLE_REGS + If defined, this macro specifies a table of register pairs used to + eliminate unneeded registers that point into the stack frame. If + it is not defined, the only elimination attempted by the compiler + is to replace references to the frame pointer with references to + the stack pointer. + + The definition of this macro is a list of structure + initializations, each of which specifies an original and + replacement register. + + On some machines, the position of the argument pointer is not known + until the compilation is completed. In such a case, a separate + hard register must be used for the argument pointer. This register + can be eliminated by replacing it with either the frame pointer or + the argument pointer, depending on whether or not the frame pointer + has been eliminated. + + In this case, you might specify: + #define ELIMINABLE_REGS \ + {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ + {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ + {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} + + Note that the elimination of the argument pointer with the stack + pointer is specified first since that is the preferred elimination. + + -- Target Hook: bool TARGET_CAN_ELIMINATE (const int FROM_REG, const + int TO_REG) + This target hook should returns 'true' if the compiler is allowed + to try to replace register number FROM_REG with register number + TO_REG. This target hook need only be defined if 'ELIMINABLE_REGS' + is defined, and will usually be 'true', since most of the cases + preventing register elimination are things that the compiler + already knows about. + + Default return value is 'true'. + + -- Macro: INITIAL_ELIMINATION_OFFSET (FROM-REG, TO-REG, OFFSET-VAR) + This macro is similar to 'INITIAL_FRAME_POINTER_OFFSET'. It + specifies the initial difference between the specified pair of + registers. This macro must be defined if 'ELIMINABLE_REGS' is + defined. + + +File: gccint.info, Node: Stack Arguments, Next: Register Arguments, Prev: Elimination, Up: Stack and Calling + +17.10.6 Passing Function Arguments on the Stack +----------------------------------------------- + +The macros in this section control how arguments are passed on the +stack. See the following section for other macros that control passing +certain arguments in registers. + + -- Target Hook: bool TARGET_PROMOTE_PROTOTYPES (const_tree FNTYPE) + This target hook returns 'true' if an argument declared in a + prototype as an integral type smaller than 'int' should actually be + passed as an 'int'. In addition to avoiding errors in certain + cases of mismatch, it also makes for better code on certain + machines. The default is to not promote prototypes. + + -- Macro: PUSH_ARGS + A C expression. If nonzero, push insns will be used to pass + outgoing arguments. If the target machine does not have a push + instruction, set it to zero. That directs GCC to use an alternate + strategy: to allocate the entire argument block and then store the + arguments into it. When 'PUSH_ARGS' is nonzero, 'PUSH_ROUNDING' + must be defined too. + + -- Macro: PUSH_ARGS_REVERSED + A C expression. If nonzero, function arguments will be evaluated + from last to first, rather than from first to last. If this macro + is not defined, it defaults to 'PUSH_ARGS' on targets where the + stack and args grow in opposite directions, and 0 otherwise. + + -- Macro: PUSH_ROUNDING (NPUSHED) + A C expression that is the number of bytes actually pushed onto the + stack when an instruction attempts to push NPUSHED bytes. + + On some machines, the definition + + #define PUSH_ROUNDING(BYTES) (BYTES) + + will suffice. But on other machines, instructions that appear to + push one byte actually push two bytes in an attempt to maintain + alignment. Then the definition should be + + #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1) + + If the value of this macro has a type, it should be an unsigned + type. + + -- Macro: ACCUMULATE_OUTGOING_ARGS + A C expression. If nonzero, the maximum amount of space required + for outgoing arguments will be computed and placed into + 'crtl->outgoing_args_size'. No space will be pushed onto the stack + for each call; instead, the function prologue should increase the + stack frame size by this amount. + + Setting both 'PUSH_ARGS' and 'ACCUMULATE_OUTGOING_ARGS' is not + proper. + + -- Macro: REG_PARM_STACK_SPACE (FNDECL) + Define this macro if functions should assume that stack space has + been allocated for arguments even when their values are passed in + registers. + + The value of this macro is the size, in bytes, of the area reserved + for arguments passed in registers for the function represented by + FNDECL, which can be zero if GCC is calling a library function. + The argument FNDECL can be the FUNCTION_DECL, or the type itself of + the function. + + This space can be allocated by the caller, or be a part of the + machine-dependent stack frame: 'OUTGOING_REG_PARM_STACK_SPACE' says + which. + + -- Macro: OUTGOING_REG_PARM_STACK_SPACE (FNTYPE) + Define this to a nonzero value if it is the responsibility of the + caller to allocate the area reserved for arguments passed in + registers when calling a function of FNTYPE. FNTYPE may be NULL if + the function called is a library function. + + If 'ACCUMULATE_OUTGOING_ARGS' is defined, this macro controls + whether the space for these arguments counts in the value of + 'crtl->outgoing_args_size'. + + -- Macro: STACK_PARMS_IN_REG_PARM_AREA + Define this macro if 'REG_PARM_STACK_SPACE' is defined, but the + stack parameters don't skip the area specified by it. + + Normally, when a parameter is not passed in registers, it is placed + on the stack beyond the 'REG_PARM_STACK_SPACE' area. Defining this + macro suppresses this behavior and causes the parameter to be + passed on the stack in its natural location. + + -- Target Hook: int TARGET_RETURN_POPS_ARGS (tree FUNDECL, tree + FUNTYPE, int SIZE) + This target hook returns the number of bytes of its own arguments + that a function pops on returning, or 0 if the function pops no + arguments and the caller must therefore pop them all after the + function returns. + + FUNDECL is a C variable whose value is a tree node that describes + the function in question. Normally it is a node of type + 'FUNCTION_DECL' that describes the declaration of the function. + From this you can obtain the 'DECL_ATTRIBUTES' of the function. + + FUNTYPE is a C variable whose value is a tree node that describes + the function in question. Normally it is a node of type + 'FUNCTION_TYPE' that describes the data type of the function. From + this it is possible to obtain the data types of the value and + arguments (if known). + + When a call to a library function is being considered, FUNDECL will + contain an identifier node for the library function. Thus, if you + need to distinguish among various library functions, you can do so + by their names. Note that "library function" in this context means + a function used to perform arithmetic, whose name is known + specially in the compiler and was not mentioned in the C code being + compiled. + + SIZE is the number of bytes of arguments passed on the stack. If a + variable number of bytes is passed, it is zero, and argument + popping will always be the responsibility of the calling function. + + On the VAX, all functions always pop their arguments, so the + definition of this macro is SIZE. On the 68000, using the standard + calling convention, no functions pop their arguments, so the value + of the macro is always 0 in this case. But an alternative calling + convention is available in which functions that take a fixed number + of arguments pop them but other functions (such as 'printf') pop + nothing (the caller pops all). When this convention is in use, + FUNTYPE is examined to determine whether a function takes a fixed + number of arguments. + + -- Macro: CALL_POPS_ARGS (CUM) + A C expression that should indicate the number of bytes a call + sequence pops off the stack. It is added to the value of + 'RETURN_POPS_ARGS' when compiling a function call. + + CUM is the variable in which all arguments to the called function + have been accumulated. + + On certain architectures, such as the SH5, a call trampoline is + used that pops certain registers off the stack, depending on the + arguments that have been passed to the function. Since this is a + property of the call site, not of the called function, + 'RETURN_POPS_ARGS' is not appropriate. + + +File: gccint.info, Node: Register Arguments, Next: Scalar Return, Prev: Stack Arguments, Up: Stack and Calling + +17.10.7 Passing Arguments in Registers +-------------------------------------- + +This section describes the macros which let you control how various +types of arguments are passed in registers or how they are arranged in +the stack. + + -- Target Hook: rtx TARGET_FUNCTION_ARG (cumulative_args_t CA, enum + machine_mode MODE, const_tree TYPE, bool NAMED) + Return an RTX indicating whether a function argument is passed in a + register and if so, which register. + + The arguments are CA, which summarizes all the previous arguments; + MODE, the machine mode of the argument; TYPE, the data type of the + argument as a tree node or 0 if that is not known (which happens + for C support library functions); and NAMED, which is 'true' for an + ordinary argument and 'false' for nameless arguments that + correspond to '...' in the called function's prototype. TYPE can + be an incomplete type if a syntax error has previously occurred. + + The return value is usually either a 'reg' RTX for the hard + register in which to pass the argument, or zero to pass the + argument on the stack. + + The value of the expression can also be a 'parallel' RTX. This is + used when an argument is passed in multiple locations. The mode of + the 'parallel' should be the mode of the entire argument. The + 'parallel' holds any number of 'expr_list' pairs; each one + describes where part of the argument is passed. In each + 'expr_list' the first operand must be a 'reg' RTX for the hard + register in which to pass this part of the argument, and the mode + of the register RTX indicates how large this part of the argument + is. The second operand of the 'expr_list' is a 'const_int' which + gives the offset in bytes into the entire argument of where this + part starts. As a special exception the first 'expr_list' in the + 'parallel' RTX may have a first operand of zero. This indicates + that the entire argument is also stored on the stack. + + The last time this hook is called, it is called with 'MODE == + VOIDmode', and its result is passed to the 'call' or 'call_value' + pattern as operands 2 and 3 respectively. + + The usual way to make the ISO library 'stdarg.h' work on a machine + where some arguments are usually passed in registers, is to cause + nameless arguments to be passed on the stack instead. This is done + by making 'TARGET_FUNCTION_ARG' return 0 whenever NAMED is 'false'. + + You may use the hook 'targetm.calls.must_pass_in_stack' in the + definition of this macro to determine if this argument is of a type + that must be passed in the stack. If 'REG_PARM_STACK_SPACE' is not + defined and 'TARGET_FUNCTION_ARG' returns nonzero for such an + argument, the compiler will abort. If 'REG_PARM_STACK_SPACE' is + defined, the argument will be computed in the stack and then loaded + into a register. + + -- Target Hook: bool TARGET_MUST_PASS_IN_STACK (enum machine_mode MODE, + const_tree TYPE) + This target hook should return 'true' if we should not pass TYPE + solely in registers. The file 'expr.h' defines a definition that + is usually appropriate, refer to 'expr.h' for additional + documentation. + + -- Target Hook: rtx TARGET_FUNCTION_INCOMING_ARG (cumulative_args_t CA, + enum machine_mode MODE, const_tree TYPE, bool NAMED) + Define this hook if the target machine has "register windows", so + that the register in which a function sees an arguments is not + necessarily the same as the one in which the caller passed the + argument. + + For such machines, 'TARGET_FUNCTION_ARG' computes the register in + which the caller passes the value, and + 'TARGET_FUNCTION_INCOMING_ARG' should be defined in a similar + fashion to tell the function being called where the arguments will + arrive. + + If 'TARGET_FUNCTION_INCOMING_ARG' is not defined, + 'TARGET_FUNCTION_ARG' serves both purposes. + + -- Target Hook: int TARGET_ARG_PARTIAL_BYTES (cumulative_args_t CUM, + enum machine_mode MODE, tree TYPE, bool NAMED) + This target hook returns the number of bytes at the beginning of an + argument that must be put in registers. The value must be zero for + arguments that are passed entirely in registers or that are + entirely pushed on the stack. + + On some machines, certain arguments must be passed partially in + registers and partially in memory. On these machines, typically + the first few words of arguments are passed in registers, and the + rest on the stack. If a multi-word argument (a 'double' or a + structure) crosses that boundary, its first few words must be + passed in registers and the rest must be pushed. This macro tells + the compiler when this occurs, and how many bytes should go in + registers. + + 'TARGET_FUNCTION_ARG' for these arguments should return the first + register to be used by the caller for this argument; likewise + 'TARGET_FUNCTION_INCOMING_ARG', for the called function. + + -- Target Hook: bool TARGET_PASS_BY_REFERENCE (cumulative_args_t CUM, + enum machine_mode MODE, const_tree TYPE, bool NAMED) + This target hook should return 'true' if an argument at the + position indicated by CUM should be passed by reference. This + predicate is queried after target independent reasons for being + passed by reference, such as 'TREE_ADDRESSABLE (type)'. + + If the hook returns true, a copy of that argument is made in memory + and a pointer to the argument is passed instead of the argument + itself. The pointer is passed in whatever way is appropriate for + passing a pointer to that type. + + -- Target Hook: bool TARGET_CALLEE_COPIES (cumulative_args_t CUM, enum + machine_mode MODE, const_tree TYPE, bool NAMED) + The function argument described by the parameters to this hook is + known to be passed by reference. The hook should return true if + the function argument should be copied by the callee instead of + copied by the caller. + + For any argument for which the hook returns true, if it can be + determined that the argument is not modified, then a copy need not + be generated. + + The default version of this hook always returns false. + + -- Macro: CUMULATIVE_ARGS + A C type for declaring a variable that is used as the first + argument of 'TARGET_FUNCTION_ARG' and other related values. For + some target machines, the type 'int' suffices and can hold the + number of bytes of argument so far. + + There is no need to record in 'CUMULATIVE_ARGS' anything about the + arguments that have been passed on the stack. The compiler has + other variables to keep track of that. For target machines on + which all arguments are passed on the stack, there is no need to + store anything in 'CUMULATIVE_ARGS'; however, the data structure + must exist and should not be empty, so use 'int'. + + -- Macro: OVERRIDE_ABI_FORMAT (FNDECL) + If defined, this macro is called before generating any code for a + function, but after the CFUN descriptor for the function has been + created. The back end may use this macro to update CFUN to reflect + an ABI other than that which would normally be used by default. If + the compiler is generating code for a compiler-generated function, + FNDECL may be 'NULL'. + + -- Macro: INIT_CUMULATIVE_ARGS (CUM, FNTYPE, LIBNAME, FNDECL, + N_NAMED_ARGS) + A C statement (sans semicolon) for initializing the variable CUM + for the state at the beginning of the argument list. The variable + has type 'CUMULATIVE_ARGS'. The value of FNTYPE is the tree node + for the data type of the function which will receive the args, or 0 + if the args are to a compiler support library function. For direct + calls that are not libcalls, FNDECL contain the declaration node of + the function. FNDECL is also set when 'INIT_CUMULATIVE_ARGS' is + used to find arguments for the function being compiled. + N_NAMED_ARGS is set to the number of named arguments, including a + structure return address if it is passed as a parameter, when + making a call. When processing incoming arguments, N_NAMED_ARGS is + set to -1. + + When processing a call to a compiler support library function, + LIBNAME identifies which one. It is a 'symbol_ref' rtx which + contains the name of the function, as a string. LIBNAME is 0 when + an ordinary C function call is being processed. Thus, each time + this macro is called, either LIBNAME or FNTYPE is nonzero, but + never both of them at once. + + -- Macro: INIT_CUMULATIVE_LIBCALL_ARGS (CUM, MODE, LIBNAME) + Like 'INIT_CUMULATIVE_ARGS' but only used for outgoing libcalls, it + gets a 'MODE' argument instead of FNTYPE, that would be 'NULL'. + INDIRECT would always be zero, too. If this macro is not defined, + 'INIT_CUMULATIVE_ARGS (cum, NULL_RTX, libname, 0)' is used instead. + + -- Macro: INIT_CUMULATIVE_INCOMING_ARGS (CUM, FNTYPE, LIBNAME) + Like 'INIT_CUMULATIVE_ARGS' but overrides it for the purposes of + finding the arguments for the function being compiled. If this + macro is undefined, 'INIT_CUMULATIVE_ARGS' is used instead. + + The value passed for LIBNAME is always 0, since library routines + with special calling conventions are never compiled with GCC. The + argument LIBNAME exists for symmetry with 'INIT_CUMULATIVE_ARGS'. + + -- Target Hook: void TARGET_FUNCTION_ARG_ADVANCE (cumulative_args_t CA, + enum machine_mode MODE, const_tree TYPE, bool NAMED) + This hook updates the summarizer variable pointed to by CA to + advance past an argument in the argument list. The values MODE, + TYPE and NAMED describe that argument. Once this is done, the + variable CUM is suitable for analyzing the _following_ argument + with 'TARGET_FUNCTION_ARG', etc. + + This hook need not do anything if the argument in question was + passed on the stack. The compiler knows how to track the amount of + stack space used for arguments without any special help. + + -- Macro: FUNCTION_ARG_OFFSET (MODE, TYPE) + If defined, a C expression that is the number of bytes to add to + the offset of the argument passed in memory. This is needed for + the SPU, which passes 'char' and 'short' arguments in the preferred + slot that is in the middle of the quad word instead of starting at + the top. + + -- Macro: FUNCTION_ARG_PADDING (MODE, TYPE) + If defined, a C expression which determines whether, and in which + direction, to pad out an argument with extra space. The value + should be of type 'enum direction': either 'upward' to pad above + the argument, 'downward' to pad below, or 'none' to inhibit + padding. + + The _amount_ of padding is not controlled by this macro, but by the + target hook 'TARGET_FUNCTION_ARG_ROUND_BOUNDARY'. It is always + just enough to reach the next multiple of that boundary. + + This macro has a default definition which is right for most + systems. For little-endian machines, the default is to pad upward. + For big-endian machines, the default is to pad downward for an + argument of constant size shorter than an 'int', and upward + otherwise. + + -- Macro: PAD_VARARGS_DOWN + If defined, a C expression which determines whether the default + implementation of va_arg will attempt to pad down before reading + the next argument, if that argument is smaller than its aligned + space as controlled by 'PARM_BOUNDARY'. If this macro is not + defined, all such arguments are padded down if 'BYTES_BIG_ENDIAN' + is true. + + -- Macro: BLOCK_REG_PADDING (MODE, TYPE, FIRST) + Specify padding for the last element of a block move between + registers and memory. FIRST is nonzero if this is the only + element. Defining this macro allows better control of register + function parameters on big-endian machines, without using + 'PARALLEL' rtl. In particular, 'MUST_PASS_IN_STACK' need not test + padding and mode of types in registers, as there is no longer a + "wrong" part of a register; For example, a three byte aggregate may + be passed in the high part of a register if so required. + + -- Target Hook: unsigned int TARGET_FUNCTION_ARG_BOUNDARY (enum + machine_mode MODE, const_tree TYPE) + This hook returns the alignment boundary, in bits, of an argument + with the specified mode and type. The default hook returns + 'PARM_BOUNDARY' for all arguments. + + -- Target Hook: unsigned int TARGET_FUNCTION_ARG_ROUND_BOUNDARY (enum + machine_mode MODE, const_tree TYPE) + Normally, the size of an argument is rounded up to 'PARM_BOUNDARY', + which is the default value for this hook. You can define this hook + to return a different value if an argument size must be rounded to + a larger value. + + -- Macro: FUNCTION_ARG_REGNO_P (REGNO) + A C expression that is nonzero if REGNO is the number of a hard + register in which function arguments are sometimes passed. This + does _not_ include implicit arguments such as the static chain and + the structure-value address. On many machines, no registers can be + used for this purpose since all function arguments are pushed on + the stack. + + -- Target Hook: bool TARGET_SPLIT_COMPLEX_ARG (const_tree TYPE) + This hook should return true if parameter of type TYPE are passed + as two scalar parameters. By default, GCC will attempt to pack + complex arguments into the target's word size. Some ABIs require + complex arguments to be split and treated as their individual + components. For example, on AIX64, complex floats should be passed + in a pair of floating point registers, even though a complex float + would fit in one 64-bit floating point register. + + The default value of this hook is 'NULL', which is treated as + always false. + + -- Target Hook: tree TARGET_BUILD_BUILTIN_VA_LIST (void) + This hook returns a type node for 'va_list' for the target. The + default version of the hook returns 'void*'. + + -- Target Hook: int TARGET_ENUM_VA_LIST_P (int IDX, const char **PNAME, + tree *PTREE) + This target hook is used in function 'c_common_nodes_and_builtins' + to iterate through the target specific builtin types for va_list. + The variable IDX is used as iterator. PNAME has to be a pointer to + a 'const char *' and PTREE a pointer to a 'tree' typed variable. + The arguments PNAME and PTREE are used to store the result of this + macro and are set to the name of the va_list builtin type and its + internal type. If the return value of this macro is zero, then + there is no more element. Otherwise the IDX should be increased + for the next call of this macro to iterate through all types. + + -- Target Hook: tree TARGET_FN_ABI_VA_LIST (tree FNDECL) + This hook returns the va_list type of the calling convention + specified by FNDECL. The default version of this hook returns + 'va_list_type_node'. + + -- Target Hook: tree TARGET_CANONICAL_VA_LIST_TYPE (tree TYPE) + This hook returns the va_list type of the calling convention + specified by the type of TYPE. If TYPE is not a valid va_list + type, it returns 'NULL_TREE'. + + -- Target Hook: tree TARGET_GIMPLIFY_VA_ARG_EXPR (tree VALIST, tree + TYPE, gimple_seq *PRE_P, gimple_seq *POST_P) + This hook performs target-specific gimplification of 'VA_ARG_EXPR'. + The first two parameters correspond to the arguments to 'va_arg'; + the latter two are as in 'gimplify.c:gimplify_expr'. + + -- Target Hook: bool TARGET_VALID_POINTER_MODE (enum machine_mode MODE) + Define this to return nonzero if the port can handle pointers with + machine mode MODE. The default version of this hook returns true + for both 'ptr_mode' and 'Pmode'. + + -- Target Hook: bool TARGET_REF_MAY_ALIAS_ERRNO (struct ao_ref *REF) + Define this to return nonzero if the memory reference REF may alias + with the system C library errno location. The default version of + this hook assumes the system C library errno location is either a + declaration of type int or accessed by dereferencing a pointer to + int. + + -- Target Hook: bool TARGET_SCALAR_MODE_SUPPORTED_P (enum machine_mode + MODE) + Define this to return nonzero if the port is prepared to handle + insns involving scalar mode MODE. For a scalar mode to be + considered supported, all the basic arithmetic and comparisons must + work. + + The default version of this hook returns true for any mode required + to handle the basic C types (as defined by the port). Included + here are the double-word arithmetic supported by the code in + 'optabs.c'. + + -- Target Hook: bool TARGET_VECTOR_MODE_SUPPORTED_P (enum machine_mode + MODE) + Define this to return nonzero if the port is prepared to handle + insns involving vector mode MODE. At the very least, it must have + move patterns for this mode. + + -- Target Hook: bool TARGET_ARRAY_MODE_SUPPORTED_P (enum machine_mode + MODE, unsigned HOST_WIDE_INT NELEMS) + Return true if GCC should try to use a scalar mode to store an + array of NELEMS elements, given that each element has mode MODE. + Returning true here overrides the usual 'MAX_FIXED_MODE' limit and + allows GCC to use any defined integer mode. + + One use of this hook is to support vector load and store operations + that operate on several homogeneous vectors. For example, ARM NEON + has operations like: + + int8x8x3_t vld3_s8 (const int8_t *) + + where the return type is defined as: + + typedef struct int8x8x3_t + { + int8x8_t val[3]; + } int8x8x3_t; + + If this hook allows 'val' to have a scalar mode, then 'int8x8x3_t' + can have the same mode. GCC can then store 'int8x8x3_t's in + registers rather than forcing them onto the stack. + + -- Target Hook: bool TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P (enum + machine_mode MODE) + Define this to return nonzero for machine modes for which the port + has small register classes. If this target hook returns nonzero + for a given MODE, the compiler will try to minimize the lifetime of + registers in MODE. The hook may be called with 'VOIDmode' as + argument. In this case, the hook is expected to return nonzero if + it returns nonzero for any mode. + + On some machines, it is risky to let hard registers live across + arbitrary insns. Typically, these machines have instructions that + require values to be in specific registers (like an accumulator), + and reload will fail if the required hard register is used for + another purpose across such an insn. + + Passes before reload do not know which hard registers will be used + in an instruction, but the machine modes of the registers set or + used in the instruction are already known. And for some machines, + register classes are small for, say, integer registers but not for + floating point registers. For example, the AMD x86-64 architecture + requires specific registers for the legacy x86 integer + instructions, but there are many SSE registers for floating point + operations. On such targets, a good strategy may be to return + nonzero from this hook for 'INTEGRAL_MODE_P' machine modes but zero + for the SSE register classes. + + The default version of this hook returns false for any mode. It is + always safe to redefine this hook to return with a nonzero value. + But if you unnecessarily define it, you will reduce the amount of + optimizations that can be performed in some cases. If you do not + define this hook to return a nonzero value when it is required, the + compiler will run out of spill registers and print a fatal error + message. + + -- Target Hook: unsigned int TARGET_FLAGS_REGNUM + If the target has a dedicated flags register, and it needs to use + the post-reload comparison elimination pass, then this value should + be set appropriately. + + +File: gccint.info, Node: Scalar Return, Next: Aggregate Return, Prev: Register Arguments, Up: Stack and Calling + +17.10.8 How Scalar Function Values Are Returned +----------------------------------------------- + +This section discusses the macros that control returning scalars as +values--values that can fit in registers. + + -- Target Hook: rtx TARGET_FUNCTION_VALUE (const_tree RET_TYPE, + const_tree FN_DECL_OR_TYPE, bool OUTGOING) + + Define this to return an RTX representing the place where a + function returns or receives a value of data type RET_TYPE, a tree + node representing a data type. FN_DECL_OR_TYPE is a tree node + representing 'FUNCTION_DECL' or 'FUNCTION_TYPE' of a function being + called. If OUTGOING is false, the hook should compute the register + in which the caller will see the return value. Otherwise, the hook + should return an RTX representing the place where a function + returns a value. + + On many machines, only 'TYPE_MODE (RET_TYPE)' is relevant. + (Actually, on most machines, scalar values are returned in the same + place regardless of mode.) The value of the expression is usually + a 'reg' RTX for the hard register where the return value is stored. + The value can also be a 'parallel' RTX, if the return value is in + multiple places. See 'TARGET_FUNCTION_ARG' for an explanation of + the 'parallel' form. Note that the callee will populate every + location specified in the 'parallel', but if the first element of + the 'parallel' contains the whole return value, callers will use + that element as the canonical location and ignore the others. The + m68k port uses this type of 'parallel' to return pointers in both + '%a0' (the canonical location) and '%d0'. + + If 'TARGET_PROMOTE_FUNCTION_RETURN' returns true, you must apply + the same promotion rules specified in 'PROMOTE_MODE' if VALTYPE is + a scalar type. + + If the precise function being called is known, FUNC is a tree node + ('FUNCTION_DECL') for it; otherwise, FUNC is a null pointer. This + makes it possible to use a different value-returning convention for + specific functions when all their calls are known. + + Some target machines have "register windows" so that the register + in which a function returns its value is not the same as the one in + which the caller sees the value. For such machines, you should + return different RTX depending on OUTGOING. + + 'TARGET_FUNCTION_VALUE' is not used for return values with + aggregate data types, because these are returned in another way. + See 'TARGET_STRUCT_VALUE_RTX' and related macros, below. + + -- Macro: FUNCTION_VALUE (VALTYPE, FUNC) + This macro has been deprecated. Use 'TARGET_FUNCTION_VALUE' for a + new target instead. + + -- Macro: LIBCALL_VALUE (MODE) + A C expression to create an RTX representing the place where a + library function returns a value of mode MODE. + + Note that "library function" in this context means a compiler + support routine, used to perform arithmetic, whose name is known + specially by the compiler and was not mentioned in the C code being + compiled. + + -- Target Hook: rtx TARGET_LIBCALL_VALUE (enum machine_mode MODE, + const_rtx FUN) + Define this hook if the back-end needs to know the name of the + libcall function in order to determine where the result should be + returned. + + The mode of the result is given by MODE and the name of the called + library function is given by FUN. The hook should return an RTX + representing the place where the library function result will be + returned. + + If this hook is not defined, then LIBCALL_VALUE will be used. + + -- Macro: FUNCTION_VALUE_REGNO_P (REGNO) + A C expression that is nonzero if REGNO is the number of a hard + register in which the values of called function may come back. + + A register whose use for returning values is limited to serving as + the second of a pair (for a value of type 'double', say) need not + be recognized by this macro. So for most machines, this definition + suffices: + + #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0) + + If the machine has register windows, so that the caller and the + called function use different registers for the return value, this + macro should recognize only the caller's register numbers. + + This macro has been deprecated. Use + 'TARGET_FUNCTION_VALUE_REGNO_P' for a new target instead. + + -- Target Hook: bool TARGET_FUNCTION_VALUE_REGNO_P (const unsigned int + REGNO) + A target hook that return 'true' if REGNO is the number of a hard + register in which the values of called function may come back. + + A register whose use for returning values is limited to serving as + the second of a pair (for a value of type 'double', say) need not + be recognized by this target hook. + + If the machine has register windows, so that the caller and the + called function use different registers for the return value, this + target hook should recognize only the caller's register numbers. + + If this hook is not defined, then FUNCTION_VALUE_REGNO_P will be + used. + + -- Macro: APPLY_RESULT_SIZE + Define this macro if 'untyped_call' and 'untyped_return' need more + space than is implied by 'FUNCTION_VALUE_REGNO_P' for saving and + restoring an arbitrary return value. + + -- Target Hook: bool TARGET_RETURN_IN_MSB (const_tree TYPE) + This hook should return true if values of type TYPE are returned at + the most significant end of a register (in other words, if they are + padded at the least significant end). You can assume that TYPE is + returned in a register; the caller is required to check this. + + Note that the register provided by 'TARGET_FUNCTION_VALUE' must be + able to hold the complete return value. For example, if a 1-, 2- + or 3-byte structure is returned at the most significant end of a + 4-byte register, 'TARGET_FUNCTION_VALUE' should provide an 'SImode' + rtx. + + +File: gccint.info, Node: Aggregate Return, Next: Caller Saves, Prev: Scalar Return, Up: Stack and Calling + +17.10.9 How Large Values Are Returned +------------------------------------- + +When a function value's mode is 'BLKmode' (and in some other cases), the +value is not returned according to 'TARGET_FUNCTION_VALUE' (*note Scalar +Return::). Instead, the caller passes the address of a block of memory +in which the value should be stored. This address is called the +"structure value address". + + This section describes how to control returning structure values in +memory. + + -- Target Hook: bool TARGET_RETURN_IN_MEMORY (const_tree TYPE, + const_tree FNTYPE) + This target hook should return a nonzero value to say to return the + function value in memory, just as large structures are always + returned. Here TYPE will be the data type of the value, and FNTYPE + will be the type of the function doing the returning, or 'NULL' for + libcalls. + + Note that values of mode 'BLKmode' must be explicitly handled by + this function. Also, the option '-fpcc-struct-return' takes effect + regardless of this macro. On most systems, it is possible to leave + the hook undefined; this causes a default definition to be used, + whose value is the constant 1 for 'BLKmode' values, and 0 + otherwise. + + Do not use this hook to indicate that structures and unions should + always be returned in memory. You should instead use + 'DEFAULT_PCC_STRUCT_RETURN' to indicate this. + + -- Macro: DEFAULT_PCC_STRUCT_RETURN + Define this macro to be 1 if all structure and union return values + must be in memory. Since this results in slower code, this should + be defined only if needed for compatibility with other compilers or + with an ABI. If you define this macro to be 0, then the + conventions used for structure and union return values are decided + by the 'TARGET_RETURN_IN_MEMORY' target hook. + + If not defined, this defaults to the value 1. + + -- Target Hook: rtx TARGET_STRUCT_VALUE_RTX (tree FNDECL, int INCOMING) + This target hook should return the location of the structure value + address (normally a 'mem' or 'reg'), or 0 if the address is passed + as an "invisible" first argument. Note that FNDECL may be 'NULL', + for libcalls. You do not need to define this target hook if the + address is always passed as an "invisible" first argument. + + On some architectures the place where the structure value address + is found by the called function is not the same place that the + caller put it. This can be due to register windows, or it could be + because the function prologue moves it to a different place. + INCOMING is '1' or '2' when the location is needed in the context + of the called function, and '0' in the context of the caller. + + If INCOMING is nonzero and the address is to be found on the stack, + return a 'mem' which refers to the frame pointer. If INCOMING is + '2', the result is being used to fetch the structure value address + at the beginning of a function. If you need to emit adjusting + code, you should do it at this point. + + -- Macro: PCC_STATIC_STRUCT_RETURN + Define this macro if the usual system convention on the target + machine for returning structures and unions is for the called + function to return the address of a static variable containing the + value. + + Do not define this if the usual system convention is for the caller + to pass an address to the subroutine. + + This macro has effect in '-fpcc-struct-return' mode, but it does + nothing when you use '-freg-struct-return' mode. + + -- Target Hook: enum machine_mode TARGET_GET_RAW_RESULT_MODE (int + REGNO) + This target hook returns the mode to be used when accessing raw + return registers in '__builtin_return'. Define this macro if the + value in REG_RAW_MODE is not correct. + + -- Target Hook: enum machine_mode TARGET_GET_RAW_ARG_MODE (int REGNO) + This target hook returns the mode to be used when accessing raw + argument registers in '__builtin_apply_args'. Define this macro if + the value in REG_RAW_MODE is not correct. + + +File: gccint.info, Node: Caller Saves, Next: Function Entry, Prev: Aggregate Return, Up: Stack and Calling + +17.10.10 Caller-Saves Register Allocation +----------------------------------------- + +If you enable it, GCC can save registers around function calls. This +makes it possible to use call-clobbered registers to hold variables that +must live across calls. + + -- Macro: CALLER_SAVE_PROFITABLE (REFS, CALLS) + A C expression to determine whether it is worthwhile to consider + placing a pseudo-register in a call-clobbered hard register and + saving and restoring it around each function call. The expression + should be 1 when this is worth doing, and 0 otherwise. + + If you don't define this macro, a default is used which is good on + most machines: '4 * CALLS < REFS'. + + -- Macro: HARD_REGNO_CALLER_SAVE_MODE (REGNO, NREGS) + A C expression specifying which mode is required for saving NREGS + of a pseudo-register in call-clobbered hard register REGNO. If + REGNO is unsuitable for caller save, 'VOIDmode' should be returned. + For most machines this macro need not be defined since GCC will + select the smallest suitable mode. + + +File: gccint.info, Node: Function Entry, Next: Profiling, Prev: Caller Saves, Up: Stack and Calling + +17.10.11 Function Entry and Exit +-------------------------------- + +This section describes the macros that output function entry +("prologue") and exit ("epilogue") code. + + -- Target Hook: void TARGET_ASM_FUNCTION_PROLOGUE (FILE *FILE, + HOST_WIDE_INT SIZE) + If defined, a function that outputs the assembler code for entry to + a function. The prologue is responsible for setting up the stack + frame, initializing the frame pointer register, saving registers + that must be saved, and allocating SIZE additional bytes of storage + for the local variables. SIZE is an integer. FILE is a stdio + stream to which the assembler code should be output. + + The label for the beginning of the function need not be output by + this macro. That has already been done when the macro is run. + + To determine which registers to save, the macro can refer to the + array 'regs_ever_live': element R is nonzero if hard register R is + used anywhere within the function. This implies the function + prologue should save register R, provided it is not one of the + call-used registers. ('TARGET_ASM_FUNCTION_EPILOGUE' must likewise + use 'regs_ever_live'.) + + On machines that have "register windows", the function entry code + does not save on the stack the registers that are in the windows, + even if they are supposed to be preserved by function calls; + instead it takes appropriate steps to "push" the register stack, if + any non-call-used registers are used in the function. + + On machines where functions may or may not have frame-pointers, the + function entry code must vary accordingly; it must set up the frame + pointer if one is wanted, and not otherwise. To determine whether + a frame pointer is in wanted, the macro can refer to the variable + 'frame_pointer_needed'. The variable's value will be 1 at run time + in a function that needs a frame pointer. *Note Elimination::. + + The function entry code is responsible for allocating any stack + space required for the function. This stack space consists of the + regions listed below. In most cases, these regions are allocated + in the order listed, with the last listed region closest to the top + of the stack (the lowest address if 'STACK_GROWS_DOWNWARD' is + defined, and the highest address if it is not defined). You can + use a different order for a machine if doing so is more convenient + or required for compatibility reasons. Except in cases where + required by standard or by a debugger, there is no reason why the + stack layout used by GCC need agree with that used by other + compilers for a machine. + + -- Target Hook: void TARGET_ASM_FUNCTION_END_PROLOGUE (FILE *FILE) + If defined, a function that outputs assembler code at the end of a + prologue. This should be used when the function prologue is being + emitted as RTL, and you have some extra assembler that needs to be + emitted. *Note prologue instruction pattern::. + + -- Target Hook: void TARGET_ASM_FUNCTION_BEGIN_EPILOGUE (FILE *FILE) + If defined, a function that outputs assembler code at the start of + an epilogue. This should be used when the function epilogue is + being emitted as RTL, and you have some extra assembler that needs + to be emitted. *Note epilogue instruction pattern::. + + -- Target Hook: void TARGET_ASM_FUNCTION_EPILOGUE (FILE *FILE, + HOST_WIDE_INT SIZE) + If defined, a function that outputs the assembler code for exit + from a function. The epilogue is responsible for restoring the + saved registers and stack pointer to their values when the function + was called, and returning control to the caller. This macro takes + the same arguments as the macro 'TARGET_ASM_FUNCTION_PROLOGUE', and + the registers to restore are determined from 'regs_ever_live' and + 'CALL_USED_REGISTERS' in the same way. + + On some machines, there is a single instruction that does all the + work of returning from the function. On these machines, give that + instruction the name 'return' and do not define the macro + 'TARGET_ASM_FUNCTION_EPILOGUE' at all. + + Do not define a pattern named 'return' if you want the + 'TARGET_ASM_FUNCTION_EPILOGUE' to be used. If you want the target + switches to control whether return instructions or epilogues are + used, define a 'return' pattern with a validity condition that + tests the target switches appropriately. If the 'return' pattern's + validity condition is false, epilogues will be used. + + On machines where functions may or may not have frame-pointers, the + function exit code must vary accordingly. Sometimes the code for + these two cases is completely different. To determine whether a + frame pointer is wanted, the macro can refer to the variable + 'frame_pointer_needed'. The variable's value will be 1 when + compiling a function that needs a frame pointer. + + Normally, 'TARGET_ASM_FUNCTION_PROLOGUE' and + 'TARGET_ASM_FUNCTION_EPILOGUE' must treat leaf functions specially. + The C variable 'current_function_is_leaf' is nonzero for such a + function. *Note Leaf Functions::. + + On some machines, some functions pop their arguments on exit while + others leave that for the caller to do. For example, the 68020 + when given '-mrtd' pops arguments in functions that take a fixed + number of arguments. + + Your definition of the macro 'RETURN_POPS_ARGS' decides which + functions pop their own arguments. 'TARGET_ASM_FUNCTION_EPILOGUE' + needs to know what was decided. The number of bytes of the current + function's arguments that this function should pop is available in + 'crtl->args.pops_args'. *Note Scalar Return::. + + * A region of 'crtl->args.pretend_args_size' bytes of uninitialized + space just underneath the first argument arriving on the stack. + (This may not be at the very start of the allocated stack region if + the calling sequence has pushed anything else since pushing the + stack arguments. But usually, on such machines, nothing else has + been pushed yet, because the function prologue itself does all the + pushing.) This region is used on machines where an argument may be + passed partly in registers and partly in memory, and, in some cases + to support the features in '<stdarg.h>'. + + * An area of memory used to save certain registers used by the + function. The size of this area, which may also include space for + such things as the return address and pointers to previous stack + frames, is machine-specific and usually depends on which registers + have been used in the function. Machines with register windows + often do not require a save area. + + * A region of at least SIZE bytes, possibly rounded up to an + allocation boundary, to contain the local variables of the + function. On some machines, this region and the save area may + occur in the opposite order, with the save area closer to the top + of the stack. + + * Optionally, when 'ACCUMULATE_OUTGOING_ARGS' is defined, a region of + 'crtl->outgoing_args_size' bytes to be used for outgoing argument + lists of the function. *Note Stack Arguments::. + + -- Macro: EXIT_IGNORE_STACK + Define this macro as a C expression that is nonzero if the return + instruction or the function epilogue ignores the value of the stack + pointer; in other words, if it is safe to delete an instruction to + adjust the stack pointer before a return from the function. The + default is 0. + + Note that this macro's value is relevant only for functions for + which frame pointers are maintained. It is never safe to delete a + final stack adjustment in a function that has no frame pointer, and + the compiler knows this regardless of 'EXIT_IGNORE_STACK'. + + -- Macro: EPILOGUE_USES (REGNO) + Define this macro as a C expression that is nonzero for registers + that are used by the epilogue or the 'return' pattern. The stack + and frame pointer registers are already assumed to be used as + needed. + + -- Macro: EH_USES (REGNO) + Define this macro as a C expression that is nonzero for registers + that are used by the exception handling mechanism, and so should be + considered live on entry to an exception edge. + + -- Target Hook: void TARGET_ASM_OUTPUT_MI_THUNK (FILE *FILE, tree + THUNK_FNDECL, HOST_WIDE_INT DELTA, HOST_WIDE_INT VCALL_OFFSET, + tree FUNCTION) + A function that outputs the assembler code for a thunk function, + used to implement C++ virtual function calls with multiple + inheritance. The thunk acts as a wrapper around a virtual + function, adjusting the implicit object parameter before handing + control off to the real function. + + First, emit code to add the integer DELTA to the location that + contains the incoming first argument. Assume that this argument + contains a pointer, and is the one used to pass the 'this' pointer + in C++. This is the incoming argument _before_ the function + prologue, e.g. '%o0' on a sparc. The addition must preserve the + values of all other incoming arguments. + + Then, if VCALL_OFFSET is nonzero, an additional adjustment should + be made after adding 'delta'. In particular, if P is the adjusted + pointer, the following adjustment should be made: + + p += (*((ptrdiff_t **)p))[vcall_offset/sizeof(ptrdiff_t)] + + After the additions, emit code to jump to FUNCTION, which is a + 'FUNCTION_DECL'. This is a direct pure jump, not a call, and does + not touch the return address. Hence returning from FUNCTION will + return to whoever called the current 'thunk'. + + The effect must be as if FUNCTION had been called directly with the + adjusted first argument. This macro is responsible for emitting + all of the code for a thunk function; + 'TARGET_ASM_FUNCTION_PROLOGUE' and 'TARGET_ASM_FUNCTION_EPILOGUE' + are not invoked. + + The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already + been extracted from it.) It might possibly be useful on some + targets, but probably not. + + If you do not define this macro, the target-independent code in the + C++ front end will generate a less efficient heavyweight thunk that + calls FUNCTION instead of jumping to it. The generic approach does + not support varargs. + + -- Target Hook: bool TARGET_ASM_CAN_OUTPUT_MI_THUNK (const_tree + THUNK_FNDECL, HOST_WIDE_INT DELTA, HOST_WIDE_INT VCALL_OFFSET, + const_tree FUNCTION) + A function that returns true if TARGET_ASM_OUTPUT_MI_THUNK would be + able to output the assembler code for the thunk function specified + by the arguments it is passed, and false otherwise. In the latter + case, the generic approach will be used by the C++ front end, with + the limitations previously exposed. + + +File: gccint.info, Node: Profiling, Next: Tail Calls, Prev: Function Entry, Up: Stack and Calling + +17.10.12 Generating Code for Profiling +-------------------------------------- + +These macros will help you generate code for profiling. + + -- Macro: FUNCTION_PROFILER (FILE, LABELNO) + A C statement or compound statement to output to FILE some + assembler code to call the profiling subroutine 'mcount'. + + The details of how 'mcount' expects to be called are determined by + your operating system environment, not by GCC. To figure them out, + compile a small program for profiling using the system's installed + C compiler and look at the assembler code that results. + + Older implementations of 'mcount' expect the address of a counter + variable to be loaded into some register. The name of this + variable is 'LP' followed by the number LABELNO, so you would + generate the name using 'LP%d' in a 'fprintf'. + + -- Macro: PROFILE_HOOK + A C statement or compound statement to output to FILE some assembly + code to call the profiling subroutine 'mcount' even the target does + not support profiling. + + -- Macro: NO_PROFILE_COUNTERS + Define this macro to be an expression with a nonzero value if the + 'mcount' subroutine on your system does not need a counter variable + allocated for each function. This is true for almost all modern + implementations. If you define this macro, you must not use the + LABELNO argument to 'FUNCTION_PROFILER'. + + -- Macro: PROFILE_BEFORE_PROLOGUE + Define this macro if the code for function profiling should come + before the function prologue. Normally, the profiling code comes + after. + + +File: gccint.info, Node: Tail Calls, Next: Stack Smashing Protection, Prev: Profiling, Up: Stack and Calling + +17.10.13 Permitting tail calls +------------------------------ + + -- Target Hook: bool TARGET_FUNCTION_OK_FOR_SIBCALL (tree DECL, tree + EXP) + True if it is OK to do sibling call optimization for the specified + call expression EXP. DECL will be the called function, or 'NULL' + if this is an indirect call. + + It is not uncommon for limitations of calling conventions to + prevent tail calls to functions outside the current unit of + translation, or during PIC compilation. The hook is used to + enforce these restrictions, as the 'sibcall' md pattern can not + fail, or fall over to a "normal" call. The criteria for successful + sibling call optimization may vary greatly between different + architectures. + + -- Target Hook: void TARGET_EXTRA_LIVE_ON_ENTRY (bitmap REGS) + Add any hard registers to REGS that are live on entry to the + function. This hook only needs to be defined to provide registers + that cannot be found by examination of FUNCTION_ARG_REGNO_P, the + callee saved registers, STATIC_CHAIN_INCOMING_REGNUM, + STATIC_CHAIN_REGNUM, TARGET_STRUCT_VALUE_RTX, FRAME_POINTER_REGNUM, + EH_USES, FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, and the + PIC_OFFSET_TABLE_REGNUM. + + -- Target Hook: void TARGET_SET_UP_BY_PROLOGUE (struct + hard_reg_set_container *) + This hook should add additional registers that are computed by the + prologue to the hard regset for shrink-wrapping optimization + purposes. + + -- Target Hook: bool TARGET_WARN_FUNC_RETURN (tree) + True if a function's return statements should be checked for + matching the function's return type. This includes checking for + falling off the end of a non-void function. Return false if no + such check should be made. + + +File: gccint.info, Node: Stack Smashing Protection, Prev: Tail Calls, Up: Stack and Calling + +17.10.14 Stack smashing protection +---------------------------------- + + -- Target Hook: tree TARGET_STACK_PROTECT_GUARD (void) + This hook returns a 'DECL' node for the external variable to use + for the stack protection guard. This variable is initialized by + the runtime to some random value and is used to initialize the + guard value that is placed at the top of the local stack frame. + The type of this variable must be 'ptr_type_node'. + + The default version of this hook creates a variable called + '__stack_chk_guard', which is normally defined in 'libgcc2.c'. + + -- Target Hook: tree TARGET_STACK_PROTECT_FAIL (void) + This hook returns a 'CALL_EXPR' that alerts the runtime that the + stack protect guard variable has been modified. This expression + should involve a call to a 'noreturn' function. + + The default version of this hook invokes a function called + '__stack_chk_fail', taking no arguments. This function is normally + defined in 'libgcc2.c'. + + -- Common Target Hook: bool TARGET_SUPPORTS_SPLIT_STACK (bool REPORT, + struct gcc_options *OPTS) + Whether this target supports splitting the stack when the options + described in OPTS have been passed. This is called after options + have been parsed, so the target may reject splitting the stack in + some configurations. The default version of this hook returns + false. If REPORT is true, this function may issue a warning or + error; if REPORT is false, it must simply return a value + + +File: gccint.info, Node: Varargs, Next: Trampolines, Prev: Stack and Calling, Up: Target Macros + +17.11 Implementing the Varargs Macros +===================================== + +GCC comes with an implementation of '<varargs.h>' and '<stdarg.h>' that +work without change on machines that pass arguments on the stack. Other +machines require their own implementations of varargs, and the two +machine independent header files must have conditionals to include it. + + ISO '<stdarg.h>' differs from traditional '<varargs.h>' mainly in the +calling convention for 'va_start'. The traditional implementation takes +just one argument, which is the variable in which to store the argument +pointer. The ISO implementation of 'va_start' takes an additional +second argument. The user is supposed to write the last named argument +of the function here. + + However, 'va_start' should not use this argument. The way to find the +end of the named arguments is with the built-in functions described +below. + + -- Macro: __builtin_saveregs () + Use this built-in function to save the argument registers in memory + so that the varargs mechanism can access them. Both ISO and + traditional versions of 'va_start' must use '__builtin_saveregs', + unless you use 'TARGET_SETUP_INCOMING_VARARGS' (see below) instead. + + On some machines, '__builtin_saveregs' is open-coded under the + control of the target hook 'TARGET_EXPAND_BUILTIN_SAVEREGS'. On + other machines, it calls a routine written in assembler language, + found in 'libgcc2.c'. + + Code generated for the call to '__builtin_saveregs' appears at the + beginning of the function, as opposed to where the call to + '__builtin_saveregs' is written, regardless of what the code is. + This is because the registers must be saved before the function + starts to use them for its own purposes. + + -- Macro: __builtin_next_arg (LASTARG) + This builtin returns the address of the first anonymous stack + argument, as type 'void *'. If 'ARGS_GROW_DOWNWARD', it returns + the address of the location above the first anonymous stack + argument. Use it in 'va_start' to initialize the pointer for + fetching arguments from the stack. Also use it in 'va_start' to + verify that the second parameter LASTARG is the last named argument + of the current function. + + -- Macro: __builtin_classify_type (OBJECT) + Since each machine has its own conventions for which data types are + passed in which kind of register, your implementation of 'va_arg' + has to embody these conventions. The easiest way to categorize the + specified data type is to use '__builtin_classify_type' together + with 'sizeof' and '__alignof__'. + + '__builtin_classify_type' ignores the value of OBJECT, considering + only its data type. It returns an integer describing what kind of + type that is--integer, floating, pointer, structure, and so on. + + The file 'typeclass.h' defines an enumeration that you can use to + interpret the values of '__builtin_classify_type'. + + These machine description macros help implement varargs: + + -- Target Hook: rtx TARGET_EXPAND_BUILTIN_SAVEREGS (void) + If defined, this hook produces the machine-specific code for a call + to '__builtin_saveregs'. This code will be moved to the very + beginning of the function, before any parameter access are made. + The return value of this function should be an RTX that contains + the value to use as the return of '__builtin_saveregs'. + + -- Target Hook: void TARGET_SETUP_INCOMING_VARARGS (cumulative_args_t + ARGS_SO_FAR, enum machine_mode MODE, tree TYPE, int + *PRETEND_ARGS_SIZE, int SECOND_TIME) + This target hook offers an alternative to using + '__builtin_saveregs' and defining the hook + 'TARGET_EXPAND_BUILTIN_SAVEREGS'. Use it to store the anonymous + register arguments into the stack so that all the arguments appear + to have been passed consecutively on the stack. Once this is done, + you can use the standard implementation of varargs that works for + machines that pass all their arguments on the stack. + + The argument ARGS_SO_FAR points to the 'CUMULATIVE_ARGS' data + structure, containing the values that are obtained after processing + the named arguments. The arguments MODE and TYPE describe the last + named argument--its machine mode and its data type as a tree node. + + The target hook should do two things: first, push onto the stack + all the argument registers _not_ used for the named arguments, and + second, store the size of the data thus pushed into the + 'int'-valued variable pointed to by PRETEND_ARGS_SIZE. The value + that you store here will serve as additional offset for setting up + the stack frame. + + Because you must generate code to push the anonymous arguments at + compile time without knowing their data types, + 'TARGET_SETUP_INCOMING_VARARGS' is only useful on machines that + have just a single category of argument register and use it + uniformly for all data types. + + If the argument SECOND_TIME is nonzero, it means that the arguments + of the function are being analyzed for the second time. This + happens for an inline function, which is not actually compiled + until the end of the source file. The hook + 'TARGET_SETUP_INCOMING_VARARGS' should not generate any + instructions in this case. + + -- Target Hook: bool TARGET_STRICT_ARGUMENT_NAMING (cumulative_args_t + CA) + Define this hook to return 'true' if the location where a function + argument is passed depends on whether or not it is a named + argument. + + This hook controls how the NAMED argument to 'TARGET_FUNCTION_ARG' + is set for varargs and stdarg functions. If this hook returns + 'true', the NAMED argument is always true for named arguments, and + false for unnamed arguments. If it returns 'false', but + 'TARGET_PRETEND_OUTGOING_VARARGS_NAMED' returns 'true', then all + arguments are treated as named. Otherwise, all named arguments + except the last are treated as named. + + You need not define this hook if it always returns 'false'. + + -- Target Hook: bool TARGET_PRETEND_OUTGOING_VARARGS_NAMED + (cumulative_args_t CA) + If you need to conditionally change ABIs so that one works with + 'TARGET_SETUP_INCOMING_VARARGS', but the other works like neither + 'TARGET_SETUP_INCOMING_VARARGS' nor 'TARGET_STRICT_ARGUMENT_NAMING' + was defined, then define this hook to return 'true' if + 'TARGET_SETUP_INCOMING_VARARGS' is used, 'false' otherwise. + Otherwise, you should not define this hook. + + +File: gccint.info, Node: Trampolines, Next: Library Calls, Prev: Varargs, Up: Target Macros + +17.12 Trampolines for Nested Functions +====================================== + +A "trampoline" is a small piece of code that is created at run time when +the address of a nested function is taken. It normally resides on the +stack, in the stack frame of the containing function. These macros tell +GCC how to generate code to allocate and initialize a trampoline. + + The instructions in the trampoline must do two things: load a constant +address into the static chain register, and jump to the real address of +the nested function. On CISC machines such as the m68k, this requires +two instructions, a move immediate and a jump. Then the two addresses +exist in the trampoline as word-long immediate operands. On RISC +machines, it is often necessary to load each address into a register in +two parts. Then pieces of each address form separate immediate +operands. + + The code generated to initialize the trampoline must store the variable +parts--the static chain value and the function address--into the +immediate operands of the instructions. On a CISC machine, this is +simply a matter of copying each address to a memory reference at the +proper offset from the start of the trampoline. On a RISC machine, it +may be necessary to take out pieces of the address and store them +separately. + + -- Target Hook: void TARGET_ASM_TRAMPOLINE_TEMPLATE (FILE *F) + This hook is called by 'assemble_trampoline_template' to output, on + the stream F, assembler code for a block of data that contains the + constant parts of a trampoline. This code should not include a + label--the label is taken care of automatically. + + If you do not define this hook, it means no template is needed for + the target. Do not define this hook on systems where the block + move code to copy the trampoline into place would be larger than + the code to generate it on the spot. + + -- Macro: TRAMPOLINE_SECTION + Return the section into which the trampoline template is to be + placed (*note Sections::). The default value is + 'readonly_data_section'. + + -- Macro: TRAMPOLINE_SIZE + A C expression for the size in bytes of the trampoline, as an + integer. + + -- Macro: TRAMPOLINE_ALIGNMENT + Alignment required for trampolines, in bits. + + If you don't define this macro, the value of 'FUNCTION_ALIGNMENT' + is used for aligning trampolines. + + -- Target Hook: void TARGET_TRAMPOLINE_INIT (rtx M_TRAMP, tree FNDECL, + rtx STATIC_CHAIN) + This hook is called to initialize a trampoline. M_TRAMP is an RTX + for the memory block for the trampoline; FNDECL is the + 'FUNCTION_DECL' for the nested function; STATIC_CHAIN is an RTX for + the static chain value that should be passed to the function when + it is called. + + If the target defines 'TARGET_ASM_TRAMPOLINE_TEMPLATE', then the + first thing this hook should do is emit a block move into M_TRAMP + from the memory block returned by 'assemble_trampoline_template'. + Note that the block move need only cover the constant parts of the + trampoline. If the target isolates the variable parts of the + trampoline to the end, not all 'TRAMPOLINE_SIZE' bytes need be + copied. + + If the target requires any other actions, such as flushing caches + or enabling stack execution, these actions should be performed + after initializing the trampoline proper. + + -- Target Hook: rtx TARGET_TRAMPOLINE_ADJUST_ADDRESS (rtx ADDR) + This hook should perform any machine-specific adjustment in the + address of the trampoline. Its argument contains the address of + the memory block that was passed to 'TARGET_TRAMPOLINE_INIT'. In + case the address to be used for a function call should be different + from the address at which the template was stored, the different + address should be returned; otherwise ADDR should be returned + unchanged. If this hook is not defined, ADDR will be used for + function calls. + + Implementing trampolines is difficult on many machines because they +have separate instruction and data caches. Writing into a stack +location fails to clear the memory in the instruction cache, so when the +program jumps to that location, it executes the old contents. + + Here are two possible solutions. One is to clear the relevant parts of +the instruction cache whenever a trampoline is set up. The other is to +make all trampolines identical, by having them jump to a standard +subroutine. The former technique makes trampoline execution faster; the +latter makes initialization faster. + + To clear the instruction cache when a trampoline is initialized, define +the following macro. + + -- Macro: CLEAR_INSN_CACHE (BEG, END) + If defined, expands to a C expression clearing the _instruction + cache_ in the specified interval. The definition of this macro + would typically be a series of 'asm' statements. Both BEG and END + are both pointer expressions. + + To use a standard subroutine, define the following macro. In addition, +you must make sure that the instructions in a trampoline fill an entire +cache line with identical instructions, or else ensure that the +beginning of the trampoline code is always aligned at the same point in +its cache line. Look in 'm68k.h' as a guide. + + -- Macro: TRANSFER_FROM_TRAMPOLINE + Define this macro if trampolines need a special subroutine to do + their work. The macro should expand to a series of 'asm' + statements which will be compiled with GCC. They go in a library + function named '__transfer_from_trampoline'. + + If you need to avoid executing the ordinary prologue code of a + compiled C function when you jump to the subroutine, you can do so + by placing a special label of your own in the assembler code. Use + one 'asm' statement to generate an assembler label, and another to + make the label global. Then trampolines can use that label to jump + directly to your special assembler code. + + +File: gccint.info, Node: Library Calls, Next: Addressing Modes, Prev: Trampolines, Up: Target Macros + +17.13 Implicit Calls to Library Routines +======================================== + +Here is an explanation of implicit calls to library routines. + + -- Macro: DECLARE_LIBRARY_RENAMES + This macro, if defined, should expand to a piece of C code that + will get expanded when compiling functions for libgcc.a. It can be + used to provide alternate names for GCC's internal library + functions if there are ABI-mandated names that the compiler should + provide. + + -- Target Hook: void TARGET_INIT_LIBFUNCS (void) + This hook should declare additional library routines or rename + existing ones, using the functions 'set_optab_libfunc' and + 'init_one_libfunc' defined in 'optabs.c'. 'init_optabs' calls this + macro after initializing all the normal library routines. + + The default is to do nothing. Most ports don't need to define this + hook. + + -- Target Hook: bool TARGET_LIBFUNC_GNU_PREFIX + If false (the default), internal library routines start with two + underscores. If set to true, these routines start with '__gnu_' + instead. E.g., '__muldi3' changes to '__gnu_muldi3'. This + currently only affects functions defined in 'libgcc2.c'. If this + is set to true, the 'tm.h' file must also '#define + LIBGCC2_GNU_PREFIX'. + + -- Macro: FLOAT_LIB_COMPARE_RETURNS_BOOL (MODE, COMPARISON) + This macro should return 'true' if the library routine that + implements the floating point comparison operator COMPARISON in + mode MODE will return a boolean, and FALSE if it will return a + tristate. + + GCC's own floating point libraries return tristates from the + comparison operators, so the default returns false always. Most + ports don't need to define this macro. + + -- Macro: TARGET_LIB_INT_CMP_BIASED + This macro should evaluate to 'true' if the integer comparison + functions (like '__cmpdi2') return 0 to indicate that the first + operand is smaller than the second, 1 to indicate that they are + equal, and 2 to indicate that the first operand is greater than the + second. If this macro evaluates to 'false' the comparison + functions return -1, 0, and 1 instead of 0, 1, and 2. If the + target uses the routines in 'libgcc.a', you do not need to define + this macro. + + -- Macro: TARGET_HAS_NO_HW_DIVIDE + This macro should be defined if the target has no hardware divide + instructions. If this macro is defined, GCC will use an algorithm + which make use of simple logical and arithmetic operations for + 64-bit division. If the macro is not defined, GCC will use an + algorithm which make use of a 64-bit by 32-bit divide primitive. + + -- Macro: TARGET_EDOM + The value of 'EDOM' on the target machine, as a C integer constant + expression. If you don't define this macro, GCC does not attempt + to deposit the value of 'EDOM' into 'errno' directly. Look in + '/usr/include/errno.h' to find the value of 'EDOM' on your system. + + If you do not define 'TARGET_EDOM', then compiled code reports + domain errors by calling the library function and letting it report + the error. If mathematical functions on your system use 'matherr' + when there is an error, then you should leave 'TARGET_EDOM' + undefined so that 'matherr' is used normally. + + -- Macro: GEN_ERRNO_RTX + Define this macro as a C expression to create an rtl expression + that refers to the global "variable" 'errno'. (On certain systems, + 'errno' may not actually be a variable.) If you don't define this + macro, a reasonable default is used. + + -- Target Hook: bool TARGET_LIBC_HAS_FUNCTION (enum function_class + FN_CLASS) + This hook determines whether a function from a class of functions + FN_CLASS is present at the runtime. + + -- Macro: NEXT_OBJC_RUNTIME + Set this macro to 1 to use the "NeXT" Objective-C message sending + conventions by default. This calling convention involves passing + the object, the selector and the method arguments all at once to + the method-lookup library function. This is the usual setting when + targeting Darwin/Mac OS X systems, which have the NeXT runtime + installed. + + If the macro is set to 0, the "GNU" Objective-C message sending + convention will be used by default. This convention passes just + the object and the selector to the method-lookup function, which + returns a pointer to the method. + + In either case, it remains possible to select code-generation for + the alternate scheme, by means of compiler command line switches. + + +File: gccint.info, Node: Addressing Modes, Next: Anchored Addresses, Prev: Library Calls, Up: Target Macros + +17.14 Addressing Modes +====================== + +This is about addressing modes. + + -- Macro: HAVE_PRE_INCREMENT + -- Macro: HAVE_PRE_DECREMENT + -- Macro: HAVE_POST_INCREMENT + -- Macro: HAVE_POST_DECREMENT + A C expression that is nonzero if the machine supports + pre-increment, pre-decrement, post-increment, or post-decrement + addressing respectively. + + -- Macro: HAVE_PRE_MODIFY_DISP + -- Macro: HAVE_POST_MODIFY_DISP + A C expression that is nonzero if the machine supports pre- or + post-address side-effect generation involving constants other than + the size of the memory operand. + + -- Macro: HAVE_PRE_MODIFY_REG + -- Macro: HAVE_POST_MODIFY_REG + A C expression that is nonzero if the machine supports pre- or + post-address side-effect generation involving a register + displacement. + + -- Macro: CONSTANT_ADDRESS_P (X) + A C expression that is 1 if the RTX X is a constant which is a + valid address. On most machines the default definition of + '(CONSTANT_P (X) && GET_CODE (X) != CONST_DOUBLE)' is acceptable, + but a few machines are more restrictive as to which constant + addresses are supported. + + -- Macro: CONSTANT_P (X) + 'CONSTANT_P', which is defined by target-independent code, accepts + integer-values expressions whose values are not explicitly known, + such as 'symbol_ref', 'label_ref', and 'high' expressions and + 'const' arithmetic expressions, in addition to 'const_int' and + 'const_double' expressions. + + -- Macro: MAX_REGS_PER_ADDRESS + A number, the maximum number of registers that can appear in a + valid memory address. Note that it is up to you to specify a value + equal to the maximum number that 'TARGET_LEGITIMATE_ADDRESS_P' + would ever accept. + + -- Target Hook: bool TARGET_LEGITIMATE_ADDRESS_P (enum machine_mode + MODE, rtx X, bool STRICT) + A function that returns whether X (an RTX) is a legitimate memory + address on the target machine for a memory operand of mode MODE. + + Legitimate addresses are defined in two variants: a strict variant + and a non-strict one. The STRICT parameter chooses which variant + is desired by the caller. + + The strict variant is used in the reload pass. It must be defined + so that any pseudo-register that has not been allocated a hard + register is considered a memory reference. This is because in + contexts where some kind of register is required, a pseudo-register + with no hard register must be rejected. For non-hard registers, + the strict variant should look up the 'reg_renumber' array; it + should then proceed using the hard register number in the array, or + treat the pseudo as a memory reference if the array holds '-1'. + + The non-strict variant is used in other passes. It must be defined + to accept all pseudo-registers in every context where some kind of + register is required. + + Normally, constant addresses which are the sum of a 'symbol_ref' + and an integer are stored inside a 'const' RTX to mark them as + constant. Therefore, there is no need to recognize such sums + specifically as legitimate addresses. Normally you would simply + recognize any 'const' as legitimate. + + Usually 'PRINT_OPERAND_ADDRESS' is not prepared to handle constant + sums that are not marked with 'const'. It assumes that a naked + 'plus' indicates indexing. If so, then you _must_ reject such + naked constant sums as illegitimate addresses, so that none of them + will be given to 'PRINT_OPERAND_ADDRESS'. + + On some machines, whether a symbolic address is legitimate depends + on the section that the address refers to. On these machines, + define the target hook 'TARGET_ENCODE_SECTION_INFO' to store the + information into the 'symbol_ref', and then check for it here. + When you see a 'const', you will have to look inside it to find the + 'symbol_ref' in order to determine the section. *Note Assembler + Format::. + + Some ports are still using a deprecated legacy substitute for this + hook, the 'GO_IF_LEGITIMATE_ADDRESS' macro. This macro has this + syntax: + + #define GO_IF_LEGITIMATE_ADDRESS (MODE, X, LABEL) + + and should 'goto LABEL' if the address X is a valid address on the + target machine for a memory operand of mode MODE. + + Compiler source files that want to use the strict variant of this + macro define the macro 'REG_OK_STRICT'. You should use an '#ifdef + REG_OK_STRICT' conditional to define the strict variant in that + case and the non-strict variant otherwise. + + Using the hook is usually simpler because it limits the number of + files that are recompiled when changes are made. + + -- Macro: TARGET_MEM_CONSTRAINT + A single character to be used instead of the default ''m'' + character for general memory addresses. This defines the + constraint letter which matches the memory addresses accepted by + 'TARGET_LEGITIMATE_ADDRESS_P'. Define this macro if you want to + support new address formats in your back end without changing the + semantics of the ''m'' constraint. This is necessary in order to + preserve functionality of inline assembly constructs using the + ''m'' constraint. + + -- Macro: FIND_BASE_TERM (X) + A C expression to determine the base term of address X, or to + provide a simplified version of X from which 'alias.c' can easily + find the base term. This macro is used in only two places: + 'find_base_value' and 'find_base_term' in 'alias.c'. + + It is always safe for this macro to not be defined. It exists so + that alias analysis can understand machine-dependent addresses. + + The typical use of this macro is to handle addresses containing a + label_ref or symbol_ref within an UNSPEC. + + -- Target Hook: rtx TARGET_LEGITIMIZE_ADDRESS (rtx X, rtx OLDX, enum + machine_mode MODE) + This hook is given an invalid memory address X for an operand of + mode MODE and should try to return a valid memory address. + + X will always be the result of a call to 'break_out_memory_refs', + and OLDX will be the operand that was given to that function to + produce X. + + The code of the hook should not alter the substructure of X. If it + transforms X into a more legitimate form, it should return the new + X. + + It is not necessary for this hook to come up with a legitimate + address, with the exception of native TLS addresses (*note Emulated + TLS::). The compiler has standard ways of doing so in all cases. + In fact, if the target supports only emulated TLS, it is safe to + omit this hook or make it return X if it cannot find a valid way to + legitimize the address. But often a machine-dependent strategy can + generate better code. + + -- Macro: LEGITIMIZE_RELOAD_ADDRESS (X, MODE, OPNUM, TYPE, IND_LEVELS, + WIN) + A C compound statement that attempts to replace X, which is an + address that needs reloading, with a valid memory address for an + operand of mode MODE. WIN will be a C statement label elsewhere in + the code. It is not necessary to define this macro, but it might + be useful for performance reasons. + + For example, on the i386, it is sometimes possible to use a single + reload register instead of two by reloading a sum of two pseudo + registers into a register. On the other hand, for number of RISC + processors offsets are limited so that often an intermediate + address needs to be generated in order to address a stack slot. By + defining 'LEGITIMIZE_RELOAD_ADDRESS' appropriately, the + intermediate addresses generated for adjacent some stack slots can + be made identical, and thus be shared. + + _Note_: This macro should be used with caution. It is necessary to + know something of how reload works in order to effectively use + this, and it is quite easy to produce macros that build in too much + knowledge of reload internals. + + _Note_: This macro must be able to reload an address created by a + previous invocation of this macro. If it fails to handle such + addresses then the compiler may generate incorrect code or abort. + + The macro definition should use 'push_reload' to indicate parts + that need reloading; OPNUM, TYPE and IND_LEVELS are usually + suitable to be passed unaltered to 'push_reload'. + + The code generated by this macro must not alter the substructure of + X. If it transforms X into a more legitimate form, it should + assign X (which will always be a C variable) a new value. This + also applies to parts that you change indirectly by calling + 'push_reload'. + + The macro definition may use 'strict_memory_address_p' to test if + the address has become legitimate. + + If you want to change only a part of X, one standard way of doing + this is to use 'copy_rtx'. Note, however, that it unshares only a + single level of rtl. Thus, if the part to be changed is not at the + top level, you'll need to replace first the top level. It is not + necessary for this macro to come up with a legitimate address; but + often a machine-dependent strategy can generate better code. + + -- Target Hook: bool TARGET_MODE_DEPENDENT_ADDRESS_P (const_rtx ADDR, + addr_space_t ADDRSPACE) + This hook returns 'true' if memory address ADDR in address space + ADDRSPACE can have different meanings depending on the machine mode + of the memory reference it is used for or if the address is valid + for some modes but not others. + + Autoincrement and autodecrement addresses typically have + mode-dependent effects because the amount of the increment or + decrement is the size of the operand being addressed. Some + machines have other mode-dependent addresses. Many RISC machines + have no mode-dependent addresses. + + You may assume that ADDR is a valid address for the machine. + + The default version of this hook returns 'false'. + + -- Target Hook: bool TARGET_LEGITIMATE_CONSTANT_P (enum machine_mode + MODE, rtx X) + This hook returns true if X is a legitimate constant for a + MODE-mode immediate operand on the target machine. You can assume + that X satisfies 'CONSTANT_P', so you need not check this. + + The default definition returns true. + + -- Target Hook: rtx TARGET_DELEGITIMIZE_ADDRESS (rtx X) + This hook is used to undo the possibly obfuscating effects of the + 'LEGITIMIZE_ADDRESS' and 'LEGITIMIZE_RELOAD_ADDRESS' target macros. + Some backend implementations of these macros wrap symbol references + inside an 'UNSPEC' rtx to represent PIC or similar addressing + modes. This target hook allows GCC's optimizers to understand the + semantics of these opaque 'UNSPEC's by converting them back into + their original form. + + -- Target Hook: bool TARGET_CONST_NOT_OK_FOR_DEBUG_P (rtx X) + This hook should return true if X should not be emitted into debug + sections. + + -- Target Hook: bool TARGET_CANNOT_FORCE_CONST_MEM (enum machine_mode + MODE, rtx X) + This hook should return true if X is of a form that cannot (or + should not) be spilled to the constant pool. MODE is the mode of + X. + + The default version of this hook returns false. + + The primary reason to define this hook is to prevent reload from + deciding that a non-legitimate constant would be better reloaded + from the constant pool instead of spilling and reloading a register + holding the constant. This restriction is often true of addresses + of TLS symbols for various targets. + + -- Target Hook: bool TARGET_USE_BLOCKS_FOR_CONSTANT_P (enum + machine_mode MODE, const_rtx X) + This hook should return true if pool entries for constant X can be + placed in an 'object_block' structure. MODE is the mode of X. + + The default version returns false for all constants. + + -- Target Hook: bool TARGET_USE_BLOCKS_FOR_DECL_P (const_tree DECL) + This hook should return true if pool entries for DECL should be + placed in an 'object_block' structure. + + The default version returns true for all decls. + + -- Target Hook: tree TARGET_BUILTIN_RECIPROCAL (unsigned FN, bool + MD_FN, bool SQRT) + This hook should return the DECL of a function that implements + reciprocal of the builtin function with builtin function code FN, + or 'NULL_TREE' if such a function is not available. MD_FN is true + when FN is a code of a machine-dependent builtin function. When + SQRT is true, additional optimizations that apply only to the + reciprocal of a square root function are performed, and only + reciprocals of 'sqrt' function are valid. + + -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD (void) + This hook should return the DECL of a function F that given an + address ADDR as an argument returns a mask M that can be used to + extract from two vectors the relevant data that resides in ADDR in + case ADDR is not properly aligned. + + The autovectorizer, when vectorizing a load operation from an + address ADDR that may be unaligned, will generate two vector loads + from the two aligned addresses around ADDR. It then generates a + 'REALIGN_LOAD' operation to extract the relevant data from the two + loaded vectors. The first two arguments to 'REALIGN_LOAD', V1 and + V2, are the two vectors, each of size VS, and the third argument, + OFF, defines how the data will be extracted from these two vectors: + if OFF is 0, then the returned vector is V2; otherwise, the + returned vector is composed from the last VS-OFF elements of V1 + concatenated to the first OFF elements of V2. + + If this hook is defined, the autovectorizer will generate a call to + F (using the DECL tree that this hook returns) and will use the + return value of F as the argument OFF to 'REALIGN_LOAD'. + Therefore, the mask M returned by F should comply with the + semantics expected by 'REALIGN_LOAD' described above. If this hook + is not defined, then ADDR will be used as the argument OFF to + 'REALIGN_LOAD', in which case the low log2(VS) - 1 bits of ADDR + will be considered. + + -- Target Hook: int TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST (enum + vect_cost_for_stmt TYPE_OF_COST, tree VECTYPE, int MISALIGN) + Returns cost of different scalar or vector statements for + vectorization cost model. For vector memory operations the cost + may depend on type (VECTYPE) and misalignment value (MISALIGN). + + -- Target Hook: bool TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE + (const_tree TYPE, bool IS_PACKED) + Return true if vector alignment is reachable (by peeling N + iterations) for the given type. + + -- Target Hook: bool TARGET_VECTORIZE_VEC_PERM_CONST_OK (enum + MACHINE_MODE, const unsigned char *SEL) + Return true if a vector created for 'vec_perm_const' is valid. + + -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_CONVERSION (unsigned + CODE, tree DEST_TYPE, tree SRC_TYPE) + This hook should return the DECL of a function that implements + conversion of the input vector of type SRC_TYPE to type DEST_TYPE. + The value of CODE is one of the enumerators in 'enum tree_code' and + specifies how the conversion is to be applied (truncation, + rounding, etc.). + + If this hook is defined, the autovectorizer will use the + 'TARGET_VECTORIZE_BUILTIN_CONVERSION' target hook when vectorizing + conversion. Otherwise, it will return 'NULL_TREE'. + + -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION (tree + FNDECL, tree VEC_TYPE_OUT, tree VEC_TYPE_IN) + This hook should return the decl of a function that implements the + vectorized variant of the builtin function with builtin function + code CODE or 'NULL_TREE' if such a function is not available. The + value of FNDECL is the builtin function declaration. The return + type of the vectorized function shall be of vector type + VEC_TYPE_OUT and the argument types should be VEC_TYPE_IN. + + -- Target Hook: bool TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT (enum + machine_mode MODE, const_tree TYPE, int MISALIGNMENT, bool + IS_PACKED) + This hook should return true if the target supports misaligned + vector store/load of a specific factor denoted in the MISALIGNMENT + parameter. The vector store/load should be of machine mode MODE + and the elements in the vectors should be of type TYPE. IS_PACKED + parameter is true if the memory access is defined in a packed + struct. + + -- Target Hook: enum machine_mode TARGET_VECTORIZE_PREFERRED_SIMD_MODE + (enum machine_mode MODE) + This hook should return the preferred mode for vectorizing scalar + mode MODE. The default is equal to 'word_mode', because the + vectorizer can do some transformations even in absence of + specialized SIMD hardware. + + -- Target Hook: unsigned int + TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES (void) + This hook should return a mask of sizes that should be iterated + over after trying to autovectorize using the vector size derived + from the mode returned by 'TARGET_VECTORIZE_PREFERRED_SIMD_MODE'. + The default is zero which means to not iterate over other vector + sizes. + + -- Target Hook: void * TARGET_VECTORIZE_INIT_COST (struct loop + *LOOP_INFO) + This hook should initialize target-specific data structures in + preparation for modeling the costs of vectorizing a loop or basic + block. The default allocates three unsigned integers for + accumulating costs for the prologue, body, and epilogue of the loop + or basic block. If LOOP_INFO is non-NULL, it identifies the loop + being vectorized; otherwise a single block is being vectorized. + + -- Target Hook: unsigned TARGET_VECTORIZE_ADD_STMT_COST (void *DATA, + int COUNT, enum vect_cost_for_stmt KIND, struct _stmt_vec_info + *STMT_INFO, int MISALIGN, enum vect_cost_model_location WHERE) + This hook should update the target-specific DATA in response to + adding COUNT copies of the given KIND of statement to a loop or + basic block. The default adds the builtin vectorizer cost for the + copies of the statement to the accumulator specified by WHERE, (the + prologue, body, or epilogue) and returns the amount added. The + return value should be viewed as a tentative cost that may later be + revised. + + -- Target Hook: void TARGET_VECTORIZE_FINISH_COST (void *DATA, unsigned + *PROLOGUE_COST, unsigned *BODY_COST, unsigned *EPILOGUE_COST) + This hook should complete calculations of the cost of vectorizing a + loop or basic block based on DATA, and return the prologue, body, + and epilogue costs as unsigned integers. The default returns the + value of the three accumulators. + + -- Target Hook: void TARGET_VECTORIZE_DESTROY_COST_DATA (void *DATA) + This hook should release DATA and any related data structures + allocated by TARGET_VECTORIZE_INIT_COST. The default releases the + accumulator. + + -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_TM_LOAD (tree) + This hook should return the built-in decl needed to load a vector + of the given type within a transaction. + + -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_TM_STORE (tree) + This hook should return the built-in decl needed to store a vector + of the given type within a transaction. + + -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_GATHER (const_tree + MEM_VECTYPE, const_tree INDEX_TYPE, int SCALE) + Target builtin that implements vector gather operation. + MEM_VECTYPE is the vector type of the load and INDEX_TYPE is scalar + type of the index, scaled by SCALE. The default is 'NULL_TREE' + which means to not vectorize gather loads. + + -- Target Hook: int TARGET_SIMD_CLONE_COMPUTE_VECSIZE_AND_SIMDLEN + (struct cgraph_node *, struct cgraph_simd_clone *, TREE, INT) + This hook should set VECSIZE_MANGLE, VECSIZE_INT, VECSIZE_FLOAT + fields in SIMD_CLONE structure pointed by CLONE_INFO argument and + also SIMDLEN field if it was previously 0. The hook should return + 0 if SIMD clones shouldn't be emitted, or number of VECSIZE_MANGLE + variants that should be emitted. + + -- Target Hook: void TARGET_SIMD_CLONE_ADJUST (struct cgraph_node *) + This hook should add implicit 'attribute(target("..."))' attribute + to SIMD clone NODE if needed. + + -- Target Hook: int TARGET_SIMD_CLONE_USABLE (struct cgraph_node *) + This hook should return -1 if SIMD clone NODE shouldn't be used in + vectorized loops in current function, or non-negative number if it + is usable. In that case, the smaller the number is, the more + desirable it is to use it. + + +File: gccint.info, Node: Anchored Addresses, Next: Condition Code, Prev: Addressing Modes, Up: Target Macros + +17.15 Anchored Addresses +======================== + +GCC usually addresses every static object as a separate entity. For +example, if we have: + + static int a, b, c; + int foo (void) { return a + b + c; } + + the code for 'foo' will usually calculate three separate symbolic +addresses: those of 'a', 'b' and 'c'. On some targets, it would be +better to calculate just one symbolic address and access the three +variables relative to it. The equivalent pseudocode would be something +like: + + int foo (void) + { + register int *xr = &x; + return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; + } + + (which isn't valid C). We refer to shared addresses like 'x' as +"section anchors". Their use is controlled by '-fsection-anchors'. + + The hooks below describe the target properties that GCC needs to know +in order to make effective use of section anchors. It won't use section +anchors at all unless either 'TARGET_MIN_ANCHOR_OFFSET' or +'TARGET_MAX_ANCHOR_OFFSET' is set to a nonzero value. + + -- Target Hook: HOST_WIDE_INT TARGET_MIN_ANCHOR_OFFSET + The minimum offset that should be applied to a section anchor. On + most targets, it should be the smallest offset that can be applied + to a base register while still giving a legitimate address for + every mode. The default value is 0. + + -- Target Hook: HOST_WIDE_INT TARGET_MAX_ANCHOR_OFFSET + Like 'TARGET_MIN_ANCHOR_OFFSET', but the maximum (inclusive) offset + that should be applied to section anchors. The default value is 0. + + -- Target Hook: void TARGET_ASM_OUTPUT_ANCHOR (rtx X) + Write the assembly code to define section anchor X, which is a + 'SYMBOL_REF' for which 'SYMBOL_REF_ANCHOR_P (X)' is true. The hook + is called with the assembly output position set to the beginning of + 'SYMBOL_REF_BLOCK (X)'. + + If 'ASM_OUTPUT_DEF' is available, the hook's default definition + uses it to define the symbol as '. + SYMBOL_REF_BLOCK_OFFSET (X)'. + If 'ASM_OUTPUT_DEF' is not available, the hook's default definition + is 'NULL', which disables the use of section anchors altogether. + + -- Target Hook: bool TARGET_USE_ANCHORS_FOR_SYMBOL_P (const_rtx X) + Return true if GCC should attempt to use anchors to access + 'SYMBOL_REF' X. You can assume 'SYMBOL_REF_HAS_BLOCK_INFO_P (X)' + and '!SYMBOL_REF_ANCHOR_P (X)'. + + The default version is correct for most targets, but you might need + to intercept this hook to handle things like target-specific + attributes or target-specific sections. + + +File: gccint.info, Node: Condition Code, Next: Costs, Prev: Anchored Addresses, Up: Target Macros + +17.16 Condition Code Status +=========================== + +The macros in this section can be split in two families, according to +the two ways of representing condition codes in GCC. + + The first representation is the so called '(cc0)' representation (*note +Jump Patterns::), where all instructions can have an implicit clobber of +the condition codes. The second is the condition code register +representation, which provides better schedulability for architectures +that do have a condition code register, but on which most instructions +do not affect it. The latter category includes most RISC machines. + + The implicit clobbering poses a strong restriction on the placement of +the definition and use of the condition code. In the past the +definition and use were always adjacent. However, recent changes to +support trapping arithmatic may result in the definition and user being +in different blocks. Thus, there may be a 'NOTE_INSN_BASIC_BLOCK' +between them. Additionally, the definition may be the source of +exception handling edges. + + These restrictions can prevent important optimizations on some +machines. For example, on the IBM RS/6000, there is a delay for taken +branches unless the condition code register is set three instructions +earlier than the conditional branch. The instruction scheduler cannot +perform this optimization if it is not permitted to separate the +definition and use of the condition code register. + + For this reason, it is possible and suggested to use a register to +represent the condition code for new ports. If there is a specific +condition code register in the machine, use a hard register. If the +condition code or comparison result can be placed in any general +register, or if there are multiple condition registers, use a pseudo +register. Registers used to store the condition code value will usually +have a mode that is in class 'MODE_CC'. + + Alternatively, you can use 'BImode' if the comparison operator is +specified already in the compare instruction. In this case, you are not +interested in most macros in this section. + +* Menu: + +* CC0 Condition Codes:: Old style representation of condition codes. +* MODE_CC Condition Codes:: Modern representation of condition codes. + + +File: gccint.info, Node: CC0 Condition Codes, Next: MODE_CC Condition Codes, Up: Condition Code + +17.16.1 Representation of condition codes using '(cc0)' +------------------------------------------------------- + +The file 'conditions.h' defines a variable 'cc_status' to describe how +the condition code was computed (in case the interpretation of the +condition code depends on the instruction that it was set by). This +variable contains the RTL expressions on which the condition code is +currently based, and several standard flags. + + Sometimes additional machine-specific flags must be defined in the +machine description header file. It can also add additional +machine-specific information by defining 'CC_STATUS_MDEP'. + + -- Macro: CC_STATUS_MDEP + C code for a data type which is used for declaring the 'mdep' + component of 'cc_status'. It defaults to 'int'. + + This macro is not used on machines that do not use 'cc0'. + + -- Macro: CC_STATUS_MDEP_INIT + A C expression to initialize the 'mdep' field to "empty". The + default definition does nothing, since most machines don't use the + field anyway. If you want to use the field, you should probably + define this macro to initialize it. + + This macro is not used on machines that do not use 'cc0'. + + -- Macro: NOTICE_UPDATE_CC (EXP, INSN) + A C compound statement to set the components of 'cc_status' + appropriately for an insn INSN whose body is EXP. It is this + macro's responsibility to recognize insns that set the condition + code as a byproduct of other activity as well as those that + explicitly set '(cc0)'. + + This macro is not used on machines that do not use 'cc0'. + + If there are insns that do not set the condition code but do alter + other machine registers, this macro must check to see whether they + invalidate the expressions that the condition code is recorded as + reflecting. For example, on the 68000, insns that store in address + registers do not set the condition code, which means that usually + 'NOTICE_UPDATE_CC' can leave 'cc_status' unaltered for such insns. + But suppose that the previous insn set the condition code based on + location 'a4@(102)' and the current insn stores a new value in + 'a4'. Although the condition code is not changed by this, it will + no longer be true that it reflects the contents of 'a4@(102)'. + Therefore, 'NOTICE_UPDATE_CC' must alter 'cc_status' in this case + to say that nothing is known about the condition code value. + + The definition of 'NOTICE_UPDATE_CC' must be prepared to deal with + the results of peephole optimization: insns whose patterns are + 'parallel' RTXs containing various 'reg', 'mem' or constants which + are just the operands. The RTL structure of these insns is not + sufficient to indicate what the insns actually do. What + 'NOTICE_UPDATE_CC' should do when it sees one is just to run + 'CC_STATUS_INIT'. + + A possible definition of 'NOTICE_UPDATE_CC' is to call a function + that looks at an attribute (*note Insn Attributes::) named, for + example, 'cc'. This avoids having detailed information about + patterns in two places, the 'md' file and in 'NOTICE_UPDATE_CC'. + + +File: gccint.info, Node: MODE_CC Condition Codes, Prev: CC0 Condition Codes, Up: Condition Code + +17.16.2 Representation of condition codes using registers +--------------------------------------------------------- + + -- Macro: SELECT_CC_MODE (OP, X, Y) + On many machines, the condition code may be produced by other + instructions than compares, for example the branch can use directly + the condition code set by a subtract instruction. However, on some + machines when the condition code is set this way some bits (such as + the overflow bit) are not set in the same way as a test + instruction, so that a different branch instruction must be used + for some conditional branches. When this happens, use the machine + mode of the condition code register to record different formats of + the condition code register. Modes can also be used to record + which compare instruction (e.g. a signed or an unsigned + comparison) produced the condition codes. + + If other modes than 'CCmode' are required, add them to + 'MACHINE-modes.def' and define 'SELECT_CC_MODE' to choose a mode + given an operand of a compare. This is needed because the modes + have to be chosen not only during RTL generation but also, for + example, by instruction combination. The result of + 'SELECT_CC_MODE' should be consistent with the mode used in the + patterns; for example to support the case of the add on the SPARC + discussed above, we have the pattern + + (define_insn "" + [(set (reg:CC_NOOV 0) + (compare:CC_NOOV + (plus:SI (match_operand:SI 0 "register_operand" "%r") + (match_operand:SI 1 "arith_operand" "rI")) + (const_int 0)))] + "" + "...") + + together with a 'SELECT_CC_MODE' that returns 'CC_NOOVmode' for + comparisons whose argument is a 'plus': + + #define SELECT_CC_MODE(OP,X,Y) \ + (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \ + ? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode) \ + : ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS \ + || GET_CODE (X) == NEG) \ + ? CC_NOOVmode : CCmode)) + + Another reason to use modes is to retain information on which + operands were used by the comparison; see 'REVERSIBLE_CC_MODE' + later in this section. + + You should define this macro if and only if you define extra CC + modes in 'MACHINE-modes.def'. + + -- Target Hook: void TARGET_CANONICALIZE_COMPARISON (int *CODE, rtx + *OP0, rtx *OP1, bool OP0_PRESERVE_VALUE) + On some machines not all possible comparisons are defined, but you + can convert an invalid comparison into a valid one. For example, + the Alpha does not have a 'GT' comparison, but you can use an 'LT' + comparison instead and swap the order of the operands. + + On such machines, implement this hook to do any required + conversions. CODE is the initial comparison code and OP0 and OP1 + are the left and right operands of the comparison, respectively. + If OP0_PRESERVE_VALUE is 'true' the implementation is not allowed + to change the value of OP0 since the value might be used in RTXs + which aren't comparisons. E.g. the implementation is not allowed + to swap operands in that case. + + GCC will not assume that the comparison resulting from this macro + is valid but will see if the resulting insn matches a pattern in + the 'md' file. + + You need not to implement this hook if it would never change the + comparison code or operands. + + -- Macro: REVERSIBLE_CC_MODE (MODE) + A C expression whose value is one if it is always safe to reverse a + comparison whose mode is MODE. If 'SELECT_CC_MODE' can ever return + MODE for a floating-point inequality comparison, then + 'REVERSIBLE_CC_MODE (MODE)' must be zero. + + You need not define this macro if it would always returns zero or + if the floating-point format is anything other than + 'IEEE_FLOAT_FORMAT'. For example, here is the definition used on + the SPARC, where floating-point inequality comparisons are always + given 'CCFPEmode': + + #define REVERSIBLE_CC_MODE(MODE) ((MODE) != CCFPEmode) + + -- Macro: REVERSE_CONDITION (CODE, MODE) + A C expression whose value is reversed condition code of the CODE + for comparison done in CC_MODE MODE. The macro is used only in + case 'REVERSIBLE_CC_MODE (MODE)' is nonzero. Define this macro in + case machine has some non-standard way how to reverse certain + conditionals. For instance in case all floating point conditions + are non-trapping, compiler may freely convert unordered compares to + ordered one. Then definition may look like: + + #define REVERSE_CONDITION(CODE, MODE) \ + ((MODE) != CCFPmode ? reverse_condition (CODE) \ + : reverse_condition_maybe_unordered (CODE)) + + -- Target Hook: bool TARGET_FIXED_CONDITION_CODE_REGS (unsigned int + *P1, unsigned int *P2) + On targets which do not use '(cc0)', and which use a hard register + rather than a pseudo-register to hold condition codes, the regular + CSE passes are often not able to identify cases in which the hard + register is set to a common value. Use this hook to enable a small + pass which optimizes such cases. This hook should return true to + enable this pass, and it should set the integers to which its + arguments point to the hard register numbers used for condition + codes. When there is only one such register, as is true on most + systems, the integer pointed to by P2 should be set to + 'INVALID_REGNUM'. + + The default version of this hook returns false. + + -- Target Hook: enum machine_mode TARGET_CC_MODES_COMPATIBLE (enum + machine_mode M1, enum machine_mode M2) + On targets which use multiple condition code modes in class + 'MODE_CC', it is sometimes the case that a comparison can be + validly done in more than one mode. On such a system, define this + target hook to take two mode arguments and to return a mode in + which both comparisons may be validly done. If there is no such + mode, return 'VOIDmode'. + + The default version of this hook checks whether the modes are the + same. If they are, it returns that mode. If they are different, + it returns 'VOIDmode'. + + +File: gccint.info, Node: Costs, Next: Scheduling, Prev: Condition Code, Up: Target Macros + +17.17 Describing Relative Costs of Operations +============================================= + +These macros let you describe the relative speed of various operations +on the target machine. + + -- Macro: REGISTER_MOVE_COST (MODE, FROM, TO) + A C expression for the cost of moving data of mode MODE from a + register in class FROM to one in class TO. The classes are + expressed using the enumeration values such as 'GENERAL_REGS'. A + value of 2 is the default; other values are interpreted relative to + that. + + It is not required that the cost always equal 2 when FROM is the + same as TO; on some machines it is expensive to move between + registers if they are not general registers. + + If reload sees an insn consisting of a single 'set' between two + hard registers, and if 'REGISTER_MOVE_COST' applied to their + classes returns a value of 2, reload does not check to ensure that + the constraints of the insn are met. Setting a cost of other than + 2 will allow reload to verify that the constraints are met. You + should do this if the 'movM' pattern's constraints do not allow + such copying. + + These macros are obsolete, new ports should use the target hook + 'TARGET_REGISTER_MOVE_COST' instead. + + -- Target Hook: int TARGET_REGISTER_MOVE_COST (enum machine_mode MODE, + reg_class_t FROM, reg_class_t TO) + This target hook should return the cost of moving data of mode MODE + from a register in class FROM to one in class TO. The classes are + expressed using the enumeration values such as 'GENERAL_REGS'. A + value of 2 is the default; other values are interpreted relative to + that. + + It is not required that the cost always equal 2 when FROM is the + same as TO; on some machines it is expensive to move between + registers if they are not general registers. + + If reload sees an insn consisting of a single 'set' between two + hard registers, and if 'TARGET_REGISTER_MOVE_COST' applied to their + classes returns a value of 2, reload does not check to ensure that + the constraints of the insn are met. Setting a cost of other than + 2 will allow reload to verify that the constraints are met. You + should do this if the 'movM' pattern's constraints do not allow + such copying. + + The default version of this function returns 2. + + -- Macro: MEMORY_MOVE_COST (MODE, CLASS, IN) + A C expression for the cost of moving data of mode MODE between a + register of class CLASS and memory; IN is zero if the value is to + be written to memory, nonzero if it is to be read in. This cost is + relative to those in 'REGISTER_MOVE_COST'. If moving between + registers and memory is more expensive than between two registers, + you should define this macro to express the relative cost. + + If you do not define this macro, GCC uses a default cost of 4 plus + the cost of copying via a secondary reload register, if one is + needed. If your machine requires a secondary reload register to + copy between memory and a register of CLASS but the reload + mechanism is more complex than copying via an intermediate, define + this macro to reflect the actual cost of the move. + + GCC defines the function 'memory_move_secondary_cost' if secondary + reloads are needed. It computes the costs due to copying via a + secondary register. If your machine copies from memory using a + secondary register in the conventional way but the default base + value of 4 is not correct for your machine, define this macro to + add some other value to the result of that function. The arguments + to that function are the same as to this macro. + + These macros are obsolete, new ports should use the target hook + 'TARGET_MEMORY_MOVE_COST' instead. + + -- Target Hook: int TARGET_MEMORY_MOVE_COST (enum machine_mode MODE, + reg_class_t RCLASS, bool IN) + This target hook should return the cost of moving data of mode MODE + between a register of class RCLASS and memory; IN is 'false' if the + value is to be written to memory, 'true' if it is to be read in. + This cost is relative to those in 'TARGET_REGISTER_MOVE_COST'. If + moving between registers and memory is more expensive than between + two registers, you should add this target hook to express the + relative cost. + + If you do not add this target hook, GCC uses a default cost of 4 + plus the cost of copying via a secondary reload register, if one is + needed. If your machine requires a secondary reload register to + copy between memory and a register of RCLASS but the reload + mechanism is more complex than copying via an intermediate, use + this target hook to reflect the actual cost of the move. + + GCC defines the function 'memory_move_secondary_cost' if secondary + reloads are needed. It computes the costs due to copying via a + secondary register. If your machine copies from memory using a + secondary register in the conventional way but the default base + value of 4 is not correct for your machine, use this target hook to + add some other value to the result of that function. The arguments + to that function are the same as to this target hook. + + -- Macro: BRANCH_COST (SPEED_P, PREDICTABLE_P) + A C expression for the cost of a branch instruction. A value of 1 + is the default; other values are interpreted relative to that. + Parameter SPEED_P is true when the branch in question should be + optimized for speed. When it is false, 'BRANCH_COST' should return + a value optimal for code size rather than performance. + PREDICTABLE_P is true for well-predicted branches. On many + architectures the 'BRANCH_COST' can be reduced then. + + Here are additional macros which do not specify precise relative costs, +but only that certain actions are more expensive than GCC would +ordinarily expect. + + -- Macro: SLOW_BYTE_ACCESS + Define this macro as a C expression which is nonzero if accessing + less than a word of memory (i.e. a 'char' or a 'short') is no + faster than accessing a word of memory, i.e., if such access + require more than one instruction or if there is no difference in + cost between byte and (aligned) word loads. + + When this macro is not defined, the compiler will access a field by + finding the smallest containing object; when it is defined, a + fullword load will be used if alignment permits. Unless bytes + accesses are faster than word accesses, using word accesses is + preferable since it may eliminate subsequent memory access if + subsequent accesses occur to other fields in the same word of the + structure, but to different bytes. + + -- Macro: SLOW_UNALIGNED_ACCESS (MODE, ALIGNMENT) + Define this macro to be the value 1 if memory accesses described by + the MODE and ALIGNMENT parameters have a cost many times greater + than aligned accesses, for example if they are emulated in a trap + handler. + + When this macro is nonzero, the compiler will act as if + 'STRICT_ALIGNMENT' were nonzero when generating code for block + moves. This can cause significantly more instructions to be + produced. Therefore, do not set this macro nonzero if unaligned + accesses only add a cycle or two to the time for a memory access. + + If the value of this macro is always zero, it need not be defined. + If this macro is defined, it should produce a nonzero value when + 'STRICT_ALIGNMENT' is nonzero. + + -- Macro: MOVE_RATIO (SPEED) + The threshold of number of scalar memory-to-memory move insns, + _below_ which a sequence of insns should be generated instead of a + string move insn or a library call. Increasing the value will + always make code faster, but eventually incurs high cost in + increased code size. + + Note that on machines where the corresponding move insn is a + 'define_expand' that emits a sequence of insns, this macro counts + the number of such sequences. + + The parameter SPEED is true if the code is currently being + optimized for speed rather than size. + + If you don't define this, a reasonable default is used. + + -- Macro: MOVE_BY_PIECES_P (SIZE, ALIGNMENT) + A C expression used to determine whether 'move_by_pieces' will be + used to copy a chunk of memory, or whether some other block move + mechanism will be used. Defaults to 1 if 'move_by_pieces_ninsns' + returns less than 'MOVE_RATIO'. + + -- Macro: MOVE_MAX_PIECES + A C expression used by 'move_by_pieces' to determine the largest + unit a load or store used to copy memory is. Defaults to + 'MOVE_MAX'. + + -- Macro: CLEAR_RATIO (SPEED) + The threshold of number of scalar move insns, _below_ which a + sequence of insns should be generated to clear memory instead of a + string clear insn or a library call. Increasing the value will + always make code faster, but eventually incurs high cost in + increased code size. + + The parameter SPEED is true if the code is currently being + optimized for speed rather than size. + + If you don't define this, a reasonable default is used. + + -- Macro: CLEAR_BY_PIECES_P (SIZE, ALIGNMENT) + A C expression used to determine whether 'clear_by_pieces' will be + used to clear a chunk of memory, or whether some other block clear + mechanism will be used. Defaults to 1 if 'move_by_pieces_ninsns' + returns less than 'CLEAR_RATIO'. + + -- Macro: SET_RATIO (SPEED) + The threshold of number of scalar move insns, _below_ which a + sequence of insns should be generated to set memory to a constant + value, instead of a block set insn or a library call. Increasing + the value will always make code faster, but eventually incurs high + cost in increased code size. + + The parameter SPEED is true if the code is currently being + optimized for speed rather than size. + + If you don't define this, it defaults to the value of 'MOVE_RATIO'. + + -- Macro: SET_BY_PIECES_P (SIZE, ALIGNMENT) + A C expression used to determine whether 'store_by_pieces' will be + used to set a chunk of memory to a constant value, or whether some + other mechanism will be used. Used by '__builtin_memset' when + storing values other than constant zero. Defaults to 1 if + 'move_by_pieces_ninsns' returns less than 'SET_RATIO'. + + -- Macro: STORE_BY_PIECES_P (SIZE, ALIGNMENT) + A C expression used to determine whether 'store_by_pieces' will be + used to set a chunk of memory to a constant string value, or + whether some other mechanism will be used. Used by + '__builtin_strcpy' when called with a constant source string. + Defaults to 1 if 'move_by_pieces_ninsns' returns less than + 'MOVE_RATIO'. + + -- Macro: USE_LOAD_POST_INCREMENT (MODE) + A C expression used to determine whether a load postincrement is a + good thing to use for a given mode. Defaults to the value of + 'HAVE_POST_INCREMENT'. + + -- Macro: USE_LOAD_POST_DECREMENT (MODE) + A C expression used to determine whether a load postdecrement is a + good thing to use for a given mode. Defaults to the value of + 'HAVE_POST_DECREMENT'. + + -- Macro: USE_LOAD_PRE_INCREMENT (MODE) + A C expression used to determine whether a load preincrement is a + good thing to use for a given mode. Defaults to the value of + 'HAVE_PRE_INCREMENT'. + + -- Macro: USE_LOAD_PRE_DECREMENT (MODE) + A C expression used to determine whether a load predecrement is a + good thing to use for a given mode. Defaults to the value of + 'HAVE_PRE_DECREMENT'. + + -- Macro: USE_STORE_POST_INCREMENT (MODE) + A C expression used to determine whether a store postincrement is a + good thing to use for a given mode. Defaults to the value of + 'HAVE_POST_INCREMENT'. + + -- Macro: USE_STORE_POST_DECREMENT (MODE) + A C expression used to determine whether a store postdecrement is a + good thing to use for a given mode. Defaults to the value of + 'HAVE_POST_DECREMENT'. + + -- Macro: USE_STORE_PRE_INCREMENT (MODE) + This macro is used to determine whether a store preincrement is a + good thing to use for a given mode. Defaults to the value of + 'HAVE_PRE_INCREMENT'. + + -- Macro: USE_STORE_PRE_DECREMENT (MODE) + This macro is used to determine whether a store predecrement is a + good thing to use for a given mode. Defaults to the value of + 'HAVE_PRE_DECREMENT'. + + -- Macro: NO_FUNCTION_CSE + Define this macro if it is as good or better to call a constant + function address than to call an address kept in a register. + + -- Macro: LOGICAL_OP_NON_SHORT_CIRCUIT + Define this macro if a non-short-circuit operation produced by + 'fold_range_test ()' is optimal. This macro defaults to true if + 'BRANCH_COST' is greater than or equal to the value 2. + + -- Target Hook: bool TARGET_RTX_COSTS (rtx X, int CODE, int OUTER_CODE, + int OPNO, int *TOTAL, bool SPEED) + This target hook describes the relative costs of RTL expressions. + + The cost may depend on the precise form of the expression, which is + available for examination in X, and the fact that X appears as + operand OPNO of an expression with rtx code OUTER_CODE. That is, + the hook can assume that there is some rtx Y such that 'GET_CODE + (Y) == OUTER_CODE' and such that either (a) 'XEXP (Y, OPNO) == X' + or (b) 'XVEC (Y, OPNO)' contains X. + + CODE is X's expression code--redundant, since it can be obtained + with 'GET_CODE (X)'. + + In implementing this hook, you can use the construct 'COSTS_N_INSNS + (N)' to specify a cost equal to N fast instructions. + + On entry to the hook, '*TOTAL' contains a default estimate for the + cost of the expression. The hook should modify this value as + necessary. Traditionally, the default costs are 'COSTS_N_INSNS + (5)' for multiplications, 'COSTS_N_INSNS (7)' for division and + modulus operations, and 'COSTS_N_INSNS (1)' for all other + operations. + + When optimizing for code size, i.e. when 'speed' is false, this + target hook should be used to estimate the relative size cost of an + expression, again relative to 'COSTS_N_INSNS'. + + The hook returns true when all subexpressions of X have been + processed, and false when 'rtx_cost' should recurse. + + -- Target Hook: int TARGET_ADDRESS_COST (rtx ADDRESS, enum machine_mode + MODE, addr_space_t AS, bool SPEED) + This hook computes the cost of an addressing mode that contains + ADDRESS. If not defined, the cost is computed from the ADDRESS + expression and the 'TARGET_RTX_COST' hook. + + For most CISC machines, the default cost is a good approximation of + the true cost of the addressing mode. However, on RISC machines, + all instructions normally have the same length and execution time. + Hence all addresses will have equal costs. + + In cases where more than one form of an address is known, the form + with the lowest cost will be used. If multiple forms have the + same, lowest, cost, the one that is the most complex will be used. + + For example, suppose an address that is equal to the sum of a + register and a constant is used twice in the same basic block. + When this macro is not defined, the address will be computed in a + register and memory references will be indirect through that + register. On machines where the cost of the addressing mode + containing the sum is no higher than that of a simple indirect + reference, this will produce an additional instruction and possibly + require an additional register. Proper specification of this macro + eliminates this overhead for such machines. + + This hook is never called with an invalid address. + + On machines where an address involving more than one register is as + cheap as an address computation involving only one register, + defining 'TARGET_ADDRESS_COST' to reflect this can cause two + registers to be live over a region of code where only one would + have been if 'TARGET_ADDRESS_COST' were not defined in that manner. + This effect should be considered in the definition of this macro. + Equivalent costs should probably only be given to addresses with + different numbers of registers on machines with lots of registers. + + +File: gccint.info, Node: Scheduling, Next: Sections, Prev: Costs, Up: Target Macros + +17.18 Adjusting the Instruction Scheduler +========================================= + +The instruction scheduler may need a fair amount of machine-specific +adjustment in order to produce good code. GCC provides several target +hooks for this purpose. It is usually enough to define just a few of +them: try the first ones in this list first. + + -- Target Hook: int TARGET_SCHED_ISSUE_RATE (void) + This hook returns the maximum number of instructions that can ever + issue at the same time on the target machine. The default is one. + Although the insn scheduler can define itself the possibility of + issue an insn on the same cycle, the value can serve as an + additional constraint to issue insns on the same simulated + processor cycle (see hooks 'TARGET_SCHED_REORDER' and + 'TARGET_SCHED_REORDER2'). This value must be constant over the + entire compilation. If you need it to vary depending on what the + instructions are, you must use 'TARGET_SCHED_VARIABLE_ISSUE'. + + -- Target Hook: int TARGET_SCHED_VARIABLE_ISSUE (FILE *FILE, int + VERBOSE, rtx INSN, int MORE) + This hook is executed by the scheduler after it has scheduled an + insn from the ready list. It should return the number of insns + which can still be issued in the current cycle. The default is + 'MORE - 1' for insns other than 'CLOBBER' and 'USE', which normally + are not counted against the issue rate. You should define this + hook if some insns take more machine resources than others, so that + fewer insns can follow them in the same cycle. FILE is either a + null pointer, or a stdio stream to write any debug output to. + VERBOSE is the verbose level provided by '-fsched-verbose-N'. INSN + is the instruction that was scheduled. + + -- Target Hook: int TARGET_SCHED_ADJUST_COST (rtx INSN, rtx LINK, rtx + DEP_INSN, int COST) + This function corrects the value of COST based on the relationship + between INSN and DEP_INSN through the dependence LINK. It should + return the new value. The default is to make no adjustment to + COST. This can be used for example to specify to the scheduler + using the traditional pipeline description that an output- or + anti-dependence does not incur the same cost as a data-dependence. + If the scheduler using the automaton based pipeline description, + the cost of anti-dependence is zero and the cost of + output-dependence is maximum of one and the difference of latency + times of the first and the second insns. If these values are not + acceptable, you could use the hook to modify them too. See also + *note Processor pipeline description::. + + -- Target Hook: int TARGET_SCHED_ADJUST_PRIORITY (rtx INSN, int + PRIORITY) + This hook adjusts the integer scheduling priority PRIORITY of INSN. + It should return the new priority. Increase the priority to + execute INSN earlier, reduce the priority to execute INSN later. + Do not define this hook if you do not need to adjust the scheduling + priorities of insns. + + -- Target Hook: int TARGET_SCHED_REORDER (FILE *FILE, int VERBOSE, rtx + *READY, int *N_READYP, int CLOCK) + This hook is executed by the scheduler after it has scheduled the + ready list, to allow the machine description to reorder it (for + example to combine two small instructions together on 'VLIW' + machines). FILE is either a null pointer, or a stdio stream to + write any debug output to. VERBOSE is the verbose level provided + by '-fsched-verbose-N'. READY is a pointer to the ready list of + instructions that are ready to be scheduled. N_READYP is a pointer + to the number of elements in the ready list. The scheduler reads + the ready list in reverse order, starting with READY[*N_READYP - 1] + and going to READY[0]. CLOCK is the timer tick of the scheduler. + You may modify the ready list and the number of ready insns. The + return value is the number of insns that can issue this cycle; + normally this is just 'issue_rate'. See also + 'TARGET_SCHED_REORDER2'. + + -- Target Hook: int TARGET_SCHED_REORDER2 (FILE *FILE, int VERBOSE, rtx + *READY, int *N_READYP, int CLOCK) + Like 'TARGET_SCHED_REORDER', but called at a different time. That + function is called whenever the scheduler starts a new cycle. This + one is called once per iteration over a cycle, immediately after + 'TARGET_SCHED_VARIABLE_ISSUE'; it can reorder the ready list and + return the number of insns to be scheduled in the same cycle. + Defining this hook can be useful if there are frequent situations + where scheduling one insn causes other insns to become ready in the + same cycle. These other insns can then be taken into account + properly. + + -- Target Hook: bool TARGET_SCHED_MACRO_FUSION_P (void) + This hook is used to check whether target platform supports macro + fusion. + + -- Target Hook: bool TARGET_SCHED_MACRO_FUSION_PAIR_P (rtx CONDGEN, rtx + CONDJMP) + This hook is used to check whether two insns could be macro fused + for target microarchitecture. If this hook returns true for the + given insn pair (CONDGEN and CONDJMP), scheduler will put them into + a sched group, and they will not be scheduled apart. + + -- Target Hook: void TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK (rtx + HEAD, rtx TAIL) + This hook is called after evaluation forward dependencies of insns + in chain given by two parameter values (HEAD and TAIL + correspondingly) but before insns scheduling of the insn chain. + For example, it can be used for better insn classification if it + requires analysis of dependencies. This hook can use backward and + forward dependencies of the insn scheduler because they are already + calculated. + + -- Target Hook: void TARGET_SCHED_INIT (FILE *FILE, int VERBOSE, int + MAX_READY) + This hook is executed by the scheduler at the beginning of each + block of instructions that are to be scheduled. FILE is either a + null pointer, or a stdio stream to write any debug output to. + VERBOSE is the verbose level provided by '-fsched-verbose-N'. + MAX_READY is the maximum number of insns in the current scheduling + region that can be live at the same time. This can be used to + allocate scratch space if it is needed, e.g. by + 'TARGET_SCHED_REORDER'. + + -- Target Hook: void TARGET_SCHED_FINISH (FILE *FILE, int VERBOSE) + This hook is executed by the scheduler at the end of each block of + instructions that are to be scheduled. It can be used to perform + cleanup of any actions done by the other scheduling hooks. FILE is + either a null pointer, or a stdio stream to write any debug output + to. VERBOSE is the verbose level provided by '-fsched-verbose-N'. + + -- Target Hook: void TARGET_SCHED_INIT_GLOBAL (FILE *FILE, int VERBOSE, + int OLD_MAX_UID) + This hook is executed by the scheduler after function level + initializations. FILE is either a null pointer, or a stdio stream + to write any debug output to. VERBOSE is the verbose level + provided by '-fsched-verbose-N'. OLD_MAX_UID is the maximum insn + uid when scheduling begins. + + -- Target Hook: void TARGET_SCHED_FINISH_GLOBAL (FILE *FILE, int + VERBOSE) + This is the cleanup hook corresponding to + 'TARGET_SCHED_INIT_GLOBAL'. FILE is either a null pointer, or a + stdio stream to write any debug output to. VERBOSE is the verbose + level provided by '-fsched-verbose-N'. + + -- Target Hook: rtx TARGET_SCHED_DFA_PRE_CYCLE_INSN (void) + The hook returns an RTL insn. The automaton state used in the + pipeline hazard recognizer is changed as if the insn were scheduled + when the new simulated processor cycle starts. Usage of the hook + may simplify the automaton pipeline description for some VLIW + processors. If the hook is defined, it is used only for the + automaton based pipeline description. The default is not to change + the state when the new simulated processor cycle starts. + + -- Target Hook: void TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN (void) + The hook can be used to initialize data used by the previous hook. + + -- Target Hook: rtx TARGET_SCHED_DFA_POST_CYCLE_INSN (void) + The hook is analogous to 'TARGET_SCHED_DFA_PRE_CYCLE_INSN' but used + to changed the state as if the insn were scheduled when the new + simulated processor cycle finishes. + + -- Target Hook: void TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN (void) + The hook is analogous to 'TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN' but + used to initialize data used by the previous hook. + + -- Target Hook: void TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE (void) + The hook to notify target that the current simulated cycle is about + to finish. The hook is analogous to + 'TARGET_SCHED_DFA_PRE_CYCLE_INSN' but used to change the state in + more complicated situations - e.g., when advancing state on a + single insn is not enough. + + -- Target Hook: void TARGET_SCHED_DFA_POST_ADVANCE_CYCLE (void) + The hook to notify target that new simulated cycle has just + started. The hook is analogous to + 'TARGET_SCHED_DFA_POST_CYCLE_INSN' but used to change the state in + more complicated situations - e.g., when advancing state on a + single insn is not enough. + + -- Target Hook: int TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD + (void) + This hook controls better choosing an insn from the ready insn + queue for the DFA-based insn scheduler. Usually the scheduler + chooses the first insn from the queue. If the hook returns a + positive value, an additional scheduler code tries all permutations + of 'TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD ()' subsequent + ready insns to choose an insn whose issue will result in maximal + number of issued insns on the same cycle. For the VLIW processor, + the code could actually solve the problem of packing simple insns + into the VLIW insn. Of course, if the rules of VLIW packing are + described in the automaton. + + This code also could be used for superscalar RISC processors. Let + us consider a superscalar RISC processor with 3 pipelines. Some + insns can be executed in pipelines A or B, some insns can be + executed only in pipelines B or C, and one insn can be executed in + pipeline B. The processor may issue the 1st insn into A and the + 2nd one into B. In this case, the 3rd insn will wait for freeing B + until the next cycle. If the scheduler issues the 3rd insn the + first, the processor could issue all 3 insns per cycle. + + Actually this code demonstrates advantages of the automaton based + pipeline hazard recognizer. We try quickly and easy many insn + schedules to choose the best one. + + The default is no multipass scheduling. + + -- Target Hook: int + TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD (rtx + INSN) + + This hook controls what insns from the ready insn queue will be + considered for the multipass insn scheduling. If the hook returns + zero for INSN, the insn will be not chosen to be issued. + + The default is that any ready insns can be chosen to be issued. + + -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BEGIN (void + *DATA, char *READY_TRY, int N_READY, bool FIRST_CYCLE_INSN_P) + This hook prepares the target backend for a new round of multipass + scheduling. + + -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_ISSUE (void + *DATA, char *READY_TRY, int N_READY, rtx INSN, const void + *PREV_DATA) + This hook is called when multipass scheduling evaluates instruction + INSN. + + -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BACKTRACK + (const void *DATA, char *READY_TRY, int N_READY) + This is called when multipass scheduling backtracks from evaluation + of an instruction. + + -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_END (const void + *DATA) + This hook notifies the target about the result of the concluded + current round of multipass scheduling. + + -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_INIT (void + *DATA) + This hook initializes target-specific data used in multipass + scheduling. + + -- Target Hook: void TARGET_SCHED_FIRST_CYCLE_MULTIPASS_FINI (void + *DATA) + This hook finalizes target-specific data used in multipass + scheduling. + + -- Target Hook: int TARGET_SCHED_DFA_NEW_CYCLE (FILE *DUMP, int + VERBOSE, rtx INSN, int LAST_CLOCK, int CLOCK, int *SORT_P) + This hook is called by the insn scheduler before issuing INSN on + cycle CLOCK. If the hook returns nonzero, INSN is not issued on + this processor cycle. Instead, the processor cycle is advanced. + If *SORT_P is zero, the insn ready queue is not sorted on the new + cycle start as usually. DUMP and VERBOSE specify the file and + verbosity level to use for debugging output. LAST_CLOCK and CLOCK + are, respectively, the processor cycle on which the previous insn + has been issued, and the current processor cycle. + + -- Target Hook: bool TARGET_SCHED_IS_COSTLY_DEPENDENCE (struct _dep + *_DEP, int COST, int DISTANCE) + This hook is used to define which dependences are considered costly + by the target, so costly that it is not advisable to schedule the + insns that are involved in the dependence too close to one another. + The parameters to this hook are as follows: The first parameter + _DEP is the dependence being evaluated. The second parameter COST + is the cost of the dependence as estimated by the scheduler, and + the third parameter DISTANCE is the distance in cycles between the + two insns. The hook returns 'true' if considering the distance + between the two insns the dependence between them is considered + costly by the target, and 'false' otherwise. + + Defining this hook can be useful in multiple-issue out-of-order + machines, where (a) it's practically hopeless to predict the actual + data/resource delays, however: (b) there's a better chance to + predict the actual grouping that will be formed, and (c) correctly + emulating the grouping can be very important. In such targets one + may want to allow issuing dependent insns closer to one + another--i.e., closer than the dependence distance; however, not in + cases of "costly dependences", which this hooks allows to define. + + -- Target Hook: void TARGET_SCHED_H_I_D_EXTENDED (void) + This hook is called by the insn scheduler after emitting a new + instruction to the instruction stream. The hook notifies a target + backend to extend its per instruction data structures. + + -- Target Hook: void * TARGET_SCHED_ALLOC_SCHED_CONTEXT (void) + Return a pointer to a store large enough to hold target scheduling + context. + + -- Target Hook: void TARGET_SCHED_INIT_SCHED_CONTEXT (void *TC, bool + CLEAN_P) + Initialize store pointed to by TC to hold target scheduling + context. It CLEAN_P is true then initialize TC as if scheduler is + at the beginning of the block. Otherwise, copy the current context + into TC. + + -- Target Hook: void TARGET_SCHED_SET_SCHED_CONTEXT (void *TC) + Copy target scheduling context pointed to by TC to the current + context. + + -- Target Hook: void TARGET_SCHED_CLEAR_SCHED_CONTEXT (void *TC) + Deallocate internal data in target scheduling context pointed to by + TC. + + -- Target Hook: void TARGET_SCHED_FREE_SCHED_CONTEXT (void *TC) + Deallocate a store for target scheduling context pointed to by TC. + + -- Target Hook: int TARGET_SCHED_SPECULATE_INSN (rtx INSN, unsigned int + DEP_STATUS, rtx *NEW_PAT) + This hook is called by the insn scheduler when INSN has only + speculative dependencies and therefore can be scheduled + speculatively. The hook is used to check if the pattern of INSN + has a speculative version and, in case of successful check, to + generate that speculative pattern. The hook should return 1, if + the instruction has a speculative form, or -1, if it doesn't. + REQUEST describes the type of requested speculation. If the return + value equals 1 then NEW_PAT is assigned the generated speculative + pattern. + + -- Target Hook: bool TARGET_SCHED_NEEDS_BLOCK_P (unsigned int + DEP_STATUS) + This hook is called by the insn scheduler during generation of + recovery code for INSN. It should return 'true', if the + corresponding check instruction should branch to recovery code, or + 'false' otherwise. + + -- Target Hook: rtx TARGET_SCHED_GEN_SPEC_CHECK (rtx INSN, rtx LABEL, + unsigned int DS) + This hook is called by the insn scheduler to generate a pattern for + recovery check instruction. If MUTATE_P is zero, then INSN is a + speculative instruction for which the check should be generated. + LABEL is either a label of a basic block, where recovery code + should be emitted, or a null pointer, when requested check doesn't + branch to recovery code (a simple check). If MUTATE_P is nonzero, + then a pattern for a branchy check corresponding to a simple check + denoted by INSN should be generated. In this case LABEL can't be + null. + + -- Target Hook: bool + TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC + (const_rtx INSN) + This hook is used as a workaround for + 'TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD' not being + called on the first instruction of the ready list. The hook is + used to discard speculative instructions that stand first in the + ready list from being scheduled on the current cycle. If the hook + returns 'false', INSN will not be chosen to be issued. For + non-speculative instructions, the hook should always return 'true'. + For example, in the ia64 backend the hook is used to cancel data + speculative insns when the ALAT table is nearly full. + + -- Target Hook: void TARGET_SCHED_SET_SCHED_FLAGS (struct spec_info_def + *SPEC_INFO) + This hook is used by the insn scheduler to find out what features + should be enabled/used. The structure *SPEC_INFO should be filled + in by the target. The structure describes speculation types that + can be used in the scheduler. + + -- Target Hook: int TARGET_SCHED_SMS_RES_MII (struct ddg *G) + This hook is called by the swing modulo scheduler to calculate a + resource-based lower bound which is based on the resources + available in the machine and the resources required by each + instruction. The target backend can use G to calculate such bound. + A very simple lower bound will be used in case this hook is not + implemented: the total number of instructions divided by the issue + rate. + + -- Target Hook: bool TARGET_SCHED_DISPATCH (rtx INSN, int X) + This hook is called by Haifa Scheduler. It returns true if + dispatch scheduling is supported in hardware and the condition + specified in the parameter is true. + + -- Target Hook: void TARGET_SCHED_DISPATCH_DO (rtx INSN, int X) + This hook is called by Haifa Scheduler. It performs the operation + specified in its second parameter. + + -- Target Hook: bool TARGET_SCHED_EXPOSED_PIPELINE + True if the processor has an exposed pipeline, which means that not + just the order of instructions is important for correctness when + scheduling, but also the latencies of operations. + + -- Target Hook: int TARGET_SCHED_REASSOCIATION_WIDTH (unsigned int OPC, + enum machine_mode MODE) + This hook is called by tree reassociator to determine a level of + parallelism required in output calculations chain. + + +File: gccint.info, Node: Sections, Next: PIC, Prev: Scheduling, Up: Target Macros + +17.19 Dividing the Output into Sections (Texts, Data, ...) +========================================================== + +An object file is divided into sections containing different types of +data. In the most common case, there are three sections: the "text +section", which holds instructions and read-only data; the "data +section", which holds initialized writable data; and the "bss section", +which holds uninitialized data. Some systems have other kinds of +sections. + + 'varasm.c' provides several well-known sections, such as +'text_section', 'data_section' and 'bss_section'. The normal way of +controlling a 'FOO_section' variable is to define the associated +'FOO_SECTION_ASM_OP' macro, as described below. The macros are only +read once, when 'varasm.c' initializes itself, so their values must be +run-time constants. They may however depend on command-line flags. + + _Note:_ Some run-time files, such 'crtstuff.c', also make use of the +'FOO_SECTION_ASM_OP' macros, and expect them to be string literals. + + Some assemblers require a different string to be written every time a +section is selected. If your assembler falls into this category, you +should define the 'TARGET_ASM_INIT_SECTIONS' hook and use +'get_unnamed_section' to set up the sections. + + You must always create a 'text_section', either by defining +'TEXT_SECTION_ASM_OP' or by initializing 'text_section' in +'TARGET_ASM_INIT_SECTIONS'. The same is true of 'data_section' and +'DATA_SECTION_ASM_OP'. If you do not create a distinct +'readonly_data_section', the default is to reuse 'text_section'. + + All the other 'varasm.c' sections are optional, and are null if the +target does not provide them. + + -- Macro: TEXT_SECTION_ASM_OP + A C expression whose value is a string, including spacing, + containing the assembler operation that should precede instructions + and read-only data. Normally '"\t.text"' is right. + + -- Macro: HOT_TEXT_SECTION_NAME + If defined, a C string constant for the name of the section + containing most frequently executed functions of the program. If + not defined, GCC will provide a default definition if the target + supports named sections. + + -- Macro: UNLIKELY_EXECUTED_TEXT_SECTION_NAME + If defined, a C string constant for the name of the section + containing unlikely executed functions in the program. + + -- Macro: DATA_SECTION_ASM_OP + A C expression whose value is a string, including spacing, + containing the assembler operation to identify the following data + as writable initialized data. Normally '"\t.data"' is right. + + -- Macro: SDATA_SECTION_ASM_OP + If defined, a C expression whose value is a string, including + spacing, containing the assembler operation to identify the + following data as initialized, writable small data. + + -- Macro: READONLY_DATA_SECTION_ASM_OP + A C expression whose value is a string, including spacing, + containing the assembler operation to identify the following data + as read-only initialized data. + + -- Macro: BSS_SECTION_ASM_OP + If defined, a C expression whose value is a string, including + spacing, containing the assembler operation to identify the + following data as uninitialized global data. If not defined, and + 'ASM_OUTPUT_ALIGNED_BSS' not defined, uninitialized global data + will be output in the data section if '-fno-common' is passed, + otherwise 'ASM_OUTPUT_COMMON' will be used. + + -- Macro: SBSS_SECTION_ASM_OP + If defined, a C expression whose value is a string, including + spacing, containing the assembler operation to identify the + following data as uninitialized, writable small data. + + -- Macro: TLS_COMMON_ASM_OP + If defined, a C expression whose value is a string containing the + assembler operation to identify the following data as thread-local + common data. The default is '".tls_common"'. + + -- Macro: TLS_SECTION_ASM_FLAG + If defined, a C expression whose value is a character constant + containing the flag used to mark a section as a TLS section. The + default is ''T''. + + -- Macro: INIT_SECTION_ASM_OP + If defined, a C expression whose value is a string, including + spacing, containing the assembler operation to identify the + following data as initialization code. If not defined, GCC will + assume such a section does not exist. This section has no + corresponding 'init_section' variable; it is used entirely in + runtime code. + + -- Macro: FINI_SECTION_ASM_OP + If defined, a C expression whose value is a string, including + spacing, containing the assembler operation to identify the + following data as finalization code. If not defined, GCC will + assume such a section does not exist. This section has no + corresponding 'fini_section' variable; it is used entirely in + runtime code. + + -- Macro: INIT_ARRAY_SECTION_ASM_OP + If defined, a C expression whose value is a string, including + spacing, containing the assembler operation to identify the + following data as part of the '.init_array' (or equivalent) + section. If not defined, GCC will assume such a section does not + exist. Do not define both this macro and 'INIT_SECTION_ASM_OP'. + + -- Macro: FINI_ARRAY_SECTION_ASM_OP + If defined, a C expression whose value is a string, including + spacing, containing the assembler operation to identify the + following data as part of the '.fini_array' (or equivalent) + section. If not defined, GCC will assume such a section does not + exist. Do not define both this macro and 'FINI_SECTION_ASM_OP'. + + -- Macro: CRT_CALL_STATIC_FUNCTION (SECTION_OP, FUNCTION) + If defined, an ASM statement that switches to a different section + via SECTION_OP, calls FUNCTION, and switches back to the text + section. This is used in 'crtstuff.c' if 'INIT_SECTION_ASM_OP' or + 'FINI_SECTION_ASM_OP' to calls to initialization and finalization + functions from the init and fini sections. By default, this macro + uses a simple function call. Some ports need hand-crafted assembly + code to avoid dependencies on registers initialized in the function + prologue or to ensure that constant pools don't end up too far way + in the text section. + + -- Macro: TARGET_LIBGCC_SDATA_SECTION + If defined, a string which names the section into which small + variables defined in crtstuff and libgcc should go. This is useful + when the target has options for optimizing access to small data, + and you want the crtstuff and libgcc routines to be conservative in + what they expect of your application yet liberal in what your + application expects. For example, for targets with a '.sdata' + section (like MIPS), you could compile crtstuff with '-G 0' so that + it doesn't require small data support from your application, but + use this macro to put small data into '.sdata' so that your + application can access these variables whether it uses small data + or not. + + -- Macro: FORCE_CODE_SECTION_ALIGN + If defined, an ASM statement that aligns a code section to some + arbitrary boundary. This is used to force all fragments of the + '.init' and '.fini' sections to have to same alignment and thus + prevent the linker from having to add any padding. + + -- Macro: JUMP_TABLES_IN_TEXT_SECTION + Define this macro to be an expression with a nonzero value if jump + tables (for 'tablejump' insns) should be output in the text + section, along with the assembler instructions. Otherwise, the + readonly data section is used. + + This macro is irrelevant if there is no separate readonly data + section. + + -- Target Hook: void TARGET_ASM_INIT_SECTIONS (void) + Define this hook if you need to do something special to set up the + 'varasm.c' sections, or if your target has some special sections of + its own that you need to create. + + GCC calls this hook after processing the command line, but before + writing any assembly code, and before calling any of the + section-returning hooks described below. + + -- Target Hook: int TARGET_ASM_RELOC_RW_MASK (void) + Return a mask describing how relocations should be treated when + selecting sections. Bit 1 should be set if global relocations + should be placed in a read-write section; bit 0 should be set if + local relocations should be placed in a read-write section. + + The default version of this function returns 3 when '-fpic' is in + effect, and 0 otherwise. The hook is typically redefined when the + target cannot support (some kinds of) dynamic relocations in + read-only sections even in executables. + + -- Target Hook: section * TARGET_ASM_SELECT_SECTION (tree EXP, int + RELOC, unsigned HOST_WIDE_INT ALIGN) + Return the section into which EXP should be placed. You can assume + that EXP is either a 'VAR_DECL' node or a constant of some sort. + RELOC indicates whether the initial value of EXP requires link-time + relocations. Bit 0 is set when variable contains local relocations + only, while bit 1 is set for global relocations. ALIGN is the + constant alignment in bits. + + The default version of this function takes care of putting + read-only variables in 'readonly_data_section'. + + See also USE_SELECT_SECTION_FOR_FUNCTIONS. + + -- Macro: USE_SELECT_SECTION_FOR_FUNCTIONS + Define this macro if you wish TARGET_ASM_SELECT_SECTION to be + called for 'FUNCTION_DECL's as well as for variables and constants. + + In the case of a 'FUNCTION_DECL', RELOC will be zero if the + function has been determined to be likely to be called, and nonzero + if it is unlikely to be called. + + -- Target Hook: void TARGET_ASM_UNIQUE_SECTION (tree DECL, int RELOC) + Build up a unique section name, expressed as a 'STRING_CST' node, + and assign it to 'DECL_SECTION_NAME (DECL)'. As with + 'TARGET_ASM_SELECT_SECTION', RELOC indicates whether the initial + value of EXP requires link-time relocations. + + The default version of this function appends the symbol name to the + ELF section name that would normally be used for the symbol. For + example, the function 'foo' would be placed in '.text.foo'. + Whatever the actual target object format, this is often good + enough. + + -- Target Hook: section * TARGET_ASM_FUNCTION_RODATA_SECTION (tree + DECL) + Return the readonly data section associated with 'DECL_SECTION_NAME + (DECL)'. The default version of this function selects + '.gnu.linkonce.r.name' if the function's section is + '.gnu.linkonce.t.name', '.rodata.name' if function is in + '.text.name', and the normal readonly-data section otherwise. + + -- Target Hook: const char * TARGET_ASM_MERGEABLE_RODATA_PREFIX + Usually, the compiler uses the prefix '".rodata"' to construct + section names for mergeable constant data. Define this macro to + override the string if a different section name should be used. + + -- Target Hook: section * TARGET_ASM_TM_CLONE_TABLE_SECTION (void) + Return the section that should be used for transactional memory + clone tables. + + -- Target Hook: section * TARGET_ASM_SELECT_RTX_SECTION (enum + machine_mode MODE, rtx X, unsigned HOST_WIDE_INT ALIGN) + Return the section into which a constant X, of mode MODE, should be + placed. You can assume that X is some kind of constant in RTL. + The argument MODE is redundant except in the case of a 'const_int' + rtx. ALIGN is the constant alignment in bits. + + The default version of this function takes care of putting symbolic + constants in 'flag_pic' mode in 'data_section' and everything else + in 'readonly_data_section'. + + -- Target Hook: tree TARGET_MANGLE_DECL_ASSEMBLER_NAME (tree DECL, tree + ID) + Define this hook if you need to postprocess the assembler name + generated by target-independent code. The ID provided to this hook + will be the computed name (e.g., the macro 'DECL_NAME' of the DECL + in C, or the mangled name of the DECL in C++). The return value of + the hook is an 'IDENTIFIER_NODE' for the appropriate mangled name + on your target system. The default implementation of this hook + just returns the ID provided. + + -- Target Hook: void TARGET_ENCODE_SECTION_INFO (tree DECL, rtx RTL, + int NEW_DECL_P) + Define this hook if references to a symbol or a constant must be + treated differently depending on something about the variable or + function named by the symbol (such as what section it is in). + + The hook is executed immediately after rtl has been created for + DECL, which may be a variable or function declaration or an entry + in the constant pool. In either case, RTL is the rtl in question. + Do _not_ use 'DECL_RTL (DECL)' in this hook; that field may not + have been initialized yet. + + In the case of a constant, it is safe to assume that the rtl is a + 'mem' whose address is a 'symbol_ref'. Most decls will also have + this form, but that is not guaranteed. Global register variables, + for instance, will have a 'reg' for their rtl. (Normally the right + thing to do with such unusual rtl is leave it alone.) + + The NEW_DECL_P argument will be true if this is the first time that + 'TARGET_ENCODE_SECTION_INFO' has been invoked on this decl. It + will be false for subsequent invocations, which will happen for + duplicate declarations. Whether or not anything must be done for + the duplicate declaration depends on whether the hook examines + 'DECL_ATTRIBUTES'. NEW_DECL_P is always true when the hook is + called for a constant. + + The usual thing for this hook to do is to record flags in the + 'symbol_ref', using 'SYMBOL_REF_FLAG' or 'SYMBOL_REF_FLAGS'. + Historically, the name string was modified if it was necessary to + encode more than one bit of information, but this practice is now + discouraged; use 'SYMBOL_REF_FLAGS'. + + The default definition of this hook, 'default_encode_section_info' + in 'varasm.c', sets a number of commonly-useful bits in + 'SYMBOL_REF_FLAGS'. Check whether the default does what you need + before overriding it. + + -- Target Hook: const char * TARGET_STRIP_NAME_ENCODING (const char + *NAME) + Decode NAME and return the real name part, sans the characters that + 'TARGET_ENCODE_SECTION_INFO' may have added. + + -- Target Hook: bool TARGET_IN_SMALL_DATA_P (const_tree EXP) + Returns true if EXP should be placed into a "small data" section. + The default version of this hook always returns false. + + -- Target Hook: bool TARGET_HAVE_SRODATA_SECTION + Contains the value true if the target places read-only "small data" + into a separate section. The default value is false. + + -- Target Hook: bool TARGET_PROFILE_BEFORE_PROLOGUE (void) + It returns true if target wants profile code emitted before + prologue. + + The default version of this hook use the target macro + 'PROFILE_BEFORE_PROLOGUE'. + + -- Target Hook: bool TARGET_BINDS_LOCAL_P (const_tree EXP) + Returns true if EXP names an object for which name resolution rules + must resolve to the current "module" (dynamic shared library or + executable image). + + The default version of this hook implements the name resolution + rules for ELF, which has a looser model of global name binding than + other currently supported object file formats. + + -- Target Hook: bool TARGET_HAVE_TLS + Contains the value true if the target supports thread-local + storage. The default value is false. + + +File: gccint.info, Node: PIC, Next: Assembler Format, Prev: Sections, Up: Target Macros + +17.20 Position Independent Code +=============================== + +This section describes macros that help implement generation of position +independent code. Simply defining these macros is not enough to +generate valid PIC; you must also add support to the hook +'TARGET_LEGITIMATE_ADDRESS_P' and to the macro 'PRINT_OPERAND_ADDRESS', +as well as 'LEGITIMIZE_ADDRESS'. You must modify the definition of +'movsi' to do something appropriate when the source operand contains a +symbolic address. You may also need to alter the handling of switch +statements so that they use relative addresses. + + -- Macro: PIC_OFFSET_TABLE_REGNUM + The register number of the register used to address a table of + static data addresses in memory. In some cases this register is + defined by a processor's "application binary interface" (ABI). + When this macro is defined, RTL is generated for this register + once, as with the stack pointer and frame pointer registers. If + this macro is not defined, it is up to the machine-dependent files + to allocate such a register (if necessary). Note that this + register must be fixed when in use (e.g. when 'flag_pic' is true). + + -- Macro: PIC_OFFSET_TABLE_REG_CALL_CLOBBERED + A C expression that is nonzero if the register defined by + 'PIC_OFFSET_TABLE_REGNUM' is clobbered by calls. If not defined, + the default is zero. Do not define this macro if + 'PIC_OFFSET_TABLE_REGNUM' is not defined. + + -- Macro: LEGITIMATE_PIC_OPERAND_P (X) + A C expression that is nonzero if X is a legitimate immediate + operand on the target machine when generating position independent + code. You can assume that X satisfies 'CONSTANT_P', so you need + not check this. You can also assume FLAG_PIC is true, so you need + not check it either. You need not define this macro if all + constants (including 'SYMBOL_REF') can be immediate operands when + generating position independent code. + + +File: gccint.info, Node: Assembler Format, Next: Debugging Info, Prev: PIC, Up: Target Macros + +17.21 Defining the Output Assembler Language +============================================ + +This section describes macros whose principal purpose is to describe how +to write instructions in assembler language--rather than what the +instructions do. + +* Menu: + +* File Framework:: Structural information for the assembler file. +* Data Output:: Output of constants (numbers, strings, addresses). +* Uninitialized Data:: Output of uninitialized variables. +* Label Output:: Output and generation of labels. +* Initialization:: General principles of initialization + and termination routines. +* Macros for Initialization:: + Specific macros that control the handling of + initialization and termination routines. +* Instruction Output:: Output of actual instructions. +* Dispatch Tables:: Output of jump tables. +* Exception Region Output:: Output of exception region code. +* Alignment Output:: Pseudo ops for alignment and skipping data. + + +File: gccint.info, Node: File Framework, Next: Data Output, Up: Assembler Format + +17.21.1 The Overall Framework of an Assembler File +-------------------------------------------------- + +This describes the overall framework of an assembly file. + + -- Target Hook: void TARGET_ASM_FILE_START (void) + Output to 'asm_out_file' any text which the assembler expects to + find at the beginning of a file. The default behavior is + controlled by two flags, documented below. Unless your target's + assembler is quite unusual, if you override the default, you should + call 'default_file_start' at some point in your target hook. This + lets other target files rely on these variables. + + -- Target Hook: bool TARGET_ASM_FILE_START_APP_OFF + If this flag is true, the text of the macro 'ASM_APP_OFF' will be + printed as the very first line in the assembly file, unless + '-fverbose-asm' is in effect. (If that macro has been defined to + the empty string, this variable has no effect.) With the normal + definition of 'ASM_APP_OFF', the effect is to notify the GNU + assembler that it need not bother stripping comments or extra + whitespace from its input. This allows it to work a bit faster. + + The default is false. You should not set it to true unless you + have verified that your port does not generate any extra whitespace + or comments that will cause GAS to issue errors in NO_APP mode. + + -- Target Hook: bool TARGET_ASM_FILE_START_FILE_DIRECTIVE + If this flag is true, 'output_file_directive' will be called for + the primary source file, immediately after printing 'ASM_APP_OFF' + (if that is enabled). Most ELF assemblers expect this to be done. + The default is false. + + -- Target Hook: void TARGET_ASM_FILE_END (void) + Output to 'asm_out_file' any text which the assembler expects to + find at the end of a file. The default is to output nothing. + + -- Function: void file_end_indicate_exec_stack () + Some systems use a common convention, the '.note.GNU-stack' special + section, to indicate whether or not an object file relies on the + stack being executable. If your system uses this convention, you + should define 'TARGET_ASM_FILE_END' to this function. If you need + to do other things in that hook, have your hook function call this + function. + + -- Target Hook: void TARGET_ASM_LTO_START (void) + Output to 'asm_out_file' any text which the assembler expects to + find at the start of an LTO section. The default is to output + nothing. + + -- Target Hook: void TARGET_ASM_LTO_END (void) + Output to 'asm_out_file' any text which the assembler expects to + find at the end of an LTO section. The default is to output + nothing. + + -- Target Hook: void TARGET_ASM_CODE_END (void) + Output to 'asm_out_file' any text which is needed before emitting + unwind info and debug info at the end of a file. Some targets emit + here PIC setup thunks that cannot be emitted at the end of file, + because they couldn't have unwind info then. The default is to + output nothing. + + -- Macro: ASM_COMMENT_START + A C string constant describing how to begin a comment in the target + assembler language. The compiler assumes that the comment will end + at the end of the line. + + -- Macro: ASM_APP_ON + A C string constant for text to be output before each 'asm' + statement or group of consecutive ones. Normally this is '"#APP"', + which is a comment that has no effect on most assemblers but tells + the GNU assembler that it must check the lines that follow for all + valid assembler constructs. + + -- Macro: ASM_APP_OFF + A C string constant for text to be output after each 'asm' + statement or group of consecutive ones. Normally this is + '"#NO_APP"', which tells the GNU assembler to resume making the + time-saving assumptions that are valid for ordinary compiler + output. + + -- Macro: ASM_OUTPUT_SOURCE_FILENAME (STREAM, NAME) + A C statement to output COFF information or DWARF debugging + information which indicates that filename NAME is the current + source file to the stdio stream STREAM. + + This macro need not be defined if the standard form of output for + the file format in use is appropriate. + + -- Target Hook: void TARGET_ASM_OUTPUT_SOURCE_FILENAME (FILE *FILE, + const char *NAME) + Output COFF information or DWARF debugging information which + indicates that filename NAME is the current source file to the + stdio stream FILE. + + This target hook need not be defined if the standard form of output + for the file format in use is appropriate. + + -- Target Hook: void TARGET_ASM_OUTPUT_IDENT (const char *NAME) + Output a string based on NAME, suitable for the '#ident' directive, + or the equivalent directive or pragma in non-C-family languages. + If this hook is not defined, nothing is output for the '#ident' + directive. + + -- Macro: OUTPUT_QUOTED_STRING (STREAM, STRING) + A C statement to output the string STRING to the stdio stream + STREAM. If you do not call the function 'output_quoted_string' in + your config files, GCC will only call it to output filenames to the + assembler source. So you can use it to canonicalize the format of + the filename using this macro. + + -- Target Hook: void TARGET_ASM_NAMED_SECTION (const char *NAME, + unsigned int FLAGS, tree DECL) + Output assembly directives to switch to section NAME. The section + should have attributes as specified by FLAGS, which is a bit mask + of the 'SECTION_*' flags defined in 'output.h'. If DECL is + non-NULL, it is the 'VAR_DECL' or 'FUNCTION_DECL' with which this + section is associated. + + -- Target Hook: section * TARGET_ASM_FUNCTION_SECTION (tree DECL, enum + node_frequency FREQ, bool STARTUP, bool EXIT) + Return preferred text (sub)section for function DECL. Main purpose + of this function is to separate cold, normal and hot functions. + STARTUP is true when function is known to be used only at startup + (from static constructors or it is 'main()'). EXIT is true when + function is known to be used only at exit (from static + destructors). Return NULL if function should go to default text + section. + + -- Target Hook: void TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS (FILE + *FILE, tree DECL, bool NEW_IS_COLD) + Used by the target to emit any assembler directives or additional + labels needed when a function is partitioned between different + sections. Output should be written to FILE. The function decl is + available as DECL and the new section is 'cold' if NEW_IS_COLD is + 'true'. + + -- Common Target Hook: bool TARGET_HAVE_NAMED_SECTIONS + This flag is true if the target supports + 'TARGET_ASM_NAMED_SECTION'. It must not be modified by + command-line option processing. + + -- Target Hook: bool TARGET_HAVE_SWITCHABLE_BSS_SECTIONS + This flag is true if we can create zeroed data by switching to a + BSS section and then using 'ASM_OUTPUT_SKIP' to allocate the space. + This is true on most ELF targets. + + -- Target Hook: unsigned int TARGET_SECTION_TYPE_FLAGS (tree DECL, + const char *NAME, int RELOC) + Choose a set of section attributes for use by + 'TARGET_ASM_NAMED_SECTION' based on a variable or function decl, a + section name, and whether or not the declaration's initializer may + contain runtime relocations. DECL may be null, in which case + read-write data should be assumed. + + The default version of this function handles choosing code vs data, + read-only vs read-write data, and 'flag_pic'. You should only need + to override this if your target has special flags that might be set + via '__attribute__'. + + -- Target Hook: int TARGET_ASM_RECORD_GCC_SWITCHES (print_switch_type + TYPE, const char *TEXT) + Provides the target with the ability to record the gcc command line + switches that have been passed to the compiler, and options that + are enabled. The TYPE argument specifies what is being recorded. + It can take the following values: + + 'SWITCH_TYPE_PASSED' + TEXT is a command line switch that has been set by the user. + + 'SWITCH_TYPE_ENABLED' + TEXT is an option which has been enabled. This might be as a + direct result of a command line switch, or because it is + enabled by default or because it has been enabled as a side + effect of a different command line switch. For example, the + '-O2' switch enables various different individual optimization + passes. + + 'SWITCH_TYPE_DESCRIPTIVE' + TEXT is either NULL or some descriptive text which should be + ignored. If TEXT is NULL then it is being used to warn the + target hook that either recording is starting or ending. The + first time TYPE is SWITCH_TYPE_DESCRIPTIVE and TEXT is NULL, + the warning is for start up and the second time the warning is + for wind down. This feature is to allow the target hook to + make any necessary preparations before it starts to record + switches and to perform any necessary tidying up after it has + finished recording switches. + + 'SWITCH_TYPE_LINE_START' + This option can be ignored by this target hook. + + 'SWITCH_TYPE_LINE_END' + This option can be ignored by this target hook. + + The hook's return value must be zero. Other return values may be + supported in the future. + + By default this hook is set to NULL, but an example implementation + is provided for ELF based targets. Called ELF_RECORD_GCC_SWITCHES, + it records the switches as ASCII text inside a new, string + mergeable section in the assembler output file. The name of the + new section is provided by the + 'TARGET_ASM_RECORD_GCC_SWITCHES_SECTION' target hook. + + -- Target Hook: const char * TARGET_ASM_RECORD_GCC_SWITCHES_SECTION + This is the name of the section that will be created by the example + ELF implementation of the 'TARGET_ASM_RECORD_GCC_SWITCHES' target + hook. + + +File: gccint.info, Node: Data Output, Next: Uninitialized Data, Prev: File Framework, Up: Assembler Format + +17.21.2 Output of Data +---------------------- + + -- Target Hook: const char * TARGET_ASM_BYTE_OP + -- Target Hook: const char * TARGET_ASM_ALIGNED_HI_OP + -- Target Hook: const char * TARGET_ASM_ALIGNED_SI_OP + -- Target Hook: const char * TARGET_ASM_ALIGNED_DI_OP + -- Target Hook: const char * TARGET_ASM_ALIGNED_TI_OP + -- Target Hook: const char * TARGET_ASM_UNALIGNED_HI_OP + -- Target Hook: const char * TARGET_ASM_UNALIGNED_SI_OP + -- Target Hook: const char * TARGET_ASM_UNALIGNED_DI_OP + -- Target Hook: const char * TARGET_ASM_UNALIGNED_TI_OP + These hooks specify assembly directives for creating certain kinds + of integer object. The 'TARGET_ASM_BYTE_OP' directive creates a + byte-sized object, the 'TARGET_ASM_ALIGNED_HI_OP' one creates an + aligned two-byte object, and so on. Any of the hooks may be + 'NULL', indicating that no suitable directive is available. + + The compiler will print these strings at the start of a new line, + followed immediately by the object's initial value. In most cases, + the string should contain a tab, a pseudo-op, and then another tab. + + -- Target Hook: bool TARGET_ASM_INTEGER (rtx X, unsigned int SIZE, int + ALIGNED_P) + The 'assemble_integer' function uses this hook to output an integer + object. X is the object's value, SIZE is its size in bytes and + ALIGNED_P indicates whether it is aligned. The function should + return 'true' if it was able to output the object. If it returns + false, 'assemble_integer' will try to split the object into smaller + parts. + + The default implementation of this hook will use the + 'TARGET_ASM_BYTE_OP' family of strings, returning 'false' when the + relevant string is 'NULL'. + + -- Target Hook: bool TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA (FILE *FILE, + rtx X) + A target hook to recognize RTX patterns that 'output_addr_const' + can't deal with, and output assembly code to FILE corresponding to + the pattern X. This may be used to allow machine-dependent + 'UNSPEC's to appear within constants. + + If target hook fails to recognize a pattern, it must return + 'false', so that a standard error message is printed. If it prints + an error message itself, by calling, for example, + 'output_operand_lossage', it may just return 'true'. + + -- Macro: ASM_OUTPUT_ASCII (STREAM, PTR, LEN) + A C statement to output to the stdio stream STREAM an assembler + instruction to assemble a string constant containing the LEN bytes + at PTR. PTR will be a C expression of type 'char *' and LEN a C + expression of type 'int'. + + If the assembler has a '.ascii' pseudo-op as found in the Berkeley + Unix assembler, do not define the macro 'ASM_OUTPUT_ASCII'. + + -- Macro: ASM_OUTPUT_FDESC (STREAM, DECL, N) + A C statement to output word N of a function descriptor for DECL. + This must be defined if 'TARGET_VTABLE_USES_DESCRIPTORS' is + defined, and is otherwise unused. + + -- Macro: CONSTANT_POOL_BEFORE_FUNCTION + You may define this macro as a C expression. You should define the + expression to have a nonzero value if GCC should output the + constant pool for a function before the code for the function, or a + zero value if GCC should output the constant pool after the + function. If you do not define this macro, the usual case, GCC + will output the constant pool before the function. + + -- Macro: ASM_OUTPUT_POOL_PROLOGUE (FILE, FUNNAME, FUNDECL, SIZE) + A C statement to output assembler commands to define the start of + the constant pool for a function. FUNNAME is a string giving the + name of the function. Should the return type of the function be + required, it can be obtained via FUNDECL. SIZE is the size, in + bytes, of the constant pool that will be written immediately after + this call. + + If no constant-pool prefix is required, the usual case, this macro + need not be defined. + + -- Macro: ASM_OUTPUT_SPECIAL_POOL_ENTRY (FILE, X, MODE, ALIGN, LABELNO, + JUMPTO) + A C statement (with or without semicolon) to output a constant in + the constant pool, if it needs special treatment. (This macro need + not do anything for RTL expressions that can be output normally.) + + The argument FILE is the standard I/O stream to output the + assembler code on. X is the RTL expression for the constant to + output, and MODE is the machine mode (in case X is a 'const_int'). + ALIGN is the required alignment for the value X; you should output + an assembler directive to force this much alignment. + + The argument LABELNO is a number to use in an internal label for + the address of this pool entry. The definition of this macro is + responsible for outputting the label definition at the proper + place. Here is how to do this: + + (*targetm.asm_out.internal_label) (FILE, "LC", LABELNO); + + When you output a pool entry specially, you should end with a + 'goto' to the label JUMPTO. This will prevent the same pool entry + from being output a second time in the usual manner. + + You need not define this macro if it would do nothing. + + -- Macro: ASM_OUTPUT_POOL_EPILOGUE (FILE FUNNAME FUNDECL SIZE) + A C statement to output assembler commands to at the end of the + constant pool for a function. FUNNAME is a string giving the name + of the function. Should the return type of the function be + required, you can obtain it via FUNDECL. SIZE is the size, in + bytes, of the constant pool that GCC wrote immediately before this + call. + + If no constant-pool epilogue is required, the usual case, you need + not define this macro. + + -- Macro: IS_ASM_LOGICAL_LINE_SEPARATOR (C, STR) + Define this macro as a C expression which is nonzero if C is used + as a logical line separator by the assembler. STR points to the + position in the string where C was found; this can be used if a + line separator uses multiple characters. + + If you do not define this macro, the default is that only the + character ';' is treated as a logical line separator. + + -- Target Hook: const char * TARGET_ASM_OPEN_PAREN + -- Target Hook: const char * TARGET_ASM_CLOSE_PAREN + These target hooks are C string constants, describing the syntax in + the assembler for grouping arithmetic expressions. If not + overridden, they default to normal parentheses, which is correct + for most assemblers. + + These macros are provided by 'real.h' for writing the definitions of +'ASM_OUTPUT_DOUBLE' and the like: + + -- Macro: REAL_VALUE_TO_TARGET_SINGLE (X, L) + -- Macro: REAL_VALUE_TO_TARGET_DOUBLE (X, L) + -- Macro: REAL_VALUE_TO_TARGET_LONG_DOUBLE (X, L) + -- Macro: REAL_VALUE_TO_TARGET_DECIMAL32 (X, L) + -- Macro: REAL_VALUE_TO_TARGET_DECIMAL64 (X, L) + -- Macro: REAL_VALUE_TO_TARGET_DECIMAL128 (X, L) + These translate X, of type 'REAL_VALUE_TYPE', to the target's + floating point representation, and store its bit pattern in the + variable L. For 'REAL_VALUE_TO_TARGET_SINGLE' and + 'REAL_VALUE_TO_TARGET_DECIMAL32', this variable should be a simple + 'long int'. For the others, it should be an array of 'long int'. + The number of elements in this array is determined by the size of + the desired target floating point data type: 32 bits of it go in + each 'long int' array element. Each array element holds 32 bits of + the result, even if 'long int' is wider than 32 bits on the host + machine. + + The array element values are designed so that you can print them + out using 'fprintf' in the order they should appear in the target + machine's memory. + + +File: gccint.info, Node: Uninitialized Data, Next: Label Output, Prev: Data Output, Up: Assembler Format + +17.21.3 Output of Uninitialized Variables +----------------------------------------- + +Each of the macros in this section is used to do the whole job of +outputting a single uninitialized variable. + + -- Macro: ASM_OUTPUT_COMMON (STREAM, NAME, SIZE, ROUNDED) + A C statement (sans semicolon) to output to the stdio stream STREAM + the assembler definition of a common-label named NAME whose size is + SIZE bytes. The variable ROUNDED is the size rounded up to + whatever alignment the caller wants. It is possible that SIZE may + be zero, for instance if a struct with no other member than a + zero-length array is defined. In this case, the backend must + output a symbol definition that allocates at least one byte, both + so that the address of the resulting object does not compare equal + to any other, and because some object formats cannot even express + the concept of a zero-sized common symbol, as that is how they + represent an ordinary undefined external. + + Use the expression 'assemble_name (STREAM, NAME)' to output the + name itself; before and after that, output the additional assembler + syntax for defining the name, and a newline. + + This macro controls how the assembler definitions of uninitialized + common global variables are output. + + -- Macro: ASM_OUTPUT_ALIGNED_COMMON (STREAM, NAME, SIZE, ALIGNMENT) + Like 'ASM_OUTPUT_COMMON' except takes the required alignment as a + separate, explicit argument. If you define this macro, it is used + in place of 'ASM_OUTPUT_COMMON', and gives you more flexibility in + handling the required alignment of the variable. The alignment is + specified as the number of bits. + + -- Macro: ASM_OUTPUT_ALIGNED_DECL_COMMON (STREAM, DECL, NAME, SIZE, + ALIGNMENT) + Like 'ASM_OUTPUT_ALIGNED_COMMON' except that DECL of the variable + to be output, if there is one, or 'NULL_TREE' if there is no + corresponding variable. If you define this macro, GCC will use it + in place of both 'ASM_OUTPUT_COMMON' and + 'ASM_OUTPUT_ALIGNED_COMMON'. Define this macro when you need to + see the variable's decl in order to chose what to output. + + -- Macro: ASM_OUTPUT_ALIGNED_BSS (STREAM, DECL, NAME, SIZE, ALIGNMENT) + A C statement (sans semicolon) to output to the stdio stream STREAM + the assembler definition of uninitialized global DECL named NAME + whose size is SIZE bytes. The variable ALIGNMENT is the alignment + specified as the number of bits. + + Try to use function 'asm_output_aligned_bss' defined in file + 'varasm.c' when defining this macro. If unable, use the expression + 'assemble_name (STREAM, NAME)' to output the name itself; before + and after that, output the additional assembler syntax for defining + the name, and a newline. + + There are two ways of handling global BSS. One is to define this + macro. The other is to have 'TARGET_ASM_SELECT_SECTION' return a + switchable BSS section (*note + TARGET_HAVE_SWITCHABLE_BSS_SECTIONS::). You do not need to do + both. + + Some languages do not have 'common' data, and require a non-common + form of global BSS in order to handle uninitialized globals + efficiently. C++ is one example of this. However, if the target + does not support global BSS, the front end may choose to make + globals common in order to save space in the object file. + + -- Macro: ASM_OUTPUT_LOCAL (STREAM, NAME, SIZE, ROUNDED) + A C statement (sans semicolon) to output to the stdio stream STREAM + the assembler definition of a local-common-label named NAME whose + size is SIZE bytes. The variable ROUNDED is the size rounded up to + whatever alignment the caller wants. + + Use the expression 'assemble_name (STREAM, NAME)' to output the + name itself; before and after that, output the additional assembler + syntax for defining the name, and a newline. + + This macro controls how the assembler definitions of uninitialized + static variables are output. + + -- Macro: ASM_OUTPUT_ALIGNED_LOCAL (STREAM, NAME, SIZE, ALIGNMENT) + Like 'ASM_OUTPUT_LOCAL' except takes the required alignment as a + separate, explicit argument. If you define this macro, it is used + in place of 'ASM_OUTPUT_LOCAL', and gives you more flexibility in + handling the required alignment of the variable. The alignment is + specified as the number of bits. + + -- Macro: ASM_OUTPUT_ALIGNED_DECL_LOCAL (STREAM, DECL, NAME, SIZE, + ALIGNMENT) + Like 'ASM_OUTPUT_ALIGNED_DECL' except that DECL of the variable to + be output, if there is one, or 'NULL_TREE' if there is no + corresponding variable. If you define this macro, GCC will use it + in place of both 'ASM_OUTPUT_DECL' and 'ASM_OUTPUT_ALIGNED_DECL'. + Define this macro when you need to see the variable's decl in order + to chose what to output. + + +File: gccint.info, Node: Label Output, Next: Initialization, Prev: Uninitialized Data, Up: Assembler Format + +17.21.4 Output and Generation of Labels +--------------------------------------- + +This is about outputting labels. + + -- Macro: ASM_OUTPUT_LABEL (STREAM, NAME) + A C statement (sans semicolon) to output to the stdio stream STREAM + the assembler definition of a label named NAME. Use the expression + 'assemble_name (STREAM, NAME)' to output the name itself; before + and after that, output the additional assembler syntax for defining + the name, and a newline. A default definition of this macro is + provided which is correct for most systems. + + -- Macro: ASM_OUTPUT_FUNCTION_LABEL (STREAM, NAME, DECL) + A C statement (sans semicolon) to output to the stdio stream STREAM + the assembler definition of a label named NAME of a function. Use + the expression 'assemble_name (STREAM, NAME)' to output the name + itself; before and after that, output the additional assembler + syntax for defining the name, and a newline. A default definition + of this macro is provided which is correct for most systems. + + If this macro is not defined, then the function name is defined in + the usual manner as a label (by means of 'ASM_OUTPUT_LABEL'). + + -- Macro: ASM_OUTPUT_INTERNAL_LABEL (STREAM, NAME) + Identical to 'ASM_OUTPUT_LABEL', except that NAME is known to refer + to a compiler-generated label. The default definition uses + 'assemble_name_raw', which is like 'assemble_name' except that it + is more efficient. + + -- Macro: SIZE_ASM_OP + A C string containing the appropriate assembler directive to + specify the size of a symbol, without any arguments. On systems + that use ELF, the default (in 'config/elfos.h') is '"\t.size\t"'; + on other systems, the default is not to define this macro. + + Define this macro only if it is correct to use the default + definitions of 'ASM_OUTPUT_SIZE_DIRECTIVE' and + 'ASM_OUTPUT_MEASURED_SIZE' for your system. If you need your own + custom definitions of those macros, or if you do not need explicit + symbol sizes at all, do not define this macro. + + -- Macro: ASM_OUTPUT_SIZE_DIRECTIVE (STREAM, NAME, SIZE) + A C statement (sans semicolon) to output to the stdio stream STREAM + a directive telling the assembler that the size of the symbol NAME + is SIZE. SIZE is a 'HOST_WIDE_INT'. If you define 'SIZE_ASM_OP', + a default definition of this macro is provided. + + -- Macro: ASM_OUTPUT_MEASURED_SIZE (STREAM, NAME) + A C statement (sans semicolon) to output to the stdio stream STREAM + a directive telling the assembler to calculate the size of the + symbol NAME by subtracting its address from the current address. + + If you define 'SIZE_ASM_OP', a default definition of this macro is + provided. The default assumes that the assembler recognizes a + special '.' symbol as referring to the current address, and can + calculate the difference between this and another symbol. If your + assembler does not recognize '.' or cannot do calculations with it, + you will need to redefine 'ASM_OUTPUT_MEASURED_SIZE' to use some + other technique. + + -- Macro: NO_DOLLAR_IN_LABEL + Define this macro if the assembler does not accept the character + '$' in label names. By default constructors and destructors in G++ + have '$' in the identifiers. If this macro is defined, '.' is used + instead. + + -- Macro: NO_DOT_IN_LABEL + Define this macro if the assembler does not accept the character + '.' in label names. By default constructors and destructors in G++ + have names that use '.'. If this macro is defined, these names are + rewritten to avoid '.'. + + -- Macro: TYPE_ASM_OP + A C string containing the appropriate assembler directive to + specify the type of a symbol, without any arguments. On systems + that use ELF, the default (in 'config/elfos.h') is '"\t.type\t"'; + on other systems, the default is not to define this macro. + + Define this macro only if it is correct to use the default + definition of 'ASM_OUTPUT_TYPE_DIRECTIVE' for your system. If you + need your own custom definition of this macro, or if you do not + need explicit symbol types at all, do not define this macro. + + -- Macro: TYPE_OPERAND_FMT + A C string which specifies (using 'printf' syntax) the format of + the second operand to 'TYPE_ASM_OP'. On systems that use ELF, the + default (in 'config/elfos.h') is '"@%s"'; on other systems, the + default is not to define this macro. + + Define this macro only if it is correct to use the default + definition of 'ASM_OUTPUT_TYPE_DIRECTIVE' for your system. If you + need your own custom definition of this macro, or if you do not + need explicit symbol types at all, do not define this macro. + + -- Macro: ASM_OUTPUT_TYPE_DIRECTIVE (STREAM, TYPE) + A C statement (sans semicolon) to output to the stdio stream STREAM + a directive telling the assembler that the type of the symbol NAME + is TYPE. TYPE is a C string; currently, that string is always + either '"function"' or '"object"', but you should not count on + this. + + If you define 'TYPE_ASM_OP' and 'TYPE_OPERAND_FMT', a default + definition of this macro is provided. + + -- Macro: ASM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL) + A C statement (sans semicolon) to output to the stdio stream STREAM + any text necessary for declaring the name NAME of a function which + is being defined. This macro is responsible for outputting the + label definition (perhaps using 'ASM_OUTPUT_FUNCTION_LABEL'). The + argument DECL is the 'FUNCTION_DECL' tree node representing the + function. + + If this macro is not defined, then the function name is defined in + the usual manner as a label (by means of + 'ASM_OUTPUT_FUNCTION_LABEL'). + + You may wish to use 'ASM_OUTPUT_TYPE_DIRECTIVE' in the definition + of this macro. + + -- Macro: ASM_DECLARE_FUNCTION_SIZE (STREAM, NAME, DECL) + A C statement (sans semicolon) to output to the stdio stream STREAM + any text necessary for declaring the size of a function which is + being defined. The argument NAME is the name of the function. The + argument DECL is the 'FUNCTION_DECL' tree node representing the + function. + + If this macro is not defined, then the function size is not + defined. + + You may wish to use 'ASM_OUTPUT_MEASURED_SIZE' in the definition of + this macro. + + -- Macro: ASM_DECLARE_OBJECT_NAME (STREAM, NAME, DECL) + A C statement (sans semicolon) to output to the stdio stream STREAM + any text necessary for declaring the name NAME of an initialized + variable which is being defined. This macro must output the label + definition (perhaps using 'ASM_OUTPUT_LABEL'). The argument DECL + is the 'VAR_DECL' tree node representing the variable. + + If this macro is not defined, then the variable name is defined in + the usual manner as a label (by means of 'ASM_OUTPUT_LABEL'). + + You may wish to use 'ASM_OUTPUT_TYPE_DIRECTIVE' and/or + 'ASM_OUTPUT_SIZE_DIRECTIVE' in the definition of this macro. + + -- Target Hook: void TARGET_ASM_DECLARE_CONSTANT_NAME (FILE *FILE, + const char *NAME, const_tree EXPR, HOST_WIDE_INT SIZE) + A target hook to output to the stdio stream FILE any text necessary + for declaring the name NAME of a constant which is being defined. + This target hook is responsible for outputting the label definition + (perhaps using 'assemble_label'). The argument EXP is the value of + the constant, and SIZE is the size of the constant in bytes. The + NAME will be an internal label. + + The default version of this target hook, define the NAME in the + usual manner as a label (by means of 'assemble_label'). + + You may wish to use 'ASM_OUTPUT_TYPE_DIRECTIVE' in this target + hook. + + -- Macro: ASM_DECLARE_REGISTER_GLOBAL (STREAM, DECL, REGNO, NAME) + A C statement (sans semicolon) to output to the stdio stream STREAM + any text necessary for claiming a register REGNO for a global + variable DECL with name NAME. + + If you don't define this macro, that is equivalent to defining it + to do nothing. + + -- Macro: ASM_FINISH_DECLARE_OBJECT (STREAM, DECL, TOPLEVEL, ATEND) + A C statement (sans semicolon) to finish up declaring a variable + name once the compiler has processed its initializer fully and thus + has had a chance to determine the size of an array when controlled + by an initializer. This is used on systems where it's necessary to + declare something about the size of the object. + + If you don't define this macro, that is equivalent to defining it + to do nothing. + + You may wish to use 'ASM_OUTPUT_SIZE_DIRECTIVE' and/or + 'ASM_OUTPUT_MEASURED_SIZE' in the definition of this macro. + + -- Target Hook: void TARGET_ASM_GLOBALIZE_LABEL (FILE *STREAM, const + char *NAME) + This target hook is a function to output to the stdio stream STREAM + some commands that will make the label NAME global; that is, + available for reference from other files. + + The default implementation relies on a proper definition of + 'GLOBAL_ASM_OP'. + + -- Target Hook: void TARGET_ASM_GLOBALIZE_DECL_NAME (FILE *STREAM, tree + DECL) + This target hook is a function to output to the stdio stream STREAM + some commands that will make the name associated with DECL global; + that is, available for reference from other files. + + The default implementation uses the TARGET_ASM_GLOBALIZE_LABEL + target hook. + + -- Macro: ASM_WEAKEN_LABEL (STREAM, NAME) + A C statement (sans semicolon) to output to the stdio stream STREAM + some commands that will make the label NAME weak; that is, + available for reference from other files but only used if no other + definition is available. Use the expression 'assemble_name + (STREAM, NAME)' to output the name itself; before and after that, + output the additional assembler syntax for making that name weak, + and a newline. + + If you don't define this macro or 'ASM_WEAKEN_DECL', GCC will not + support weak symbols and you should not define the 'SUPPORTS_WEAK' + macro. + + -- Macro: ASM_WEAKEN_DECL (STREAM, DECL, NAME, VALUE) + Combines (and replaces) the function of 'ASM_WEAKEN_LABEL' and + 'ASM_OUTPUT_WEAK_ALIAS', allowing access to the associated function + or variable decl. If VALUE is not 'NULL', this C statement should + output to the stdio stream STREAM assembler code which defines + (equates) the weak symbol NAME to have the value VALUE. If VALUE + is 'NULL', it should output commands to make NAME weak. + + -- Macro: ASM_OUTPUT_WEAKREF (STREAM, DECL, NAME, VALUE) + Outputs a directive that enables NAME to be used to refer to symbol + VALUE with weak-symbol semantics. 'decl' is the declaration of + 'name'. + + -- Macro: SUPPORTS_WEAK + A preprocessor constant expression which evaluates to true if the + target supports weak symbols. + + If you don't define this macro, 'defaults.h' provides a default + definition. If either 'ASM_WEAKEN_LABEL' or 'ASM_WEAKEN_DECL' is + defined, the default definition is '1'; otherwise, it is '0'. + + -- Macro: TARGET_SUPPORTS_WEAK + A C expression which evaluates to true if the target supports weak + symbols. + + If you don't define this macro, 'defaults.h' provides a default + definition. The default definition is '(SUPPORTS_WEAK)'. Define + this macro if you want to control weak symbol support with a + compiler flag such as '-melf'. + + -- Macro: MAKE_DECL_ONE_ONLY (DECL) + A C statement (sans semicolon) to mark DECL to be emitted as a + public symbol such that extra copies in multiple translation units + will be discarded by the linker. Define this macro if your object + file format provides support for this concept, such as the 'COMDAT' + section flags in the Microsoft Windows PE/COFF format, and this + support requires changes to DECL, such as putting it in a separate + section. + + -- Macro: SUPPORTS_ONE_ONLY + A C expression which evaluates to true if the target supports + one-only semantics. + + If you don't define this macro, 'varasm.c' provides a default + definition. If 'MAKE_DECL_ONE_ONLY' is defined, the default + definition is '1'; otherwise, it is '0'. Define this macro if you + want to control one-only symbol support with a compiler flag, or if + setting the 'DECL_ONE_ONLY' flag is enough to mark a declaration to + be emitted as one-only. + + -- Target Hook: void TARGET_ASM_ASSEMBLE_VISIBILITY (tree DECL, int + VISIBILITY) + This target hook is a function to output to ASM_OUT_FILE some + commands that will make the symbol(s) associated with DECL have + hidden, protected or internal visibility as specified by + VISIBILITY. + + -- Macro: TARGET_WEAK_NOT_IN_ARCHIVE_TOC + A C expression that evaluates to true if the target's linker + expects that weak symbols do not appear in a static archive's table + of contents. The default is '0'. + + Leaving weak symbols out of an archive's table of contents means + that, if a symbol will only have a definition in one translation + unit and will have undefined references from other translation + units, that symbol should not be weak. Defining this macro to be + nonzero will thus have the effect that certain symbols that would + normally be weak (explicit template instantiations, and vtables for + polymorphic classes with noninline key methods) will instead be + nonweak. + + The C++ ABI requires this macro to be zero. Define this macro for + targets where full C++ ABI compliance is impossible and where + linker restrictions require weak symbols to be left out of a static + archive's table of contents. + + -- Macro: ASM_OUTPUT_EXTERNAL (STREAM, DECL, NAME) + A C statement (sans semicolon) to output to the stdio stream STREAM + any text necessary for declaring the name of an external symbol + named NAME which is referenced in this compilation but not defined. + The value of DECL is the tree node for the declaration. + + This macro need not be defined if it does not need to output + anything. The GNU assembler and most Unix assemblers don't require + anything. + + -- Target Hook: void TARGET_ASM_EXTERNAL_LIBCALL (rtx SYMREF) + This target hook is a function to output to ASM_OUT_FILE an + assembler pseudo-op to declare a library function name external. + The name of the library function is given by SYMREF, which is a + 'symbol_ref'. + + -- Target Hook: void TARGET_ASM_MARK_DECL_PRESERVED (const char + *SYMBOL) + This target hook is a function to output to ASM_OUT_FILE an + assembler directive to annotate SYMBOL as used. The Darwin target + uses the .no_dead_code_strip directive. + + -- Macro: ASM_OUTPUT_LABELREF (STREAM, NAME) + A C statement (sans semicolon) to output to the stdio stream STREAM + a reference in assembler syntax to a label named NAME. This should + add '_' to the front of the name, if that is customary on your + operating system, as it is in most Berkeley Unix systems. This + macro is used in 'assemble_name'. + + -- Target Hook: tree TARGET_MANGLE_ASSEMBLER_NAME (const char *NAME) + Given a symbol NAME, perform same mangling as 'varasm.c''s + 'assemble_name', but in memory rather than to a file stream, + returning result as an 'IDENTIFIER_NODE'. Required for correct LTO + symtabs. The default implementation calls the + 'TARGET_STRIP_NAME_ENCODING' hook and then prepends the + 'USER_LABEL_PREFIX', if any. + + -- Macro: ASM_OUTPUT_SYMBOL_REF (STREAM, SYM) + A C statement (sans semicolon) to output a reference to + 'SYMBOL_REF' SYM. If not defined, 'assemble_name' will be used to + output the name of the symbol. This macro may be used to modify + the way a symbol is referenced depending on information encoded by + 'TARGET_ENCODE_SECTION_INFO'. + + -- Macro: ASM_OUTPUT_LABEL_REF (STREAM, BUF) + A C statement (sans semicolon) to output a reference to BUF, the + result of 'ASM_GENERATE_INTERNAL_LABEL'. If not defined, + 'assemble_name' will be used to output the name of the symbol. + This macro is not used by 'output_asm_label', or the '%l' specifier + that calls it; the intention is that this macro should be set when + it is necessary to output a label differently when its address is + being taken. + + -- Target Hook: void TARGET_ASM_INTERNAL_LABEL (FILE *STREAM, const + char *PREFIX, unsigned long LABELNO) + A function to output to the stdio stream STREAM a label whose name + is made from the string PREFIX and the number LABELNO. + + It is absolutely essential that these labels be distinct from the + labels used for user-level functions and variables. Otherwise, + certain programs will have name conflicts with internal labels. + + It is desirable to exclude internal labels from the symbol table of + the object file. Most assemblers have a naming convention for + labels that should be excluded; on many systems, the letter 'L' at + the beginning of a label has this effect. You should find out what + convention your system uses, and follow it. + + The default version of this function utilizes + 'ASM_GENERATE_INTERNAL_LABEL'. + + -- Macro: ASM_OUTPUT_DEBUG_LABEL (STREAM, PREFIX, NUM) + A C statement to output to the stdio stream STREAM a debug info + label whose name is made from the string PREFIX and the number NUM. + This is useful for VLIW targets, where debug info labels may need + to be treated differently than branch target labels. On some + systems, branch target labels must be at the beginning of + instruction bundles, but debug info labels can occur in the middle + of instruction bundles. + + If this macro is not defined, then + '(*targetm.asm_out.internal_label)' will be used. + + -- Macro: ASM_GENERATE_INTERNAL_LABEL (STRING, PREFIX, NUM) + A C statement to store into the string STRING a label whose name is + made from the string PREFIX and the number NUM. + + This string, when output subsequently by 'assemble_name', should + produce the output that '(*targetm.asm_out.internal_label)' would + produce with the same PREFIX and NUM. + + If the string begins with '*', then 'assemble_name' will output the + rest of the string unchanged. It is often convenient for + 'ASM_GENERATE_INTERNAL_LABEL' to use '*' in this way. If the + string doesn't start with '*', then 'ASM_OUTPUT_LABELREF' gets to + output the string, and may change it. (Of course, + 'ASM_OUTPUT_LABELREF' is also part of your machine description, so + you should know what it does on your machine.) + + -- Macro: ASM_FORMAT_PRIVATE_NAME (OUTVAR, NAME, NUMBER) + A C expression to assign to OUTVAR (which is a variable of type + 'char *') a newly allocated string made from the string NAME and + the number NUMBER, with some suitable punctuation added. Use + 'alloca' to get space for the string. + + The string will be used as an argument to 'ASM_OUTPUT_LABELREF' to + produce an assembler label for an internal static variable whose + name is NAME. Therefore, the string must be such as to result in + valid assembler code. The argument NUMBER is different each time + this macro is executed; it prevents conflicts between + similarly-named internal static variables in different scopes. + + Ideally this string should not be a valid C identifier, to prevent + any conflict with the user's own symbols. Most assemblers allow + periods or percent signs in assembler symbols; putting at least one + of these between the name and the number will suffice. + + If this macro is not defined, a default definition will be provided + which is correct for most systems. + + -- Macro: ASM_OUTPUT_DEF (STREAM, NAME, VALUE) + A C statement to output to the stdio stream STREAM assembler code + which defines (equates) the symbol NAME to have the value VALUE. + + If 'SET_ASM_OP' is defined, a default definition is provided which + is correct for most systems. + + -- Macro: ASM_OUTPUT_DEF_FROM_DECLS (STREAM, DECL_OF_NAME, + DECL_OF_VALUE) + A C statement to output to the stdio stream STREAM assembler code + which defines (equates) the symbol whose tree node is DECL_OF_NAME + to have the value of the tree node DECL_OF_VALUE. This macro will + be used in preference to 'ASM_OUTPUT_DEF' if it is defined and if + the tree nodes are available. + + If 'SET_ASM_OP' is defined, a default definition is provided which + is correct for most systems. + + -- Macro: TARGET_DEFERRED_OUTPUT_DEFS (DECL_OF_NAME, DECL_OF_VALUE) + A C statement that evaluates to true if the assembler code which + defines (equates) the symbol whose tree node is DECL_OF_NAME to + have the value of the tree node DECL_OF_VALUE should be emitted + near the end of the current compilation unit. The default is to + not defer output of defines. This macro affects defines output by + 'ASM_OUTPUT_DEF' and 'ASM_OUTPUT_DEF_FROM_DECLS'. + + -- Macro: ASM_OUTPUT_WEAK_ALIAS (STREAM, NAME, VALUE) + A C statement to output to the stdio stream STREAM assembler code + which defines (equates) the weak symbol NAME to have the value + VALUE. If VALUE is 'NULL', it defines NAME as an undefined weak + symbol. + + Define this macro if the target only supports weak aliases; define + 'ASM_OUTPUT_DEF' instead if possible. + + -- Macro: OBJC_GEN_METHOD_LABEL (BUF, IS_INST, CLASS_NAME, CAT_NAME, + SEL_NAME) + Define this macro to override the default assembler names used for + Objective-C methods. + + The default name is a unique method number followed by the name of + the class (e.g. '_1_Foo'). For methods in categories, the name of + the category is also included in the assembler name (e.g. + '_1_Foo_Bar'). + + These names are safe on most systems, but make debugging difficult + since the method's selector is not present in the name. Therefore, + particular systems define other ways of computing names. + + BUF is an expression of type 'char *' which gives you a buffer in + which to store the name; its length is as long as CLASS_NAME, + CAT_NAME and SEL_NAME put together, plus 50 characters extra. + + The argument IS_INST specifies whether the method is an instance + method or a class method; CLASS_NAME is the name of the class; + CAT_NAME is the name of the category (or 'NULL' if the method is + not in a category); and SEL_NAME is the name of the selector. + + On systems where the assembler can handle quoted names, you can use + this macro to provide more human-readable names. + + +File: gccint.info, Node: Initialization, Next: Macros for Initialization, Prev: Label Output, Up: Assembler Format + +17.21.5 How Initialization Functions Are Handled +------------------------------------------------ + +The compiled code for certain languages includes "constructors" (also +called "initialization routines")--functions to initialize data in the +program when the program is started. These functions need to be called +before the program is "started"--that is to say, before 'main' is +called. + + Compiling some languages generates "destructors" (also called +"termination routines") that should be called when the program +terminates. + + To make the initialization and termination functions work, the compiler +must output something in the assembler code to cause those functions to +be called at the appropriate time. When you port the compiler to a new +system, you need to specify how to do this. + + There are two major ways that GCC currently supports the execution of +initialization and termination functions. Each way has two variants. +Much of the structure is common to all four variations. + + The linker must build two lists of these functions--a list of +initialization functions, called '__CTOR_LIST__', and a list of +termination functions, called '__DTOR_LIST__'. + + Each list always begins with an ignored function pointer (which may +hold 0, -1, or a count of the function pointers after it, depending on +the environment). This is followed by a series of zero or more function +pointers to constructors (or destructors), followed by a function +pointer containing zero. + + Depending on the operating system and its executable file format, +either 'crtstuff.c' or 'libgcc2.c' traverses these lists at startup time +and exit time. Constructors are called in reverse order of the list; +destructors in forward order. + + The best way to handle static constructors works only for object file +formats which provide arbitrarily-named sections. A section is set +aside for a list of constructors, and another for a list of destructors. +Traditionally these are called '.ctors' and '.dtors'. Each object file +that defines an initialization function also puts a word in the +constructor section to point to that function. The linker accumulates +all these words into one contiguous '.ctors' section. Termination +functions are handled similarly. + + This method will be chosen as the default by 'target-def.h' if +'TARGET_ASM_NAMED_SECTION' is defined. A target that does not support +arbitrary sections, but does support special designated constructor and +destructor sections may define 'CTORS_SECTION_ASM_OP' and +'DTORS_SECTION_ASM_OP' to achieve the same effect. + + When arbitrary sections are available, there are two variants, +depending upon how the code in 'crtstuff.c' is called. On systems that +support a ".init" section which is executed at program startup, parts of +'crtstuff.c' are compiled into that section. The program is linked by +the 'gcc' driver like this: + + ld -o OUTPUT_FILE crti.o crtbegin.o ... -lgcc crtend.o crtn.o + + The prologue of a function ('__init') appears in the '.init' section of +'crti.o'; the epilogue appears in 'crtn.o'. Likewise for the function +'__fini' in the ".fini" section. Normally these files are provided by +the operating system or by the GNU C library, but are provided by GCC +for a few targets. + + The objects 'crtbegin.o' and 'crtend.o' are (for most targets) compiled +from 'crtstuff.c'. They contain, among other things, code fragments +within the '.init' and '.fini' sections that branch to routines in the +'.text' section. The linker will pull all parts of a section together, +which results in a complete '__init' function that invokes the routines +we need at startup. + + To use this variant, you must define the 'INIT_SECTION_ASM_OP' macro +properly. + + If no init section is available, when GCC compiles any function called +'main' (or more accurately, any function designated as a program entry +point by the language front end calling 'expand_main_function'), it +inserts a procedure call to '__main' as the first executable code after +the function prologue. The '__main' function is defined in 'libgcc2.c' +and runs the global constructors. + + In file formats that don't support arbitrary sections, there are again +two variants. In the simplest variant, the GNU linker (GNU 'ld') and an +'a.out' format must be used. In this case, 'TARGET_ASM_CONSTRUCTOR' is +defined to produce a '.stabs' entry of type 'N_SETT', referencing the +name '__CTOR_LIST__', and with the address of the void function +containing the initialization code as its value. The GNU linker +recognizes this as a request to add the value to a "set"; the values are +accumulated, and are eventually placed in the executable as a vector in +the format described above, with a leading (ignored) count and a +trailing zero element. 'TARGET_ASM_DESTRUCTOR' is handled similarly. +Since no init section is available, the absence of 'INIT_SECTION_ASM_OP' +causes the compilation of 'main' to call '__main' as above, starting the +initialization process. + + The last variant uses neither arbitrary sections nor the GNU linker. +This is preferable when you want to do dynamic linking and when using +file formats which the GNU linker does not support, such as 'ECOFF'. In +this case, 'TARGET_HAVE_CTORS_DTORS' is false, initialization and +termination functions are recognized simply by their names. This +requires an extra program in the linkage step, called 'collect2'. This +program pretends to be the linker, for use with GCC; it does its job by +running the ordinary linker, but also arranges to include the vectors of +initialization and termination functions. These functions are called +via '__main' as described above. In order to use this method, +'use_collect2' must be defined in the target in 'config.gcc'. + + The following section describes the specific macros that control and +customize the handling of initialization and termination functions. + + +File: gccint.info, Node: Macros for Initialization, Next: Instruction Output, Prev: Initialization, Up: Assembler Format + +17.21.6 Macros Controlling Initialization Routines +-------------------------------------------------- + +Here are the macros that control how the compiler handles initialization +and termination functions: + + -- Macro: INIT_SECTION_ASM_OP + If defined, a C string constant, including spacing, for the + assembler operation to identify the following data as + initialization code. If not defined, GCC will assume such a + section does not exist. When you are using special sections for + initialization and termination functions, this macro also controls + how 'crtstuff.c' and 'libgcc2.c' arrange to run the initialization + functions. + + -- Macro: HAS_INIT_SECTION + If defined, 'main' will not call '__main' as described above. This + macro should be defined for systems that control start-up code on a + symbol-by-symbol basis, such as OSF/1, and should not be defined + explicitly for systems that support 'INIT_SECTION_ASM_OP'. + + -- Macro: LD_INIT_SWITCH + If defined, a C string constant for a switch that tells the linker + that the following symbol is an initialization routine. + + -- Macro: LD_FINI_SWITCH + If defined, a C string constant for a switch that tells the linker + that the following symbol is a finalization routine. + + -- Macro: COLLECT_SHARED_INIT_FUNC (STREAM, FUNC) + If defined, a C statement that will write a function that can be + automatically called when a shared library is loaded. The function + should call FUNC, which takes no arguments. If not defined, and + the object format requires an explicit initialization function, + then a function called '_GLOBAL__DI' will be generated. + + This function and the following one are used by collect2 when + linking a shared library that needs constructors or destructors, or + has DWARF2 exception tables embedded in the code. + + -- Macro: COLLECT_SHARED_FINI_FUNC (STREAM, FUNC) + If defined, a C statement that will write a function that can be + automatically called when a shared library is unloaded. The + function should call FUNC, which takes no arguments. If not + defined, and the object format requires an explicit finalization + function, then a function called '_GLOBAL__DD' will be generated. + + -- Macro: INVOKE__main + If defined, 'main' will call '__main' despite the presence of + 'INIT_SECTION_ASM_OP'. This macro should be defined for systems + where the init section is not actually run automatically, but is + still useful for collecting the lists of constructors and + destructors. + + -- Macro: SUPPORTS_INIT_PRIORITY + If nonzero, the C++ 'init_priority' attribute is supported and the + compiler should emit instructions to control the order of + initialization of objects. If zero, the compiler will issue an + error message upon encountering an 'init_priority' attribute. + + -- Target Hook: bool TARGET_HAVE_CTORS_DTORS + This value is true if the target supports some "native" method of + collecting constructors and destructors to be run at startup and + exit. It is false if we must use 'collect2'. + + -- Target Hook: void TARGET_ASM_CONSTRUCTOR (rtx SYMBOL, int PRIORITY) + If defined, a function that outputs assembler code to arrange to + call the function referenced by SYMBOL at initialization time. + + Assume that SYMBOL is a 'SYMBOL_REF' for a function taking no + arguments and with no return value. If the target supports + initialization priorities, PRIORITY is a value between 0 and + 'MAX_INIT_PRIORITY'; otherwise it must be 'DEFAULT_INIT_PRIORITY'. + + If this macro is not defined by the target, a suitable default will + be chosen if (1) the target supports arbitrary section names, (2) + the target defines 'CTORS_SECTION_ASM_OP', or (3) 'USE_COLLECT2' is + not defined. + + -- Target Hook: void TARGET_ASM_DESTRUCTOR (rtx SYMBOL, int PRIORITY) + This is like 'TARGET_ASM_CONSTRUCTOR' but used for termination + functions rather than initialization functions. + + If 'TARGET_HAVE_CTORS_DTORS' is true, the initialization routine +generated for the generated object file will have static linkage. + + If your system uses 'collect2' as the means of processing constructors, +then that program normally uses 'nm' to scan an object file for +constructor functions to be called. + + On certain kinds of systems, you can define this macro to make +'collect2' work faster (and, in some cases, make it work at all): + + -- Macro: OBJECT_FORMAT_COFF + Define this macro if the system uses COFF (Common Object File + Format) object files, so that 'collect2' can assume this format and + scan object files directly for dynamic constructor/destructor + functions. + + This macro is effective only in a native compiler; 'collect2' as + part of a cross compiler always uses 'nm' for the target machine. + + -- Macro: REAL_NM_FILE_NAME + Define this macro as a C string constant containing the file name + to use to execute 'nm'. The default is to search the path normally + for 'nm'. + + -- Macro: NM_FLAGS + 'collect2' calls 'nm' to scan object files for static constructors + and destructors and LTO info. By default, '-n' is passed. Define + 'NM_FLAGS' to a C string constant if other options are needed to + get the same output format as GNU 'nm -n' produces. + + If your system supports shared libraries and has a program to list the +dynamic dependencies of a given library or executable, you can define +these macros to enable support for running initialization and +termination functions in shared libraries: + + -- Macro: LDD_SUFFIX + Define this macro to a C string constant containing the name of the + program which lists dynamic dependencies, like 'ldd' under SunOS 4. + + -- Macro: PARSE_LDD_OUTPUT (PTR) + Define this macro to be C code that extracts filenames from the + output of the program denoted by 'LDD_SUFFIX'. PTR is a variable + of type 'char *' that points to the beginning of a line of output + from 'LDD_SUFFIX'. If the line lists a dynamic dependency, the + code must advance PTR to the beginning of the filename on that + line. Otherwise, it must set PTR to 'NULL'. + + -- Macro: SHLIB_SUFFIX + Define this macro to a C string constant containing the default + shared library extension of the target (e.g., '".so"'). 'collect2' + strips version information after this suffix when generating global + constructor and destructor names. This define is only needed on + targets that use 'collect2' to process constructors and + destructors. + + +File: gccint.info, Node: Instruction Output, Next: Dispatch Tables, Prev: Macros for Initialization, Up: Assembler Format + +17.21.7 Output of Assembler Instructions +---------------------------------------- + +This describes assembler instruction output. + + -- Macro: REGISTER_NAMES + A C initializer containing the assembler's names for the machine + registers, each one as a C string constant. This is what + translates register numbers in the compiler into assembler + language. + + -- Macro: ADDITIONAL_REGISTER_NAMES + If defined, a C initializer for an array of structures containing a + name and a register number. This macro defines additional names + for hard registers, thus allowing the 'asm' option in declarations + to refer to registers using alternate names. + + -- Macro: OVERLAPPING_REGISTER_NAMES + If defined, a C initializer for an array of structures containing a + name, a register number and a count of the number of consecutive + machine registers the name overlaps. This macro defines additional + names for hard registers, thus allowing the 'asm' option in + declarations to refer to registers using alternate names. Unlike + 'ADDITIONAL_REGISTER_NAMES', this macro should be used when the + register name implies multiple underlying registers. + + This macro should be used when it is important that a clobber in an + 'asm' statement clobbers all the underlying values implied by the + register name. For example, on ARM, clobbering the + double-precision VFP register "d0" implies clobbering both + single-precision registers "s0" and "s1". + + -- Macro: ASM_OUTPUT_OPCODE (STREAM, PTR) + Define this macro if you are using an unusual assembler that + requires different names for the machine instructions. + + The definition is a C statement or statements which output an + assembler instruction opcode to the stdio stream STREAM. The + macro-operand PTR is a variable of type 'char *' which points to + the opcode name in its "internal" form--the form that is written in + the machine description. The definition should output the opcode + name to STREAM, performing any translation you desire, and + increment the variable PTR to point at the end of the opcode so + that it will not be output twice. + + In fact, your macro definition may process less than the entire + opcode name, or more than the opcode name; but if you want to + process text that includes '%'-sequences to substitute operands, + you must take care of the substitution yourself. Just be sure to + increment PTR over whatever text should not be output normally. + + If you need to look at the operand values, they can be found as the + elements of 'recog_data.operand'. + + If the macro definition does nothing, the instruction is output in + the usual way. + + -- Macro: FINAL_PRESCAN_INSN (INSN, OPVEC, NOPERANDS) + If defined, a C statement to be executed just prior to the output + of assembler code for INSN, to modify the extracted operands so + they will be output differently. + + Here the argument OPVEC is the vector containing the operands + extracted from INSN, and NOPERANDS is the number of elements of the + vector which contain meaningful data for this insn. The contents + of this vector are what will be used to convert the insn template + into assembler code, so you can change the assembler output by + changing the contents of the vector. + + This macro is useful when various assembler syntaxes share a single + file of instruction patterns; by defining this macro differently, + you can cause a large class of instructions to be output + differently (such as with rearranged operands). Naturally, + variations in assembler syntax affecting individual insn patterns + ought to be handled by writing conditional output routines in those + patterns. + + If this macro is not defined, it is equivalent to a null statement. + + -- Target Hook: void TARGET_ASM_FINAL_POSTSCAN_INSN (FILE *FILE, rtx + INSN, rtx *OPVEC, int NOPERANDS) + If defined, this target hook is a function which is executed just + after the output of assembler code for INSN, to change the mode of + the assembler if necessary. + + Here the argument OPVEC is the vector containing the operands + extracted from INSN, and NOPERANDS is the number of elements of the + vector which contain meaningful data for this insn. The contents + of this vector are what was used to convert the insn template into + assembler code, so you can change the assembler mode by checking + the contents of the vector. + + -- Macro: PRINT_OPERAND (STREAM, X, CODE) + A C compound statement to output to stdio stream STREAM the + assembler syntax for an instruction operand X. X is an RTL + expression. + + CODE is a value that can be used to specify one of several ways of + printing the operand. It is used when identical operands must be + printed differently depending on the context. CODE comes from the + '%' specification that was used to request printing of the operand. + If the specification was just '%DIGIT' then CODE is 0; if the + specification was '%LTR DIGIT' then CODE is the ASCII code for LTR. + + If X is a register, this macro should print the register's name. + The names can be found in an array 'reg_names' whose type is 'char + *[]'. 'reg_names' is initialized from 'REGISTER_NAMES'. + + When the machine description has a specification '%PUNCT' (a '%' + followed by a punctuation character), this macro is called with a + null pointer for X and the punctuation character for CODE. + + -- Macro: PRINT_OPERAND_PUNCT_VALID_P (CODE) + A C expression which evaluates to true if CODE is a valid + punctuation character for use in the 'PRINT_OPERAND' macro. If + 'PRINT_OPERAND_PUNCT_VALID_P' is not defined, it means that no + punctuation characters (except for the standard one, '%') are used + in this way. + + -- Macro: PRINT_OPERAND_ADDRESS (STREAM, X) + A C compound statement to output to stdio stream STREAM the + assembler syntax for an instruction operand that is a memory + reference whose address is X. X is an RTL expression. + + On some machines, the syntax for a symbolic address depends on the + section that the address refers to. On these machines, define the + hook 'TARGET_ENCODE_SECTION_INFO' to store the information into the + 'symbol_ref', and then check for it here. *Note Assembler + Format::. + + -- Macro: DBR_OUTPUT_SEQEND (FILE) + A C statement, to be executed after all slot-filler instructions + have been output. If necessary, call 'dbr_sequence_length' to + determine the number of slots filled in a sequence (zero if not + currently outputting a sequence), to decide how many no-ops to + output, or whatever. + + Don't define this macro if it has nothing to do, but it is helpful + in reading assembly output if the extent of the delay sequence is + made explicit (e.g. with white space). + + Note that output routines for instructions with delay slots must be +prepared to deal with not being output as part of a sequence (i.e. when +the scheduling pass is not run, or when no slot fillers could be found.) +The variable 'final_sequence' is null when not processing a sequence, +otherwise it contains the 'sequence' rtx being output. + + -- Macro: REGISTER_PREFIX + -- Macro: LOCAL_LABEL_PREFIX + -- Macro: USER_LABEL_PREFIX + -- Macro: IMMEDIATE_PREFIX + If defined, C string expressions to be used for the '%R', '%L', + '%U', and '%I' options of 'asm_fprintf' (see 'final.c'). These are + useful when a single 'md' file must support multiple assembler + formats. In that case, the various 'tm.h' files can define these + macros differently. + + -- Macro: ASM_FPRINTF_EXTENSIONS (FILE, ARGPTR, FORMAT) + If defined this macro should expand to a series of 'case' + statements which will be parsed inside the 'switch' statement of + the 'asm_fprintf' function. This allows targets to define extra + printf formats which may useful when generating their assembler + statements. Note that uppercase letters are reserved for future + generic extensions to asm_fprintf, and so are not available to + target specific code. The output file is given by the parameter + FILE. The varargs input pointer is ARGPTR and the rest of the + format string, starting the character after the one that is being + switched upon, is pointed to by FORMAT. + + -- Macro: ASSEMBLER_DIALECT + If your target supports multiple dialects of assembler language + (such as different opcodes), define this macro as a C expression + that gives the numeric index of the assembler language dialect to + use, with zero as the first variant. + + If this macro is defined, you may use constructs of the form + '{option0|option1|option2...}' + in the output templates of patterns (*note Output Template::) or in + the first argument of 'asm_fprintf'. This construct outputs + 'option0', 'option1', 'option2', etc., if the value of + 'ASSEMBLER_DIALECT' is zero, one, two, etc. Any special characters + within these strings retain their usual meaning. If there are + fewer alternatives within the braces than the value of + 'ASSEMBLER_DIALECT', the construct outputs nothing. If it's needed + to print curly braces or '|' character in assembler output + directly, '%{', '%}' and '%|' can be used. + + If you do not define this macro, the characters '{', '|' and '}' do + not have any special meaning when used in templates or operands to + 'asm_fprintf'. + + Define the macros 'REGISTER_PREFIX', 'LOCAL_LABEL_PREFIX', + 'USER_LABEL_PREFIX' and 'IMMEDIATE_PREFIX' if you can express the + variations in assembler language syntax with that mechanism. + Define 'ASSEMBLER_DIALECT' and use the '{option0|option1}' syntax + if the syntax variant are larger and involve such things as + different opcodes or operand order. + + -- Macro: ASM_OUTPUT_REG_PUSH (STREAM, REGNO) + A C expression to output to STREAM some assembler code which will + push hard register number REGNO onto the stack. The code need not + be optimal, since this macro is used only when profiling. + + -- Macro: ASM_OUTPUT_REG_POP (STREAM, REGNO) + A C expression to output to STREAM some assembler code which will + pop hard register number REGNO off of the stack. The code need not + be optimal, since this macro is used only when profiling. + + +File: gccint.info, Node: Dispatch Tables, Next: Exception Region Output, Prev: Instruction Output, Up: Assembler Format + +17.21.8 Output of Dispatch Tables +--------------------------------- + +This concerns dispatch tables. + + -- Macro: ASM_OUTPUT_ADDR_DIFF_ELT (STREAM, BODY, VALUE, REL) + A C statement to output to the stdio stream STREAM an assembler + pseudo-instruction to generate a difference between two labels. + VALUE and REL are the numbers of two internal labels. The + definitions of these labels are output using + '(*targetm.asm_out.internal_label)', and they must be printed in + the same way here. For example, + + fprintf (STREAM, "\t.word L%d-L%d\n", + VALUE, REL) + + You must provide this macro on machines where the addresses in a + dispatch table are relative to the table's own address. If + defined, GCC will also use this macro on all machines when + producing PIC. BODY is the body of the 'ADDR_DIFF_VEC'; it is + provided so that the mode and flags can be read. + + -- Macro: ASM_OUTPUT_ADDR_VEC_ELT (STREAM, VALUE) + This macro should be provided on machines where the addresses in a + dispatch table are absolute. + + The definition should be a C statement to output to the stdio + stream STREAM an assembler pseudo-instruction to generate a + reference to a label. VALUE is the number of an internal label + whose definition is output using + '(*targetm.asm_out.internal_label)'. For example, + + fprintf (STREAM, "\t.word L%d\n", VALUE) + + -- Macro: ASM_OUTPUT_CASE_LABEL (STREAM, PREFIX, NUM, TABLE) + Define this if the label before a jump-table needs to be output + specially. The first three arguments are the same as for + '(*targetm.asm_out.internal_label)'; the fourth argument is the + jump-table which follows (a 'jump_table_data' containing an + 'addr_vec' or 'addr_diff_vec'). + + This feature is used on system V to output a 'swbeg' statement for + the table. + + If this macro is not defined, these labels are output with + '(*targetm.asm_out.internal_label)'. + + -- Macro: ASM_OUTPUT_CASE_END (STREAM, NUM, TABLE) + Define this if something special must be output at the end of a + jump-table. The definition should be a C statement to be executed + after the assembler code for the table is written. It should write + the appropriate code to stdio stream STREAM. The argument TABLE is + the jump-table insn, and NUM is the label-number of the preceding + label. + + If this macro is not defined, nothing special is output at the end + of the jump-table. + + -- Target Hook: void TARGET_ASM_EMIT_UNWIND_LABEL (FILE *STREAM, tree + DECL, int FOR_EH, int EMPTY) + This target hook emits a label at the beginning of each FDE. It + should be defined on targets where FDEs need special labels, and it + should write the appropriate label, for the FDE associated with the + function declaration DECL, to the stdio stream STREAM. The third + argument, FOR_EH, is a boolean: true if this is for an exception + table. The fourth argument, EMPTY, is a boolean: true if this is a + placeholder label for an omitted FDE. + + The default is that FDEs are not given nonlocal labels. + + -- Target Hook: void TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL (FILE *STREAM) + This target hook emits a label at the beginning of the exception + table. It should be defined on targets where it is desirable for + the table to be broken up according to function. + + The default is that no label is emitted. + + -- Target Hook: void TARGET_ASM_EMIT_EXCEPT_PERSONALITY (rtx + PERSONALITY) + If the target implements 'TARGET_ASM_UNWIND_EMIT', this hook may be + used to emit a directive to install a personality hook into the + unwind info. This hook should not be used if dwarf2 unwind info is + used. + + -- Target Hook: void TARGET_ASM_UNWIND_EMIT (FILE *STREAM, rtx INSN) + This target hook emits assembly directives required to unwind the + given instruction. This is only used when + 'TARGET_EXCEPT_UNWIND_INFO' returns 'UI_TARGET'. + + -- Target Hook: bool TARGET_ASM_UNWIND_EMIT_BEFORE_INSN + True if the 'TARGET_ASM_UNWIND_EMIT' hook should be called before + the assembly for INSN has been emitted, false if the hook should be + called afterward. + + +File: gccint.info, Node: Exception Region Output, Next: Alignment Output, Prev: Dispatch Tables, Up: Assembler Format + +17.21.9 Assembler Commands for Exception Regions +------------------------------------------------ + +This describes commands marking the start and the end of an exception +region. + + -- Macro: EH_FRAME_SECTION_NAME + If defined, a C string constant for the name of the section + containing exception handling frame unwind information. If not + defined, GCC will provide a default definition if the target + supports named sections. 'crtstuff.c' uses this macro to switch to + the appropriate section. + + You should define this symbol if your target supports DWARF 2 frame + unwind information and the default definition does not work. + + -- Macro: EH_FRAME_IN_DATA_SECTION + If defined, DWARF 2 frame unwind information will be placed in the + data section even though the target supports named sections. This + might be necessary, for instance, if the system linker does garbage + collection and sections cannot be marked as not to be collected. + + Do not define this macro unless 'TARGET_ASM_NAMED_SECTION' is also + defined. + + -- Macro: EH_TABLES_CAN_BE_READ_ONLY + Define this macro to 1 if your target is such that no frame unwind + information encoding used with non-PIC code will ever require a + runtime relocation, but the linker may not support merging + read-only and read-write sections into a single read-write section. + + -- Macro: MASK_RETURN_ADDR + An rtx used to mask the return address found via 'RETURN_ADDR_RTX', + so that it does not contain any extraneous set bits in it. + + -- Macro: DWARF2_UNWIND_INFO + Define this macro to 0 if your target supports DWARF 2 frame unwind + information, but it does not yet work with exception handling. + Otherwise, if your target supports this information (if it defines + 'INCOMING_RETURN_ADDR_RTX' and 'OBJECT_FORMAT_ELF'), GCC will + provide a default definition of 1. + + -- Common Target Hook: enum unwind_info_type TARGET_EXCEPT_UNWIND_INFO + (struct gcc_options *OPTS) + This hook defines the mechanism that will be used for exception + handling by the target. If the target has ABI specified unwind + tables, the hook should return 'UI_TARGET'. If the target is to + use the 'setjmp'/'longjmp'-based exception handling scheme, the + hook should return 'UI_SJLJ'. If the target supports DWARF 2 frame + unwind information, the hook should return 'UI_DWARF2'. + + A target may, if exceptions are disabled, choose to return + 'UI_NONE'. This may end up simplifying other parts of + target-specific code. The default implementation of this hook + never returns 'UI_NONE'. + + Note that the value returned by this hook should be constant. It + should not depend on anything except the command-line switches + described by OPTS. In particular, the setting 'UI_SJLJ' must be + fixed at compiler start-up as C pre-processor macros and builtin + functions related to exception handling are set up depending on + this setting. + + The default implementation of the hook first honors the + '--enable-sjlj-exceptions' configure option, then + 'DWARF2_UNWIND_INFO', and finally defaults to 'UI_SJLJ'. If + 'DWARF2_UNWIND_INFO' depends on command-line options, the target + must define this hook so that OPTS is used correctly. + + -- Common Target Hook: bool TARGET_UNWIND_TABLES_DEFAULT + This variable should be set to 'true' if the target ABI requires + unwinding tables even when exceptions are not used. It must not be + modified by command-line option processing. + + -- Macro: DONT_USE_BUILTIN_SETJMP + Define this macro to 1 if the 'setjmp'/'longjmp'-based scheme + should use the 'setjmp'/'longjmp' functions from the C library + instead of the '__builtin_setjmp'/'__builtin_longjmp' machinery. + + -- Macro: JMP_BUF_SIZE + This macro has no effect unless 'DONT_USE_BUILTIN_SETJMP' is also + defined. Define this macro if the default size of 'jmp_buf' buffer + for the 'setjmp'/'longjmp'-based exception handling mechanism is + not large enough, or if it is much too large. The default size is + 'FIRST_PSEUDO_REGISTER * sizeof(void *)'. + + -- Macro: DWARF_CIE_DATA_ALIGNMENT + This macro need only be defined if the target might save registers + in the function prologue at an offset to the stack pointer that is + not aligned to 'UNITS_PER_WORD'. The definition should be the + negative minimum alignment if 'STACK_GROWS_DOWNWARD' is defined, + and the positive minimum alignment otherwise. *Note SDB and + DWARF::. Only applicable if the target supports DWARF 2 frame + unwind information. + + -- Target Hook: bool TARGET_TERMINATE_DW2_EH_FRAME_INFO + Contains the value true if the target should add a zero word onto + the end of a Dwarf-2 frame info section when used for exception + handling. Default value is false if 'EH_FRAME_SECTION_NAME' is + defined, and true otherwise. + + -- Target Hook: rtx TARGET_DWARF_REGISTER_SPAN (rtx REG) + Given a register, this hook should return a parallel of registers + to represent where to find the register pieces. Define this hook + if the register and its mode are represented in Dwarf in + non-contiguous locations, or if the register should be represented + in more than one register in Dwarf. Otherwise, this hook should + return 'NULL_RTX'. If not defined, the default is to return + 'NULL_RTX'. + + -- Target Hook: void TARGET_INIT_DWARF_REG_SIZES_EXTRA (tree ADDRESS) + If some registers are represented in Dwarf-2 unwind information in + multiple pieces, define this hook to fill in information about the + sizes of those pieces in the table used by the unwinder at runtime. + It will be called by 'expand_builtin_init_dwarf_reg_sizes' after + filling in a single size corresponding to each hard register; + ADDRESS is the address of the table. + + -- Target Hook: bool TARGET_ASM_TTYPE (rtx SYM) + This hook is used to output a reference from a frame unwinding + table to the type_info object identified by SYM. It should return + 'true' if the reference was output. Returning 'false' will cause + the reference to be output using the normal Dwarf2 routines. + + -- Target Hook: bool TARGET_ARM_EABI_UNWINDER + This flag should be set to 'true' on targets that use an ARM EABI + based unwinding library, and 'false' on other targets. This + effects the format of unwinding tables, and how the unwinder in + entered after running a cleanup. The default is 'false'. + + +File: gccint.info, Node: Alignment Output, Prev: Exception Region Output, Up: Assembler Format + +17.21.10 Assembler Commands for Alignment +----------------------------------------- + +This describes commands for alignment. + + -- Macro: JUMP_ALIGN (LABEL) + The alignment (log base 2) to put in front of LABEL, which is a + common destination of jumps and has no fallthru incoming edge. + + This macro need not be defined if you don't want any special + alignment to be done at such a time. Most machine descriptions do + not currently define the macro. + + Unless it's necessary to inspect the LABEL parameter, it is better + to set the variable ALIGN_JUMPS in the target's + 'TARGET_OPTION_OVERRIDE'. Otherwise, you should try to honor the + user's selection in ALIGN_JUMPS in a 'JUMP_ALIGN' implementation. + + -- Target Hook: int TARGET_ASM_JUMP_ALIGN_MAX_SKIP (rtx LABEL) + The maximum number of bytes to skip before LABEL when applying + 'JUMP_ALIGN'. This works only if 'ASM_OUTPUT_MAX_SKIP_ALIGN' is + defined. + + -- Macro: LABEL_ALIGN_AFTER_BARRIER (LABEL) + The alignment (log base 2) to put in front of LABEL, which follows + a 'BARRIER'. + + This macro need not be defined if you don't want any special + alignment to be done at such a time. Most machine descriptions do + not currently define the macro. + + -- Target Hook: int TARGET_ASM_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP (rtx + LABEL) + The maximum number of bytes to skip before LABEL when applying + 'LABEL_ALIGN_AFTER_BARRIER'. This works only if + 'ASM_OUTPUT_MAX_SKIP_ALIGN' is defined. + + -- Macro: LOOP_ALIGN (LABEL) + The alignment (log base 2) to put in front of LABEL that heads a + frequently executed basic block (usually the header of a loop). + + This macro need not be defined if you don't want any special + alignment to be done at such a time. Most machine descriptions do + not currently define the macro. + + Unless it's necessary to inspect the LABEL parameter, it is better + to set the variable 'align_loops' in the target's + 'TARGET_OPTION_OVERRIDE'. Otherwise, you should try to honor the + user's selection in 'align_loops' in a 'LOOP_ALIGN' implementation. + + -- Target Hook: int TARGET_ASM_LOOP_ALIGN_MAX_SKIP (rtx LABEL) + The maximum number of bytes to skip when applying 'LOOP_ALIGN' to + LABEL. This works only if 'ASM_OUTPUT_MAX_SKIP_ALIGN' is defined. + + -- Macro: LABEL_ALIGN (LABEL) + The alignment (log base 2) to put in front of LABEL. If + 'LABEL_ALIGN_AFTER_BARRIER' / 'LOOP_ALIGN' specify a different + alignment, the maximum of the specified values is used. + + Unless it's necessary to inspect the LABEL parameter, it is better + to set the variable 'align_labels' in the target's + 'TARGET_OPTION_OVERRIDE'. Otherwise, you should try to honor the + user's selection in 'align_labels' in a 'LABEL_ALIGN' + implementation. + + -- Target Hook: int TARGET_ASM_LABEL_ALIGN_MAX_SKIP (rtx LABEL) + The maximum number of bytes to skip when applying 'LABEL_ALIGN' to + LABEL. This works only if 'ASM_OUTPUT_MAX_SKIP_ALIGN' is defined. + + -- Macro: ASM_OUTPUT_SKIP (STREAM, NBYTES) + A C statement to output to the stdio stream STREAM an assembler + instruction to advance the location counter by NBYTES bytes. Those + bytes should be zero when loaded. NBYTES will be a C expression of + type 'unsigned HOST_WIDE_INT'. + + -- Macro: ASM_NO_SKIP_IN_TEXT + Define this macro if 'ASM_OUTPUT_SKIP' should not be used in the + text section because it fails to put zeros in the bytes that are + skipped. This is true on many Unix systems, where the pseudo-op to + skip bytes produces no-op instructions rather than zeros when used + in the text section. + + -- Macro: ASM_OUTPUT_ALIGN (STREAM, POWER) + A C statement to output to the stdio stream STREAM an assembler + command to advance the location counter to a multiple of 2 to the + POWER bytes. POWER will be a C expression of type 'int'. + + -- Macro: ASM_OUTPUT_ALIGN_WITH_NOP (STREAM, POWER) + Like 'ASM_OUTPUT_ALIGN', except that the "nop" instruction is used + for padding, if necessary. + + -- Macro: ASM_OUTPUT_MAX_SKIP_ALIGN (STREAM, POWER, MAX_SKIP) + A C statement to output to the stdio stream STREAM an assembler + command to advance the location counter to a multiple of 2 to the + POWER bytes, but only if MAX_SKIP or fewer bytes are needed to + satisfy the alignment request. POWER and MAX_SKIP will be a C + expression of type 'int'. + + +File: gccint.info, Node: Debugging Info, Next: Floating Point, Prev: Assembler Format, Up: Target Macros + +17.22 Controlling Debugging Information Format +============================================== + +This describes how to specify debugging information. + +* Menu: + +* All Debuggers:: Macros that affect all debugging formats uniformly. +* DBX Options:: Macros enabling specific options in DBX format. +* DBX Hooks:: Hook macros for varying DBX format. +* File Names and DBX:: Macros controlling output of file names in DBX format. +* SDB and DWARF:: Macros for SDB (COFF) and DWARF formats. +* VMS Debug:: Macros for VMS debug format. + + +File: gccint.info, Node: All Debuggers, Next: DBX Options, Up: Debugging Info + +17.22.1 Macros Affecting All Debugging Formats +---------------------------------------------- + +These macros affect all debugging formats. + + -- Macro: DBX_REGISTER_NUMBER (REGNO) + A C expression that returns the DBX register number for the + compiler register number REGNO. In the default macro provided, the + value of this expression will be REGNO itself. But sometimes there + are some registers that the compiler knows about and DBX does not, + or vice versa. In such cases, some register may need to have one + number in the compiler and another for DBX. + + If two registers have consecutive numbers inside GCC, and they can + be used as a pair to hold a multiword value, then they _must_ have + consecutive numbers after renumbering with 'DBX_REGISTER_NUMBER'. + Otherwise, debuggers will be unable to access such a pair, because + they expect register pairs to be consecutive in their own numbering + scheme. + + If you find yourself defining 'DBX_REGISTER_NUMBER' in way that + does not preserve register pairs, then what you must do instead is + redefine the actual register numbering scheme. + + -- Macro: DEBUGGER_AUTO_OFFSET (X) + A C expression that returns the integer offset value for an + automatic variable having address X (an RTL expression). The + default computation assumes that X is based on the frame-pointer + and gives the offset from the frame-pointer. This is required for + targets that produce debugging output for DBX or COFF-style + debugging output for SDB and allow the frame-pointer to be + eliminated when the '-g' options is used. + + -- Macro: DEBUGGER_ARG_OFFSET (OFFSET, X) + A C expression that returns the integer offset value for an + argument having address X (an RTL expression). The nominal offset + is OFFSET. + + -- Macro: PREFERRED_DEBUGGING_TYPE + A C expression that returns the type of debugging output GCC should + produce when the user specifies just '-g'. Define this if you have + arranged for GCC to support more than one format of debugging + output. Currently, the allowable values are 'DBX_DEBUG', + 'SDB_DEBUG', 'DWARF_DEBUG', 'DWARF2_DEBUG', 'XCOFF_DEBUG', + 'VMS_DEBUG', and 'VMS_AND_DWARF2_DEBUG'. + + When the user specifies '-ggdb', GCC normally also uses the value + of this macro to select the debugging output format, but with two + exceptions. If 'DWARF2_DEBUGGING_INFO' is defined, GCC uses the + value 'DWARF2_DEBUG'. Otherwise, if 'DBX_DEBUGGING_INFO' is + defined, GCC uses 'DBX_DEBUG'. + + The value of this macro only affects the default debugging output; + the user can always get a specific type of output by using + '-gstabs', '-gcoff', '-gdwarf-2', '-gxcoff', or '-gvms'. + + +File: gccint.info, Node: DBX Options, Next: DBX Hooks, Prev: All Debuggers, Up: Debugging Info + +17.22.2 Specific Options for DBX Output +--------------------------------------- + +These are specific options for DBX output. + + -- Macro: DBX_DEBUGGING_INFO + Define this macro if GCC should produce debugging output for DBX in + response to the '-g' option. + + -- Macro: XCOFF_DEBUGGING_INFO + Define this macro if GCC should produce XCOFF format debugging + output in response to the '-g' option. This is a variant of DBX + format. + + -- Macro: DEFAULT_GDB_EXTENSIONS + Define this macro to control whether GCC should by default generate + GDB's extended version of DBX debugging information (assuming + DBX-format debugging information is enabled at all). If you don't + define the macro, the default is 1: always generate the extended + information if there is any occasion to. + + -- Macro: DEBUG_SYMS_TEXT + Define this macro if all '.stabs' commands should be output while + in the text section. + + -- Macro: ASM_STABS_OP + A C string constant, including spacing, naming the assembler pseudo + op to use instead of '"\t.stabs\t"' to define an ordinary debugging + symbol. If you don't define this macro, '"\t.stabs\t"' is used. + This macro applies only to DBX debugging information format. + + -- Macro: ASM_STABD_OP + A C string constant, including spacing, naming the assembler pseudo + op to use instead of '"\t.stabd\t"' to define a debugging symbol + whose value is the current location. If you don't define this + macro, '"\t.stabd\t"' is used. This macro applies only to DBX + debugging information format. + + -- Macro: ASM_STABN_OP + A C string constant, including spacing, naming the assembler pseudo + op to use instead of '"\t.stabn\t"' to define a debugging symbol + with no name. If you don't define this macro, '"\t.stabn\t"' is + used. This macro applies only to DBX debugging information format. + + -- Macro: DBX_NO_XREFS + Define this macro if DBX on your system does not support the + construct 'xsTAGNAME'. On some systems, this construct is used to + describe a forward reference to a structure named TAGNAME. On + other systems, this construct is not supported at all. + + -- Macro: DBX_CONTIN_LENGTH + A symbol name in DBX-format debugging information is normally + continued (split into two separate '.stabs' directives) when it + exceeds a certain length (by default, 80 characters). On some + operating systems, DBX requires this splitting; on others, + splitting must not be done. You can inhibit splitting by defining + this macro with the value zero. You can override the default + splitting-length by defining this macro as an expression for the + length you desire. + + -- Macro: DBX_CONTIN_CHAR + Normally continuation is indicated by adding a '\' character to the + end of a '.stabs' string when a continuation follows. To use a + different character instead, define this macro as a character + constant for the character you want to use. Do not define this + macro if backslash is correct for your system. + + -- Macro: DBX_STATIC_STAB_DATA_SECTION + Define this macro if it is necessary to go to the data section + before outputting the '.stabs' pseudo-op for a non-global static + variable. + + -- Macro: DBX_TYPE_DECL_STABS_CODE + The value to use in the "code" field of the '.stabs' directive for + a typedef. The default is 'N_LSYM'. + + -- Macro: DBX_STATIC_CONST_VAR_CODE + The value to use in the "code" field of the '.stabs' directive for + a static variable located in the text section. DBX format does not + provide any "right" way to do this. The default is 'N_FUN'. + + -- Macro: DBX_REGPARM_STABS_CODE + The value to use in the "code" field of the '.stabs' directive for + a parameter passed in registers. DBX format does not provide any + "right" way to do this. The default is 'N_RSYM'. + + -- Macro: DBX_REGPARM_STABS_LETTER + The letter to use in DBX symbol data to identify a symbol as a + parameter passed in registers. DBX format does not customarily + provide any way to do this. The default is ''P''. + + -- Macro: DBX_FUNCTION_FIRST + Define this macro if the DBX information for a function and its + arguments should precede the assembler code for the function. + Normally, in DBX format, the debugging information entirely follows + the assembler code. + + -- Macro: DBX_BLOCKS_FUNCTION_RELATIVE + Define this macro, with value 1, if the value of a symbol + describing the scope of a block ('N_LBRAC' or 'N_RBRAC') should be + relative to the start of the enclosing function. Normally, GCC + uses an absolute address. + + -- Macro: DBX_LINES_FUNCTION_RELATIVE + Define this macro, with value 1, if the value of a symbol + indicating the current line number ('N_SLINE') should be relative + to the start of the enclosing function. Normally, GCC uses an + absolute address. + + -- Macro: DBX_USE_BINCL + Define this macro if GCC should generate 'N_BINCL' and 'N_EINCL' + stabs for included header files, as on Sun systems. This macro + also directs GCC to output a type number as a pair of a file number + and a type number within the file. Normally, GCC does not generate + 'N_BINCL' or 'N_EINCL' stabs, and it outputs a single number for a + type number. + + +File: gccint.info, Node: DBX Hooks, Next: File Names and DBX, Prev: DBX Options, Up: Debugging Info + +17.22.3 Open-Ended Hooks for DBX Format +--------------------------------------- + +These are hooks for DBX format. + + -- Macro: DBX_OUTPUT_SOURCE_LINE (STREAM, LINE, COUNTER) + A C statement to output DBX debugging information before code for + line number LINE of the current source file to the stdio stream + STREAM. COUNTER is the number of time the macro was invoked, + including the current invocation; it is intended to generate unique + labels in the assembly output. + + This macro should not be defined if the default output is correct, + or if it can be made correct by defining + 'DBX_LINES_FUNCTION_RELATIVE'. + + -- Macro: NO_DBX_FUNCTION_END + Some stabs encapsulation formats (in particular ECOFF), cannot + handle the '.stabs "",N_FUN,,0,0,Lscope-function-1' gdb dbx + extension construct. On those machines, define this macro to turn + this feature off without disturbing the rest of the gdb extensions. + + -- Macro: NO_DBX_BNSYM_ENSYM + Some assemblers cannot handle the '.stabd BNSYM/ENSYM,0,0' gdb dbx + extension construct. On those machines, define this macro to turn + this feature off without disturbing the rest of the gdb extensions. + + +File: gccint.info, Node: File Names and DBX, Next: SDB and DWARF, Prev: DBX Hooks, Up: Debugging Info + +17.22.4 File Names in DBX Format +-------------------------------- + +This describes file names in DBX format. + + -- Macro: DBX_OUTPUT_MAIN_SOURCE_FILENAME (STREAM, NAME) + A C statement to output DBX debugging information to the stdio + stream STREAM, which indicates that file NAME is the main source + file--the file specified as the input file for compilation. This + macro is called only once, at the beginning of compilation. + + This macro need not be defined if the standard form of output for + DBX debugging information is appropriate. + + It may be necessary to refer to a label equal to the beginning of + the text section. You can use 'assemble_name (stream, + ltext_label_name)' to do so. If you do this, you must also set the + variable USED_LTEXT_LABEL_NAME to 'true'. + + -- Macro: NO_DBX_MAIN_SOURCE_DIRECTORY + Define this macro, with value 1, if GCC should not emit an + indication of the current directory for compilation and current + source language at the beginning of the file. + + -- Macro: NO_DBX_GCC_MARKER + Define this macro, with value 1, if GCC should not emit an + indication that this object file was compiled by GCC. The default + is to emit an 'N_OPT' stab at the beginning of every source file, + with 'gcc2_compiled.' for the string and value 0. + + -- Macro: DBX_OUTPUT_MAIN_SOURCE_FILE_END (STREAM, NAME) + A C statement to output DBX debugging information at the end of + compilation of the main source file NAME. Output should be written + to the stdio stream STREAM. + + If you don't define this macro, nothing special is output at the + end of compilation, which is correct for most machines. + + -- Macro: DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END + Define this macro _instead of_ defining + 'DBX_OUTPUT_MAIN_SOURCE_FILE_END', if what needs to be output at + the end of compilation is an 'N_SO' stab with an empty string, + whose value is the highest absolute text address in the file. + + +File: gccint.info, Node: SDB and DWARF, Next: VMS Debug, Prev: File Names and DBX, Up: Debugging Info + +17.22.5 Macros for SDB and DWARF Output +--------------------------------------- + +Here are macros for SDB and DWARF output. + + -- Macro: SDB_DEBUGGING_INFO + Define this macro if GCC should produce COFF-style debugging output + for SDB in response to the '-g' option. + + -- Macro: DWARF2_DEBUGGING_INFO + Define this macro if GCC should produce dwarf version 2 format + debugging output in response to the '-g' option. + + -- Target Hook: int TARGET_DWARF_CALLING_CONVENTION (const_tree + FUNCTION) + Define this to enable the dwarf attribute + 'DW_AT_calling_convention' to be emitted for each function. + Instead of an integer return the enum value for the 'DW_CC_' + tag. + + To support optional call frame debugging information, you must also + define 'INCOMING_RETURN_ADDR_RTX' and either set + 'RTX_FRAME_RELATED_P' on the prologue insns if you use RTL for the + prologue, or call 'dwarf2out_def_cfa' and 'dwarf2out_reg_save' as + appropriate from 'TARGET_ASM_FUNCTION_PROLOGUE' if you don't. + + -- Macro: DWARF2_FRAME_INFO + Define this macro to a nonzero value if GCC should always output + Dwarf 2 frame information. If 'TARGET_EXCEPT_UNWIND_INFO' (*note + Exception Region Output::) returns 'UI_DWARF2', and exceptions are + enabled, GCC will output this information not matter how you define + 'DWARF2_FRAME_INFO'. + + -- Target Hook: enum unwind_info_type TARGET_DEBUG_UNWIND_INFO (void) + This hook defines the mechanism that will be used for describing + frame unwind information to the debugger. Normally the hook will + return 'UI_DWARF2' if DWARF 2 debug information is enabled, and + return 'UI_NONE' otherwise. + + A target may return 'UI_DWARF2' even when DWARF 2 debug information + is disabled in order to always output DWARF 2 frame information. + + A target may return 'UI_TARGET' if it has ABI specified unwind + tables. This will suppress generation of the normal debug frame + unwind information. + + -- Macro: DWARF2_ASM_LINE_DEBUG_INFO + Define this macro to be a nonzero value if the assembler can + generate Dwarf 2 line debug info sections. This will result in + much more compact line number tables, and hence is desirable if it + works. + + -- Target Hook: bool TARGET_WANT_DEBUG_PUB_SECTIONS + True if the '.debug_pubtypes' and '.debug_pubnames' sections should + be emitted. These sections are not used on most platforms, and in + particular GDB does not use them. + + -- Target Hook: bool TARGET_FORCE_AT_COMP_DIR + True if the 'DW_AT_comp_dir' attribute should be emitted for each + compilation unit. This attribute is required for the darwin linker + to emit debug information. + + -- Target Hook: bool TARGET_DELAY_SCHED2 + True if sched2 is not to be run at its normal place. This usually + means it will be run as part of machine-specific reorg. + + -- Target Hook: bool TARGET_DELAY_VARTRACK + True if vartrack is not to be run at its normal place. This + usually means it will be run as part of machine-specific reorg. + + -- Macro: ASM_OUTPUT_DWARF_DELTA (STREAM, SIZE, LABEL1, LABEL2) + A C statement to issue assembly directives that create a difference + LAB1 minus LAB2, using an integer of the given SIZE. + + -- Macro: ASM_OUTPUT_DWARF_VMS_DELTA (STREAM, SIZE, LABEL1, LABEL2) + A C statement to issue assembly directives that create a difference + between the two given labels in system defined units, e.g. + instruction slots on IA64 VMS, using an integer of the given size. + + -- Macro: ASM_OUTPUT_DWARF_OFFSET (STREAM, SIZE, LABEL, SECTION) + A C statement to issue assembly directives that create a + section-relative reference to the given LABEL, using an integer of + the given SIZE. The label is known to be defined in the given + SECTION. + + -- Macro: ASM_OUTPUT_DWARF_PCREL (STREAM, SIZE, LABEL) + A C statement to issue assembly directives that create a + self-relative reference to the given LABEL, using an integer of the + given SIZE. + + -- Macro: ASM_OUTPUT_DWARF_TABLE_REF (LABEL) + A C statement to issue assembly directives that create a reference + to the DWARF table identifier LABEL from the current section. This + is used on some systems to avoid garbage collecting a DWARF table + which is referenced by a function. + + -- Target Hook: void TARGET_ASM_OUTPUT_DWARF_DTPREL (FILE *FILE, int + SIZE, rtx X) + If defined, this target hook is a function which outputs a + DTP-relative reference to the given TLS symbol of the specified + size. + + -- Macro: PUT_SDB_ ... + Define these macros to override the assembler syntax for the + special SDB assembler directives. See 'sdbout.c' for a list of + these macros and their arguments. If the standard syntax is used, + you need not define them yourself. + + -- Macro: SDB_DELIM + Some assemblers do not support a semicolon as a delimiter, even + between SDB assembler directives. In that case, define this macro + to be the delimiter to use (usually '\n'). It is not necessary to + define a new set of 'PUT_SDB_OP' macros if this is the only change + required. + + -- Macro: SDB_ALLOW_UNKNOWN_REFERENCES + Define this macro to allow references to unknown structure, union, + or enumeration tags to be emitted. Standard COFF does not allow + handling of unknown references, MIPS ECOFF has support for it. + + -- Macro: SDB_ALLOW_FORWARD_REFERENCES + Define this macro to allow references to structure, union, or + enumeration tags that have not yet been seen to be handled. Some + assemblers choke if forward tags are used, while some require it. + + -- Macro: SDB_OUTPUT_SOURCE_LINE (STREAM, LINE) + A C statement to output SDB debugging information before code for + line number LINE of the current source file to the stdio stream + STREAM. The default is to emit an '.ln' directive. + + +File: gccint.info, Node: VMS Debug, Prev: SDB and DWARF, Up: Debugging Info + +17.22.6 Macros for VMS Debug Format +----------------------------------- + +Here are macros for VMS debug format. + + -- Macro: VMS_DEBUGGING_INFO + Define this macro if GCC should produce debugging output for VMS in + response to the '-g' option. The default behavior for VMS is to + generate minimal debug info for a traceback in the absence of '-g' + unless explicitly overridden with '-g0'. This behavior is + controlled by 'TARGET_OPTION_OPTIMIZATION' and + 'TARGET_OPTION_OVERRIDE'. + + +File: gccint.info, Node: Floating Point, Next: Mode Switching, Prev: Debugging Info, Up: Target Macros + +17.23 Cross Compilation and Floating Point +========================================== + +While all modern machines use twos-complement representation for +integers, there are a variety of representations for floating point +numbers. This means that in a cross-compiler the representation of +floating point numbers in the compiled program may be different from +that used in the machine doing the compilation. + + Because different representation systems may offer different amounts of +range and precision, all floating point constants must be represented in +the target machine's format. Therefore, the cross compiler cannot +safely use the host machine's floating point arithmetic; it must emulate +the target's arithmetic. To ensure consistency, GCC always uses +emulation to work with floating point values, even when the host and +target floating point formats are identical. + + The following macros are provided by 'real.h' for the compiler to use. +All parts of the compiler which generate or optimize floating-point +calculations must use these macros. They may evaluate their operands +more than once, so operands must not have side effects. + + -- Macro: REAL_VALUE_TYPE + The C data type to be used to hold a floating point value in the + target machine's format. Typically this is a 'struct' containing + an array of 'HOST_WIDE_INT', but all code should treat it as an + opaque quantity. + + -- Macro: int REAL_VALUES_EQUAL (REAL_VALUE_TYPE X, REAL_VALUE_TYPE Y) + Compares for equality the two values, X and Y. If the target + floating point format supports negative zeroes and/or NaNs, + 'REAL_VALUES_EQUAL (-0.0, 0.0)' is true, and 'REAL_VALUES_EQUAL + (NaN, NaN)' is false. + + -- Macro: int REAL_VALUES_LESS (REAL_VALUE_TYPE X, REAL_VALUE_TYPE Y) + Tests whether X is less than Y. + + -- Macro: HOST_WIDE_INT REAL_VALUE_FIX (REAL_VALUE_TYPE X) + Truncates X to a signed integer, rounding toward zero. + + -- Macro: unsigned HOST_WIDE_INT REAL_VALUE_UNSIGNED_FIX + (REAL_VALUE_TYPE X) + Truncates X to an unsigned integer, rounding toward zero. If X is + negative, returns zero. + + -- Macro: REAL_VALUE_TYPE REAL_VALUE_ATOF (const char *STRING, enum + machine_mode MODE) + Converts STRING into a floating point number in the target + machine's representation for mode MODE. This routine can handle + both decimal and hexadecimal floating point constants, using the + syntax defined by the C language for both. + + -- Macro: int REAL_VALUE_NEGATIVE (REAL_VALUE_TYPE X) + Returns 1 if X is negative (including negative zero), 0 otherwise. + + -- Macro: int REAL_VALUE_ISINF (REAL_VALUE_TYPE X) + Determines whether X represents infinity (positive or negative). + + -- Macro: int REAL_VALUE_ISNAN (REAL_VALUE_TYPE X) + Determines whether X represents a "NaN" (not-a-number). + + -- Macro: void REAL_ARITHMETIC (REAL_VALUE_TYPE OUTPUT, enum tree_code + CODE, REAL_VALUE_TYPE X, REAL_VALUE_TYPE Y) + Calculates an arithmetic operation on the two floating point values + X and Y, storing the result in OUTPUT (which must be a variable). + + The operation to be performed is specified by CODE. Only the + following codes are supported: 'PLUS_EXPR', 'MINUS_EXPR', + 'MULT_EXPR', 'RDIV_EXPR', 'MAX_EXPR', 'MIN_EXPR'. + + If 'REAL_ARITHMETIC' is asked to evaluate division by zero and the + target's floating point format cannot represent infinity, it will + call 'abort'. Callers should check for this situation first, using + 'MODE_HAS_INFINITIES'. *Note Storage Layout::. + + -- Macro: REAL_VALUE_TYPE REAL_VALUE_NEGATE (REAL_VALUE_TYPE X) + Returns the negative of the floating point value X. + + -- Macro: REAL_VALUE_TYPE REAL_VALUE_ABS (REAL_VALUE_TYPE X) + Returns the absolute value of X. + + -- Macro: void REAL_VALUE_TO_INT (HOST_WIDE_INT LOW, HOST_WIDE_INT + HIGH, REAL_VALUE_TYPE X) + Converts a floating point value X into a double-precision integer + which is then stored into LOW and HIGH. If the value is not + integral, it is truncated. + + -- Macro: void REAL_VALUE_FROM_INT (REAL_VALUE_TYPE X, HOST_WIDE_INT + LOW, HOST_WIDE_INT HIGH, enum machine_mode MODE) + Converts a double-precision integer found in LOW and HIGH, into a + floating point value which is then stored into X. The value is + truncated to fit in mode MODE. + + +File: gccint.info, Node: Mode Switching, Next: Target Attributes, Prev: Floating Point, Up: Target Macros + +17.24 Mode Switching Instructions +================================= + +The following macros control mode switching optimizations: + + -- Macro: OPTIMIZE_MODE_SWITCHING (ENTITY) + Define this macro if the port needs extra instructions inserted for + mode switching in an optimizing compilation. + + For an example, the SH4 can perform both single and double + precision floating point operations, but to perform a single + precision operation, the FPSCR PR bit has to be cleared, while for + a double precision operation, this bit has to be set. Changing the + PR bit requires a general purpose register as a scratch register, + hence these FPSCR sets have to be inserted before reload, i.e. you + can't put this into instruction emitting or + 'TARGET_MACHINE_DEPENDENT_REORG'. + + You can have multiple entities that are mode-switched, and select + at run time which entities actually need it. + 'OPTIMIZE_MODE_SWITCHING' should return nonzero for any ENTITY that + needs mode-switching. If you define this macro, you also have to + define 'NUM_MODES_FOR_MODE_SWITCHING', 'MODE_NEEDED', + 'MODE_PRIORITY_TO_MODE' and 'EMIT_MODE_SET'. 'MODE_AFTER', + 'MODE_ENTRY', and 'MODE_EXIT' are optional. + + -- Macro: NUM_MODES_FOR_MODE_SWITCHING + If you define 'OPTIMIZE_MODE_SWITCHING', you have to define this as + initializer for an array of integers. Each initializer element N + refers to an entity that needs mode switching, and specifies the + number of different modes that might need to be set for this + entity. The position of the initializer in the + initializer--starting counting at zero--determines the integer that + is used to refer to the mode-switched entity in question. In + macros that take mode arguments / yield a mode result, modes are + represented as numbers 0 ... N - 1. N is used to specify that no + mode switch is needed / supplied. + + -- Macro: MODE_NEEDED (ENTITY, INSN) + ENTITY is an integer specifying a mode-switched entity. If + 'OPTIMIZE_MODE_SWITCHING' is defined, you must define this macro to + return an integer value not larger than the corresponding element + in 'NUM_MODES_FOR_MODE_SWITCHING', to denote the mode that ENTITY + must be switched into prior to the execution of INSN. + + -- Macro: MODE_AFTER (ENTITY, MODE, INSN) + ENTITY is an integer specifying a mode-switched entity. If this + macro is defined, it is evaluated for every INSN during mode + switching. It determines the mode that an insn results in (if + different from the incoming mode). + + -- Macro: MODE_ENTRY (ENTITY) + If this macro is defined, it is evaluated for every ENTITY that + needs mode switching. It should evaluate to an integer, which is a + mode that ENTITY is assumed to be switched to at function entry. + If 'MODE_ENTRY' is defined then 'MODE_EXIT' must be defined. + + -- Macro: MODE_EXIT (ENTITY) + If this macro is defined, it is evaluated for every ENTITY that + needs mode switching. It should evaluate to an integer, which is a + mode that ENTITY is assumed to be switched to at function exit. If + 'MODE_EXIT' is defined then 'MODE_ENTRY' must be defined. + + -- Macro: MODE_PRIORITY_TO_MODE (ENTITY, N) + This macro specifies the order in which modes for ENTITY are + processed. 0 is the highest priority, + 'NUM_MODES_FOR_MODE_SWITCHING[ENTITY] - 1' the lowest. The value + of the macro should be an integer designating a mode for ENTITY. + For any fixed ENTITY, 'mode_priority_to_mode' (ENTITY, N) shall be + a bijection in 0 ... 'num_modes_for_mode_switching[ENTITY] - 1'. + + -- Macro: EMIT_MODE_SET (ENTITY, MODE, HARD_REGS_LIVE) + Generate one or more insns to set ENTITY to MODE. HARD_REG_LIVE is + the set of hard registers live at the point where the insn(s) are + to be inserted. + + +File: gccint.info, Node: Target Attributes, Next: Emulated TLS, Prev: Mode Switching, Up: Target Macros + +17.25 Defining target-specific uses of '__attribute__' +====================================================== + +Target-specific attributes may be defined for functions, data and types. +These are described using the following target hooks; they also need to +be documented in 'extend.texi'. + + -- Target Hook: const struct attribute_spec * TARGET_ATTRIBUTE_TABLE + If defined, this target hook points to an array of 'struct + attribute_spec' (defined in 'tree.h') specifying the machine + specific attributes for this target and some of the restrictions on + the entities to which these attributes are applied and the + arguments they take. + + -- Target Hook: bool TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P (const_tree + NAME) + If defined, this target hook is a function which returns true if + the machine-specific attribute named NAME expects an identifier + given as its first argument to be passed on as a plain identifier, + not subjected to name lookup. If this is not defined, the default + is false for all machine-specific attributes. + + -- Target Hook: int TARGET_COMP_TYPE_ATTRIBUTES (const_tree TYPE1, + const_tree TYPE2) + If defined, this target hook is a function which returns zero if + the attributes on TYPE1 and TYPE2 are incompatible, one if they are + compatible, and two if they are nearly compatible (which causes a + warning to be generated). If this is not defined, machine-specific + attributes are supposed always to be compatible. + + -- Target Hook: void TARGET_SET_DEFAULT_TYPE_ATTRIBUTES (tree TYPE) + If defined, this target hook is a function which assigns default + attributes to the newly defined TYPE. + + -- Target Hook: tree TARGET_MERGE_TYPE_ATTRIBUTES (tree TYPE1, tree + TYPE2) + Define this target hook if the merging of type attributes needs + special handling. If defined, the result is a list of the combined + 'TYPE_ATTRIBUTES' of TYPE1 and TYPE2. It is assumed that + 'comptypes' has already been called and returned 1. This function + may call 'merge_attributes' to handle machine-independent merging. + + -- Target Hook: tree TARGET_MERGE_DECL_ATTRIBUTES (tree OLDDECL, tree + NEWDECL) + Define this target hook if the merging of decl attributes needs + special handling. If defined, the result is a list of the combined + 'DECL_ATTRIBUTES' of OLDDECL and NEWDECL. NEWDECL is a duplicate + declaration of OLDDECL. Examples of when this is needed are when + one attribute overrides another, or when an attribute is nullified + by a subsequent definition. This function may call + 'merge_attributes' to handle machine-independent merging. + + If the only target-specific handling you require is 'dllimport' for + Microsoft Windows targets, you should define the macro + 'TARGET_DLLIMPORT_DECL_ATTRIBUTES' to '1'. The compiler will then + define a function called 'merge_dllimport_decl_attributes' which + can then be defined as the expansion of + 'TARGET_MERGE_DECL_ATTRIBUTES'. You can also add + 'handle_dll_attribute' in the attribute table for your port to + perform initial processing of the 'dllimport' and 'dllexport' + attributes. This is done in 'i386/cygwin.h' and 'i386/i386.c', for + example. + + -- Target Hook: bool TARGET_VALID_DLLIMPORT_ATTRIBUTE_P (const_tree + DECL) + DECL is a variable or function with '__attribute__((dllimport))' + specified. Use this hook if the target needs to add extra + validation checks to 'handle_dll_attribute'. + + -- Macro: TARGET_DECLSPEC + Define this macro to a nonzero value if you want to treat + '__declspec(X)' as equivalent to '__attribute((X))'. By default, + this behavior is enabled only for targets that define + 'TARGET_DLLIMPORT_DECL_ATTRIBUTES'. The current implementation of + '__declspec' is via a built-in macro, but you should not rely on + this implementation detail. + + -- Target Hook: void TARGET_INSERT_ATTRIBUTES (tree NODE, tree + *ATTR_PTR) + Define this target hook if you want to be able to add attributes to + a decl when it is being created. This is normally useful for back + ends which wish to implement a pragma by using the attributes which + correspond to the pragma's effect. The NODE argument is the decl + which is being created. The ATTR_PTR argument is a pointer to the + attribute list for this decl. The list itself should not be + modified, since it may be shared with other decls, but attributes + may be chained on the head of the list and '*ATTR_PTR' modified to + point to the new attributes, or a copy of the list may be made if + further changes are needed. + + -- Target Hook: bool TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P (const_tree + FNDECL) + This target hook returns 'true' if it is OK to inline FNDECL into + the current function, despite its having target-specific + attributes, 'false' otherwise. By default, if a function has a + target specific attribute attached to it, it will not be inlined. + + -- Target Hook: bool TARGET_OPTION_VALID_ATTRIBUTE_P (tree FNDECL, tree + NAME, tree ARGS, int FLAGS) + This hook is called to parse 'attribute(target("..."))', which + allows setting target-specific options on individual functions. + These function-specific options may differ from the options + specified on the command line. The hook should return 'true' if + the options are valid. + + The hook should set the 'DECL_FUNCTION_SPECIFIC_TARGET' field in + the function declaration to hold a pointer to a target-specific + 'struct cl_target_option' structure. + + -- Target Hook: void TARGET_OPTION_SAVE (struct cl_target_option *PTR, + struct gcc_options *OPTS) + This hook is called to save any additional target-specific + information in the 'struct cl_target_option' structure for + function-specific options from the 'struct gcc_options' structure. + *Note Option file format::. + + -- Target Hook: void TARGET_OPTION_RESTORE (struct gcc_options *OPTS, + struct cl_target_option *PTR) + This hook is called to restore any additional target-specific + information in the 'struct cl_target_option' structure for + function-specific options to the 'struct gcc_options' structure. + + -- Target Hook: void TARGET_OPTION_PRINT (FILE *FILE, int INDENT, + struct cl_target_option *PTR) + This hook is called to print any additional target-specific + information in the 'struct cl_target_option' structure for + function-specific options. + + -- Target Hook: bool TARGET_OPTION_PRAGMA_PARSE (tree ARGS, tree + POP_TARGET) + This target hook parses the options for '#pragma GCC target', which + sets the target-specific options for functions that occur later in + the input stream. The options accepted should be the same as those + handled by the 'TARGET_OPTION_VALID_ATTRIBUTE_P' hook. + + -- Target Hook: void TARGET_OPTION_OVERRIDE (void) + Sometimes certain combinations of command options do not make sense + on a particular target machine. You can override the hook + 'TARGET_OPTION_OVERRIDE' to take account of this. This hooks is + called once just after all the command options have been parsed. + + Don't use this hook to turn on various extra optimizations for + '-O'. That is what 'TARGET_OPTION_OPTIMIZATION' is for. + + If you need to do something whenever the optimization level is + changed via the optimize attribute or pragma, see + 'TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE' + + -- Target Hook: bool TARGET_OPTION_FUNCTION_VERSIONS (tree DECL1, tree + DECL2) + This target hook returns 'true' if DECL1 and DECL2 are versions of + the same function. DECL1 and DECL2 are function versions if and + only if they have the same function signature and different target + specific attributes, that is, they are compiled for different + target machines. + + -- Target Hook: bool TARGET_CAN_INLINE_P (tree CALLER, tree CALLEE) + This target hook returns 'false' if the CALLER function cannot + inline CALLEE, based on target specific information. By default, + inlining is not allowed if the callee function has function + specific target options and the caller does not use the same + options. + + +File: gccint.info, Node: Emulated TLS, Next: MIPS Coprocessors, Prev: Target Attributes, Up: Target Macros + +17.26 Emulating TLS +=================== + +For targets whose psABI does not provide Thread Local Storage via +specific relocations and instruction sequences, an emulation layer is +used. A set of target hooks allows this emulation layer to be +configured for the requirements of a particular target. For instance +the psABI may in fact specify TLS support in terms of an emulation +layer. + + The emulation layer works by creating a control object for every TLS +object. To access the TLS object, a lookup function is provided which, +when given the address of the control object, will return the address of +the current thread's instance of the TLS object. + + -- Target Hook: const char * TARGET_EMUTLS_GET_ADDRESS + Contains the name of the helper function that uses a TLS control + object to locate a TLS instance. The default causes libgcc's + emulated TLS helper function to be used. + + -- Target Hook: const char * TARGET_EMUTLS_REGISTER_COMMON + Contains the name of the helper function that should be used at + program startup to register TLS objects that are implicitly + initialized to zero. If this is 'NULL', all TLS objects will have + explicit initializers. The default causes libgcc's emulated TLS + registration function to be used. + + -- Target Hook: const char * TARGET_EMUTLS_VAR_SECTION + Contains the name of the section in which TLS control variables + should be placed. The default of 'NULL' allows these to be placed + in any section. + + -- Target Hook: const char * TARGET_EMUTLS_TMPL_SECTION + Contains the name of the section in which TLS initializers should + be placed. The default of 'NULL' allows these to be placed in any + section. + + -- Target Hook: const char * TARGET_EMUTLS_VAR_PREFIX + Contains the prefix to be prepended to TLS control variable names. + The default of 'NULL' uses a target-specific prefix. + + -- Target Hook: const char * TARGET_EMUTLS_TMPL_PREFIX + Contains the prefix to be prepended to TLS initializer objects. + The default of 'NULL' uses a target-specific prefix. + + -- Target Hook: tree TARGET_EMUTLS_VAR_FIELDS (tree TYPE, tree *NAME) + Specifies a function that generates the FIELD_DECLs for a TLS + control object type. TYPE is the RECORD_TYPE the fields are for + and NAME should be filled with the structure tag, if the default of + '__emutls_object' is unsuitable. The default creates a type + suitable for libgcc's emulated TLS function. + + -- Target Hook: tree TARGET_EMUTLS_VAR_INIT (tree VAR, tree DECL, tree + TMPL_ADDR) + Specifies a function that generates the CONSTRUCTOR to initialize a + TLS control object. VAR is the TLS control object, DECL is the TLS + object and TMPL_ADDR is the address of the initializer. The + default initializes libgcc's emulated TLS control object. + + -- Target Hook: bool TARGET_EMUTLS_VAR_ALIGN_FIXED + Specifies whether the alignment of TLS control variable objects is + fixed and should not be increased as some backends may do to + optimize single objects. The default is false. + + -- Target Hook: bool TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS + Specifies whether a DWARF 'DW_OP_form_tls_address' location + descriptor may be used to describe emulated TLS control objects. + + +File: gccint.info, Node: MIPS Coprocessors, Next: PCH Target, Prev: Emulated TLS, Up: Target Macros + +17.27 Defining coprocessor specifics for MIPS targets. +====================================================== + +The MIPS specification allows MIPS implementations to have as many as 4 +coprocessors, each with as many as 32 private registers. GCC supports +accessing these registers and transferring values between the registers +and memory using asm-ized variables. For example: + + register unsigned int cp0count asm ("c0r1"); + unsigned int d; + + d = cp0count + 3; + + ("c0r1" is the default name of register 1 in coprocessor 0; alternate +names may be added as described below, or the default names may be +overridden entirely in 'SUBTARGET_CONDITIONAL_REGISTER_USAGE'.) + + Coprocessor registers are assumed to be epilogue-used; sets to them +will be preserved even if it does not appear that the register is used +again later in the function. + + Another note: according to the MIPS spec, coprocessor 1 (if present) is +the FPU. One accesses COP1 registers through standard mips +floating-point support; they are not included in this mechanism. + + There is one macro used in defining the MIPS coprocessor interface +which you may want to override in subtargets; it is described below. + + +File: gccint.info, Node: PCH Target, Next: C++ ABI, Prev: MIPS Coprocessors, Up: Target Macros + +17.28 Parameters for Precompiled Header Validity Checking +========================================================= + + -- Target Hook: void * TARGET_GET_PCH_VALIDITY (size_t *SZ) + This hook returns a pointer to the data needed by + 'TARGET_PCH_VALID_P' and sets '*SZ' to the size of the data in + bytes. + + -- Target Hook: const char * TARGET_PCH_VALID_P (const void *DATA, + size_t SZ) + This hook checks whether the options used to create a PCH file are + compatible with the current settings. It returns 'NULL' if so and + a suitable error message if not. Error messages will be presented + to the user and must be localized using '_(MSG)'. + + DATA is the data that was returned by 'TARGET_GET_PCH_VALIDITY' + when the PCH file was created and SZ is the size of that data in + bytes. It's safe to assume that the data was created by the same + version of the compiler, so no format checking is needed. + + The default definition of 'default_pch_valid_p' should be suitable + for most targets. + + -- Target Hook: const char * TARGET_CHECK_PCH_TARGET_FLAGS (int + PCH_FLAGS) + If this hook is nonnull, the default implementation of + 'TARGET_PCH_VALID_P' will use it to check for compatible values of + 'target_flags'. PCH_FLAGS specifies the value that 'target_flags' + had when the PCH file was created. The return value is the same as + for 'TARGET_PCH_VALID_P'. + + -- Target Hook: void TARGET_PREPARE_PCH_SAVE (void) + Called before writing out a PCH file. If the target has some + garbage-collected data that needs to be in a particular state on + PCH loads, it can use this hook to enforce that state. Very few + targets need to do anything here. + + +File: gccint.info, Node: C++ ABI, Next: Named Address Spaces, Prev: PCH Target, Up: Target Macros + +17.29 C++ ABI parameters +======================== + + -- Target Hook: tree TARGET_CXX_GUARD_TYPE (void) + Define this hook to override the integer type used for guard + variables. These are used to implement one-time construction of + static objects. The default is long_long_integer_type_node. + + -- Target Hook: bool TARGET_CXX_GUARD_MASK_BIT (void) + This hook determines how guard variables are used. It should + return 'false' (the default) if the first byte should be used. A + return value of 'true' indicates that only the least significant + bit should be used. + + -- Target Hook: tree TARGET_CXX_GET_COOKIE_SIZE (tree TYPE) + This hook returns the size of the cookie to use when allocating an + array whose elements have the indicated TYPE. Assumes that it is + already known that a cookie is needed. The default is 'max(sizeof + (size_t), alignof(type))', as defined in section 2.7 of the + IA64/Generic C++ ABI. + + -- Target Hook: bool TARGET_CXX_COOKIE_HAS_SIZE (void) + This hook should return 'true' if the element size should be stored + in array cookies. The default is to return 'false'. + + -- Target Hook: int TARGET_CXX_IMPORT_EXPORT_CLASS (tree TYPE, int + IMPORT_EXPORT) + If defined by a backend this hook allows the decision made to + export class TYPE to be overruled. Upon entry IMPORT_EXPORT will + contain 1 if the class is going to be exported, -1 if it is going + to be imported and 0 otherwise. This function should return the + modified value and perform any other actions necessary to support + the backend's targeted operating system. + + -- Target Hook: bool TARGET_CXX_CDTOR_RETURNS_THIS (void) + This hook should return 'true' if constructors and destructors + return the address of the object created/destroyed. The default is + to return 'false'. + + -- Target Hook: bool TARGET_CXX_KEY_METHOD_MAY_BE_INLINE (void) + This hook returns true if the key method for a class (i.e., the + method which, if defined in the current translation unit, causes + the virtual table to be emitted) may be an inline function. Under + the standard Itanium C++ ABI the key method may be an inline + function so long as the function is not declared inline in the + class definition. Under some variants of the ABI, an inline + function can never be the key method. The default is to return + 'true'. + + -- Target Hook: void TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY (tree + DECL) + DECL is a virtual table, virtual table table, typeinfo object, or + other similar implicit class data object that will be emitted with + external linkage in this translation unit. No ELF visibility has + been explicitly specified. If the target needs to specify a + visibility other than that of the containing class, use this hook + to set 'DECL_VISIBILITY' and 'DECL_VISIBILITY_SPECIFIED'. + + -- Target Hook: bool TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT (void) + This hook returns true (the default) if virtual tables and other + similar implicit class data objects are always COMDAT if they have + external linkage. If this hook returns false, then class data for + classes whose virtual table will be emitted in only one translation + unit will not be COMDAT. + + -- Target Hook: bool TARGET_CXX_LIBRARY_RTTI_COMDAT (void) + This hook returns true (the default) if the RTTI information for + the basic types which is defined in the C++ runtime should always + be COMDAT, false if it should not be COMDAT. + + -- Target Hook: bool TARGET_CXX_USE_AEABI_ATEXIT (void) + This hook returns true if '__aeabi_atexit' (as defined by the ARM + EABI) should be used to register static destructors when + '-fuse-cxa-atexit' is in effect. The default is to return false to + use '__cxa_atexit'. + + -- Target Hook: bool TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT (void) + This hook returns true if the target 'atexit' function can be used + in the same manner as '__cxa_atexit' to register C++ static + destructors. This requires that 'atexit'-registered functions in + shared libraries are run in the correct order when the libraries + are unloaded. The default is to return false. + + -- Target Hook: void TARGET_CXX_ADJUST_CLASS_AT_DEFINITION (tree TYPE) + TYPE is a C++ class (i.e., RECORD_TYPE or UNION_TYPE) that has just + been defined. Use this hook to make adjustments to the class (eg, + tweak visibility or perform any other required target + modifications). + + -- Target Hook: tree TARGET_CXX_DECL_MANGLING_CONTEXT (const_tree DECL) + Return target-specific mangling context of DECL or 'NULL_TREE'. + + +File: gccint.info, Node: Named Address Spaces, Next: Misc, Prev: C++ ABI, Up: Target Macros + +17.30 Adding support for named address spaces +============================================= + +The draft technical report of the ISO/IEC JTC1 S22 WG14 N1275 standards +committee, 'Programming Languages - C - Extensions to support embedded +processors', specifies a syntax for embedded processors to specify +alternate address spaces. You can configure a GCC port to support +section 5.1 of the draft report to add support for address spaces other +than the default address space. These address spaces are new keywords +that are similar to the 'volatile' and 'const' type attributes. + + Pointers to named address spaces can have a different size than +pointers to the generic address space. + + For example, the SPU port uses the '__ea' address space to refer to +memory in the host processor, rather than memory local to the SPU +processor. Access to memory in the '__ea' address space involves +issuing DMA operations to move data between the host processor and the +local processor memory address space. Pointers in the '__ea' address +space are either 32 bits or 64 bits based on the '-mea32' or '-mea64' +switches (native SPU pointers are always 32 bits). + + Internally, address spaces are represented as a small integer in the +range 0 to 15 with address space 0 being reserved for the generic +address space. + + To register a named address space qualifier keyword with the C front +end, the target may call the 'c_register_addr_space' routine. For +example, the SPU port uses the following to declare '__ea' as the +keyword for named address space #1: + #define ADDR_SPACE_EA 1 + c_register_addr_space ("__ea", ADDR_SPACE_EA); + + -- Target Hook: enum machine_mode TARGET_ADDR_SPACE_POINTER_MODE + (addr_space_t ADDRESS_SPACE) + Define this to return the machine mode to use for pointers to + ADDRESS_SPACE if the target supports named address spaces. The + default version of this hook returns 'ptr_mode' for the generic + address space only. + + -- Target Hook: enum machine_mode TARGET_ADDR_SPACE_ADDRESS_MODE + (addr_space_t ADDRESS_SPACE) + Define this to return the machine mode to use for addresses in + ADDRESS_SPACE if the target supports named address spaces. The + default version of this hook returns 'Pmode' for the generic + address space only. + + -- Target Hook: bool TARGET_ADDR_SPACE_VALID_POINTER_MODE (enum + machine_mode MODE, addr_space_t AS) + Define this to return nonzero if the port can handle pointers with + machine mode MODE to address space AS. This target hook is the + same as the 'TARGET_VALID_POINTER_MODE' target hook, except that it + includes explicit named address space support. The default version + of this hook returns true for the modes returned by either the + 'TARGET_ADDR_SPACE_POINTER_MODE' or + 'TARGET_ADDR_SPACE_ADDRESS_MODE' target hooks for the given address + space. + + -- Target Hook: bool TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P (enum + machine_mode MODE, rtx EXP, bool STRICT, addr_space_t AS) + Define this to return true if EXP is a valid address for mode MODE + in the named address space AS. The STRICT parameter says whether + strict addressing is in effect after reload has finished. This + target hook is the same as the 'TARGET_LEGITIMATE_ADDRESS_P' target + hook, except that it includes explicit named address space support. + + -- Target Hook: rtx TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS (rtx X, rtx + OLDX, enum machine_mode MODE, addr_space_t AS) + Define this to modify an invalid address X to be a valid address + with mode MODE in the named address space AS. This target hook is + the same as the 'TARGET_LEGITIMIZE_ADDRESS' target hook, except + that it includes explicit named address space support. + + -- Target Hook: bool TARGET_ADDR_SPACE_SUBSET_P (addr_space_t SUBSET, + addr_space_t SUPERSET) + Define this to return whether the SUBSET named address space is + contained within the SUPERSET named address space. Pointers to a + named address space that is a subset of another named address space + will be converted automatically without a cast if used together in + arithmetic operations. Pointers to a superset address space can be + converted to pointers to a subset address space via explicit casts. + + -- Target Hook: rtx TARGET_ADDR_SPACE_CONVERT (rtx OP, tree FROM_TYPE, + tree TO_TYPE) + Define this to convert the pointer expression represented by the + RTL OP with type FROM_TYPE that points to a named address space to + a new pointer expression with type TO_TYPE that points to a + different named address space. When this hook it called, it is + guaranteed that one of the two address spaces is a subset of the + other, as determined by the 'TARGET_ADDR_SPACE_SUBSET_P' target + hook. + + +File: gccint.info, Node: Misc, Prev: Named Address Spaces, Up: Target Macros + +17.31 Miscellaneous Parameters +============================== + +Here are several miscellaneous parameters. + + -- Macro: HAS_LONG_COND_BRANCH + Define this boolean macro to indicate whether or not your + architecture has conditional branches that can span all of memory. + It is used in conjunction with an optimization that partitions hot + and cold basic blocks into separate sections of the executable. If + this macro is set to false, gcc will convert any conditional + branches that attempt to cross between sections into unconditional + branches or indirect jumps. + + -- Macro: HAS_LONG_UNCOND_BRANCH + Define this boolean macro to indicate whether or not your + architecture has unconditional branches that can span all of + memory. It is used in conjunction with an optimization that + partitions hot and cold basic blocks into separate sections of the + executable. If this macro is set to false, gcc will convert any + unconditional branches that attempt to cross between sections into + indirect jumps. + + -- Macro: CASE_VECTOR_MODE + An alias for a machine mode name. This is the machine mode that + elements of a jump-table should have. + + -- Macro: CASE_VECTOR_SHORTEN_MODE (MIN_OFFSET, MAX_OFFSET, BODY) + Optional: return the preferred mode for an 'addr_diff_vec' when the + minimum and maximum offset are known. If you define this, it + enables extra code in branch shortening to deal with + 'addr_diff_vec'. To make this work, you also have to define + 'INSN_ALIGN' and make the alignment for 'addr_diff_vec' explicit. + The BODY argument is provided so that the offset_unsigned and scale + flags can be updated. + + -- Macro: CASE_VECTOR_PC_RELATIVE + Define this macro to be a C expression to indicate when jump-tables + should contain relative addresses. You need not define this macro + if jump-tables never contain relative addresses, or jump-tables + should contain relative addresses only when '-fPIC' or '-fPIC' is + in effect. + + -- Target Hook: unsigned int TARGET_CASE_VALUES_THRESHOLD (void) + This function return the smallest number of different values for + which it is best to use a jump-table instead of a tree of + conditional branches. The default is four for machines with a + 'casesi' instruction and five otherwise. This is best for most + machines. + + -- Macro: WORD_REGISTER_OPERATIONS + Define this macro if operations between registers with integral + mode smaller than a word are always performed on the entire + register. Most RISC machines have this property and most CISC + machines do not. + + -- Macro: LOAD_EXTEND_OP (MEM_MODE) + Define this macro to be a C expression indicating when insns that + read memory in MEM_MODE, an integral mode narrower than a word, set + the bits outside of MEM_MODE to be either the sign-extension or the + zero-extension of the data read. Return 'SIGN_EXTEND' for values + of MEM_MODE for which the insn sign-extends, 'ZERO_EXTEND' for + which it zero-extends, and 'UNKNOWN' for other modes. + + This macro is not called with MEM_MODE non-integral or with a width + greater than or equal to 'BITS_PER_WORD', so you may return any + value in this case. Do not define this macro if it would always + return 'UNKNOWN'. On machines where this macro is defined, you + will normally define it as the constant 'SIGN_EXTEND' or + 'ZERO_EXTEND'. + + You may return a non-'UNKNOWN' value even if for some hard + registers the sign extension is not performed, if for the + 'REGNO_REG_CLASS' of these hard registers + 'CANNOT_CHANGE_MODE_CLASS' returns nonzero when the FROM mode is + MEM_MODE and the TO mode is any integral mode larger than this but + not larger than 'word_mode'. + + You must return 'UNKNOWN' if for some hard registers that allow + this mode, 'CANNOT_CHANGE_MODE_CLASS' says that they cannot change + to 'word_mode', but that they can change to another integral mode + that is larger then MEM_MODE but still smaller than 'word_mode'. + + -- Macro: SHORT_IMMEDIATES_SIGN_EXTEND + Define this macro if loading short immediate values into registers + sign extends. + + -- Target Hook: unsigned int TARGET_MIN_DIVISIONS_FOR_RECIP_MUL (enum + machine_mode MODE) + When '-ffast-math' is in effect, GCC tries to optimize divisions by + the same divisor, by turning them into multiplications by the + reciprocal. This target hook specifies the minimum number of + divisions that should be there for GCC to perform the optimization + for a variable of mode MODE. The default implementation returns 3 + if the machine has an instruction for the division, and 2 if it + does not. + + -- Macro: MOVE_MAX + The maximum number of bytes that a single instruction can move + quickly between memory and registers or between two memory + locations. + + -- Macro: MAX_MOVE_MAX + The maximum number of bytes that a single instruction can move + quickly between memory and registers or between two memory + locations. If this is undefined, the default is 'MOVE_MAX'. + Otherwise, it is the constant value that is the largest value that + 'MOVE_MAX' can have at run-time. + + -- Macro: SHIFT_COUNT_TRUNCATED + A C expression that is nonzero if on this machine the number of + bits actually used for the count of a shift operation is equal to + the number of bits needed to represent the size of the object being + shifted. When this macro is nonzero, the compiler will assume that + it is safe to omit a sign-extend, zero-extend, and certain bitwise + 'and' instructions that truncates the count of a shift operation. + On machines that have instructions that act on bit-fields at + variable positions, which may include 'bit test' instructions, a + nonzero 'SHIFT_COUNT_TRUNCATED' also enables deletion of + truncations of the values that serve as arguments to bit-field + instructions. + + If both types of instructions truncate the count (for shifts) and + position (for bit-field operations), or if no variable-position + bit-field instructions exist, you should define this macro. + + However, on some machines, such as the 80386 and the 680x0, + truncation only applies to shift operations and not the (real or + pretended) bit-field operations. Define 'SHIFT_COUNT_TRUNCATED' to + be zero on such machines. Instead, add patterns to the 'md' file + that include the implied truncation of the shift instructions. + + You need not define this macro if it would always have the value of + zero. + + -- Target Hook: unsigned HOST_WIDE_INT TARGET_SHIFT_TRUNCATION_MASK + (enum machine_mode MODE) + This function describes how the standard shift patterns for MODE + deal with shifts by negative amounts or by more than the width of + the mode. *Note shift patterns::. + + On many machines, the shift patterns will apply a mask M to the + shift count, meaning that a fixed-width shift of X by Y is + equivalent to an arbitrary-width shift of X by Y & M. If this is + true for mode MODE, the function should return M, otherwise it + should return 0. A return value of 0 indicates that no particular + behavior is guaranteed. + + Note that, unlike 'SHIFT_COUNT_TRUNCATED', this function does _not_ + apply to general shift rtxes; it applies only to instructions that + are generated by the named shift patterns. + + The default implementation of this function returns + 'GET_MODE_BITSIZE (MODE) - 1' if 'SHIFT_COUNT_TRUNCATED' and 0 + otherwise. This definition is always safe, but if + 'SHIFT_COUNT_TRUNCATED' is false, and some shift patterns + nevertheless truncate the shift count, you may get better code by + overriding it. + + -- Macro: TRULY_NOOP_TRUNCATION (OUTPREC, INPREC) + A C expression which is nonzero if on this machine it is safe to + "convert" an integer of INPREC bits to one of OUTPREC bits (where + OUTPREC is smaller than INPREC) by merely operating on it as if it + had only OUTPREC bits. + + On many machines, this expression can be 1. + + When 'TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for + modes for which 'MODES_TIEABLE_P' is 0, suboptimal code can result. + If this is the case, making 'TRULY_NOOP_TRUNCATION' return 0 in + such cases may improve things. + + -- Target Hook: int TARGET_MODE_REP_EXTENDED (enum machine_mode MODE, + enum machine_mode REP_MODE) + The representation of an integral mode can be such that the values + are always extended to a wider integral mode. Return 'SIGN_EXTEND' + if values of MODE are represented in sign-extended form to + REP_MODE. Return 'UNKNOWN' otherwise. (Currently, none of the + targets use zero-extended representation this way so unlike + 'LOAD_EXTEND_OP', 'TARGET_MODE_REP_EXTENDED' is expected to return + either 'SIGN_EXTEND' or 'UNKNOWN'. Also no target extends MODE to + REP_MODE so that REP_MODE is not the next widest integral mode and + currently we take advantage of this fact.) + + Similarly to 'LOAD_EXTEND_OP' you may return a non-'UNKNOWN' value + even if the extension is not performed on certain hard registers as + long as for the 'REGNO_REG_CLASS' of these hard registers + 'CANNOT_CHANGE_MODE_CLASS' returns nonzero. + + Note that 'TARGET_MODE_REP_EXTENDED' and 'LOAD_EXTEND_OP' describe + two related properties. If you define 'TARGET_MODE_REP_EXTENDED + (mode, word_mode)' you probably also want to define 'LOAD_EXTEND_OP + (mode)' to return the same type of extension. + + In order to enforce the representation of 'mode', + 'TRULY_NOOP_TRUNCATION' should return false when truncating to + 'mode'. + + -- Macro: STORE_FLAG_VALUE + A C expression describing the value returned by a comparison + operator with an integral mode and stored by a store-flag + instruction ('cstoreMODE4') when the condition is true. This + description must apply to _all_ the 'cstoreMODE4' patterns and all + the comparison operators whose results have a 'MODE_INT' mode. + + A value of 1 or -1 means that the instruction implementing the + comparison operator returns exactly 1 or -1 when the comparison is + true and 0 when the comparison is false. Otherwise, the value + indicates which bits of the result are guaranteed to be 1 when the + comparison is true. This value is interpreted in the mode of the + comparison operation, which is given by the mode of the first + operand in the 'cstoreMODE4' pattern. Either the low bit or the + sign bit of 'STORE_FLAG_VALUE' be on. Presently, only those bits + are used by the compiler. + + If 'STORE_FLAG_VALUE' is neither 1 or -1, the compiler will + generate code that depends only on the specified bits. It can also + replace comparison operators with equivalent operations if they + cause the required bits to be set, even if the remaining bits are + undefined. For example, on a machine whose comparison operators + return an 'SImode' value and where 'STORE_FLAG_VALUE' is defined as + '0x80000000', saying that just the sign bit is relevant, the + expression + + (ne:SI (and:SI X (const_int POWER-OF-2)) (const_int 0)) + + can be converted to + + (ashift:SI X (const_int N)) + + where N is the appropriate shift count to move the bit being tested + into the sign bit. + + There is no way to describe a machine that always sets the + low-order bit for a true value, but does not guarantee the value of + any other bits, but we do not know of any machine that has such an + instruction. If you are trying to port GCC to such a machine, + include an instruction to perform a logical-and of the result with + 1 in the pattern for the comparison operators and let us know at + <gcc@gcc.gnu.org>. + + Often, a machine will have multiple instructions that obtain a + value from a comparison (or the condition codes). Here are rules + to guide the choice of value for 'STORE_FLAG_VALUE', and hence the + instructions to be used: + + * Use the shortest sequence that yields a valid definition for + 'STORE_FLAG_VALUE'. It is more efficient for the compiler to + "normalize" the value (convert it to, e.g., 1 or 0) than for + the comparison operators to do so because there may be + opportunities to combine the normalization with other + operations. + + * For equal-length sequences, use a value of 1 or -1, with -1 + being slightly preferred on machines with expensive jumps and + 1 preferred on other machines. + + * As a second choice, choose a value of '0x80000001' if + instructions exist that set both the sign and low-order bits + but do not define the others. + + * Otherwise, use a value of '0x80000000'. + + Many machines can produce both the value chosen for + 'STORE_FLAG_VALUE' and its negation in the same number of + instructions. On those machines, you should also define a pattern + for those cases, e.g., one matching + + (set A (neg:M (ne:M B C))) + + Some machines can also perform 'and' or 'plus' operations on + condition code values with less instructions than the corresponding + 'cstoreMODE4' insn followed by 'and' or 'plus'. On those machines, + define the appropriate patterns. Use the names 'incscc' and + 'decscc', respectively, for the patterns which perform 'plus' or + 'minus' operations on condition code values. See 'rs6000.md' for + some examples. The GNU Superoptimizer can be used to find such + instruction sequences on other machines. + + If this macro is not defined, the default value, 1, is used. You + need not define 'STORE_FLAG_VALUE' if the machine has no store-flag + instructions, or if the value generated by these instructions is 1. + + -- Macro: FLOAT_STORE_FLAG_VALUE (MODE) + A C expression that gives a nonzero 'REAL_VALUE_TYPE' value that is + returned when comparison operators with floating-point results are + true. Define this macro on machines that have comparison + operations that return floating-point values. If there are no such + operations, do not define this macro. + + -- Macro: VECTOR_STORE_FLAG_VALUE (MODE) + A C expression that gives a rtx representing the nonzero true + element for vector comparisons. The returned rtx should be valid + for the inner mode of MODE which is guaranteed to be a vector mode. + Define this macro on machines that have vector comparison + operations that return a vector result. If there are no such + operations, do not define this macro. Typically, this macro is + defined as 'const1_rtx' or 'constm1_rtx'. This macro may return + 'NULL_RTX' to prevent the compiler optimizing such vector + comparison operations for the given mode. + + -- Macro: CLZ_DEFINED_VALUE_AT_ZERO (MODE, VALUE) + -- Macro: CTZ_DEFINED_VALUE_AT_ZERO (MODE, VALUE) + A C expression that indicates whether the architecture defines a + value for 'clz' or 'ctz' with a zero operand. A result of '0' + indicates the value is undefined. If the value is defined for only + the RTL expression, the macro should evaluate to '1'; if the value + applies also to the corresponding optab entry (which is normally + the case if it expands directly into the corresponding RTL), then + the macro should evaluate to '2'. In the cases where the value is + defined, VALUE should be set to this value. + + If this macro is not defined, the value of 'clz' or 'ctz' at zero + is assumed to be undefined. + + This macro must be defined if the target's expansion for 'ffs' + relies on a particular value to get correct results. Otherwise it + is not necessary, though it may be used to optimize some corner + cases, and to provide a default expansion for the 'ffs' optab. + + Note that regardless of this macro the "definedness" of 'clz' and + 'ctz' at zero do _not_ extend to the builtin functions visible to + the user. Thus one may be free to adjust the value at will to + match the target expansion of these operations without fear of + breaking the API. + + -- Macro: Pmode + An alias for the machine mode for pointers. On most machines, + define this to be the integer mode corresponding to the width of a + hardware pointer; 'SImode' on 32-bit machine or 'DImode' on 64-bit + machines. On some machines you must define this to be one of the + partial integer modes, such as 'PSImode'. + + The width of 'Pmode' must be at least as large as the value of + 'POINTER_SIZE'. If it is not equal, you must define the macro + 'POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to + 'Pmode'. + + -- Macro: FUNCTION_MODE + An alias for the machine mode used for memory references to + functions being called, in 'call' RTL expressions. On most CISC + machines, where an instruction can begin at any byte address, this + should be 'QImode'. On most RISC machines, where all instructions + have fixed size and alignment, this should be a mode with the same + size and alignment as the machine instruction words - typically + 'SImode' or 'HImode'. + + -- Macro: STDC_0_IN_SYSTEM_HEADERS + In normal operation, the preprocessor expands '__STDC__' to the + constant 1, to signify that GCC conforms to ISO Standard C. On + some hosts, like Solaris, the system compiler uses a different + convention, where '__STDC__' is normally 0, but is 1 if the user + specifies strict conformance to the C Standard. + + Defining 'STDC_0_IN_SYSTEM_HEADERS' makes GNU CPP follows the host + convention when processing system header files, but when processing + user files '__STDC__' will always expand to 1. + + -- C Target Hook: const char * TARGET_C_PREINCLUDE (void) + Define this hook to return the name of a header file to be included + at the start of all compilations, as if it had been included with + '#include <FILE>'. If this hook returns 'NULL', or is not defined, + or the header is not found, or if the user specifies + '-ffreestanding' or '-nostdinc', no header is included. + + This hook can be used together with a header provided by the system + C library to implement ISO C requirements for certain macros to be + predefined that describe properties of the whole implementation + rather than just the compiler. + + -- C Target Hook: bool TARGET_CXX_IMPLICIT_EXTERN_C (const char*) + Define this hook to add target-specific C++ implicit extern C + functions. If this function returns true for the name of a + file-scope function, that function implicitly gets extern "C" + linkage rather than whatever language linkage the declaration would + normally have. An example of such function is WinMain on Win32 + targets. + + -- Macro: NO_IMPLICIT_EXTERN_C + Define this macro if the system header files support C++ as well as + C. This macro inhibits the usual method of using system header + files in C++, which is to pretend that the file's contents are + enclosed in 'extern "C" {...}'. + + -- Macro: REGISTER_TARGET_PRAGMAS () + Define this macro if you want to implement any target-specific + pragmas. If defined, it is a C expression which makes a series of + calls to 'c_register_pragma' or 'c_register_pragma_with_expansion' + for each pragma. The macro may also do any setup required for the + pragmas. + + The primary reason to define this macro is to provide compatibility + with other compilers for the same target. In general, we + discourage definition of target-specific pragmas for GCC. + + If the pragma can be implemented by attributes then you should + consider defining the target hook 'TARGET_INSERT_ATTRIBUTES' as + well. + + Preprocessor macros that appear on pragma lines are not expanded. + All '#pragma' directives that do not match any registered pragma + are silently ignored, unless the user specifies + '-Wunknown-pragmas'. + + -- Function: void c_register_pragma (const char *SPACE, const char + *NAME, void (*CALLBACK) (struct cpp_reader *)) + -- Function: void c_register_pragma_with_expansion (const char *SPACE, + const char *NAME, void (*CALLBACK) (struct cpp_reader *)) + + Each call to 'c_register_pragma' or + 'c_register_pragma_with_expansion' establishes one pragma. The + CALLBACK routine will be called when the preprocessor encounters a + pragma of the form + + #pragma [SPACE] NAME ... + + SPACE is the case-sensitive namespace of the pragma, or 'NULL' to + put the pragma in the global namespace. The callback routine + receives PFILE as its first argument, which can be passed on to + cpplib's functions if necessary. You can lex tokens after the NAME + by calling 'pragma_lex'. Tokens that are not read by the callback + will be silently ignored. The end of the line is indicated by a + token of type 'CPP_EOF'. Macro expansion occurs on the arguments + of pragmas registered with 'c_register_pragma_with_expansion' but + not on the arguments of pragmas registered with + 'c_register_pragma'. + + Note that the use of 'pragma_lex' is specific to the C and C++ + compilers. It will not work in the Java or Fortran compilers, or + any other language compilers for that matter. Thus if 'pragma_lex' + is going to be called from target-specific code, it must only be + done so when building the C and C++ compilers. This can be done by + defining the variables 'c_target_objs' and 'cxx_target_objs' in the + target entry in the 'config.gcc' file. These variables should name + the target-specific, language-specific object file which contains + the code that uses 'pragma_lex'. Note it will also be necessary to + add a rule to the makefile fragment pointed to by 'tmake_file' that + shows how to build this object file. + + -- Macro: HANDLE_PRAGMA_PACK_WITH_EXPANSION + Define this macro if macros should be expanded in the arguments of + '#pragma pack'. + + -- Macro: TARGET_DEFAULT_PACK_STRUCT + If your target requires a structure packing default other than 0 + (meaning the machine default), define this macro to the necessary + value (in bytes). This must be a value that would also be valid to + use with '#pragma pack()' (that is, a small power of two). + + -- Macro: DOLLARS_IN_IDENTIFIERS + Define this macro to control use of the character '$' in identifier + names for the C family of languages. 0 means '$' is not allowed by + default; 1 means it is allowed. 1 is the default; there is no need + to define this macro in that case. + + -- Macro: INSN_SETS_ARE_DELAYED (INSN) + Define this macro as a C expression that is nonzero if it is safe + for the delay slot scheduler to place instructions in the delay + slot of INSN, even if they appear to use a resource set or + clobbered in INSN. INSN is always a 'jump_insn' or an 'insn'; GCC + knows that every 'call_insn' has this behavior. On machines where + some 'insn' or 'jump_insn' is really a function call and hence has + this behavior, you should define this macro. + + You need not define this macro if it would always return zero. + + -- Macro: INSN_REFERENCES_ARE_DELAYED (INSN) + Define this macro as a C expression that is nonzero if it is safe + for the delay slot scheduler to place instructions in the delay + slot of INSN, even if they appear to set or clobber a resource + referenced in INSN. INSN is always a 'jump_insn' or an 'insn'. On + machines where some 'insn' or 'jump_insn' is really a function call + and its operands are registers whose use is actually in the + subroutine it calls, you should define this macro. Doing so allows + the delay slot scheduler to move instructions which copy arguments + into the argument registers into the delay slot of INSN. + + You need not define this macro if it would always return zero. + + -- Macro: MULTIPLE_SYMBOL_SPACES + Define this macro as a C expression that is nonzero if, in some + cases, global symbols from one translation unit may not be bound to + undefined symbols in another translation unit without user + intervention. For instance, under Microsoft Windows symbols must + be explicitly imported from shared libraries (DLLs). + + You need not define this macro if it would always evaluate to zero. + + -- Target Hook: tree TARGET_MD_ASM_CLOBBERS (tree OUTPUTS, tree INPUTS, + tree CLOBBERS) + This target hook should add to CLOBBERS 'STRING_CST' trees for any + hard regs the port wishes to automatically clobber for an asm. It + should return the result of the last 'tree_cons' used to add a + clobber. The OUTPUTS, INPUTS and CLOBBER lists are the + corresponding parameters to the asm and may be inspected to avoid + clobbering a register that is an input or output of the asm. You + can use 'tree_overlaps_hard_reg_set', declared in 'tree.h', to test + for overlap with regards to asm-declared registers. + + -- Macro: MATH_LIBRARY + Define this macro as a C string constant for the linker argument to + link in the system math library, minus the initial '"-l"', or '""' + if the target does not have a separate math library. + + You need only define this macro if the default of '"m"' is wrong. + + -- Macro: LIBRARY_PATH_ENV + Define this macro as a C string constant for the environment + variable that specifies where the linker should look for libraries. + + You need only define this macro if the default of '"LIBRARY_PATH"' + is wrong. + + -- Macro: TARGET_POSIX_IO + Define this macro if the target supports the following POSIX file + functions, access, mkdir and file locking with fcntl / F_SETLKW. + Defining 'TARGET_POSIX_IO' will enable the test coverage code to + use file locking when exiting a program, which avoids race + conditions if the program has forked. It will also create + directories at run-time for cross-profiling. + + -- Macro: MAX_CONDITIONAL_EXECUTE + + A C expression for the maximum number of instructions to execute + via conditional execution instructions instead of a branch. A + value of 'BRANCH_COST'+1 is the default if the machine does not use + cc0, and 1 if it does use cc0. + + -- Macro: IFCVT_MODIFY_TESTS (CE_INFO, TRUE_EXPR, FALSE_EXPR) + Used if the target needs to perform machine-dependent modifications + on the conditionals used for turning basic blocks into + conditionally executed code. CE_INFO points to a data structure, + 'struct ce_if_block', which contains information about the + currently processed blocks. TRUE_EXPR and FALSE_EXPR are the tests + that are used for converting the then-block and the else-block, + respectively. Set either TRUE_EXPR or FALSE_EXPR to a null pointer + if the tests cannot be converted. + + -- Macro: IFCVT_MODIFY_MULTIPLE_TESTS (CE_INFO, BB, TRUE_EXPR, + FALSE_EXPR) + Like 'IFCVT_MODIFY_TESTS', but used when converting more + complicated if-statements into conditions combined by 'and' and + 'or' operations. BB contains the basic block that contains the + test that is currently being processed and about to be turned into + a condition. + + -- Macro: IFCVT_MODIFY_INSN (CE_INFO, PATTERN, INSN) + A C expression to modify the PATTERN of an INSN that is to be + converted to conditional execution format. CE_INFO points to a + data structure, 'struct ce_if_block', which contains information + about the currently processed blocks. + + -- Macro: IFCVT_MODIFY_FINAL (CE_INFO) + A C expression to perform any final machine dependent modifications + in converting code to conditional execution. The involved basic + blocks can be found in the 'struct ce_if_block' structure that is + pointed to by CE_INFO. + + -- Macro: IFCVT_MODIFY_CANCEL (CE_INFO) + A C expression to cancel any machine dependent modifications in + converting code to conditional execution. The involved basic + blocks can be found in the 'struct ce_if_block' structure that is + pointed to by CE_INFO. + + -- Macro: IFCVT_MACHDEP_INIT (CE_INFO) + A C expression to initialize any machine specific data for + if-conversion of the if-block in the 'struct ce_if_block' structure + that is pointed to by CE_INFO. + + -- Target Hook: void TARGET_MACHINE_DEPENDENT_REORG (void) + If non-null, this hook performs a target-specific pass over the + instruction stream. The compiler will run it at all optimization + levels, just before the point at which it normally does + delayed-branch scheduling. + + The exact purpose of the hook varies from target to target. Some + use it to do transformations that are necessary for correctness, + such as laying out in-function constant pools or avoiding hardware + hazards. Others use it as an opportunity to do some + machine-dependent optimizations. + + You need not implement the hook if it has nothing to do. The + default definition is null. + + -- Target Hook: void TARGET_INIT_BUILTINS (void) + Define this hook if you have any machine-specific built-in + functions that need to be defined. It should be a function that + performs the necessary setup. + + Machine specific built-in functions can be useful to expand special + machine instructions that would otherwise not normally be generated + because they have no equivalent in the source language (for + example, SIMD vector instructions or prefetch instructions). + + To create a built-in function, call the function + 'lang_hooks.builtin_function' which is defined by the language + front end. You can use any type nodes set up by + 'build_common_tree_nodes'; only language front ends that use those + two functions will call 'TARGET_INIT_BUILTINS'. + + -- Target Hook: tree TARGET_BUILTIN_DECL (unsigned CODE, bool + INITIALIZE_P) + Define this hook if you have any machine-specific built-in + functions that need to be defined. It should be a function that + returns the builtin function declaration for the builtin function + code CODE. If there is no such builtin and it cannot be + initialized at this time if INITIALIZE_P is true the function + should return 'NULL_TREE'. If CODE is out of range the function + should return 'error_mark_node'. + + -- Target Hook: rtx TARGET_EXPAND_BUILTIN (tree EXP, rtx TARGET, rtx + SUBTARGET, enum machine_mode MODE, int IGNORE) + + Expand a call to a machine specific built-in function that was set + up by 'TARGET_INIT_BUILTINS'. EXP is the expression for the + function call; the result should go to TARGET if that is + convenient, and have mode MODE if that is convenient. SUBTARGET + may be used as the target for computing one of EXP's operands. + IGNORE is nonzero if the value is to be ignored. This function + should return the result of the call to the built-in function. + + -- Target Hook: tree TARGET_RESOLVE_OVERLOADED_BUILTIN (unsigned int + LOC, tree FNDECL, void *ARGLIST) + Select a replacement for a machine specific built-in function that + was set up by 'TARGET_INIT_BUILTINS'. This is done _before_ + regular type checking, and so allows the target to implement a + crude form of function overloading. FNDECL is the declaration of + the built-in function. ARGLIST is the list of arguments passed to + the built-in function. The result is a complete expression that + implements the operation, usually another 'CALL_EXPR'. ARGLIST + really has type 'VEC(tree,gc)*' + + -- Target Hook: tree TARGET_FOLD_BUILTIN (tree FNDECL, int N_ARGS, tree + *ARGP, bool IGNORE) + Fold a call to a machine specific built-in function that was set up + by 'TARGET_INIT_BUILTINS'. FNDECL is the declaration of the + built-in function. N_ARGS is the number of arguments passed to the + function; the arguments themselves are pointed to by ARGP. The + result is another tree, valid for both GIMPLE and GENERIC, + containing a simplified expression for the call's result. If + IGNORE is true the value will be ignored. + + -- Target Hook: bool TARGET_GIMPLE_FOLD_BUILTIN (gimple_stmt_iterator + *GSI) + Fold a call to a machine specific built-in function that was set up + by 'TARGET_INIT_BUILTINS'. GSI points to the gimple statement + holding the function call. Returns true if any change was made to + the GIMPLE stream. + + -- Target Hook: int TARGET_COMPARE_VERSION_PRIORITY (tree DECL1, tree + DECL2) + This hook is used to compare the target attributes in two functions + to determine which function's features get higher priority. This + is used during function multi-versioning to figure out the order in + which two versions must be dispatched. A function version with a + higher priority is checked for dispatching earlier. DECL1 and + DECL2 are the two function decls that will be compared. + + -- Target Hook: tree TARGET_GET_FUNCTION_VERSIONS_DISPATCHER (void + *DECL) + This hook is used to get the dispatcher function for a set of + function versions. The dispatcher function is called to invoke the + right function version at run-time. DECL is one version from a set + of semantically identical versions. + + -- Target Hook: tree TARGET_GENERATE_VERSION_DISPATCHER_BODY (void + *ARG) + This hook is used to generate the dispatcher logic to invoke the + right function version at run-time for a given set of function + versions. ARG points to the callgraph node of the dispatcher + function whose body must be generated. + + -- Target Hook: bool TARGET_CAN_USE_DOLOOP_P (double_int ITERATIONS, + double_int ITERATIONS_MAX, unsigned int LOOP_DEPTH, bool + ENTERED_AT_TOP) + Return true if it is possible to use low-overhead loops + ('doloop_end' and 'doloop_begin') for a particular loop. + ITERATIONS gives the exact number of iterations, or 0 if not known. + ITERATIONS_MAX gives the maximum number of iterations, or 0 if not + known. LOOP_DEPTH is the nesting depth of the loop, with 1 for + innermost loops, 2 for loops that contain innermost loops, and so + on. ENTERED_AT_TOP is true if the loop is only entered from the + top. + + This hook is only used if 'doloop_end' is available. The default + implementation returns true. You can use + 'can_use_doloop_if_innermost' if the loop must be the innermost, + and if there are no other restrictions. + + -- Target Hook: const char * TARGET_INVALID_WITHIN_DOLOOP (const_rtx + INSN) + + Take an instruction in INSN and return NULL if it is valid within a + low-overhead loop, otherwise return a string explaining why doloop + could not be applied. + + Many targets use special registers for low-overhead looping. For + any instruction that clobbers these this function should return a + string indicating the reason why the doloop could not be applied. + By default, the RTL loop optimizer does not use a present doloop + pattern for loops containing function calls or branch on table + instructions. + + -- Target Hook: bool TARGET_LEGITIMATE_COMBINED_INSN (rtx INSN) + Take an instruction in INSN and return 'false' if the instruction + is not appropriate as a combination of two or more instructions. + The default is to accept all instructions. + + -- Macro: MD_CAN_REDIRECT_BRANCH (BRANCH1, BRANCH2) + + Take a branch insn in BRANCH1 and another in BRANCH2. Return true + if redirecting BRANCH1 to the destination of BRANCH2 is possible. + + On some targets, branches may have a limited range. Optimizing the + filling of delay slots can result in branches being redirected, and + this may in turn cause a branch offset to overflow. + + -- Target Hook: bool TARGET_CAN_FOLLOW_JUMP (const_rtx FOLLOWER, + const_rtx FOLLOWEE) + FOLLOWER and FOLLOWEE are JUMP_INSN instructions; return true if + FOLLOWER may be modified to follow FOLLOWEE; false, if it can't. + For example, on some targets, certain kinds of branches can't be + made to follow through a hot/cold partitioning. + + -- Target Hook: bool TARGET_COMMUTATIVE_P (const_rtx X, int OUTER_CODE) + This target hook returns 'true' if X is considered to be + commutative. Usually, this is just COMMUTATIVE_P (X), but the HP + PA doesn't consider PLUS to be commutative inside a MEM. + OUTER_CODE is the rtx code of the enclosing rtl, if known, + otherwise it is UNKNOWN. + + -- Target Hook: rtx TARGET_ALLOCATE_INITIAL_VALUE (rtx HARD_REG) + + When the initial value of a hard register has been copied in a + pseudo register, it is often not necessary to actually allocate + another register to this pseudo register, because the original hard + register or a stack slot it has been saved into can be used. + 'TARGET_ALLOCATE_INITIAL_VALUE' is called at the start of register + allocation once for each hard register that had its initial value + copied by using 'get_func_hard_reg_initial_val' or + 'get_hard_reg_initial_val'. Possible values are 'NULL_RTX', if you + don't want to do any special allocation, a 'REG' rtx--that would + typically be the hard register itself, if it is known not to be + clobbered--or a 'MEM'. If you are returning a 'MEM', this is only + a hint for the allocator; it might decide to use another register + anyways. You may use 'current_function_is_leaf' or 'REG_N_SETS' in + the hook to determine if the hard register in question will not be + clobbered. The default value of this hook is 'NULL', which + disables any special allocation. + + -- Target Hook: int TARGET_UNSPEC_MAY_TRAP_P (const_rtx X, unsigned + FLAGS) + This target hook returns nonzero if X, an 'unspec' or + 'unspec_volatile' operation, might cause a trap. Targets can use + this hook to enhance precision of analysis for 'unspec' and + 'unspec_volatile' operations. You may call 'may_trap_p_1' to + analyze inner elements of X in which case FLAGS should be passed + along. + + -- Target Hook: void TARGET_SET_CURRENT_FUNCTION (tree DECL) + The compiler invokes this hook whenever it changes its current + function context ('cfun'). You can define this function if the + back end needs to perform any initialization or reset actions on a + per-function basis. For example, it may be used to implement + function attributes that affect register usage or code generation + patterns. The argument DECL is the declaration for the new + function context, and may be null to indicate that the compiler has + left a function context and is returning to processing at the top + level. The default hook function does nothing. + + GCC sets 'cfun' to a dummy function context during initialization + of some parts of the back end. The hook function is not invoked in + this situation; you need not worry about the hook being invoked + recursively, or when the back end is in a partially-initialized + state. 'cfun' might be 'NULL' to indicate processing at top level, + outside of any function scope. + + -- Macro: TARGET_OBJECT_SUFFIX + Define this macro to be a C string representing the suffix for + object files on your target machine. If you do not define this + macro, GCC will use '.o' as the suffix for object files. + + -- Macro: TARGET_EXECUTABLE_SUFFIX + Define this macro to be a C string representing the suffix to be + automatically added to executable files on your target machine. If + you do not define this macro, GCC will use the null string as the + suffix for executable files. + + -- Macro: COLLECT_EXPORT_LIST + If defined, 'collect2' will scan the individual object files + specified on its command line and create an export list for the + linker. Define this macro for systems like AIX, where the linker + discards object files that are not referenced from 'main' and uses + export lists. + + -- Macro: MODIFY_JNI_METHOD_CALL (MDECL) + Define this macro to a C expression representing a variant of the + method call MDECL, if Java Native Interface (JNI) methods must be + invoked differently from other methods on your target. For + example, on 32-bit Microsoft Windows, JNI methods must be invoked + using the 'stdcall' calling convention and this macro is then + defined as this expression: + + build_type_attribute_variant (MDECL, + build_tree_list + (get_identifier ("stdcall"), + NULL)) + + -- Target Hook: bool TARGET_CANNOT_MODIFY_JUMPS_P (void) + This target hook returns 'true' past the point in which new jump + instructions could be created. On machines that require a register + for every jump such as the SHmedia ISA of SH5, this point would + typically be reload, so this target hook should be defined to a + function such as: + + static bool + cannot_modify_jumps_past_reload_p () + { + return (reload_completed || reload_in_progress); + } + + -- Target Hook: reg_class_t TARGET_BRANCH_TARGET_REGISTER_CLASS (void) + This target hook returns a register class for which branch target + register optimizations should be applied. All registers in this + class should be usable interchangeably. After reload, registers in + this class will be re-allocated and loads will be hoisted out of + loops and be subjected to inter-block scheduling. + + -- Target Hook: bool TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED (bool + AFTER_PROLOGUE_EPILOGUE_GEN) + Branch target register optimization will by default exclude + callee-saved registers that are not already live during the current + function; if this target hook returns true, they will be included. + The target code must than make sure that all target registers in + the class returned by 'TARGET_BRANCH_TARGET_REGISTER_CLASS' that + might need saving are saved. AFTER_PROLOGUE_EPILOGUE_GEN indicates + if prologues and epilogues have already been generated. Note, even + if you only return true when AFTER_PROLOGUE_EPILOGUE_GEN is false, + you still are likely to have to make special provisions in + 'INITIAL_ELIMINATION_OFFSET' to reserve space for caller-saved + target registers. + + -- Target Hook: bool TARGET_HAVE_CONDITIONAL_EXECUTION (void) + This target hook returns true if the target supports conditional + execution. This target hook is required only when the target has + several different modes and they have different conditional + execution capability, such as ARM. + + -- Target Hook: unsigned TARGET_LOOP_UNROLL_ADJUST (unsigned NUNROLL, + struct loop *LOOP) + This target hook returns a new value for the number of times LOOP + should be unrolled. The parameter NUNROLL is the number of times + the loop is to be unrolled. The parameter LOOP is a pointer to the + loop, which is going to be checked for unrolling. This target hook + is required only when the target has special constraints like + maximum number of memory accesses. + + -- Macro: POWI_MAX_MULTS + If defined, this macro is interpreted as a signed integer C + expression that specifies the maximum number of floating point + multiplications that should be emitted when expanding + exponentiation by an integer constant inline. When this value is + defined, exponentiation requiring more than this number of + multiplications is implemented by calling the system library's + 'pow', 'powf' or 'powl' routines. The default value places no + upper bound on the multiplication count. + + -- Macro: void TARGET_EXTRA_INCLUDES (const char *SYSROOT, const char + *IPREFIX, int STDINC) + This target hook should register any extra include files for the + target. The parameter STDINC indicates if normal include files are + present. The parameter SYSROOT is the system root directory. The + parameter IPREFIX is the prefix for the gcc directory. + + -- Macro: void TARGET_EXTRA_PRE_INCLUDES (const char *SYSROOT, const + char *IPREFIX, int STDINC) + This target hook should register any extra include files for the + target before any standard headers. The parameter STDINC indicates + if normal include files are present. The parameter SYSROOT is the + system root directory. The parameter IPREFIX is the prefix for the + gcc directory. + + -- Macro: void TARGET_OPTF (char *PATH) + This target hook should register special include paths for the + target. The parameter PATH is the include to register. On Darwin + systems, this is used for Framework includes, which have semantics + that are different from '-I'. + + -- Macro: bool TARGET_USE_LOCAL_THUNK_ALIAS_P (tree FNDECL) + This target macro returns 'true' if it is safe to use a local alias + for a virtual function FNDECL when constructing thunks, 'false' + otherwise. By default, the macro returns 'true' for all functions, + if a target supports aliases (i.e. defines 'ASM_OUTPUT_DEF'), + 'false' otherwise, + + -- Macro: TARGET_FORMAT_TYPES + If defined, this macro is the name of a global variable containing + target-specific format checking information for the '-Wformat' + option. The default is to have no target-specific format checks. + + -- Macro: TARGET_N_FORMAT_TYPES + If defined, this macro is the number of entries in + 'TARGET_FORMAT_TYPES'. + + -- Macro: TARGET_OVERRIDES_FORMAT_ATTRIBUTES + If defined, this macro is the name of a global variable containing + target-specific format overrides for the '-Wformat' option. The + default is to have no target-specific format overrides. If + defined, 'TARGET_FORMAT_TYPES' must be defined, too. + + -- Macro: TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT + If defined, this macro specifies the number of entries in + 'TARGET_OVERRIDES_FORMAT_ATTRIBUTES'. + + -- Macro: TARGET_OVERRIDES_FORMAT_INIT + If defined, this macro specifies the optional initialization + routine for target specific customizations of the system printf and + scanf formatter settings. + + -- Target Hook: bool TARGET_RELAXED_ORDERING + If set to 'true', means that the target's memory model does not + guarantee that loads which do not depend on one another will access + main memory in the order of the instruction stream; if ordering is + important, an explicit memory barrier must be used. This is true + of many recent processors which implement a policy of "relaxed," + "weak," or "release" memory consistency, such as Alpha, PowerPC, + and ia64. The default is 'false'. + + -- Target Hook: const char * TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN + (const_tree TYPELIST, const_tree FUNCDECL, const_tree VAL) + If defined, this macro returns the diagnostic message when it is + illegal to pass argument VAL to function FUNCDECL with prototype + TYPELIST. + + -- Target Hook: const char * TARGET_INVALID_CONVERSION (const_tree + FROMTYPE, const_tree TOTYPE) + If defined, this macro returns the diagnostic message when it is + invalid to convert from FROMTYPE to TOTYPE, or 'NULL' if validity + should be determined by the front end. + + -- Target Hook: const char * TARGET_INVALID_UNARY_OP (int OP, + const_tree TYPE) + If defined, this macro returns the diagnostic message when it is + invalid to apply operation OP (where unary plus is denoted by + 'CONVERT_EXPR') to an operand of type TYPE, or 'NULL' if validity + should be determined by the front end. + + -- Target Hook: const char * TARGET_INVALID_BINARY_OP (int OP, + const_tree TYPE1, const_tree TYPE2) + If defined, this macro returns the diagnostic message when it is + invalid to apply operation OP to operands of types TYPE1 and TYPE2, + or 'NULL' if validity should be determined by the front end. + + -- Target Hook: const char * TARGET_INVALID_PARAMETER_TYPE (const_tree + TYPE) + If defined, this macro returns the diagnostic message when it is + invalid for functions to include parameters of type TYPE, or 'NULL' + if validity should be determined by the front end. This is + currently used only by the C and C++ front ends. + + -- Target Hook: const char * TARGET_INVALID_RETURN_TYPE (const_tree + TYPE) + If defined, this macro returns the diagnostic message when it is + invalid for functions to have return type TYPE, or 'NULL' if + validity should be determined by the front end. This is currently + used only by the C and C++ front ends. + + -- Target Hook: tree TARGET_PROMOTED_TYPE (const_tree TYPE) + If defined, this target hook returns the type to which values of + TYPE should be promoted when they appear in expressions, analogous + to the integer promotions, or 'NULL_TREE' to use the front end's + normal promotion rules. This hook is useful when there are + target-specific types with special promotion rules. This is + currently used only by the C and C++ front ends. + + -- Target Hook: tree TARGET_CONVERT_TO_TYPE (tree TYPE, tree EXPR) + If defined, this hook returns the result of converting EXPR to + TYPE. It should return the converted expression, or 'NULL_TREE' to + apply the front end's normal conversion rules. This hook is useful + when there are target-specific types with special conversion rules. + This is currently used only by the C and C++ front ends. + + -- Macro: TARGET_USE_JCR_SECTION + This macro determines whether to use the JCR section to register + Java classes. By default, TARGET_USE_JCR_SECTION is defined to 1 + if both SUPPORTS_WEAK and TARGET_HAVE_NAMED_SECTIONS are true, else + 0. + + -- Macro: OBJC_JBLEN + This macro determines the size of the objective C jump buffer for + the NeXT runtime. By default, OBJC_JBLEN is defined to an + innocuous value. + + -- Macro: LIBGCC2_UNWIND_ATTRIBUTE + Define this macro if any target-specific attributes need to be + attached to the functions in 'libgcc' that provide low-level + support for call stack unwinding. It is used in declarations in + 'unwind-generic.h' and the associated definitions of those + functions. + + -- Target Hook: void TARGET_UPDATE_STACK_BOUNDARY (void) + Define this macro to update the current function stack boundary if + necessary. + + -- Target Hook: rtx TARGET_GET_DRAP_RTX (void) + This hook should return an rtx for Dynamic Realign Argument Pointer + (DRAP) if a different argument pointer register is needed to access + the function's argument list due to stack realignment. Return + 'NULL' if no DRAP is needed. + + -- Target Hook: bool TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS (void) + When optimization is disabled, this hook indicates whether or not + arguments should be allocated to stack slots. Normally, GCC + allocates stacks slots for arguments when not optimizing in order + to make debugging easier. However, when a function is declared + with '__attribute__((naked))', there is no stack frame, and the + compiler cannot safely move arguments from the registers in which + they are passed to the stack. Therefore, this hook should return + true in general, but false for naked functions. The default + implementation always returns true. + + -- Target Hook: unsigned HOST_WIDE_INT TARGET_CONST_ANCHOR + On some architectures it can take multiple instructions to + synthesize a constant. If there is another constant already in a + register that is close enough in value then it is preferable that + the new constant is computed from this register using immediate + addition or subtraction. We accomplish this through CSE. Besides + the value of the constant we also add a lower and an upper constant + anchor to the available expressions. These are then queried when + encountering new constants. The anchors are computed by rounding + the constant up and down to a multiple of the value of + 'TARGET_CONST_ANCHOR'. 'TARGET_CONST_ANCHOR' should be the maximum + positive value accepted by immediate-add plus one. We currently + assume that the value of 'TARGET_CONST_ANCHOR' is a power of 2. + For example, on MIPS, where add-immediate takes a 16-bit signed + value, 'TARGET_CONST_ANCHOR' is set to '0x8000'. The default value + is zero, which disables this optimization. + + -- Target Hook: unsigned HOST_WIDE_INT TARGET_ASAN_SHADOW_OFFSET (void) + Return the offset bitwise ored into shifted address to get + corresponding Address Sanitizer shadow memory address. NULL if + Address Sanitizer is not supported by the target. + + -- Target Hook: unsigned HOST_WIDE_INT TARGET_MEMMODEL_CHECK (unsigned + HOST_WIDE_INT VAL) + Validate target specific memory model mask bits. When NULL no + target specific memory model bits are allowed. + + -- Target Hook: unsigned char TARGET_ATOMIC_TEST_AND_SET_TRUEVAL + This value should be set if the result written by + 'atomic_test_and_set' is not exactly 1, i.e. the 'bool' 'true'. + + -- Target Hook: bool TARGET_HAS_IFUNC_P (void) + It returns true if the target supports GNU indirect functions. The + support includes the assembler, linker and dynamic linker. The + default value of this hook is based on target's libc. + + -- Target Hook: unsigned int TARGET_ATOMIC_ALIGN_FOR_MODE (enum + machine_mode MODE) + If defined, this function returns an appropriate alignment in bits + for an atomic object of machine_mode MODE. If 0 is returned then + the default alignment for the specified mode is used. + + -- Target Hook: void TARGET_ATOMIC_ASSIGN_EXPAND_FENV (tree *HOLD, tree + *CLEAR, tree *UPDATE) + ISO C11 requires atomic compound assignments that may raise + floating-point exceptions to raise exceptions corresponding to the + arithmetic operation whose result was successfully stored in a + compare-and-exchange sequence. This requires code equivalent to + calls to 'feholdexcept', 'feclearexcept' and 'feupdateenv' to be + generated at appropriate points in the compare-and-exchange + sequence. This hook should set '*HOLD' to an expression equivalent + to the call to 'feholdexcept', '*CLEAR' to an expression equivalent + to the call to 'feclearexcept' and '*UPDATE' to an expression + equivalent to the call to 'feupdateenv'. The three expressions are + 'NULL_TREE' on entry to the hook and may be left as 'NULL_TREE' if + no code is required in a particular place. The default + implementation leaves all three expressions as 'NULL_TREE'. The + '__atomic_feraiseexcept' function from 'libatomic' may be of use as + part of the code generated in '*UPDATE'. + + +File: gccint.info, Node: Host Config, Next: Fragments, Prev: Target Macros, Up: Top + +18 Host Configuration +********************* + +Most details about the machine and system on which the compiler is +actually running are detected by the 'configure' script. Some things +are impossible for 'configure' to detect; these are described in two +ways, either by macros defined in a file named 'xm-MACHINE.h' or by hook +functions in the file specified by the OUT_HOST_HOOK_OBJ variable in +'config.gcc'. (The intention is that very few hosts will need a header +file but nearly every fully supported host will need to override some +hooks.) + + If you need to define only a few macros, and they have simple +definitions, consider using the 'xm_defines' variable in your +'config.gcc' entry instead of creating a host configuration header. +*Note System Config::. + +* Menu: + +* Host Common:: Things every host probably needs implemented. +* Filesystem:: Your host can't have the letter 'a' in filenames? +* Host Misc:: Rare configuration options for hosts. + + +File: gccint.info, Node: Host Common, Next: Filesystem, Up: Host Config + +18.1 Host Common +================ + +Some things are just not portable, even between similar operating +systems, and are too difficult for autoconf to detect. They get +implemented using hook functions in the file specified by the +HOST_HOOK_OBJ variable in 'config.gcc'. + + -- Host Hook: void HOST_HOOKS_EXTRA_SIGNALS (void) + This host hook is used to set up handling for extra signals. The + most common thing to do in this hook is to detect stack overflow. + + -- Host Hook: void * HOST_HOOKS_GT_PCH_GET_ADDRESS (size_t SIZE, int + FD) + This host hook returns the address of some space that is likely to + be free in some subsequent invocation of the compiler. We intend + to load the PCH data at this address such that the data need not be + relocated. The area should be able to hold SIZE bytes. If the + host uses 'mmap', FD is an open file descriptor that can be used + for probing. + + -- Host Hook: int HOST_HOOKS_GT_PCH_USE_ADDRESS (void * ADDRESS, size_t + SIZE, int FD, size_t OFFSET) + This host hook is called when a PCH file is about to be loaded. We + want to load SIZE bytes from FD at OFFSET into memory at ADDRESS. + The given address will be the result of a previous invocation of + 'HOST_HOOKS_GT_PCH_GET_ADDRESS'. Return -1 if we couldn't allocate + SIZE bytes at ADDRESS. Return 0 if the memory is allocated but the + data is not loaded. Return 1 if the hook has performed everything. + + If the implementation uses reserved address space, free any + reserved space beyond SIZE, regardless of the return value. If no + PCH will be loaded, this hook may be called with SIZE zero, in + which case all reserved address space should be freed. + + Do not try to handle values of ADDRESS that could not have been + returned by this executable; just return -1. Such values usually + indicate an out-of-date PCH file (built by some other GCC + executable), and such a PCH file won't work. + + -- Host Hook: size_t HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY (void); + This host hook returns the alignment required for allocating + virtual memory. Usually this is the same as getpagesize, but on + some hosts the alignment for reserving memory differs from the + pagesize for committing memory. + + +File: gccint.info, Node: Filesystem, Next: Host Misc, Prev: Host Common, Up: Host Config + +18.2 Host Filesystem +==================== + +GCC needs to know a number of things about the semantics of the host +machine's filesystem. Filesystems with Unix and MS-DOS semantics are +automatically detected. For other systems, you can define the following +macros in 'xm-MACHINE.h'. + +'HAVE_DOS_BASED_FILE_SYSTEM' + This macro is automatically defined by 'system.h' if the host file + system obeys the semantics defined by MS-DOS instead of Unix. DOS + file systems are case insensitive, file specifications may begin + with a drive letter, and both forward slash and backslash ('/' and + '\') are directory separators. + +'DIR_SEPARATOR' +'DIR_SEPARATOR_2' + If defined, these macros expand to character constants specifying + separators for directory names within a file specification. + 'system.h' will automatically give them appropriate values on Unix + and MS-DOS file systems. If your file system is neither of these, + define one or both appropriately in 'xm-MACHINE.h'. + + However, operating systems like VMS, where constructing a pathname + is more complicated than just stringing together directory names + separated by a special character, should not define either of these + macros. + +'PATH_SEPARATOR' + If defined, this macro should expand to a character constant + specifying the separator for elements of search paths. The default + value is a colon (':'). DOS-based systems usually, but not always, + use semicolon (';'). + +'VMS' + Define this macro if the host system is VMS. + +'HOST_OBJECT_SUFFIX' + Define this macro to be a C string representing the suffix for + object files on your host machine. If you do not define this + macro, GCC will use '.o' as the suffix for object files. + +'HOST_EXECUTABLE_SUFFIX' + Define this macro to be a C string representing the suffix for + executable files on your host machine. If you do not define this + macro, GCC will use the null string as the suffix for executable + files. + +'HOST_BIT_BUCKET' + A pathname defined by the host operating system, which can be + opened as a file and written to, but all the information written is + discarded. This is commonly known as a "bit bucket" or "null + device". If you do not define this macro, GCC will use '/dev/null' + as the bit bucket. If the host does not support a bit bucket, + define this macro to an invalid filename. + +'UPDATE_PATH_HOST_CANONICALIZE (PATH)' + If defined, a C statement (sans semicolon) that performs + host-dependent canonicalization when a path used in a compilation + driver or preprocessor is canonicalized. PATH is a malloc-ed path + to be canonicalized. If the C statement does canonicalize PATH + into a different buffer, the old path should be freed and the new + buffer should have been allocated with malloc. + +'DUMPFILE_FORMAT' + Define this macro to be a C string representing the format to use + for constructing the index part of debugging dump file names. The + resultant string must fit in fifteen bytes. The full filename will + be the concatenation of: the prefix of the assembler file name, the + string resulting from applying this format to an index number, and + a string unique to each dump file kind, e.g. 'rtl'. + + If you do not define this macro, GCC will use '.%02d.'. You should + define this macro if using the default will create an invalid file + name. + +'DELETE_IF_ORDINARY' + Define this macro to be a C statement (sans semicolon) that + performs host-dependent removal of ordinary temp files in the + compilation driver. + + If you do not define this macro, GCC will use the default version. + You should define this macro if the default version does not + reliably remove the temp file as, for example, on VMS which allows + multiple versions of a file. + +'HOST_LACKS_INODE_NUMBERS' + Define this macro if the host filesystem does not report meaningful + inode numbers in struct stat. + + +File: gccint.info, Node: Host Misc, Prev: Filesystem, Up: Host Config + +18.3 Host Misc +============== + +'FATAL_EXIT_CODE' + A C expression for the status code to be returned when the compiler + exits after serious errors. The default is the system-provided + macro 'EXIT_FAILURE', or '1' if the system doesn't define that + macro. Define this macro only if these defaults are incorrect. + +'SUCCESS_EXIT_CODE' + A C expression for the status code to be returned when the compiler + exits without serious errors. (Warnings are not serious errors.) + The default is the system-provided macro 'EXIT_SUCCESS', or '0' if + the system doesn't define that macro. Define this macro only if + these defaults are incorrect. + +'USE_C_ALLOCA' + Define this macro if GCC should use the C implementation of + 'alloca' provided by 'libiberty.a'. This only affects how some + parts of the compiler itself allocate memory. It does not change + code generation. + + When GCC is built with a compiler other than itself, the C 'alloca' + is always used. This is because most other implementations have + serious bugs. You should define this macro only on a system where + no stack-based 'alloca' can possibly work. For instance, if a + system has a small limit on the size of the stack, GCC's builtin + 'alloca' will not work reliably. + +'COLLECT2_HOST_INITIALIZATION' + If defined, a C statement (sans semicolon) that performs + host-dependent initialization when 'collect2' is being initialized. + +'GCC_DRIVER_HOST_INITIALIZATION' + If defined, a C statement (sans semicolon) that performs + host-dependent initialization when a compilation driver is being + initialized. + +'HOST_LONG_LONG_FORMAT' + If defined, the string used to indicate an argument of type 'long + long' to functions like 'printf'. The default value is '"ll"'. + +'HOST_LONG_FORMAT' + If defined, the string used to indicate an argument of type 'long' + to functions like 'printf'. The default value is '"l"'. + +'HOST_PTR_PRINTF' + If defined, the string used to indicate an argument of type 'void + *' to functions like 'printf'. The default value is '"%p"'. + + In addition, if 'configure' generates an incorrect definition of any of +the macros in 'auto-host.h', you can override that definition in a host +configuration header. If you need to do this, first see if it is +possible to fix 'configure'. + + +File: gccint.info, Node: Fragments, Next: Collect2, Prev: Host Config, Up: Top + +19 Makefile Fragments +********************* + +When you configure GCC using the 'configure' script, it will construct +the file 'Makefile' from the template file 'Makefile.in'. When it does +this, it can incorporate makefile fragments from the 'config' directory. +These are used to set Makefile parameters that are not amenable to being +calculated by autoconf. The list of fragments to incorporate is set by +'config.gcc' (and occasionally 'config.build' and 'config.host'); *Note +System Config::. + + Fragments are named either 't-TARGET' or 'x-HOST', depending on whether +they are relevant to configuring GCC to produce code for a particular +target, or to configuring GCC to run on a particular host. Here TARGET +and HOST are mnemonics which usually have some relationship to the +canonical system name, but no formal connection. + + If these files do not exist, it means nothing needs to be added for a +given target or host. Most targets need a few 't-TARGET' fragments, but +needing 'x-HOST' fragments is rare. + +* Menu: + +* Target Fragment:: Writing 't-TARGET' files. +* Host Fragment:: Writing 'x-HOST' files. + + +File: gccint.info, Node: Target Fragment, Next: Host Fragment, Up: Fragments + +19.1 Target Makefile Fragments +============================== + +Target makefile fragments can set these Makefile variables. + +'LIBGCC2_CFLAGS' + Compiler flags to use when compiling 'libgcc2.c'. + +'LIB2FUNCS_EXTRA' + A list of source file names to be compiled or assembled and + inserted into 'libgcc.a'. + +'CRTSTUFF_T_CFLAGS' + Special flags used when compiling 'crtstuff.c'. *Note + Initialization::. + +'CRTSTUFF_T_CFLAGS_S' + Special flags used when compiling 'crtstuff.c' for shared linking. + Used if you use 'crtbeginS.o' and 'crtendS.o' in 'EXTRA-PARTS'. + *Note Initialization::. + +'MULTILIB_OPTIONS' + For some targets, invoking GCC in different ways produces objects + that can not be linked together. For example, for some targets GCC + produces both big and little endian code. For these targets, you + must arrange for multiple versions of 'libgcc.a' to be compiled, + one for each set of incompatible options. When GCC invokes the + linker, it arranges to link in the right version of 'libgcc.a', + based on the command line options used. + + The 'MULTILIB_OPTIONS' macro lists the set of options for which + special versions of 'libgcc.a' must be built. Write options that + are mutually incompatible side by side, separated by a slash. + Write options that may be used together separated by a space. The + build procedure will build all combinations of compatible options. + + For example, if you set 'MULTILIB_OPTIONS' to 'm68000/m68020 + msoft-float', 'Makefile' will build special versions of 'libgcc.a' + using the following sets of options: '-m68000', '-m68020', + '-msoft-float', '-m68000 -msoft-float', and '-m68020 -msoft-float'. + +'MULTILIB_DIRNAMES' + If 'MULTILIB_OPTIONS' is used, this variable specifies the + directory names that should be used to hold the various libraries. + Write one element in 'MULTILIB_DIRNAMES' for each element in + 'MULTILIB_OPTIONS'. If 'MULTILIB_DIRNAMES' is not used, the + default value will be 'MULTILIB_OPTIONS', with all slashes treated + as spaces. + + 'MULTILIB_DIRNAMES' describes the multilib directories using GCC + conventions and is applied to directories that are part of the GCC + installation. When multilib-enabled, the compiler will add a + subdirectory of the form PREFIX/MULTILIB before each directory in + the search path for libraries and crt files. + + For example, if 'MULTILIB_OPTIONS' is set to 'm68000/m68020 + msoft-float', then the default value of 'MULTILIB_DIRNAMES' is + 'm68000 m68020 msoft-float'. You may specify a different value if + you desire a different set of directory names. + +'MULTILIB_MATCHES' + Sometimes the same option may be written in two different ways. If + an option is listed in 'MULTILIB_OPTIONS', GCC needs to know about + any synonyms. In that case, set 'MULTILIB_MATCHES' to a list of + items of the form 'option=option' to describe all relevant + synonyms. For example, 'm68000=mc68000 m68020=mc68020'. + +'MULTILIB_EXCEPTIONS' + Sometimes when there are multiple sets of 'MULTILIB_OPTIONS' being + specified, there are combinations that should not be built. In + that case, set 'MULTILIB_EXCEPTIONS' to be all of the switch + exceptions in shell case syntax that should not be built. + + For example the ARM processor cannot execute both hardware floating + point instructions and the reduced size THUMB instructions at the + same time, so there is no need to build libraries with both of + these options enabled. Therefore 'MULTILIB_EXCEPTIONS' is set to: + *mthumb/*mhard-float* + +'MULTILIB_REQUIRED' + Sometimes when there are only a few combinations are required, it + would be a big effort to come up with a 'MULTILIB_EXCEPTIONS' list + to cover all undesired ones. In such a case, just listing all the + required combinations in 'MULTILIB_REQUIRED' would be more + straightforward. + + The way to specify the entries in 'MULTILIB_REQUIRED' is same with + the way used for 'MULTILIB_EXCEPTIONS', only this time what are + required will be specified. Suppose there are multiple sets of + 'MULTILIB_OPTIONS' and only two combinations are required, one for + ARMv7-M and one for ARMv7-R with hard floating-point ABI and FPU, + the 'MULTILIB_REQUIRED' can be set to: + MULTILIB_REQUIRED = mthumb/march=armv7-m + MULTILIB_REQUIRED += march=armv7-r/mfloat-abi=hard/mfpu=vfpv3-d16 + + The 'MULTILIB_REQUIRED' can be used together with + 'MULTILIB_EXCEPTIONS'. The option combinations generated from + 'MULTILIB_OPTIONS' will be filtered by 'MULTILIB_EXCEPTIONS' and + then by 'MULTILIB_REQUIRED'. + +'MULTILIB_REUSE' + Sometimes it is desirable to reuse one existing multilib for + different sets of options. Such kind of reuse can minimize the + number of multilib variants. And for some targets it is better to + reuse an existing multilib than to fall back to default multilib + when there is no corresponding multilib. This can be done by + adding reuse rules to 'MULTILIB_REUSE'. + + A reuse rule is comprised of two parts connected by equality sign. + The left part is option set used to build multilib and the right + part is option set that will reuse this multilib. The order of + options in the left part matters and should be same with those + specified in 'MULTILIB_REQUIRED' or aligned with order in + 'MULTILIB_OPTIONS'. There is no such limitation for options in + right part as we don't build multilib from them. But the equality + sign in both parts should be replaced with period. + + The 'MULTILIB_REUSE' is different from 'MULTILIB_MATCHES' in that + it sets up relations between two option sets rather than two + options. Here is an example to demo how we reuse libraries built + in Thumb mode for applications built in ARM mode: + MULTILIB_REUSE = mthumb/march.armv7-r=marm/march.armv7-r + + Before the advent of 'MULTILIB_REUSE', GCC select multilib by + comparing command line options with options used to build multilib. + The 'MULTILIB_REUSE' is complementary to that way. Only when the + original comparison matches nothing it will work to see if it is OK + to reuse some existing multilib. + +'MULTILIB_EXTRA_OPTS' + Sometimes it is desirable that when building multiple versions of + 'libgcc.a' certain options should always be passed on to the + compiler. In that case, set 'MULTILIB_EXTRA_OPTS' to be the list + of options to be used for all builds. If you set this, you should + probably set 'CRTSTUFF_T_CFLAGS' to a dash followed by it. + +'MULTILIB_OSDIRNAMES' + If 'MULTILIB_OPTIONS' is used, this variable specifies a list of + subdirectory names, that are used to modify the search path + depending on the chosen multilib. Unlike 'MULTILIB_DIRNAMES', + 'MULTILIB_OSDIRNAMES' describes the multilib directories using + operating systems conventions, and is applied to the directories + such as 'lib' or those in the 'LIBRARY_PATH' environment variable. + The format is either the same as of 'MULTILIB_DIRNAMES', or a set + of mappings. When it is the same as 'MULTILIB_DIRNAMES', it + describes the multilib directories using operating system + conventions, rather than GCC conventions. When it is a set of + mappings of the form GCCDIR=OSDIR, the left side gives the GCC + convention and the right gives the equivalent OS defined location. + If the OSDIR part begins with a '!', GCC will not search in the + non-multilib directory and use exclusively the multilib directory. + Otherwise, the compiler will examine the search path for libraries + and crt files twice; the first time it will add MULTILIB to each + directory in the search path, the second it will not. + + For configurations that support both multilib and multiarch, + 'MULTILIB_OSDIRNAMES' also encodes the multiarch name, thus + subsuming 'MULTIARCH_DIRNAME'. The multiarch name is appended to + each directory name, separated by a colon (e.g. + '../lib32:i386-linux-gnu'). + + Each multiarch subdirectory will be searched before the + corresponding OS multilib directory, for example + '/lib/i386-linux-gnu' before '/lib/../lib32'. The multiarch name + will also be used to modify the system header search path, as + explained for 'MULTIARCH_DIRNAME'. + +'MULTIARCH_DIRNAME' + This variable specifies the multiarch name for configurations that + are multiarch-enabled but not multilibbed configurations. + + The multiarch name is used to augment the search path for + libraries, crt files and system header files with additional + locations. The compiler will add a multiarch subdirectory of the + form PREFIX/MULTIARCH before each directory in the library and crt + search path. It will also add two directories + 'LOCAL_INCLUDE_DIR'/MULTIARCH and + 'NATIVE_SYSTEM_HEADER_DIR'/MULTIARCH) to the system header search + path, respectively before 'LOCAL_INCLUDE_DIR' and + 'NATIVE_SYSTEM_HEADER_DIR'. + + 'MULTIARCH_DIRNAME' is not used for configurations that support + both multilib and multiarch. In that case, multiarch names are + encoded in 'MULTILIB_OSDIRNAMES' instead. + + More documentation about multiarch can be found at + <http://wiki.debian.org/Multiarch>. + +'SPECS' + Unfortunately, setting 'MULTILIB_EXTRA_OPTS' is not enough, since + it does not affect the build of target libraries, at least not the + build of the default multilib. One possible work-around is to use + 'DRIVER_SELF_SPECS' to bring options from the 'specs' file as if + they had been passed in the compiler driver command line. However, + you don't want to be adding these options after the toolchain is + installed, so you can instead tweak the 'specs' file that will be + used during the toolchain build, while you still install the + original, built-in 'specs'. The trick is to set 'SPECS' to some + other filename (say 'specs.install'), that will then be created out + of the built-in specs, and introduce a 'Makefile' rule to generate + the 'specs' file that's going to be used at build time out of your + 'specs.install'. + +'T_CFLAGS' + These are extra flags to pass to the C compiler. They are used + both when building GCC, and when compiling things with the + just-built GCC. This variable is deprecated and should not be + used. + + +File: gccint.info, Node: Host Fragment, Prev: Target Fragment, Up: Fragments + +19.2 Host Makefile Fragments +============================ + +The use of 'x-HOST' fragments is discouraged. You should only use it +for makefile dependencies. + + +File: gccint.info, Node: Collect2, Next: Header Dirs, Prev: Fragments, Up: Top + +20 'collect2' +************* + +GCC uses a utility called 'collect2' on nearly all systems to arrange to +call various initialization functions at start time. + + The program 'collect2' works by linking the program once and looking +through the linker output file for symbols with particular names +indicating they are constructor functions. If it finds any, it creates +a new temporary '.c' file containing a table of them, compiles it, and +links the program a second time including that file. + + The actual calls to the constructors are carried out by a subroutine +called '__main', which is called (automatically) at the beginning of the +body of 'main' (provided 'main' was compiled with GNU CC). Calling +'__main' is necessary, even when compiling C code, to allow linking C +and C++ object code together. (If you use '-nostdlib', you get an +unresolved reference to '__main', since it's defined in the standard GCC +library. Include '-lgcc' at the end of your compiler command line to +resolve this reference.) + + The program 'collect2' is installed as 'ld' in the directory where the +passes of the compiler are installed. When 'collect2' needs to find the +_real_ 'ld', it tries the following file names: + + * a hard coded linker file name, if GCC was configured with the + '--with-ld' option. + + * 'real-ld' in the directories listed in the compiler's search + directories. + + * 'real-ld' in the directories listed in the environment variable + 'PATH'. + + * The file specified in the 'REAL_LD_FILE_NAME' configuration macro, + if specified. + + * 'ld' in the compiler's search directories, except that 'collect2' + will not execute itself recursively. + + * 'ld' in 'PATH'. + + "The compiler's search directories" means all the directories where +'gcc' searches for passes of the compiler. This includes directories +that you specify with '-B'. + + Cross-compilers search a little differently: + + * 'real-ld' in the compiler's search directories. + + * 'TARGET-real-ld' in 'PATH'. + + * The file specified in the 'REAL_LD_FILE_NAME' configuration macro, + if specified. + + * 'ld' in the compiler's search directories. + + * 'TARGET-ld' in 'PATH'. + + 'collect2' explicitly avoids running 'ld' using the file name under +which 'collect2' itself was invoked. In fact, it remembers up a list of +such names--in case one copy of 'collect2' finds another copy (or +version) of 'collect2' installed as 'ld' in a second place in the search +path. + + 'collect2' searches for the utilities 'nm' and 'strip' using the same +algorithm as above for 'ld'. + + +File: gccint.info, Node: Header Dirs, Next: Type Information, Prev: Collect2, Up: Top + +21 Standard Header File Directories +*********************************** + +'GCC_INCLUDE_DIR' means the same thing for native and cross. It is +where GCC stores its private include files, and also where GCC stores +the fixed include files. A cross compiled GCC runs 'fixincludes' on the +header files in '$(tooldir)/include'. (If the cross compilation header +files need to be fixed, they must be installed before GCC is built. If +the cross compilation header files are already suitable for GCC, nothing +special need be done). + + 'GPLUSPLUS_INCLUDE_DIR' means the same thing for native and cross. It +is where 'g++' looks first for header files. The C++ library installs +only target independent header files in that directory. + + 'LOCAL_INCLUDE_DIR' is used only by native compilers. GCC doesn't +install anything there. It is normally '/usr/local/include'. This is +where local additions to a packaged system should place header files. + + 'CROSS_INCLUDE_DIR' is used only by cross compilers. GCC doesn't +install anything there. + + 'TOOL_INCLUDE_DIR' is used for both native and cross compilers. It is +the place for other packages to install header files that GCC will use. +For a cross-compiler, this is the equivalent of '/usr/include'. When +you build a cross-compiler, 'fixincludes' processes any header files in +this directory. + + +File: gccint.info, Node: Type Information, Next: Plugins, Prev: Header Dirs, Up: Top + +22 Memory Management and Type Information +***************************************** + +GCC uses some fairly sophisticated memory management techniques, which +involve determining information about GCC's data structures from GCC's +source code and using this information to perform garbage collection and +implement precompiled headers. + + A full C++ parser would be too complicated for this task, so a limited +subset of C++ is interpreted and special markers are used to determine +what parts of the source to look at. All 'struct', 'union' and +'template' structure declarations that define data structures that are +allocated under control of the garbage collector must be marked. All +global variables that hold pointers to garbage-collected memory must +also be marked. Finally, all global variables that need to be saved and +restored by a precompiled header must be marked. (The precompiled +header mechanism can only save static variables if they're scalar. +Complex data structures must be allocated in garbage-collected memory to +be saved in a precompiled header.) + + The full format of a marker is + GTY (([OPTION] [(PARAM)], [OPTION] [(PARAM)] ...)) +but in most cases no options are needed. The outer double parentheses +are still necessary, though: 'GTY(())'. Markers can appear: + + * In a structure definition, before the open brace; + * In a global variable declaration, after the keyword 'static' or + 'extern'; and + * In a structure field definition, before the name of the field. + + Here are some examples of marking simple data structures and globals. + + struct GTY(()) TAG + { + FIELDS... + }; + + typedef struct GTY(()) TAG + { + FIELDS... + } *TYPENAME; + + static GTY(()) struct TAG *LIST; /* points to GC memory */ + static GTY(()) int COUNTER; /* save counter in a PCH */ + + The parser understands simple typedefs such as 'typedef struct TAG +*NAME;' and 'typedef int NAME;'. These don't need to be marked. + + Since 'gengtype''s understanding of C++ is limited, there are several +constructs and declarations that are not supported inside +classes/structures marked for automatic GC code generation. The +following C++ constructs produce a 'gengtype' error on +structures/classes marked for automatic GC code generation: + + * Type definitions inside classes/structures are not supported. + * Enumerations inside classes/structures are not supported. + + If you have a class or structure using any of the above constructs, you +need to mark that class as 'GTY ((user))' and provide your own marking +routines (see section *note User GC:: for details). + + It is always valid to include function definitions inside classes. +Those are always ignored by 'gengtype', as it only cares about data +members. + +* Menu: + +* GTY Options:: What goes inside a 'GTY(())'. +* Inheritance and GTY:: Adding GTY to a class hierarchy. +* User GC:: Adding user-provided GC marking routines. +* GGC Roots:: Making global variables GGC roots. +* Files:: How the generated files work. +* Invoking the garbage collector:: How to invoke the garbage collector. +* Troubleshooting:: When something does not work as expected. + + +File: gccint.info, Node: GTY Options, Next: Inheritance and GTY, Up: Type Information + +22.1 The Inside of a 'GTY(())' +============================== + +Sometimes the C code is not enough to fully describe the type structure. +Extra information can be provided with 'GTY' options and additional +markers. Some options take a parameter, which may be either a string or +a type name, depending on the parameter. If an option takes no +parameter, it is acceptable either to omit the parameter entirely, or to +provide an empty string as a parameter. For example, 'GTY ((skip))' and +'GTY ((skip ("")))' are equivalent. + + When the parameter is a string, often it is a fragment of C code. Four +special escapes may be used in these strings, to refer to pieces of the +data structure being marked: + +'%h' + The current structure. +'%1' + The structure that immediately contains the current structure. +'%0' + The outermost structure that contains the current structure. +'%a' + A partial expression of the form '[i1][i2]...' that indexes the + array item currently being marked. + + For instance, suppose that you have a structure of the form + struct A { + ... + }; + struct B { + struct A foo[12]; + }; +and 'b' is a variable of type 'struct B'. When marking 'b.foo[11]', +'%h' would expand to 'b.foo[11]', '%0' and '%1' would both expand to +'b', and '%a' would expand to '[11]'. + + As in ordinary C, adjacent strings will be concatenated; this is +helpful when you have a complicated expression. + GTY ((chain_next ("TREE_CODE (&%h.generic) == INTEGER_TYPE" + " ? TYPE_NEXT_VARIANT (&%h.generic)" + " : TREE_CHAIN (&%h.generic)"))) + + The available options are: + +'length ("EXPRESSION")' + + There are two places the type machinery will need to be explicitly + told the length of an array of non-atomic objects. The first case + is when a structure ends in a variable-length array, like this: + struct GTY(()) rtvec_def { + int num_elem; /* number of elements */ + rtx GTY ((length ("%h.num_elem"))) elem[1]; + }; + + In this case, the 'length' option is used to override the specified + array length (which should usually be '1'). The parameter of the + option is a fragment of C code that calculates the length. + + The second case is when a structure or a global variable contains a + pointer to an array, like this: + struct gimple_omp_for_iter * GTY((length ("%h.collapse"))) iter; + In this case, 'iter' has been allocated by writing something like + x->iter = ggc_alloc_cleared_vec_gimple_omp_for_iter (collapse); + and the 'collapse' provides the length of the field. + + This second use of 'length' also works on global variables, like: + static GTY((length("reg_known_value_size"))) rtx *reg_known_value; + + Note that the 'length' option is only meant for use with arrays of + non-atomic objects, that is, objects that contain pointers pointing + to other GTY-managed objects. For other GC-allocated arrays and + strings you should use 'atomic'. + +'skip' + + If 'skip' is applied to a field, the type machinery will ignore it. + This is somewhat dangerous; the only safe use is in a union when + one field really isn't ever used. + +'desc ("EXPRESSION")' +'tag ("CONSTANT")' +'default' + + The type machinery needs to be told which field of a 'union' is + currently active. This is done by giving each field a constant + 'tag' value, and then specifying a discriminator using 'desc'. The + value of the expression given by 'desc' is compared against each + 'tag' value, each of which should be different. If no 'tag' is + matched, the field marked with 'default' is used if there is one, + otherwise no field in the union will be marked. + + In the 'desc' option, the "current structure" is the union that it + discriminates. Use '%1' to mean the structure containing it. + There are no escapes available to the 'tag' option, since it is a + constant. + + For example, + struct GTY(()) tree_binding + { + struct tree_common common; + union tree_binding_u { + tree GTY ((tag ("0"))) scope; + struct cp_binding_level * GTY ((tag ("1"))) level; + } GTY ((desc ("BINDING_HAS_LEVEL_P ((tree)&%0)"))) xscope; + tree value; + }; + + In this example, the value of BINDING_HAS_LEVEL_P when applied to a + 'struct tree_binding *' is presumed to be 0 or 1. If 1, the type + mechanism will treat the field 'level' as being present and if 0, + will treat the field 'scope' as being present. + + The 'desc' and 'tag' options can also be used for inheritance to + denote which subclass an instance is. See *note Inheritance and + GTY:: for more information. + +'param_is (TYPE)' +'use_param' + + Sometimes it's convenient to define some data structure to work on + generic pointers (that is, 'PTR') and then use it with a specific + type. 'param_is' specifies the real type pointed to, and + 'use_param' says where in the generic data structure that type + should be put. + + For instance, to have a 'htab_t' that points to trees, one would + write the definition of 'htab_t' like this: + typedef struct GTY(()) { + ... + void ** GTY ((use_param, ...)) entries; + ... + } htab_t; + and then declare variables like this: + static htab_t GTY ((param_is (union tree_node))) ict; + +'paramN_is (TYPE)' +'use_paramN' + + In more complicated cases, the data structure might need to work on + several different types, which might not necessarily all be + pointers. For this, 'param1_is' through 'param9_is' may be used to + specify the real type of a field identified by 'use_param1' through + 'use_param9'. + +'use_params' + + When a structure contains another structure that is parameterized, + there's no need to do anything special, the inner structure + inherits the parameters of the outer one. When a structure + contains a pointer to a parameterized structure, the type machinery + won't automatically detect this (it could, it just doesn't yet), so + it's necessary to tell it that the pointed-to structure should use + the same parameters as the outer structure. This is done by + marking the pointer with the 'use_params' option. + +'deletable' + + 'deletable', when applied to a global variable, indicates that when + garbage collection runs, there's no need to mark anything pointed + to by this variable, it can just be set to 'NULL' instead. This is + used to keep a list of free structures around for re-use. + +'if_marked ("EXPRESSION")' + + Suppose you want some kinds of object to be unique, and so you put + them in a hash table. If garbage collection marks the hash table, + these objects will never be freed, even if the last other reference + to them goes away. GGC has special handling to deal with this: if + you use the 'if_marked' option on a global hash table, GGC will + call the routine whose name is the parameter to the option on each + hash table entry. If the routine returns nonzero, the hash table + entry will be marked as usual. If the routine returns zero, the + hash table entry will be deleted. + + The routine 'ggc_marked_p' can be used to determine if an element + has been marked already; in fact, the usual case is to use + 'if_marked ("ggc_marked_p")'. + +'mark_hook ("HOOK-ROUTINE-NAME")' + + If provided for a structure or union type, the given + HOOK-ROUTINE-NAME (between double-quotes) is the name of a routine + called when the garbage collector has just marked the data as + reachable. This routine should not change the data, or call any + ggc routine. Its only argument is a pointer to the just marked + (const) structure or union. + +'maybe_undef' + + When applied to a field, 'maybe_undef' indicates that it's OK if + the structure that this fields points to is never defined, so long + as this field is always 'NULL'. This is used to avoid requiring + backends to define certain optional structures. It doesn't work + with language frontends. + +'nested_ptr (TYPE, "TO EXPRESSION", "FROM EXPRESSION")' + + The type machinery expects all pointers to point to the start of an + object. Sometimes for abstraction purposes it's convenient to have + a pointer which points inside an object. So long as it's possible + to convert the original object to and from the pointer, such + pointers can still be used. TYPE is the type of the original + object, the TO EXPRESSION returns the pointer given the original + object, and the FROM EXPRESSION returns the original object given + the pointer. The pointer will be available using the '%h' escape. + +'chain_next ("EXPRESSION")' +'chain_prev ("EXPRESSION")' +'chain_circular ("EXPRESSION")' + + It's helpful for the type machinery to know if objects are often + chained together in long lists; this lets it generate code that + uses less stack space by iterating along the list instead of + recursing down it. 'chain_next' is an expression for the next item + in the list, 'chain_prev' is an expression for the previous item. + For singly linked lists, use only 'chain_next'; for doubly linked + lists, use both. The machinery requires that taking the next item + of the previous item gives the original item. 'chain_circular' is + similar to 'chain_next', but can be used for circular single linked + lists. + +'reorder ("FUNCTION NAME")' + + Some data structures depend on the relative ordering of pointers. + If the precompiled header machinery needs to change that ordering, + it will call the function referenced by the 'reorder' option, + before changing the pointers in the object that's pointed to by the + field the option applies to. The function must take four + arguments, with the signature + 'void *, void *, gt_pointer_operator, void *'. The first parameter + is a pointer to the structure that contains the object being + updated, or the object itself if there is no containing structure. + The second parameter is a cookie that should be ignored. The third + parameter is a routine that, given a pointer, will update it to its + correct new value. The fourth parameter is a cookie that must be + passed to the second parameter. + + PCH cannot handle data structures that depend on the absolute + values of pointers. 'reorder' functions can be expensive. When + possible, it is better to depend on properties of the data, like an + ID number or the hash of a string instead. + +'variable_size' + + The type machinery expects the types to be of constant size. When + this is not true, for example, with structs that have array fields + or unions, the type machinery cannot tell how many bytes need to be + allocated at each allocation. The 'variable_size' is used to mark + such types. The type machinery then provides allocators that take + a parameter indicating an exact size of object being allocated. + Note that the size must be provided in bytes whereas the 'length' + option works with array lengths in number of elements. + + For example, + struct GTY((variable_size)) sorted_fields_type { + int len; + tree GTY((length ("%h.len"))) elts[1]; + }; + + Then the objects of 'struct sorted_fields_type' are allocated in GC + memory as follows: + field_vec = ggc_alloc_sorted_fields_type (size); + + If FIELD_VEC->ELTS stores N elements, then SIZE could be calculated + as follows: + size_t size = sizeof (struct sorted_fields_type) + n * sizeof (tree); + +'atomic' + + The 'atomic' option can only be used with pointers. It informs the + GC machinery that the memory that the pointer points to does not + contain any pointers, and hence it should be treated by the GC and + PCH machinery as an "atomic" block of memory that does not need to + be examined when scanning memory for pointers. In particular, the + machinery will not scan that memory for pointers to mark them as + reachable (when marking pointers for GC) or to relocate them (when + writing a PCH file). + + The 'atomic' option differs from the 'skip' option. 'atomic' keeps + the memory under Garbage Collection, but makes the GC ignore the + contents of the memory. 'skip' is more drastic in that it causes + the pointer and the memory to be completely ignored by the Garbage + Collector. So, memory marked as 'atomic' is automatically freed + when no longer reachable, while memory marked as 'skip' is not. + + The 'atomic' option must be used with great care, because all sorts + of problem can occur if used incorrectly, that is, if the memory + the pointer points to does actually contain a pointer. + + Here is an example of how to use it: + struct GTY(()) my_struct { + int number_of_elements; + unsigned int * GTY ((atomic)) elements; + }; + In this case, 'elements' is a pointer under GC, and the memory it + points to needs to be allocated using the Garbage Collector, and + will be freed automatically by the Garbage Collector when it is no + longer referenced. But the memory that the pointer points to is an + array of 'unsigned int' elements, and the GC must not try to scan + it to find pointers to mark or relocate, which is why it is marked + with the 'atomic' option. + + Note that, currently, global variables can not be marked with + 'atomic'; only fields of a struct can. This is a known limitation. + It would be useful to be able to mark global pointers with 'atomic' + to make the PCH machinery aware of them so that they are saved and + restored correctly to PCH files. + +'special ("NAME")' + + The 'special' option is used to mark types that have to be dealt + with by special case machinery. The parameter is the name of the + special case. See 'gengtype.c' for further details. Avoid adding + new special cases unless there is no other alternative. + +'user' + + The 'user' option indicates that the code to mark structure fields + is completely handled by user-provided routines. See section *note + User GC:: for details on what functions need to be provided. + + +File: gccint.info, Node: Inheritance and GTY, Next: User GC, Prev: GTY Options, Up: Type Information + +22.2 Support for inheritance +============================ + +gengtype has some support for simple class hierarchies. You can use +this to have gengtype autogenerate marking routines, provided: + + * There must be a concrete base class, with a discriminator + expression that can be used to identify which subclass an instance + is. + * Only single inheritance is used. + * None of the classes within the hierarchy are templates. + + If your class hierarchy does not fit in this pattern, you must use +*note User GC:: instead. + + The base class and its discriminator must be identified using the +"desc" option. Each concrete subclass must use the "tag" option to +identify which value of the discriminator it corresponds to. + + Every class in the hierarchy must have a 'GTY(())' marker, as gengtype +will only attempt to parse classes that have such a marker (1). + + class GTY((desc("%h.kind"), tag("0"))) example_base + { + public: + int kind; + tree a; + }; + + class GTY((tag("1")) some_subclass : public example_base + { + public: + tree b; + }; + + class GTY((tag("2")) some_other_subclass : public example_base + { + public: + tree c; + }; + + The generated marking routines for the above will contain a "switch" on +"kind", visiting all appropriate fields. For example, if kind is 2, it +will cast to "some_other_subclass" and visit fields a, b, and c. + + ---------- Footnotes ---------- + + (1) Classes lacking such a marker will not be identified as being +part of the hierarchy, and so the marking routines will not handle them, +leading to a assertion failure within the marking routines due to an +unknown tag value (assuming that assertions are enabled). + + +File: gccint.info, Node: User GC, Next: GGC Roots, Prev: Inheritance and GTY, Up: Type Information + +22.3 Support for user-provided GC marking routines +================================================== + +The garbage collector supports types for which no automatic marking code +is generated. For these types, the user is required to provide three +functions: one to act as a marker for garbage collection, and two +functions to act as marker and pointer walker for pre-compiled headers. + + Given a structure 'struct GTY((user)) my_struct', the following +functions should be defined to mark 'my_struct': + + void gt_ggc_mx (my_struct *p) + { + /* This marks field 'fld'. */ + gt_ggc_mx (p->fld); + } + + void gt_pch_nx (my_struct *p) + { + /* This marks field 'fld'. */ + gt_pch_nx (tp->fld); + } + + void gt_pch_nx (my_struct *p, gt_pointer_operator op, void *cookie) + { + /* For every field 'fld', call the given pointer operator. */ + op (&(tp->fld), cookie); + } + + In general, each marker 'M' should call 'M' for every pointer field in +the structure. Fields that are not allocated in GC or are not pointers +must be ignored. + + For embedded lists (e.g., structures with a 'next' or 'prev' pointer), +the marker must follow the chain and mark every element in it. + + Note that the rules for the pointer walker 'gt_pch_nx (my_struct *, +gt_pointer_operator, void *)' are slightly different. In this case, the +operation 'op' must be applied to the _address_ of every pointer field. + +22.3.1 User-provided marking routines for template types +-------------------------------------------------------- + +When a template type 'TP' is marked with 'GTY', all instances of that +type are considered user-provided types. This means that the individual +instances of 'TP' do not need to be marked with 'GTY'. The user needs +to provide template functions to mark all the fields of the type. + + The following code snippets represent all the functions that need to be +provided. Note that type 'TP' may reference to more than one type. In +these snippets, there is only one type 'T', but there could be more. + + template<typename T> + void gt_ggc_mx (TP<T> *tp) + { + extern void gt_ggc_mx (T&); + + /* This marks field 'fld' of type 'T'. */ + gt_ggc_mx (tp->fld); + } + + template<typename T> + void gt_pch_nx (TP<T> *tp) + { + extern void gt_pch_nx (T&); + + /* This marks field 'fld' of type 'T'. */ + gt_pch_nx (tp->fld); + } + + template<typename T> + void gt_pch_nx (TP<T *> *tp, gt_pointer_operator op, void *cookie) + { + /* For every field 'fld' of 'tp' with type 'T *', call the given + pointer operator. */ + op (&(tp->fld), cookie); + } + + template<typename T> + void gt_pch_nx (TP<T> *tp, gt_pointer_operator, void *cookie) + { + extern void gt_pch_nx (T *, gt_pointer_operator, void *); + + /* For every field 'fld' of 'tp' with type 'T', call the pointer + walker for all the fields of T. */ + gt_pch_nx (&(tp->fld), op, cookie); + } + + Support for user-defined types is currently limited. The following +restrictions apply: + + 1. Type 'TP' and all the argument types 'T' must be marked with 'GTY'. + + 2. Type 'TP' can only have type names in its argument list. + + 3. The pointer walker functions are different for 'TP<T>' and 'TP<T + *>'. In the case of 'TP<T>', references to 'T' must be handled by + calling 'gt_pch_nx' (which will, in turn, walk all the pointers + inside fields of 'T'). In the case of 'TP<T *>', references to 'T + *' must be handled by calling the 'op' function on the address of + the pointer (see the code snippets above). + + +File: gccint.info, Node: GGC Roots, Next: Files, Prev: User GC, Up: Type Information + +22.4 Marking Roots for the Garbage Collector +============================================ + +In addition to keeping track of types, the type machinery also locates +the global variables ("roots") that the garbage collector starts at. +Roots must be declared using one of the following syntaxes: + + * 'extern GTY(([OPTIONS])) TYPE NAME;' + * 'static GTY(([OPTIONS])) TYPE NAME;' +The syntax + * 'GTY(([OPTIONS])) TYPE NAME;' +is _not_ accepted. There should be an 'extern' declaration of such a +variable in a header somewhere--mark that, not the definition. Or, if +the variable is only used in one file, make it 'static'. + + +File: gccint.info, Node: Files, Next: Invoking the garbage collector, Prev: GGC Roots, Up: Type Information + +22.5 Source Files Containing Type Information +============================================= + +Whenever you add 'GTY' markers to a source file that previously had +none, or create a new source file containing 'GTY' markers, there are +three things you need to do: + + 1. You need to add the file to the list of source files the type + machinery scans. There are four cases: + + a. For a back-end file, this is usually done automatically; if + not, you should add it to 'target_gtfiles' in the appropriate + port's entries in 'config.gcc'. + + b. For files shared by all front ends, add the filename to the + 'GTFILES' variable in 'Makefile.in'. + + c. For files that are part of one front end, add the filename to + the 'gtfiles' variable defined in the appropriate + 'config-lang.in'. Headers should appear before non-headers in + this list. + + d. For files that are part of some but not all front ends, add + the filename to the 'gtfiles' variable of _all_ the front ends + that use it. + + 2. If the file was a header file, you'll need to check that it's + included in the right place to be visible to the generated files. + For a back-end header file, this should be done automatically. For + a front-end header file, it needs to be included by the same file + that includes 'gtype-LANG.h'. For other header files, it needs to + be included in 'gtype-desc.c', which is a generated file, so add it + to 'ifiles' in 'open_base_file' in 'gengtype.c'. + + For source files that aren't header files, the machinery will + generate a header file that should be included in the source file + you just changed. The file will be called 'gt-PATH.h' where PATH + is the pathname relative to the 'gcc' directory with slashes + replaced by -, so for example the header file to be included in + 'cp/parser.c' is called 'gt-cp-parser.c'. The generated header + file should be included after everything else in the source file. + Don't forget to mention this file as a dependency in the + 'Makefile'! + + For language frontends, there is another file that needs to be included +somewhere. It will be called 'gtype-LANG.h', where LANG is the name of +the subdirectory the language is contained in. + + Plugins can add additional root tables. Run the 'gengtype' utility in +plugin mode as 'gengtype -P pluginout.h SOURCE-DIR FILE-LIST PLUGIN*.C' +with your plugin files PLUGIN*.C using 'GTY' to generate the PLUGINOUT.H +file. The GCC build tree is needed to be present in that mode. + + +File: gccint.info, Node: Invoking the garbage collector, Next: Troubleshooting, Prev: Files, Up: Type Information + +22.6 How to invoke the garbage collector +======================================== + +The GCC garbage collector GGC is only invoked explicitly. In contrast +with many other garbage collectors, it is not implicitly invoked by +allocation routines when a lot of memory has been consumed. So the only +way to have GGC reclaim storage is to call the 'ggc_collect' function +explicitly. This call is an expensive operation, as it may have to scan +the entire heap. Beware that local variables (on the GCC call stack) +are not followed by such an invocation (as many other garbage collectors +do): you should reference all your data from static or external 'GTY'-ed +variables, and it is advised to call 'ggc_collect' with a shallow call +stack. The GGC is an exact mark and sweep garbage collector (so it does +not scan the call stack for pointers). In practice GCC passes don't +often call 'ggc_collect' themselves, because it is called by the pass +manager between passes. + + At the time of the 'ggc_collect' call all pointers in the GC-marked +structures must be valid or 'NULL'. In practice this means that there +should not be uninitialized pointer fields in the structures even if +your code never reads or writes those fields at a particular instance. +One way to ensure this is to use cleared versions of allocators unless +all the fields are initialized manually immediately after allocation. + + +File: gccint.info, Node: Troubleshooting, Prev: Invoking the garbage collector, Up: Type Information + +22.7 Troubleshooting the garbage collector +========================================== + +With the current garbage collector implementation, most issues should +show up as GCC compilation errors. Some of the most commonly +encountered issues are described below. + + * Gengtype does not produce allocators for a 'GTY'-marked type. + Gengtype checks if there is at least one possible path from GC + roots to at least one instance of each type before outputting + allocators. If there is no such path, the 'GTY' markers will be + ignored and no allocators will be output. Solve this by making + sure that there exists at least one such path. If creating it is + unfeasible or raises a "code smell", consider if you really must + use GC for allocating such type. + + * Link-time errors about undefined 'gt_ggc_r_foo_bar' and + similarly-named symbols. Check if your 'foo_bar' source file has + '#include "gt-foo_bar.h"' as its very last line. + + +File: gccint.info, Node: Plugins, Next: LTO, Prev: Type Information, Up: Top + +23 Plugins +********** + +GCC plugin is a loadable module that provides extra features to the +compiler, which they can further pass around as a shareable module. + + GCC plugins provide developers with a rich subset of the GCC API to +allow them to extend GCC as they see fit. Whether it is writing an +additional optimization pass, transforming code, or analyzing +information, plugins can be quite useful. + +* Menu: + +* Plugins loading:: How can we load plugins. +* Plugin API:: The APIs for plugins. +* Plugins pass:: How a plugin interact with the pass manager. +* Plugins GC:: How a plugin Interact with GCC Garbage Collector. +* Plugins description:: Giving information about a plugin itself. +* Plugins attr:: Registering custom attributes or pragmas. +* Plugins recording:: Recording information about pass execution. +* Plugins gate:: Controlling which passes are being run. +* Plugins tracking:: Keeping track of available passes. +* Plugins building:: How can we build a plugin. + + +File: gccint.info, Node: Plugins loading, Next: Plugin API, Up: Plugins + +23.1 Loading Plugins +==================== + +Plugins are supported on platforms that support '-ldl -rdynamic'. They +are loaded by the compiler using 'dlopen' and invoked at pre-determined +locations in the compilation process. + + Plugins are loaded with + + '-fplugin=/path/to/NAME.so' '-fplugin-arg-NAME-KEY1[=VALUE1]' + + The plugin arguments are parsed by GCC and passed to respective plugins +as key-value pairs. Multiple plugins can be invoked by specifying +multiple '-fplugin' arguments. + + A plugin can be simply given by its short name (no dots or slashes). +When simply passing '-fplugin=NAME', the plugin is loaded from the +'plugin' directory, so '-fplugin=NAME' is the same as '-fplugin=`gcc +-print-file-name=plugin`/NAME.so', using backquote shell syntax to query +the 'plugin' directory. + + +File: gccint.info, Node: Plugin API, Next: Plugins pass, Prev: Plugins loading, Up: Plugins + +23.2 Plugin API +=============== + +Plugins are activated by the compiler at specific events as defined in +'gcc-plugin.h'. For each event of interest, the plugin should call +'register_callback' specifying the name of the event and address of the +callback function that will handle that event. + + The header 'gcc-plugin.h' must be the first gcc header to be included. + +23.2.1 Plugin license check +--------------------------- + +Every plugin should define the global symbol 'plugin_is_GPL_compatible' +to assert that it has been licensed under a GPL-compatible license. If +this symbol does not exist, the compiler will emit a fatal error and +exit with the error message: + + fatal error: plugin NAME is not licensed under a GPL-compatible license + NAME: undefined symbol: plugin_is_GPL_compatible + compilation terminated + + The declared type of the symbol should be int, to match a forward +declaration in 'gcc-plugin.h' that suppresses C++ mangling. It does not +need to be in any allocated section, though. The compiler merely +asserts that the symbol exists in the global scope. Something like this +is enough: + + int plugin_is_GPL_compatible; + +23.2.2 Plugin initialization +---------------------------- + +Every plugin should export a function called 'plugin_init' that is +called right after the plugin is loaded. This function is responsible +for registering all the callbacks required by the plugin and do any +other required initialization. + + This function is called from 'compile_file' right before invoking the +parser. The arguments to 'plugin_init' are: + + * 'plugin_info': Plugin invocation information. + * 'version': GCC version. + + The 'plugin_info' struct is defined as follows: + + struct plugin_name_args + { + char *base_name; /* Short name of the plugin + (filename without .so suffix). */ + const char *full_name; /* Path to the plugin as specified with + -fplugin=. */ + int argc; /* Number of arguments specified with + -fplugin-arg-.... */ + struct plugin_argument *argv; /* Array of ARGC key-value pairs. */ + const char *version; /* Version string provided by plugin. */ + const char *help; /* Help string provided by plugin. */ + } + + If initialization fails, 'plugin_init' must return a non-zero value. +Otherwise, it should return 0. + + The version of the GCC compiler loading the plugin is described by the +following structure: + + struct plugin_gcc_version + { + const char *basever; + const char *datestamp; + const char *devphase; + const char *revision; + const char *configuration_arguments; + }; + + The function 'plugin_default_version_check' takes two pointers to such +structure and compare them field by field. It can be used by the +plugin's 'plugin_init' function. + + The version of GCC used to compile the plugin can be found in the +symbol 'gcc_version' defined in the header 'plugin-version.h'. The +recommended version check to perform looks like + + #include "plugin-version.h" + ... + + int + plugin_init (struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) + { + if (!plugin_default_version_check (version, &gcc_version)) + return 1; + + } + + but you can also check the individual fields if you want a less strict +check. + +23.2.3 Plugin callbacks +----------------------- + +Callback functions have the following prototype: + + /* The prototype for a plugin callback function. + gcc_data - event-specific data provided by GCC + user_data - plugin-specific data provided by the plug-in. */ + typedef void (*plugin_callback_func)(void *gcc_data, void *user_data); + + Callbacks can be invoked at the following pre-determined events: + + enum plugin_event + { + PLUGIN_PASS_MANAGER_SETUP, /* To hook into pass manager. */ + PLUGIN_FINISH_TYPE, /* After finishing parsing a type. */ + PLUGIN_FINISH_DECL, /* After finishing parsing a declaration. */ + PLUGIN_FINISH_UNIT, /* Useful for summary processing. */ + PLUGIN_PRE_GENERICIZE, /* Allows to see low level AST in C and C++ frontends. */ + PLUGIN_FINISH, /* Called before GCC exits. */ + PLUGIN_INFO, /* Information about the plugin. */ + PLUGIN_GGC_START, /* Called at start of GCC Garbage Collection. */ + PLUGIN_GGC_MARKING, /* Extend the GGC marking. */ + PLUGIN_GGC_END, /* Called at end of GGC. */ + PLUGIN_REGISTER_GGC_ROOTS, /* Register an extra GGC root table. */ + PLUGIN_REGISTER_GGC_CACHES, /* Register an extra GGC cache table. */ + PLUGIN_ATTRIBUTES, /* Called during attribute registration */ + PLUGIN_START_UNIT, /* Called before processing a translation unit. */ + PLUGIN_PRAGMAS, /* Called during pragma registration. */ + /* Called before first pass from all_passes. */ + PLUGIN_ALL_PASSES_START, + /* Called after last pass from all_passes. */ + PLUGIN_ALL_PASSES_END, + /* Called before first ipa pass. */ + PLUGIN_ALL_IPA_PASSES_START, + /* Called after last ipa pass. */ + PLUGIN_ALL_IPA_PASSES_END, + /* Allows to override pass gate decision for current_pass. */ + PLUGIN_OVERRIDE_GATE, + /* Called before executing a pass. */ + PLUGIN_PASS_EXECUTION, + /* Called before executing subpasses of a GIMPLE_PASS in + execute_ipa_pass_list. */ + PLUGIN_EARLY_GIMPLE_PASSES_START, + /* Called after executing subpasses of a GIMPLE_PASS in + execute_ipa_pass_list. */ + PLUGIN_EARLY_GIMPLE_PASSES_END, + /* Called when a pass is first instantiated. */ + PLUGIN_NEW_PASS, + /* Called when a file is #include-d or given via the #line directive. + This could happen many times. The event data is the included file path, + as a const char* pointer. */ + PLUGIN_INCLUDE_FILE, + + PLUGIN_EVENT_FIRST_DYNAMIC /* Dummy event used for indexing callback + array. */ + }; + + In addition, plugins can also look up the enumerator of a named event, +and / or generate new events dynamically, by calling the function +'get_named_event_id'. + + To register a callback, the plugin calls 'register_callback' with the +arguments: + + * 'char *name': Plugin name. + * 'int event': The event code. + * 'plugin_callback_func callback': The function that handles 'event'. + * 'void *user_data': Pointer to plugin-specific data. + + For the PLUGIN_PASS_MANAGER_SETUP, PLUGIN_INFO, +PLUGIN_REGISTER_GGC_ROOTS and PLUGIN_REGISTER_GGC_CACHES pseudo-events +the 'callback' should be null, and the 'user_data' is specific. + + When the PLUGIN_PRAGMAS event is triggered (with a null pointer as data +from GCC), plugins may register their own pragmas. Notice that pragmas +are not available from 'lto1', so plugins used with '-flto' option to +GCC during link-time optimization cannot use pragmas and do not even see +functions like 'c_register_pragma' or 'pragma_lex'. + + The PLUGIN_INCLUDE_FILE event, with a 'const char*' file path as GCC +data, is triggered for processing of '#include' or '#line' directives. + + The PLUGIN_FINISH event is the last time that plugins can call GCC +functions, notably emit diagnostics with 'warning', 'error' etc. + + +File: gccint.info, Node: Plugins pass, Next: Plugins GC, Prev: Plugin API, Up: Plugins + +23.3 Interacting with the pass manager +====================================== + +There needs to be a way to add/reorder/remove passes dynamically. This +is useful for both analysis plugins (plugging in after a certain pass +such as CFG or an IPA pass) and optimization plugins. + + Basic support for inserting new passes or replacing existing passes is +provided. A plugin registers a new pass with GCC by calling +'register_callback' with the 'PLUGIN_PASS_MANAGER_SETUP' event and a +pointer to a 'struct register_pass_info' object defined as follows + + enum pass_positioning_ops + { + PASS_POS_INSERT_AFTER, // Insert after the reference pass. + PASS_POS_INSERT_BEFORE, // Insert before the reference pass. + PASS_POS_REPLACE // Replace the reference pass. + }; + + struct register_pass_info + { + struct opt_pass *pass; /* New pass provided by the plugin. */ + const char *reference_pass_name; /* Name of the reference pass for hooking + up the new pass. */ + int ref_pass_instance_number; /* Insert the pass at the specified + instance number of the reference pass. */ + /* Do it for every instance if it is 0. */ + enum pass_positioning_ops pos_op; /* how to insert the new pass. */ + }; + + + /* Sample plugin code that registers a new pass. */ + int + plugin_init (struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) + { + struct register_pass_info pass_info; + + ... + + /* Code to fill in the pass_info object with new pass information. */ + + ... + + /* Register the new pass. */ + register_callback (plugin_info->base_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info); + + ... + } + + +File: gccint.info, Node: Plugins GC, Next: Plugins description, Prev: Plugins pass, Up: Plugins + +23.4 Interacting with the GCC Garbage Collector +=============================================== + +Some plugins may want to be informed when GGC (the GCC Garbage +Collector) is running. They can register callbacks for the +'PLUGIN_GGC_START' and 'PLUGIN_GGC_END' events (for which the callback +is called with a null 'gcc_data') to be notified of the start or end of +the GCC garbage collection. + + Some plugins may need to have GGC mark additional data. This can be +done by registering a callback (called with a null 'gcc_data') for the +'PLUGIN_GGC_MARKING' event. Such callbacks can call the 'ggc_set_mark' +routine, preferably through the 'ggc_mark' macro (and conversely, these +routines should usually not be used in plugins outside of the +'PLUGIN_GGC_MARKING' event). + + Some plugins may need to add extra GGC root tables, e.g. to handle +their own 'GTY'-ed data. This can be done with the +'PLUGIN_REGISTER_GGC_ROOTS' pseudo-event with a null callback and the +extra root table (of type 'struct ggc_root_tab*') as 'user_data'. +Plugins that want to use the 'if_marked' hash table option can add the +extra GGC cache tables generated by 'gengtype' using the +'PLUGIN_REGISTER_GGC_CACHES' pseudo-event with a null callback and the +extra cache table (of type 'struct ggc_cache_tab*') as 'user_data'. +Running the 'gengtype -p SOURCE-DIR FILE-LIST PLUGIN*.C ...' utility +generates these extra root tables. + + You should understand the details of memory management inside GCC +before using 'PLUGIN_GGC_MARKING', 'PLUGIN_REGISTER_GGC_ROOTS' or +'PLUGIN_REGISTER_GGC_CACHES'. + + +File: gccint.info, Node: Plugins description, Next: Plugins attr, Prev: Plugins GC, Up: Plugins + +23.5 Giving information about a plugin +====================================== + +A plugin should give some information to the user about itself. This +uses the following structure: + + struct plugin_info + { + const char *version; + const char *help; + }; + + Such a structure is passed as the 'user_data' by the plugin's init +routine using 'register_callback' with the 'PLUGIN_INFO' pseudo-event +and a null callback. + + +File: gccint.info, Node: Plugins attr, Next: Plugins recording, Prev: Plugins description, Up: Plugins + +23.6 Registering custom attributes or pragmas +============================================= + +For analysis (or other) purposes it is useful to be able to add custom +attributes or pragmas. + + The 'PLUGIN_ATTRIBUTES' callback is called during attribute +registration. Use the 'register_attribute' function to register custom +attributes. + + /* Attribute handler callback */ + static tree + handle_user_attribute (tree *node, tree name, tree args, + int flags, bool *no_add_attrs) + { + return NULL_TREE; + } + + /* Attribute definition */ + static struct attribute_spec user_attr = + { "user", 1, 1, false, false, false, handle_user_attribute, false }; + + /* Plugin callback called during attribute registration. + Registered with register_callback (plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL) + */ + static void + register_attributes (void *event_data, void *data) + { + warning (0, G_("Callback to register attributes")); + register_attribute (&user_attr); + } + + The PLUGIN_PRAGMAS callback is called once during pragmas registration. +Use the 'c_register_pragma', 'c_register_pragma_with_data', +'c_register_pragma_with_expansion', +'c_register_pragma_with_expansion_and_data' functions to register custom +pragmas and their handlers (which often want to call 'pragma_lex') from +'c-family/c-pragma.h'. + + /* Plugin callback called during pragmas registration. Registered with + register_callback (plugin_name, PLUGIN_PRAGMAS, + register_my_pragma, NULL); + */ + static void + register_my_pragma (void *event_data, void *data) + { + warning (0, G_("Callback to register pragmas")); + c_register_pragma ("GCCPLUGIN", "sayhello", handle_pragma_sayhello); + } + + It is suggested to pass '"GCCPLUGIN"' (or a short name identifying your +plugin) as the "space" argument of your pragma. + + Pragmas registered with 'c_register_pragma_with_expansion' or +'c_register_pragma_with_expansion_and_data' support preprocessor +expansions. For example: + + #define NUMBER 10 + #pragma GCCPLUGIN foothreshold (NUMBER) + + +File: gccint.info, Node: Plugins recording, Next: Plugins gate, Prev: Plugins attr, Up: Plugins + +23.7 Recording information about pass execution +=============================================== + +The event PLUGIN_PASS_EXECUTION passes the pointer to the executed pass +(the same as current_pass) as 'gcc_data' to the callback. You can also +inspect cfun to find out about which function this pass is executed for. +Note that this event will only be invoked if the gate check (if +applicable, modified by PLUGIN_OVERRIDE_GATE) succeeds. You can use +other hooks, like 'PLUGIN_ALL_PASSES_START', 'PLUGIN_ALL_PASSES_END', +'PLUGIN_ALL_IPA_PASSES_START', 'PLUGIN_ALL_IPA_PASSES_END', +'PLUGIN_EARLY_GIMPLE_PASSES_START', and/or +'PLUGIN_EARLY_GIMPLE_PASSES_END' to manipulate global state in your +plugin(s) in order to get context for the pass execution. + + +File: gccint.info, Node: Plugins gate, Next: Plugins tracking, Prev: Plugins recording, Up: Plugins + +23.8 Controlling which passes are being run +=========================================== + +After the original gate function for a pass is called, its result - the +gate status - is stored as an integer. Then the event +'PLUGIN_OVERRIDE_GATE' is invoked, with a pointer to the gate status in +the 'gcc_data' parameter to the callback function. A nonzero value of +the gate status means that the pass is to be executed. You can both +read and write the gate status via the passed pointer. + + +File: gccint.info, Node: Plugins tracking, Next: Plugins building, Prev: Plugins gate, Up: Plugins + +23.9 Keeping track of available passes +====================================== + +When your plugin is loaded, you can inspect the various pass lists to +determine what passes are available. However, other plugins might add +new passes. Also, future changes to GCC might cause generic passes to +be added after plugin loading. When a pass is first added to one of the +pass lists, the event 'PLUGIN_NEW_PASS' is invoked, with the callback +parameter 'gcc_data' pointing to the new pass. + + +File: gccint.info, Node: Plugins building, Prev: Plugins tracking, Up: Plugins + +23.10 Building GCC plugins +========================== + +If plugins are enabled, GCC installs the headers needed to build a +plugin (somewhere in the installation tree, e.g. under '/usr/local'). +In particular a 'plugin/include' directory is installed, containing all +the header files needed to build plugins. + + On most systems, you can query this 'plugin' directory by invoking 'gcc +-print-file-name=plugin' (replace if needed 'gcc' with the appropriate +program path). + + Inside plugins, this 'plugin' directory name can be queried by calling +'default_plugin_dir_name ()'. + + Plugins may know, when they are compiled, the GCC version for which +'plugin-version.h' is provided. The constant macros +'GCCPLUGIN_VERSION_MAJOR', 'GCCPLUGIN_VERSION_MINOR', +'GCCPLUGIN_VERSION_PATCHLEVEL', 'GCCPLUGIN_VERSION' are integer numbers, +so a plugin could ensure it is built for GCC 4.7 with + #if GCCPLUGIN_VERSION != 4007 + #error this GCC plugin is for GCC 4.7 + #endif + + The following GNU Makefile excerpt shows how to build a simple plugin: + + HOST_GCC=g++ + TARGET_GCC=gcc + PLUGIN_SOURCE_FILES= plugin1.c plugin2.cc + GCCPLUGINS_DIR:= $(shell $(TARGET_GCC) -print-file-name=plugin) + CXXFLAGS+= -I$(GCCPLUGINS_DIR)/include -fPIC -fno-rtti -O2 + + plugin.so: $(PLUGIN_SOURCE_FILES) + $(HOST_GCC) -shared $(CXXFLAGS) $^ -o $@ + + A single source file plugin may be built with 'g++ -I`gcc +-print-file-name=plugin`/include -fPIC -shared -fno-rtti -O2 plugin.c -o +plugin.so', using backquote shell syntax to query the 'plugin' +directory. + + When a plugin needs to use 'gengtype', be sure that both 'gengtype' and +'gtype.state' have the same version as the GCC for which the plugin is +built. + + +File: gccint.info, Node: LTO, Next: Funding, Prev: Plugins, Up: Top + +24 Link Time Optimization +************************* + +Link Time Optimization (LTO) gives GCC the capability of dumping its +internal representation (GIMPLE) to disk, so that all the different +compilation units that make up a single executable can be optimized as a +single module. This expands the scope of inter-procedural optimizations +to encompass the whole program (or, rather, everything that is visible +at link time). + +* Menu: + +* LTO Overview:: Overview of LTO. +* LTO object file layout:: LTO file sections in ELF. +* IPA:: Using summary information in IPA passes. +* WHOPR:: Whole program assumptions, + linker plugin and symbol visibilities. +* Internal flags:: Internal flags controlling 'lto1'. + + +File: gccint.info, Node: LTO Overview, Next: LTO object file layout, Up: LTO + +24.1 Design Overview +==================== + +Link time optimization is implemented as a GCC front end for a bytecode +representation of GIMPLE that is emitted in special sections of '.o' +files. Currently, LTO support is enabled in most ELF-based systems, as +well as darwin, cygwin and mingw systems. + + Since GIMPLE bytecode is saved alongside final object code, object +files generated with LTO support are larger than regular object files. +This "fat" object format makes it easy to integrate LTO into existing +build systems, as one can, for instance, produce archives of the files. +Additionally, one might be able to ship one set of fat objects which +could be used both for development and the production of optimized +builds. A, perhaps surprising, side effect of this feature is that any +mistake in the toolchain that leads to LTO information not being used +(e.g. an older 'libtool' calling 'ld' directly). This is both an +advantage, as the system is more robust, and a disadvantage, as the user +is not informed that the optimization has been disabled. + + The current implementation only produces "fat" objects, effectively +doubling compilation time and increasing file sizes up to 5x the +original size. This hides the problem that some tools, such as 'ar' and +'nm', need to understand symbol tables of LTO sections. These tools +were extended to use the plugin infrastructure, and with these problems +solved, GCC will also support "slim" objects consisting of the +intermediate code alone. + + At the highest level, LTO splits the compiler in two. The first half +(the "writer") produces a streaming representation of all the internal +data structures needed to optimize and generate code. This includes +declarations, types, the callgraph and the GIMPLE representation of +function bodies. + + When '-flto' is given during compilation of a source file, the pass +manager executes all the passes in 'all_lto_gen_passes'. Currently, +this phase is composed of two IPA passes: + + * 'pass_ipa_lto_gimple_out' This pass executes the function + 'lto_output' in 'lto-streamer-out.c', which traverses the call + graph encoding every reachable declaration, type and function. + This generates a memory representation of all the file sections + described below. + + * 'pass_ipa_lto_finish_out' This pass executes the function + 'produce_asm_for_decls' in 'lto-streamer-out.c', which takes the + memory image built in the previous pass and encodes it in the + corresponding ELF file sections. + + The second half of LTO support is the "reader". This is implemented as +the GCC front end 'lto1' in 'lto/lto.c'. When 'collect2' detects a link +set of '.o'/'.a' files with LTO information and the '-flto' is enabled, +it invokes 'lto1' which reads the set of files and aggregates them into +a single translation unit for optimization. The main entry point for +the reader is 'lto/lto.c':'lto_main'. + +24.1.1 LTO modes of operation +----------------------------- + +One of the main goals of the GCC link-time infrastructure was to allow +effective compilation of large programs. For this reason GCC implements +two link-time compilation modes. + + 1. _LTO mode_, in which the whole program is read into the compiler at + link-time and optimized in a similar way as if it were a single + source-level compilation unit. + + 2. _WHOPR or partitioned mode_, designed to utilize multiple CPUs + and/or a distributed compilation environment to quickly link large + applications. WHOPR stands for WHOle Program optimizeR (not to be + confused with the semantics of '-fwhole-program'). It partitions + the aggregated callgraph from many different '.o' files and + distributes the compilation of the sub-graphs to different CPUs. + + Note that distributed compilation is not implemented yet, but since + the parallelism is facilitated via generating a 'Makefile', it + would be easy to implement. + + WHOPR splits LTO into three main stages: + 1. Local generation (LGEN) This stage executes in parallel. Every + file in the program is compiled into the intermediate language and + packaged together with the local call-graph and summary + information. This stage is the same for both the LTO and WHOPR + compilation mode. + + 2. Whole Program Analysis (WPA) WPA is performed sequentially. The + global call-graph is generated, and a global analysis procedure + makes transformation decisions. The global call-graph is + partitioned to facilitate parallel optimization during phase 3. + The results of the WPA stage are stored into new object files which + contain the partitions of program expressed in the intermediate + language and the optimization decisions. + + 3. Local transformations (LTRANS) This stage executes in parallel. + All the decisions made during phase 2 are implemented locally in + each partitioned object file, and the final object code is + generated. Optimizations which cannot be decided efficiently + during the phase 2 may be performed on the local call-graph + partitions. + + WHOPR can be seen as an extension of the usual LTO mode of compilation. +In LTO, WPA and LTRANS are executed within a single execution of the +compiler, after the whole program has been read into memory. + + When compiling in WHOPR mode, the callgraph is partitioned during the +WPA stage. The whole program is split into a given number of partitions +of roughly the same size. The compiler tries to minimize the number of +references which cross partition boundaries. The main advantage of +WHOPR is to allow the parallel execution of LTRANS stages, which are the +most time-consuming part of the compilation process. Additionally, it +avoids the need to load the whole program into memory. + + +File: gccint.info, Node: LTO object file layout, Next: IPA, Prev: LTO Overview, Up: LTO + +24.2 LTO file sections +====================== + +LTO information is stored in several ELF sections inside object files. +Data structures and enum codes for sections are defined in +'lto-streamer.h'. + + These sections are emitted from 'lto-streamer-out.c' and mapped in all +at once from 'lto/lto.c':'lto_file_read'. The individual functions +dealing with the reading/writing of each section are described below. + + * Command line options ('.gnu.lto_.opts') + + This section contains the command line options used to generate the + object files. This is used at link time to determine the + optimization level and other settings when they are not explicitly + specified at the linker command line. + + Currently, GCC does not support combining LTO object files compiled + with different set of the command line options into a single + binary. At link time, the options given on the command line and + the options saved on all the files in a link-time set are applied + globally. No attempt is made at validating the combination of + flags (other than the usual validation done by option processing). + This is implemented in 'lto/lto.c':'lto_read_all_file_options'. + + * Symbol table ('.gnu.lto_.symtab') + + This table replaces the ELF symbol table for functions and + variables represented in the LTO IL. Symbols used and exported by + the optimized assembly code of "fat" objects might not match the + ones used and exported by the intermediate code. This table is + necessary because the intermediate code is less optimized and thus + requires a separate symbol table. + + Additionally, the binary code in the "fat" object will lack a call + to a function, since the call was optimized out at compilation time + after the intermediate language was streamed out. In some special + cases, the same optimization may not happen during link-time + optimization. This would lead to an undefined symbol if only one + symbol table was used. + + The symbol table is emitted in + 'lto-streamer-out.c':'produce_symtab'. + + * Global declarations and types ('.gnu.lto_.decls') + + This section contains an intermediate language dump of all + declarations and types required to represent the callgraph, static + variables and top-level debug info. + + The contents of this section are emitted in + 'lto-streamer-out.c':'produce_asm_for_decls'. Types and symbols + are emitted in a topological order that preserves the sharing of + pointers when the file is read back in + ('lto.c':'read_cgraph_and_symbols'). + + * The callgraph ('.gnu.lto_.cgraph') + + This section contains the basic data structure used by the GCC + inter-procedural optimization infrastructure. This section stores + an annotated multi-graph which represents the functions and call + sites as well as the variables, aliases and top-level 'asm' + statements. + + This section is emitted in 'lto-streamer-out.c':'output_cgraph' and + read in 'lto-cgraph.c':'input_cgraph'. + + * IPA references ('.gnu.lto_.refs') + + This section contains references between function and static + variables. It is emitted by 'lto-cgraph.c':'output_refs' and read + by 'lto-cgraph.c':'input_refs'. + + * Function bodies ('.gnu.lto_.function_body.<name>') + + This section contains function bodies in the intermediate language + representation. Every function body is in a separate section to + allow copying of the section independently to different object + files or reading the function on demand. + + Functions are emitted in 'lto-streamer-out.c':'output_function' and + read in 'lto-streamer-in.c':'input_function'. + + * Static variable initializers ('.gnu.lto_.vars') + + This section contains all the symbols in the global variable pool. + It is emitted by 'lto-cgraph.c':'output_varpool' and read in + 'lto-cgraph.c':'input_cgraph'. + + * Summaries and optimization summaries used by IPA passes + ('.gnu.lto_.<xxx>', where '<xxx>' is one of 'jmpfuncs', 'pureconst' + or 'reference') + + These sections are used by IPA passes that need to emit summary + information during LTO generation to be read and aggregated at link + time. Each pass is responsible for implementing two pass manager + hooks: one for writing the summary and another for reading it in. + The format of these sections is entirely up to each individual + pass. The only requirement is that the writer and reader hooks + agree on the format. + + +File: gccint.info, Node: IPA, Next: WHOPR, Prev: LTO object file layout, Up: LTO + +24.3 Using summary information in IPA passes +============================================ + +Programs are represented internally as a _callgraph_ (a multi-graph +where nodes are functions and edges are call sites) and a _varpool_ (a +list of static and external variables in the program). + + The inter-procedural optimization is organized as a sequence of +individual passes, which operate on the callgraph and the varpool. To +make the implementation of WHOPR possible, every inter-procedural +optimization pass is split into several stages that are executed at +different times during WHOPR compilation: + + * LGEN time + 1. _Generate summary_ ('generate_summary' in 'struct + ipa_opt_pass_d'). This stage analyzes every function body and + variable initializer is examined and stores relevant + information into a pass-specific data structure. + + 2. _Write summary_ ('write_summary' in 'struct ipa_opt_pass_d'). + This stage writes all the pass-specific information generated + by 'generate_summary'. Summaries go into their own + 'LTO_section_*' sections that have to be declared in + 'lto-streamer.h':'enum lto_section_type'. A new section is + created by calling 'create_output_block' and data can be + written using the 'lto_output_*' routines. + + * WPA time + 1. _Read summary_ ('read_summary' in 'struct ipa_opt_pass_d'). + This stage reads all the pass-specific information in exactly + the same order that it was written by 'write_summary'. + + 2. _Execute_ ('execute' in 'struct opt_pass'). This performs + inter-procedural propagation. This must be done without + actual access to the individual function bodies or variable + initializers. Typically, this results in a transitive closure + operation over the summary information of all the nodes in the + callgraph. + + 3. _Write optimization summary_ ('write_optimization_summary' in + 'struct ipa_opt_pass_d'). This writes the result of the + inter-procedural propagation into the object file. This can + use the same data structures and helper routines used in + 'write_summary'. + + * LTRANS time + 1. _Read optimization summary_ ('read_optimization_summary' in + 'struct ipa_opt_pass_d'). The counterpart to + 'write_optimization_summary'. This reads the interprocedural + optimization decisions in exactly the same format emitted by + 'write_optimization_summary'. + + 2. _Transform_ ('function_transform' and 'variable_transform' in + 'struct ipa_opt_pass_d'). The actual function bodies and + variable initializers are updated based on the information + passed down from the _Execute_ stage. + + The implementation of the inter-procedural passes are shared between +LTO, WHOPR and classic non-LTO compilation. + + * During the traditional file-by-file mode every pass executes its + own _Generate summary_, _Execute_, and _Transform_ stages within + the single execution context of the compiler. + + * In LTO compilation mode, every pass uses _Generate summary_ and + _Write summary_ stages at compilation time, while the _Read + summary_, _Execute_, and _Transform_ stages are executed at link + time. + + * In WHOPR mode all stages are used. + + To simplify development, the GCC pass manager differentiates between +normal inter-procedural passes and small inter-procedural passes. A +_small inter-procedural pass_ ('SIMPLE_IPA_PASS') is a pass that does +everything at once and thus it can not be executed during WPA in WHOPR +mode. It defines only the _Execute_ stage and during this stage it +accesses and modifies the function bodies. Such passes are useful for +optimization at LGEN or LTRANS time and are used, for example, to +implement early optimization before writing object files. The simple +inter-procedural passes can also be used for easier prototyping and +development of a new inter-procedural pass. + +24.3.1 Virtual clones +--------------------- + +One of the main challenges of introducing the WHOPR compilation mode was +addressing the interactions between optimization passes. In LTO +compilation mode, the passes are executed in a sequence, each of which +consists of analysis (or _Generate summary_), propagation (or _Execute_) +and _Transform_ stages. Once the work of one pass is finished, the next +pass sees the updated program representation and can execute. This +makes the individual passes dependent on each other. + + In WHOPR mode all passes first execute their _Generate summary_ stage. +Then summary writing marks the end of the LGEN stage. At WPA time, the +summaries are read back into memory and all passes run the _Execute_ +stage. Optimization summaries are streamed and sent to LTRANS, where +all the passes execute the _Transform_ stage. + + Most optimization passes split naturally into analysis, propagation and +transformation stages. But some do not. The main problem arises when +one pass performs changes and the following pass gets confused by seeing +different callgraphs between the _Transform_ stage and the _Generate +summary_ or _Execute_ stage. This means that the passes are required to +communicate their decisions with each other. + + To facilitate this communication, the GCC callgraph infrastructure +implements _virtual clones_, a method of representing the changes +performed by the optimization passes in the callgraph without needing to +update function bodies. + + A _virtual clone_ in the callgraph is a function that has no associated +body, just a description of how to create its body based on a different +function (which itself may be a virtual clone). + + The description of function modifications includes adjustments to the +function's signature (which allows, for example, removing or adding +function arguments), substitutions to perform on the function body, and, +for inlined functions, a pointer to the function that it will be inlined +into. + + It is also possible to redirect any edge of the callgraph from a +function to its virtual clone. This implies updating of the call site +to adjust for the new function signature. + + Most of the transformations performed by inter-procedural optimizations +can be represented via virtual clones. For instance, a constant +propagation pass can produce a virtual clone of the function which +replaces one of its arguments by a constant. The inliner can represent +its decisions by producing a clone of a function whose body will be +later integrated into a given function. + + Using _virtual clones_, the program can be easily updated during the +_Execute_ stage, solving most of pass interactions problems that would +otherwise occur during _Transform_. + + Virtual clones are later materialized in the LTRANS stage and turned +into real functions. Passes executed after the virtual clone were +introduced also perform their _Transform_ stage on new functions, so for +a pass there is no significant difference between operating on a real +function or a virtual clone introduced before its _Execute_ stage. + + Optimization passes then work on virtual clones introduced before their +_Execute_ stage as if they were real functions. The only difference is +that clones are not visible during the _Generate Summary_ stage. + + To keep function summaries updated, the callgraph interface allows an +optimizer to register a callback that is called every time a new clone +is introduced as well as when the actual function or variable is +generated or when a function or variable is removed. These hooks are +registered in the _Generate summary_ stage and allow the pass to keep +its information intact until the _Execute_ stage. The same hooks can +also be registered during the _Execute_ stage to keep the optimization +summaries updated for the _Transform_ stage. + +24.3.2 IPA references +--------------------- + +GCC represents IPA references in the callgraph. For a function or +variable 'A', the _IPA reference_ is a list of all locations where the +address of 'A' is taken and, when 'A' is a variable, a list of all +direct stores and reads to/from 'A'. References represent an oriented +multi-graph on the union of nodes of the callgraph and the varpool. See +'ipa-reference.c':'ipa_reference_write_optimization_summary' and +'ipa-reference.c':'ipa_reference_read_optimization_summary' for details. + +24.3.3 Jump functions +--------------------- + +Suppose that an optimization pass sees a function 'A' and it knows the +values of (some of) its arguments. The _jump function_ describes the +value of a parameter of a given function call in function 'A' based on +this knowledge. + + Jump functions are used by several optimizations, such as the +inter-procedural constant propagation pass and the devirtualization +pass. The inliner also uses jump functions to perform inlining of +callbacks. + + +File: gccint.info, Node: WHOPR, Next: Internal flags, Prev: IPA, Up: LTO + +24.4 Whole program assumptions, linker plugin and symbol visibilities +===================================================================== + +Link-time optimization gives relatively minor benefits when used alone. +The problem is that propagation of inter-procedural information does not +work well across functions and variables that are called or referenced +by other compilation units (such as from a dynamically linked library). +We say that such functions and variables are _externally visible_. + + To make the situation even more difficult, many applications organize +themselves as a set of shared libraries, and the default ELF visibility +rules allow one to overwrite any externally visible symbol with a +different symbol at runtime. This basically disables any optimizations +across such functions and variables, because the compiler cannot be sure +that the function body it is seeing is the same function body that will +be used at runtime. Any function or variable not declared 'static' in +the sources degrades the quality of inter-procedural optimization. + + To avoid this problem the compiler must assume that it sees the whole +program when doing link-time optimization. Strictly speaking, the whole +program is rarely visible even at link-time. Standard system libraries +are usually linked dynamically or not provided with the link-time +information. In GCC, the whole program option ('-fwhole-program') +asserts that every function and variable defined in the current +compilation unit is static, except for function 'main' (note: at link +time, the current unit is the union of all objects compiled with LTO). +Since some functions and variables need to be referenced externally, for +example by another DSO or from an assembler file, GCC also provides the +function and variable attribute 'externally_visible' which can be used +to disable the effect of '-fwhole-program' on a specific symbol. + + The whole program mode assumptions are slightly more complex in C++, +where inline functions in headers are put into _COMDAT_ sections. +COMDAT function and variables can be defined by multiple object files +and their bodies are unified at link-time and dynamic link-time. COMDAT +functions are changed to local only when their address is not taken and +thus un-sharing them with a library is not harmful. COMDAT variables +always remain externally visible, however for readonly variables it is +assumed that their initializers cannot be overwritten by a different +value. + + GCC provides the function and variable attribute 'visibility' that can +be used to specify the visibility of externally visible symbols (or +alternatively an '-fdefault-visibility' command line option). ELF +defines the 'default', 'protected', 'hidden' and 'internal' +visibilities. + + The most commonly used is visibility is 'hidden'. It specifies that +the symbol cannot be referenced from outside of the current shared +library. Unfortunately, this information cannot be used directly by the +link-time optimization in the compiler since the whole shared library +also might contain non-LTO objects and those are not visible to the +compiler. + + GCC solves this problem using linker plugins. A _linker plugin_ is an +interface to the linker that allows an external program to claim the +ownership of a given object file. The linker then performs the linking +procedure by querying the plugin about the symbol table of the claimed +objects and once the linking decisions are complete, the plugin is +allowed to provide the final object file before the actual linking is +made. The linker plugin obtains the symbol resolution information which +specifies which symbols provided by the claimed objects are bound from +the rest of a binary being linked. + + Currently, the linker plugin works only in combination with the Gold +linker, but a GNU ld implementation is under development. + + GCC is designed to be independent of the rest of the toolchain and aims +to support linkers without plugin support. For this reason it does not +use the linker plugin by default. Instead, the object files are +examined by 'collect2' before being passed to the linker and objects +found to have LTO sections are passed to 'lto1' first. This mode does +not work for library archives. The decision on what object files from +the archive are needed depends on the actual linking and thus GCC would +have to implement the linker itself. The resolution information is +missing too and thus GCC needs to make an educated guess based on +'-fwhole-program'. Without the linker plugin GCC also assumes that +symbols are declared 'hidden' and not referred by non-LTO code by +default. + + +File: gccint.info, Node: Internal flags, Prev: WHOPR, Up: LTO + +24.5 Internal flags controlling 'lto1' +====================================== + +The following flags are passed into 'lto1' and are not meant to be used +directly from the command line. + + * -fwpa This option runs the serial part of the link-time optimizer + performing the inter-procedural propagation (WPA mode). The + compiler reads in summary information from all inputs and performs + an analysis based on summary information only. It generates object + files for subsequent runs of the link-time optimizer where + individual object files are optimized using both summary + information from the WPA mode and the actual function bodies. It + then drives the LTRANS phase. + + * -fltrans This option runs the link-time optimizer in the + local-transformation (LTRANS) mode, which reads in output from a + previous run of the LTO in WPA mode. In the LTRANS mode, LTO + optimizes an object and produces the final assembly. + + * -fltrans-output-list=FILE This option specifies a file to which the + names of LTRANS output files are written. This option is only + meaningful in conjunction with '-fwpa'. + + * -fresolution=FILE This option specifies the linker resolution file. + This option is only meaningful in conjunction with '-fwpa' and as + option to pass through to the LTO linker plugin. + + +File: gccint.info, Node: Funding, Next: GNU Project, Prev: LTO, Up: Top + +Funding Free Software +********************* + +If you want to have more free software a few years from now, it makes +sense for you to help encourage people to contribute funds for its +development. The most effective approach known is to encourage +commercial redistributors to donate. + + Users of free software systems can boost the pace of development by +encouraging for-a-fee distributors to donate part of their selling price +to free software developers--the Free Software Foundation, and others. + + The way to convince distributors to do this is to demand it and expect +it from them. So when you compare distributors, judge them partly by +how much they give to free software development. Show distributors they +must compete to be the one who gives the most. + + To make this approach work, you must insist on numbers that you can +compare, such as, "We will donate ten dollars to the Frobnitz project +for each disk sold." Don't be satisfied with a vague promise, such as +"A portion of the profits are donated," since it doesn't give a basis +for comparison. + + Even a precise fraction "of the profits from this disk" is not very +meaningful, since creative accounting and unrelated business decisions +can greatly alter what fraction of the sales price counts as profit. If +the price you pay is $50, ten percent of the profit is probably less +than a dollar; it might be a few cents, or nothing at all. + + Some redistributors do development work themselves. This is useful +too; but to keep everyone honest, you need to inquire how much they do, +and what kind. Some kinds of development make much more long-term +difference than others. For example, maintaining a separate version of +a program contributes very little; maintaining the standard version of a +program for the whole community contributes much. Easy new ports +contribute little, since someone else would surely do them; difficult +ports such as adding a new CPU to the GNU Compiler Collection contribute +more; major new features or packages contribute the most. + + By establishing the idea that supporting further development is "the +proper thing to do" when distributing free software for a fee, we can +assure a steady flow of resources into making more free software. + + Copyright (C) 1994 Free Software Foundation, Inc. + Verbatim copying and redistribution of this section is permitted + without royalty; alteration is not permitted. + + +File: gccint.info, Node: GNU Project, Next: Copying, Prev: Funding, Up: Top + +The GNU Project and GNU/Linux +***************************** + +The GNU Project was launched in 1984 to develop a complete Unix-like +operating system which is free software: the GNU system. (GNU is a +recursive acronym for "GNU's Not Unix"; it is pronounced "guh-NEW".) +Variants of the GNU operating system, which use the kernel Linux, are +now widely used; though these systems are often referred to as "Linux", +they are more accurately called GNU/Linux systems. + + For more information, see: + <http://www.gnu.org/> + <http://www.gnu.org/gnu/linux-and-gnu.html> + + +File: gccint.info, Node: Copying, Next: GNU Free Documentation License, Prev: GNU Project, Up: Top + +GNU General Public License +************************** + + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + Everyone is permitted to copy and distribute verbatim copies of this + license document, but changing it is not allowed. + +Preamble +======== + +The GNU General Public License is a free, copyleft license for software +and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program-to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for them if +you wish), that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free +programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether gratis +or for a fee, you must pass on to the recipients the same freedoms that +you received. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + Developers that use the GNU GPL protect your rights with two steps: (1) +assert copyright on the software, and (2) offer you this License giving +you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + +TERMS AND CONDITIONS +==================== + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public + License. + + "Copyright" also means copyright-like laws that apply to other + kinds of works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this + License. Each licensee is addressed as "you". "Licensees" and + "recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the + work in a fashion requiring copyright permission, other than the + making of an exact copy. The resulting work is called a "modified + version" of the earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work + based on the Program. + + To "propagate" a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on + a computer or modifying a private copy. Propagation includes + copying, distribution (with or without modification), making + available to the public, and in some countries other activities as + well. + + To "convey" a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user + through a computer network, with no transfer of a copy, is not + conveying. + + An interactive user interface displays "Appropriate Legal Notices" + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to + the extent that warranties are provided), that licensees may convey + the work under this License, and how to view a copy of this + License. If the interface presents a list of user commands or + options, such as a menu, a prominent item in the list meets this + criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work + for making modifications to it. "Object code" means any non-source + form of a work. + + A "Standard Interface" means an interface that either is an + official standard defined by a recognized standards body, or, in + the case of interfaces specified for a particular programming + language, one that is widely used among developers working in that + language. + + The "System Libraries" of an executable work include anything, + other than the work as a whole, that (a) is included in the normal + form of packaging a Major Component, but which is not part of that + Major Component, and (b) serves only to enable use of the work with + that Major Component, or to implement a Standard Interface for + which an implementation is available to the public in source code + form. A "Major Component", in this context, means a major + essential component (kernel, window system, and so on) of the + specific operating system (if any) on which the executable work + runs, or a compiler used to produce the work, or an object code + interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts + to control those activities. However, it does not include the + work's System Libraries, or general-purpose tools or generally + available free programs which are used unmodified in performing + those activities but which are not part of the work. For example, + Corresponding Source includes interface definition files associated + with source files for the work, and the source code for shared + libraries and dynamically linked subprograms that the work is + specifically designed to require, such as by intimate data + communication or control flow between those subprograms and other + parts of the work. + + The Corresponding Source need not include anything that users can + regenerate automatically from other parts of the Corresponding + Source. + + The Corresponding Source for a work in source code form is that + same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running + a covered work is covered by this License only if the output, given + its content, constitutes a covered work. This License acknowledges + your rights of fair use or other equivalent, as provided by + copyright law. + + You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise + remains in force. You may convey covered works to others for the + sole purpose of having them make modifications exclusively for you, + or provide you with facilities for running those works, provided + that you comply with the terms of this License in conveying all + material for which you do not control copyright. Those thus making + or running the covered works for you must do so exclusively on your + behalf, under your direction and control, on terms that prohibit + them from making any copies of your copyrighted material outside + their relationship with you. + + Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section + 10 makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under + article 11 of the WIPO copyright treaty adopted on 20 December + 1996, or similar laws prohibiting or restricting circumvention of + such measures. + + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such + circumvention is effected by exercising rights under this License + with respect to the covered work, and you disclaim any intention to + limit operation or modification of the work as a means of + enforcing, against the work's users, your or third parties' legal + rights to forbid circumvention of technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the + code; keep intact all notices of the absence of any warranty; and + give all recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these + conditions: + + a. The work must carry prominent notices stating that you + modified it, and giving a relevant date. + + b. The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in + section 4 to "keep intact all notices". + + c. You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable + section 7 additional terms, to the whole of the work, and all + its parts, regardless of how they are packaged. This License + gives no permission to license the work in any other way, but + it does not invalidate such permission if you have separately + received it. + + d. If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has + interactive interfaces that do not display Appropriate Legal + Notices, your work need not make them do so. + + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered + work, and which are not combined with it such as to form a larger + program, in or on a volume of a storage or distribution medium, is + called an "aggregate" if the compilation and its resulting + copyright are not used to limit the access or legal rights of the + compilation's users beyond what the individual works permit. + Inclusion of a covered work in an aggregate does not cause this + License to apply to the other parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this + License, in one of these ways: + + a. Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b. Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that + product model, to give anyone who possesses the object code + either (1) a copy of the Corresponding Source for all the + software in the product that is covered by this License, on a + durable physical medium customarily used for software + interchange, for a price no more than your reasonable cost of + physically performing this conveying of source, or (2) access + to copy the Corresponding Source from a network server at no + charge. + + c. Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, + and only if you received the object code with such an offer, + in accord with subsection 6b. + + d. Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to + the Corresponding Source in the same way through the same + place at no further charge. You need not require recipients + to copy the Corresponding Source along with the object code. + If the place to copy the object code is a network server, the + Corresponding Source may be on a different server (operated by + you or a third party) that supports equivalent copying + facilities, provided you maintain clear directions next to the + object code saying where to find the Corresponding Source. + Regardless of what server hosts the Corresponding Source, you + remain obligated to ensure that it is available for as long as + needed to satisfy these requirements. + + e. Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the + general public at no charge under subsection 6d. + + A separable portion of the object code, whose source code is + excluded from the Corresponding Source as a System Library, need + not be included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means + any tangible personal property which is normally used for personal, + family, or household purposes, or (2) anything designed or sold for + incorporation into a dwelling. In determining whether a product is + a consumer product, doubtful cases shall be resolved in favor of + coverage. For a particular product received by a particular user, + "normally used" refers to a typical or common use of that class of + product, regardless of the status of the particular user or of the + way in which the particular user actually uses, or expects or is + expected to use, the product. A product is a consumer product + regardless of whether the product has substantial commercial, + industrial or non-consumer uses, unless such uses represent the + only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, + procedures, authorization keys, or other information required to + install and execute modified versions of a covered work in that + User Product from a modified version of its Corresponding Source. + The information must suffice to ensure that the continued + functioning of the modified object code is in no case prevented or + interfered with solely because modification has been made. + + If you convey an object code work under this section in, or with, + or specifically for use in, a User Product, and the conveying + occurs as part of a transaction in which the right of possession + and use of the User Product is transferred to the recipient in + perpetuity or for a fixed term (regardless of how the transaction + is characterized), the Corresponding Source conveyed under this + section must be accompanied by the Installation Information. But + this requirement does not apply if neither you nor any third party + retains the ability to install modified object code on the User + Product (for example, the work has been installed in ROM). + + The requirement to provide Installation Information does not + include a requirement to continue to provide support service, + warranty, or updates for a work that has been modified or installed + by the recipient, or for the User Product in which it has been + modified or installed. Access to a network may be denied when the + modification itself materially and adversely affects the operation + of the network or violates the rules and protocols for + communication across the network. + + Corresponding Source conveyed, and Installation Information + provided, in accord with this section must be in a format that is + publicly documented (and with an implementation available to the + public in source code form), and must require no special password + or key for unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of + this License by making exceptions from one or more of its + conditions. Additional permissions that are applicable to the + entire Program shall be treated as though they were included in + this License, to the extent that they are valid under applicable + law. If additional permissions apply only to part of the Program, + that part may be used separately under those permissions, but the + entire Program remains governed by this License without regard to + the additional permissions. + + When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part + of it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material + you add to a covered work, you may (if authorized by the copyright + holders of that material) supplement the terms of this License with + terms: + + a. Disclaiming warranty or limiting liability differently from + the terms of sections 15 and 16 of this License; or + + b. Requiring preservation of specified reasonable legal notices + or author attributions in that material or in the Appropriate + Legal Notices displayed by works containing it; or + + c. Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked + in reasonable ways as different from the original version; or + + d. Limiting the use for publicity purposes of names of licensors + or authors of the material; or + + e. Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f. Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified + versions of it) with contractual assumptions of liability to + the recipient, for any liability that these contractual + assumptions directly impose on those licensors and authors. + + All other non-permissive additional terms are considered "further + restrictions" within the meaning of section 10. If the Program as + you received it, or any part of it, contains a notice stating that + it is governed by this License along with a term that is a further + restriction, you may remove that term. If a license document + contains a further restriction but permits relicensing or conveying + under this License, you may add to a covered work material governed + by the terms of that license document, provided that the further + restriction does not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in + the form of a separately written license, or stated as exceptions; + the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights + under this License (including any patent licenses granted under the + third paragraph of section 11). + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, you do not qualify to receive new licenses + for the same material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer + transmission to receive a copy likewise does not require + acceptance. However, nothing other than this License grants you + permission to propagate or modify any covered work. These actions + infringe copyright if you do not accept this License. Therefore, + by modifying or propagating a covered work, you indicate your + acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not + responsible for enforcing compliance by third parties with this + License. + + An "entity transaction" is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a + covered work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party's predecessor in interest had or + could give under the previous paragraph, plus a right to possession + of the Corresponding Source of the work from the predecessor in + interest, if the predecessor has it or can get it with reasonable + efforts. + + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you + may not impose a license fee, royalty, or other charge for exercise + of rights granted under this License, and you may not initiate + litigation (including a cross-claim or counterclaim in a lawsuit) + alleging that any patent claim is infringed by making, using, + selling, offering for sale, or importing the Program or any portion + of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. + The work thus licensed is called the contributor's "contributor + version". + + A contributor's "essential patent claims" are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, + permitted by this License, of making, using, or selling its + contributor version, but do not include claims that would be + infringed only as a consequence of further modification of the + contributor version. For purposes of this definition, "control" + includes the right to grant patent sublicenses in a manner + consistent with the requirements of this License. + + Each contributor grants you a non-exclusive, worldwide, + royalty-free patent license under the contributor's essential + patent claims, to make, use, sell, offer for sale, import and + otherwise run, modify and propagate the contents of its contributor + version. + + In the following three paragraphs, a "patent license" is any + express agreement or commitment, however denominated, not to + enforce a patent (such as an express permission to practice a + patent or covenant not to sue for patent infringement). To "grant" + such a patent license to a party means to make such an agreement or + commitment not to enforce a patent against the party. + + If you convey a covered work, knowingly relying on a patent + license, and the Corresponding Source of the work is not available + for anyone to copy, free of charge and under the terms of this + License, through a publicly available network server or other + readily accessible means, then you must either (1) cause the + Corresponding Source to be so available, or (2) arrange to deprive + yourself of the benefit of the patent license for this particular + work, or (3) arrange, in a manner consistent with the requirements + of this License, to extend the patent license to downstream + recipients. "Knowingly relying" means you have actual knowledge + that, but for the patent license, your conveying the covered work + in a country, or your recipient's use of the covered work in a + country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, + modify or convey a specific copy of the covered work, then the + patent license you grant is automatically extended to all + recipients of the covered work and works based on it. + + A patent license is "discriminatory" if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that + are specifically granted under this License. You may not convey a + covered work if you are a party to an arrangement with a third + party that is in the business of distributing software, under which + you make payment to the third party based on the extent of your + activity of conveying the work, and under which the third party + grants, to any of the parties who would receive the covered work + from you, a discriminatory patent license (a) in connection with + copies of the covered work conveyed by you (or copies made from + those copies), or (b) primarily for and in connection with specific + products or compilations that contain the covered work, unless you + entered into that arrangement, or that patent license was granted, + prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement + or otherwise) that contradict the conditions of this License, they + do not excuse you from the conditions of this License. If you + cannot convey a covered work so as to satisfy simultaneously your + obligations under this License and any other pertinent obligations, + then as a consequence you may not convey it at all. For example, + if you agree to terms that obligate you to collect a royalty for + further conveying from those to whom you convey the Program, the + only way you could satisfy both those terms and this License would + be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU Affero General Public License into a + single combined work, and to convey the resulting work. The terms + of this License will continue to apply to the part which is the + covered work, but the special requirements of the GNU Affero + General Public License, section 13, concerning interaction through + a network will apply to the combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new + versions of the GNU General Public License from time to time. Such + new versions will be similar in spirit to the present version, but + may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU + General Public License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that numbered version or of any later version published by the Free + Software Foundation. If the Program does not specify a version + number of the GNU General Public License, you may choose any + version ever published by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future + versions of the GNU General Public License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Program. + + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE + COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE + RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL + NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES + AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR + DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE + THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA + BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF + THE POSSIBILITY OF SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely + approximates an absolute waiver of all civil liability in + connection with the Program, unless a warranty or assumption of + liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS +=========================== + +How to Apply These Terms to Your New Programs +============================================= + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. + Copyright (C) YEAR NAME OF AUTHOR + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + Also add information on how to contact you by electronic and paper +mail. + + If the program does terminal interaction, make it output a short notice +like this when it starts in an interactive mode: + + PROGRAM Copyright (C) YEAR NAME OF AUTHOR + This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type 'show c' for details. + + The hypothetical commands 'show w' and 'show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + + You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see <http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + +File: gccint.info, Node: GNU Free Documentation License, Next: Contributors, Prev: Copying, Up: Top + +GNU Free Documentation License +****************************** + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + <http://fsf.org/> + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled "History" in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + "History" section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version's + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + <http://www.gnu.org/copyleft/>. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: gccint.info, Node: Contributors, Next: Option Index, Prev: GNU Free Documentation License, Up: Top + +Contributors to GCC +******************* + +The GCC project would like to thank its many contributors. Without them +the project would not have been nearly as successful as it has been. +Any omissions in this list are accidental. Feel free to contact +<law@redhat.com> or <gerald@pfeifer.com> if you have been left out or +some of your contributions are not listed. Please keep this list in +alphabetical order. + + * Analog Devices helped implement the support for complex data types + and iterators. + + * John David Anglin for threading-related fixes and improvements to + libstdc++-v3, and the HP-UX port. + + * James van Artsdalen wrote the code that makes efficient use of the + Intel 80387 register stack. + + * Abramo and Roberto Bagnara for the SysV68 Motorola 3300 Delta + Series port. + + * Alasdair Baird for various bug fixes. + + * Giovanni Bajo for analyzing lots of complicated C++ problem + reports. + + * Peter Barada for his work to improve code generation for new + ColdFire cores. + + * Gerald Baumgartner added the signature extension to the C++ front + end. + + * Godmar Back for his Java improvements and encouragement. + + * Scott Bambrough for help porting the Java compiler. + + * Wolfgang Bangerth for processing tons of bug reports. + + * Jon Beniston for his Microsoft Windows port of Java and port to + Lattice Mico32. + + * Daniel Berlin for better DWARF2 support, faster/better + optimizations, improved alias analysis, plus migrating GCC to + Bugzilla. + + * Geoff Berry for his Java object serialization work and various + patches. + + * David Binderman tests weekly snapshots of GCC trunk against Fedora + Rawhide for several architectures. + + * Uros Bizjak for the implementation of x87 math built-in functions + and for various middle end and i386 back end improvements and bug + fixes. + + * Eric Blake for helping to make GCJ and libgcj conform to the + specifications. + + * Janne Blomqvist for contributions to GNU Fortran. + + * Segher Boessenkool for various fixes. + + * Hans-J. Boehm for his garbage collector, IA-64 libffi port, and + other Java work. + + * Neil Booth for work on cpplib, lang hooks, debug hooks and other + miscellaneous clean-ups. + + * Steven Bosscher for integrating the GNU Fortran front end into GCC + and for contributing to the tree-ssa branch. + + * Eric Botcazou for fixing middle- and backend bugs left and right. + + * Per Bothner for his direction via the steering committee and + various improvements to the infrastructure for supporting new + languages. Chill front end implementation. Initial + implementations of cpplib, fix-header, config.guess, libio, and + past C++ library (libg++) maintainer. Dreaming up, designing and + implementing much of GCJ. + + * Devon Bowen helped port GCC to the Tahoe. + + * Don Bowman for mips-vxworks contributions. + + * Dave Brolley for work on cpplib and Chill. + + * Paul Brook for work on the ARM architecture and maintaining GNU + Fortran. + + * Robert Brown implemented the support for Encore 32000 systems. + + * Christian Bruel for improvements to local store elimination. + + * Herman A.J. ten Brugge for various fixes. + + * Joerg Brunsmann for Java compiler hacking and help with the GCJ + FAQ. + + * Joe Buck for his direction via the steering committee. + + * Craig Burley for leadership of the G77 Fortran effort. + + * Stephan Buys for contributing Doxygen notes for libstdc++. + + * Paolo Carlini for libstdc++ work: lots of efficiency improvements + to the C++ strings, streambufs and formatted I/O, hard detective + work on the frustrating localization issues, and keeping up with + the problem reports. + + * John Carr for his alias work, SPARC hacking, infrastructure + improvements, previous contributions to the steering committee, + loop optimizations, etc. + + * Stephane Carrez for 68HC11 and 68HC12 ports. + + * Steve Chamberlain for support for the Renesas SH and H8 processors + and the PicoJava processor, and for GCJ config fixes. + + * Glenn Chambers for help with the GCJ FAQ. + + * John-Marc Chandonia for various libgcj patches. + + * Denis Chertykov for contributing and maintaining the AVR port, the + first GCC port for an 8-bit architecture. + + * Scott Christley for his Objective-C contributions. + + * Eric Christopher for his Java porting help and clean-ups. + + * Branko Cibej for more warning contributions. + + * The GNU Classpath project for all of their merged runtime code. + + * Nick Clifton for arm, mcore, fr30, v850, m32r, msp430 rx work, + '--help', and other random hacking. + + * Michael Cook for libstdc++ cleanup patches to reduce warnings. + + * R. Kelley Cook for making GCC buildable from a read-only directory + as well as other miscellaneous build process and documentation + clean-ups. + + * Ralf Corsepius for SH testing and minor bug fixing. + + * Stan Cox for care and feeding of the x86 port and lots of behind + the scenes hacking. + + * Alex Crain provided changes for the 3b1. + + * Ian Dall for major improvements to the NS32k port. + + * Paul Dale for his work to add uClinux platform support to the m68k + backend. + + * Dario Dariol contributed the four varieties of sample programs that + print a copy of their source. + + * Russell Davidson for fstream and stringstream fixes in libstdc++. + + * Bud Davis for work on the G77 and GNU Fortran compilers. + + * Mo DeJong for GCJ and libgcj bug fixes. + + * DJ Delorie for the DJGPP port, build and libiberty maintenance, + various bug fixes, and the M32C, MeP, MSP430, and RL78 ports. + + * Arnaud Desitter for helping to debug GNU Fortran. + + * Gabriel Dos Reis for contributions to G++, contributions and + maintenance of GCC diagnostics infrastructure, libstdc++-v3, + including 'valarray<>', 'complex<>', maintaining the numerics + library (including that pesky '<limits>' :-) and keeping up-to-date + anything to do with numbers. + + * Ulrich Drepper for his work on glibc, testing of GCC using glibc, + ISO C99 support, CFG dumping support, etc., plus support of the C++ + runtime libraries including for all kinds of C interface issues, + contributing and maintaining 'complex<>', sanity checking and + disbursement, configuration architecture, libio maintenance, and + early math work. + + * Franc,ois Dumont for his work on libstdc++-v3, especially + maintaining and improving 'debug-mode' and associative and + unordered containers. + + * Zdenek Dvorak for a new loop unroller and various fixes. + + * Michael Eager for his work on the Xilinx MicroBlaze port. + + * Richard Earnshaw for his ongoing work with the ARM. + + * David Edelsohn for his direction via the steering committee, + ongoing work with the RS6000/PowerPC port, help cleaning up Haifa + loop changes, doing the entire AIX port of libstdc++ with his bare + hands, and for ensuring GCC properly keeps working on AIX. + + * Kevin Ediger for the floating point formatting of num_put::do_put + in libstdc++. + + * Phil Edwards for libstdc++ work including configuration hackery, + documentation maintainer, chief breaker of the web pages, the + occasional iostream bug fix, and work on shared library symbol + versioning. + + * Paul Eggert for random hacking all over GCC. + + * Mark Elbrecht for various DJGPP improvements, and for libstdc++ + configuration support for locales and fstream-related fixes. + + * Vadim Egorov for libstdc++ fixes in strings, streambufs, and + iostreams. + + * Christian Ehrhardt for dealing with bug reports. + + * Ben Elliston for his work to move the Objective-C runtime into its + own subdirectory and for his work on autoconf. + + * Revital Eres for work on the PowerPC 750CL port. + + * Marc Espie for OpenBSD support. + + * Doug Evans for much of the global optimization framework, arc, + m32r, and SPARC work. + + * Christopher Faylor for his work on the Cygwin port and for caring + and feeding the gcc.gnu.org box and saving its users tons of spam. + + * Fred Fish for BeOS support and Ada fixes. + + * Ivan Fontes Garcia for the Portuguese translation of the GCJ FAQ. + + * Peter Gerwinski for various bug fixes and the Pascal front end. + + * Kaveh R. Ghazi for his direction via the steering committee, + amazing work to make '-W -Wall -W* -Werror' useful, and testing GCC + on a plethora of platforms. Kaveh extends his gratitude to the + CAIP Center at Rutgers University for providing him with computing + resources to work on Free Software from the late 1980s to 2010. + + * John Gilmore for a donation to the FSF earmarked improving GNU + Java. + + * Judy Goldberg for c++ contributions. + + * Torbjorn Granlund for various fixes and the c-torture testsuite, + multiply- and divide-by-constant optimization, improved long long + support, improved leaf function register allocation, and his + direction via the steering committee. + + * Anthony Green for his '-Os' contributions, the moxie port, and Java + front end work. + + * Stu Grossman for gdb hacking, allowing GCJ developers to debug Java + code. + + * Michael K. Gschwind contributed the port to the PDP-11. + + * Richard Biener for his ongoing middle-end contributions and bug + fixes and for release management. + + * Ron Guilmette implemented the 'protoize' and 'unprotoize' tools, + the support for Dwarf symbolic debugging information, and much of + the support for System V Release 4. He has also worked heavily on + the Intel 386 and 860 support. + + * Sumanth Gundapaneni for contributing the CR16 port. + + * Mostafa Hagog for Swing Modulo Scheduling (SMS) and post reload + GCSE. + + * Bruno Haible for improvements in the runtime overhead for EH, new + warnings and assorted bug fixes. + + * Andrew Haley for his amazing Java compiler and library efforts. + + * Chris Hanson assisted in making GCC work on HP-UX for the 9000 + series 300. + + * Michael Hayes for various thankless work he's done trying to get + the c30/c40 ports functional. Lots of loop and unroll improvements + and fixes. + + * Dara Hazeghi for wading through myriads of target-specific bug + reports. + + * Kate Hedstrom for staking the G77 folks with an initial testsuite. + + * Richard Henderson for his ongoing SPARC, alpha, ia32, and ia64 + work, loop opts, and generally fixing lots of old problems we've + ignored for years, flow rewrite and lots of further stuff, + including reviewing tons of patches. + + * Aldy Hernandez for working on the PowerPC port, SIMD support, and + various fixes. + + * Nobuyuki Hikichi of Software Research Associates, Tokyo, + contributed the support for the Sony NEWS machine. + + * Kazu Hirata for caring and feeding the Renesas H8/300 port and + various fixes. + + * Katherine Holcomb for work on GNU Fortran. + + * Manfred Hollstein for his ongoing work to keep the m88k alive, lots + of testing and bug fixing, particularly of GCC configury code. + + * Steve Holmgren for MachTen patches. + + * Mat Hostetter for work on the TILE-Gx and TILEPro ports. + + * Jan Hubicka for his x86 port improvements. + + * Falk Hueffner for working on C and optimization bug reports. + + * Bernardo Innocenti for his m68k work, including merging of ColdFire + improvements and uClinux support. + + * Christian Iseli for various bug fixes. + + * Kamil Iskra for general m68k hacking. + + * Lee Iverson for random fixes and MIPS testing. + + * Andreas Jaeger for testing and benchmarking of GCC and various bug + fixes. + + * Jakub Jelinek for his SPARC work and sibling call optimizations as + well as lots of bug fixes and test cases, and for improving the + Java build system. + + * Janis Johnson for ia64 testing and fixes, her quality improvement + sidetracks, and web page maintenance. + + * Kean Johnston for SCO OpenServer support and various fixes. + + * Tim Josling for the sample language treelang based originally on + Richard Kenner's "toy" language. + + * Nicolai Josuttis for additional libstdc++ documentation. + + * Klaus Kaempf for his ongoing work to make alpha-vms a viable + target. + + * Steven G. Kargl for work on GNU Fortran. + + * David Kashtan of SRI adapted GCC to VMS. + + * Ryszard Kabatek for many, many libstdc++ bug fixes and + optimizations of strings, especially member functions, and for + auto_ptr fixes. + + * Geoffrey Keating for his ongoing work to make the PPC work for + GNU/Linux and his automatic regression tester. + + * Brendan Kehoe for his ongoing work with G++ and for a lot of early + work in just about every part of libstdc++. + + * Oliver M. Kellogg of Deutsche Aerospace contributed the port to the + MIL-STD-1750A. + + * Richard Kenner of the New York University Ultracomputer Research + Laboratory wrote the machine descriptions for the AMD 29000, the + DEC Alpha, the IBM RT PC, and the IBM RS/6000 as well as the + support for instruction attributes. He also made changes to better + support RISC processors including changes to common subexpression + elimination, strength reduction, function calling sequence + handling, and condition code support, in addition to generalizing + the code for frame pointer elimination and delay slot scheduling. + Richard Kenner was also the head maintainer of GCC for several + years. + + * Mumit Khan for various contributions to the Cygwin and Mingw32 + ports and maintaining binary releases for Microsoft Windows hosts, + and for massive libstdc++ porting work to Cygwin/Mingw32. + + * Robin Kirkham for cpu32 support. + + * Mark Klein for PA improvements. + + * Thomas Koenig for various bug fixes. + + * Bruce Korb for the new and improved fixincludes code. + + * Benjamin Kosnik for his G++ work and for leading the libstdc++-v3 + effort. + + * Charles LaBrec contributed the support for the Integrated Solutions + 68020 system. + + * Asher Langton and Mike Kumbera for contributing Cray pointer + support to GNU Fortran, and for other GNU Fortran improvements. + + * Jeff Law for his direction via the steering committee, coordinating + the entire egcs project and GCC 2.95, rolling out snapshots and + releases, handling merges from GCC2, reviewing tons of patches that + might have fallen through the cracks else, and random but extensive + hacking. + + * Walter Lee for work on the TILE-Gx and TILEPro ports. + + * Marc Lehmann for his direction via the steering committee and + helping with analysis and improvements of x86 performance. + + * Victor Leikehman for work on GNU Fortran. + + * Ted Lemon wrote parts of the RTL reader and printer. + + * Kriang Lerdsuwanakij for C++ improvements including template as + template parameter support, and many C++ fixes. + + * Warren Levy for tremendous work on libgcj (Java Runtime Library) + and random work on the Java front end. + + * Alain Lichnewsky ported GCC to the MIPS CPU. + + * Oskar Liljeblad for hacking on AWT and his many Java bug reports + and patches. + + * Robert Lipe for OpenServer support, new testsuites, testing, etc. + + * Chen Liqin for various S+core related fixes/improvement, and for + maintaining the S+core port. + + * Weiwen Liu for testing and various bug fixes. + + * Manuel Lo'pez-Iba'n~ez for improving '-Wconversion' and many other + diagnostics fixes and improvements. + + * Dave Love for his ongoing work with the Fortran front end and + runtime libraries. + + * Martin von Lo"wis for internal consistency checking infrastructure, + various C++ improvements including namespace support, and tons of + assistance with libstdc++/compiler merges. + + * H.J. Lu for his previous contributions to the steering committee, + many x86 bug reports, prototype patches, and keeping the GNU/Linux + ports working. + + * Greg McGary for random fixes and (someday) bounded pointers. + + * Andrew MacLeod for his ongoing work in building a real EH system, + various code generation improvements, work on the global optimizer, + etc. + + * Vladimir Makarov for hacking some ugly i960 problems, PowerPC + hacking improvements to compile-time performance, overall knowledge + and direction in the area of instruction scheduling, and design and + implementation of the automaton based instruction scheduler. + + * Bob Manson for his behind the scenes work on dejagnu. + + * Philip Martin for lots of libstdc++ string and vector iterator + fixes and improvements, and string clean up and testsuites. + + * All of the Mauve project contributors, for Java test code. + + * Bryce McKinlay for numerous GCJ and libgcj fixes and improvements. + + * Adam Megacz for his work on the Microsoft Windows port of GCJ. + + * Michael Meissner for LRS framework, ia32, m32r, v850, m88k, MIPS, + powerpc, haifa, ECOFF debug support, and other assorted hacking. + + * Jason Merrill for his direction via the steering committee and + leading the G++ effort. + + * Martin Michlmayr for testing GCC on several architectures using the + entire Debian archive. + + * David Miller for his direction via the steering committee, lots of + SPARC work, improvements in jump.c and interfacing with the Linux + kernel developers. + + * Gary Miller ported GCC to Charles River Data Systems machines. + + * Alfred Minarik for libstdc++ string and ios bug fixes, and turning + the entire libstdc++ testsuite namespace-compatible. + + * Mark Mitchell for his direction via the steering committee, + mountains of C++ work, load/store hoisting out of loops, alias + analysis improvements, ISO C 'restrict' support, and serving as + release manager from 2000 to 2011. + + * Alan Modra for various GNU/Linux bits and testing. + + * Toon Moene for his direction via the steering committee, Fortran + maintenance, and his ongoing work to make us make Fortran run fast. + + * Jason Molenda for major help in the care and feeding of all the + services on the gcc.gnu.org (formerly egcs.cygnus.com) + machine--mail, web services, ftp services, etc etc. Doing all this + work on scrap paper and the backs of envelopes would have been... + difficult. + + * Catherine Moore for fixing various ugly problems we have sent her + way, including the haifa bug which was killing the Alpha & PowerPC + Linux kernels. + + * Mike Moreton for his various Java patches. + + * David Mosberger-Tang for various Alpha improvements, and for the + initial IA-64 port. + + * Stephen Moshier contributed the floating point emulator that + assists in cross-compilation and permits support for floating point + numbers wider than 64 bits and for ISO C99 support. + + * Bill Moyer for his behind the scenes work on various issues. + + * Philippe De Muyter for his work on the m68k port. + + * Joseph S. Myers for his work on the PDP-11 port, format checking + and ISO C99 support, and continuous emphasis on (and contributions + to) documentation. + + * Nathan Myers for his work on libstdc++-v3: architecture and + authorship through the first three snapshots, including + implementation of locale infrastructure, string, shadow C headers, + and the initial project documentation (DESIGN, CHECKLIST, and so + forth). Later, more work on MT-safe string and shadow headers. + + * Felix Natter for documentation on porting libstdc++. + + * Nathanael Nerode for cleaning up the configuration/build process. + + * NeXT, Inc. donated the front end that supports the Objective-C + language. + + * Hans-Peter Nilsson for the CRIS and MMIX ports, improvements to the + search engine setup, various documentation fixes and other small + fixes. + + * Geoff Noer for his work on getting cygwin native builds working. + + * Diego Novillo for his work on Tree SSA, OpenMP, SPEC performance + tracking web pages, GIMPLE tuples, and assorted fixes. + + * David O'Brien for the FreeBSD/alpha, FreeBSD/AMD x86-64, + FreeBSD/ARM, FreeBSD/PowerPC, and FreeBSD/SPARC64 ports and related + infrastructure improvements. + + * Alexandre Oliva for various build infrastructure improvements, + scripts and amazing testing work, including keeping libtool issues + sane and happy. + + * Stefan Olsson for work on mt_alloc. + + * Melissa O'Neill for various NeXT fixes. + + * Rainer Orth for random MIPS work, including improvements to GCC's + o32 ABI support, improvements to dejagnu's MIPS support, Java + configuration clean-ups and porting work, and maintaining the IRIX, + Solaris 2, and Tru64 UNIX ports. + + * Hartmut Penner for work on the s390 port. + + * Paul Petersen wrote the machine description for the Alliant FX/8. + + * Alexandre Petit-Bianco for implementing much of the Java compiler + and continued Java maintainership. + + * Matthias Pfaller for major improvements to the NS32k port. + + * Gerald Pfeifer for his direction via the steering committee, + pointing out lots of problems we need to solve, maintenance of the + web pages, and taking care of documentation maintenance in general. + + * Andrew Pinski for processing bug reports by the dozen. + + * Ovidiu Predescu for his work on the Objective-C front end and + runtime libraries. + + * Jerry Quinn for major performance improvements in C++ formatted + I/O. + + * Ken Raeburn for various improvements to checker, MIPS ports and + various cleanups in the compiler. + + * Rolf W. Rasmussen for hacking on AWT. + + * David Reese of Sun Microsystems contributed to the Solaris on + PowerPC port. + + * Volker Reichelt for keeping up with the problem reports. + + * Joern Rennecke for maintaining the sh port, loop, regmove & reload + hacking and developing and maintaining the Epiphany port. + + * Loren J. Rittle for improvements to libstdc++-v3 including the + FreeBSD port, threading fixes, thread-related configury changes, + critical threading documentation, and solutions to really tricky + I/O problems, as well as keeping GCC properly working on FreeBSD + and continuous testing. + + * Craig Rodrigues for processing tons of bug reports. + + * Ola Ro"nnerup for work on mt_alloc. + + * Gavin Romig-Koch for lots of behind the scenes MIPS work. + + * David Ronis inspired and encouraged Craig to rewrite the G77 + documentation in texinfo format by contributing a first pass at a + translation of the old 'g77-0.5.16/f/DOC' file. + + * Ken Rose for fixes to GCC's delay slot filling code. + + * Paul Rubin wrote most of the preprocessor. + + * Pe'tur Runo'lfsson for major performance improvements in C++ + formatted I/O and large file support in C++ filebuf. + + * Chip Salzenberg for libstdc++ patches and improvements to locales, + traits, Makefiles, libio, libtool hackery, and "long long" support. + + * Juha Sarlin for improvements to the H8 code generator. + + * Greg Satz assisted in making GCC work on HP-UX for the 9000 series + 300. + + * Roger Sayle for improvements to constant folding and GCC's RTL + optimizers as well as for fixing numerous bugs. + + * Bradley Schatz for his work on the GCJ FAQ. + + * Peter Schauer wrote the code to allow debugging to work on the + Alpha. + + * William Schelter did most of the work on the Intel 80386 support. + + * Tobias Schlu"ter for work on GNU Fortran. + + * Bernd Schmidt for various code generation improvements and major + work in the reload pass, serving as release manager for GCC 2.95.3, + and work on the Blackfin and C6X ports. + + * Peter Schmid for constant testing of libstdc++--especially + application testing, going above and beyond what was requested for + the release criteria--and libstdc++ header file tweaks. + + * Jason Schroeder for jcf-dump patches. + + * Andreas Schwab for his work on the m68k port. + + * Lars Segerlund for work on GNU Fortran. + + * Dodji Seketeli for numerous C++ bug fixes and debug info + improvements. + + * Tim Shen for major work on '<regex>'. + + * Joel Sherrill for his direction via the steering committee, RTEMS + contributions and RTEMS testing. + + * Nathan Sidwell for many C++ fixes/improvements. + + * Jeffrey Siegal for helping RMS with the original design of GCC, + some code which handles the parse tree and RTL data structures, + constant folding and help with the original VAX & m68k ports. + + * Kenny Simpson for prompting libstdc++ fixes due to defect reports + from the LWG (thereby keeping GCC in line with updates from the + ISO). + + * Franz Sirl for his ongoing work with making the PPC port stable for + GNU/Linux. + + * Andrey Slepuhin for assorted AIX hacking. + + * Trevor Smigiel for contributing the SPU port. + + * Christopher Smith did the port for Convex machines. + + * Danny Smith for his major efforts on the Mingw (and Cygwin) ports. + + * Randy Smith finished the Sun FPA support. + + * Ed Smith-Rowland for his continuous work on libstdc++-v3, special + functions, '<random>', and various improvements to C++11 features. + + * Scott Snyder for queue, iterator, istream, and string fixes and + libstdc++ testsuite entries. Also for providing the patch to G77 + to add rudimentary support for 'INTEGER*1', 'INTEGER*2', and + 'LOGICAL*1'. + + * Zdenek Sojka for running automated regression testing of GCC and + reporting numerous bugs. + + * Jayant Sonar for contributing the CR16 port. + + * Brad Spencer for contributions to the GLIBCPP_FORCE_NEW technique. + + * Richard Stallman, for writing the original GCC and launching the + GNU project. + + * Jan Stein of the Chalmers Computer Society provided support for + Genix, as well as part of the 32000 machine description. + + * Nigel Stephens for various mips16 related fixes/improvements. + + * Jonathan Stone wrote the machine description for the Pyramid + computer. + + * Graham Stott for various infrastructure improvements. + + * John Stracke for his Java HTTP protocol fixes. + + * Mike Stump for his Elxsi port, G++ contributions over the years and + more recently his vxworks contributions + + * Jeff Sturm for Java porting help, bug fixes, and encouragement. + + * Shigeya Suzuki for this fixes for the bsdi platforms. + + * Ian Lance Taylor for the Go frontend, the initial mips16 and mips64 + support, general configury hacking, fixincludes, etc. + + * Holger Teutsch provided the support for the Clipper CPU. + + * Gary Thomas for his ongoing work to make the PPC work for + GNU/Linux. + + * Philipp Thomas for random bug fixes throughout the compiler + + * Jason Thorpe for thread support in libstdc++ on NetBSD. + + * Kresten Krab Thorup wrote the run time support for the Objective-C + language and the fantastic Java bytecode interpreter. + + * Michael Tiemann for random bug fixes, the first instruction + scheduler, initial C++ support, function integration, NS32k, SPARC + and M88k machine description work, delay slot scheduling. + + * Andreas Tobler for his work porting libgcj to Darwin. + + * Teemu Torma for thread safe exception handling support. + + * Leonard Tower wrote parts of the parser, RTL generator, and RTL + definitions, and of the VAX machine description. + + * Daniel Towner and Hariharan Sandanagobalane contributed and + maintain the picoChip port. + + * Tom Tromey for internationalization support and for his many Java + contributions and libgcj maintainership. + + * Lassi Tuura for improvements to config.guess to determine HP + processor types. + + * Petter Urkedal for libstdc++ CXXFLAGS, math, and algorithms fixes. + + * Andy Vaught for the design and initial implementation of the GNU + Fortran front end. + + * Brent Verner for work with the libstdc++ cshadow files and their + associated configure steps. + + * Todd Vierling for contributions for NetBSD ports. + + * Jonathan Wakely for contributing libstdc++ Doxygen notes and XHTML + guidance. + + * Dean Wakerley for converting the install documentation from HTML to + texinfo in time for GCC 3.0. + + * Krister Walfridsson for random bug fixes. + + * Feng Wang for contributions to GNU Fortran. + + * Stephen M. Webb for time and effort on making libstdc++ shadow + files work with the tricky Solaris 8+ headers, and for pushing the + build-time header tree. Also, for starting and driving the + '<regex>' effort. + + * John Wehle for various improvements for the x86 code generator, + related infrastructure improvements to help x86 code generation, + value range propagation and other work, WE32k port. + + * Ulrich Weigand for work on the s390 port. + + * Zack Weinberg for major work on cpplib and various other bug fixes. + + * Matt Welsh for help with Linux Threads support in GCJ. + + * Urban Widmark for help fixing java.io. + + * Mark Wielaard for new Java library code and his work integrating + with Classpath. + + * Dale Wiles helped port GCC to the Tahoe. + + * Bob Wilson from Tensilica, Inc. for the Xtensa port. + + * Jim Wilson for his direction via the steering committee, tackling + hard problems in various places that nobody else wanted to work on, + strength reduction and other loop optimizations. + + * Paul Woegerer and Tal Agmon for the CRX port. + + * Carlo Wood for various fixes. + + * Tom Wood for work on the m88k port. + + * Chung-Ju Wu for his work on the Andes NDS32 port. + + * Canqun Yang for work on GNU Fortran. + + * Masanobu Yuhara of Fujitsu Laboratories implemented the machine + description for the Tron architecture (specifically, the Gmicro). + + * Kevin Zachmann helped port GCC to the Tahoe. + + * Ayal Zaks for Swing Modulo Scheduling (SMS). + + * Xiaoqiang Zhang for work on GNU Fortran. + + * Gilles Zunino for help porting Java to Irix. + + The following people are recognized for their contributions to GNAT, +the Ada front end of GCC: + * Bernard Banner + + * Romain Berrendonner + + * Geert Bosch + + * Emmanuel Briot + + * Joel Brobecker + + * Ben Brosgol + + * Vincent Celier + + * Arnaud Charlet + + * Chien Chieng + + * Cyrille Comar + + * Cyrille Crozes + + * Robert Dewar + + * Gary Dismukes + + * Robert Duff + + * Ed Falis + + * Ramon Fernandez + + * Sam Figueroa + + * Vasiliy Fofanov + + * Michael Friess + + * Franco Gasperoni + + * Ted Giering + + * Matthew Gingell + + * Laurent Guerby + + * Jerome Guitton + + * Olivier Hainque + + * Jerome Hugues + + * Hristian Kirtchev + + * Jerome Lambourg + + * Bruno Leclerc + + * Albert Lee + + * Sean McNeil + + * Javier Miranda + + * Laurent Nana + + * Pascal Obry + + * Dong-Ik Oh + + * Laurent Pautet + + * Brett Porter + + * Thomas Quinot + + * Nicolas Roche + + * Pat Rogers + + * Jose Ruiz + + * Douglas Rupp + + * Sergey Rybin + + * Gail Schenker + + * Ed Schonberg + + * Nicolas Setton + + * Samuel Tardieu + + The following people are recognized for their contributions of new +features, bug reports, testing and integration of classpath/libgcj for +GCC version 4.1: + * Lillian Angel for 'JTree' implementation and lots Free Swing + additions and bug fixes. + + * Wolfgang Baer for 'GapContent' bug fixes. + + * Anthony Balkissoon for 'JList', Free Swing 1.5 updates and mouse + event fixes, lots of Free Swing work including 'JTable' editing. + + * Stuart Ballard for RMI constant fixes. + + * Goffredo Baroncelli for 'HTTPURLConnection' fixes. + + * Gary Benson for 'MessageFormat' fixes. + + * Daniel Bonniot for 'Serialization' fixes. + + * Chris Burdess for lots of gnu.xml and http protocol fixes, 'StAX' + and 'DOM xml:id' support. + + * Ka-Hing Cheung for 'TreePath' and 'TreeSelection' fixes. + + * Archie Cobbs for build fixes, VM interface updates, + 'URLClassLoader' updates. + + * Kelley Cook for build fixes. + + * Martin Cordova for Suggestions for better 'SocketTimeoutException'. + + * David Daney for 'BitSet' bug fixes, 'HttpURLConnection' rewrite and + improvements. + + * Thomas Fitzsimmons for lots of upgrades to the gtk+ AWT and Cairo + 2D support. Lots of imageio framework additions, lots of AWT and + Free Swing bug fixes. + + * Jeroen Frijters for 'ClassLoader' and nio cleanups, serialization + fixes, better 'Proxy' support, bug fixes and IKVM integration. + + * Santiago Gala for 'AccessControlContext' fixes. + + * Nicolas Geoffray for 'VMClassLoader' and 'AccessController' + improvements. + + * David Gilbert for 'basic' and 'metal' icon and plaf support and + lots of documenting, Lots of Free Swing and metal theme additions. + 'MetalIconFactory' implementation. + + * Anthony Green for 'MIDI' framework, 'ALSA' and 'DSSI' providers. + + * Andrew Haley for 'Serialization' and 'URLClassLoader' fixes, gcj + build speedups. + + * Kim Ho for 'JFileChooser' implementation. + + * Andrew John Hughes for 'Locale' and net fixes, URI RFC2986 updates, + 'Serialization' fixes, 'Properties' XML support and generic branch + work, VMIntegration guide update. + + * Bastiaan Huisman for 'TimeZone' bug fixing. + + * Andreas Jaeger for mprec updates. + + * Paul Jenner for better '-Werror' support. + + * Ito Kazumitsu for 'NetworkInterface' implementation and updates. + + * Roman Kennke for 'BoxLayout', 'GrayFilter' and 'SplitPane', plus + bug fixes all over. Lots of Free Swing work including styled text. + + * Simon Kitching for 'String' cleanups and optimization suggestions. + + * Michael Koch for configuration fixes, 'Locale' updates, bug and + build fixes. + + * Guilhem Lavaux for configuration, thread and channel fixes and + Kaffe integration. JCL native 'Pointer' updates. Logger bug + fixes. + + * David Lichteblau for JCL support library global/local reference + cleanups. + + * Aaron Luchko for JDWP updates and documentation fixes. + + * Ziga Mahkovec for 'Graphics2D' upgraded to Cairo 0.5 and new regex + features. + + * Sven de Marothy for BMP imageio support, CSS and 'TextLayout' + fixes. 'GtkImage' rewrite, 2D, awt, free swing and date/time fixes + and implementing the Qt4 peers. + + * Casey Marshall for crypto algorithm fixes, 'FileChannel' lock, + 'SystemLogger' and 'FileHandler' rotate implementations, NIO + 'FileChannel.map' support, security and policy updates. + + * Bryce McKinlay for RMI work. + + * Audrius Meskauskas for lots of Free Corba, RMI and HTML work plus + testing and documenting. + + * Kalle Olavi Niemitalo for build fixes. + + * Rainer Orth for build fixes. + + * Andrew Overholt for 'File' locking fixes. + + * Ingo Proetel for 'Image', 'Logger' and 'URLClassLoader' updates. + + * Olga Rodimina for 'MenuSelectionManager' implementation. + + * Jan Roehrich for 'BasicTreeUI' and 'JTree' fixes. + + * Julian Scheid for documentation updates and gjdoc support. + + * Christian Schlichtherle for zip fixes and cleanups. + + * Robert Schuster for documentation updates and beans fixes, + 'TreeNode' enumerations and 'ActionCommand' and various fixes, XML + and URL, AWT and Free Swing bug fixes. + + * Keith Seitz for lots of JDWP work. + + * Christian Thalinger for 64-bit cleanups, Configuration and VM + interface fixes and 'CACAO' integration, 'fdlibm' updates. + + * Gael Thomas for 'VMClassLoader' boot packages support suggestions. + + * Andreas Tobler for Darwin and Solaris testing and fixing, 'Qt4' + support for Darwin/OS X, 'Graphics2D' support, 'gtk+' updates. + + * Dalibor Topic for better 'DEBUG' support, build cleanups and Kaffe + integration. 'Qt4' build infrastructure, 'SHA1PRNG' and + 'GdkPixbugDecoder' updates. + + * Tom Tromey for Eclipse integration, generics work, lots of bug + fixes and gcj integration including coordinating The Big Merge. + + * Mark Wielaard for bug fixes, packaging and release management, + 'Clipboard' implementation, system call interrupts and network + timeouts and 'GdkPixpufDecoder' fixes. + + In addition to the above, all of which also contributed time and energy +in testing GCC, we would like to thank the following for their +contributions to testing: + + * Michael Abd-El-Malek + + * Thomas Arend + + * Bonzo Armstrong + + * Steven Ashe + + * Chris Baldwin + + * David Billinghurst + + * Jim Blandy + + * Stephane Bortzmeyer + + * Horst von Brand + + * Frank Braun + + * Rodney Brown + + * Sidney Cadot + + * Bradford Castalia + + * Robert Clark + + * Jonathan Corbet + + * Ralph Doncaster + + * Richard Emberson + + * Levente Farkas + + * Graham Fawcett + + * Mark Fernyhough + + * Robert A. French + + * Jo"rgen Freyh + + * Mark K. Gardner + + * Charles-Antoine Gauthier + + * Yung Shing Gene + + * David Gilbert + + * Simon Gornall + + * Fred Gray + + * John Griffin + + * Patrik Hagglund + + * Phil Hargett + + * Amancio Hasty + + * Takafumi Hayashi + + * Bryan W. Headley + + * Kevin B. Hendricks + + * Joep Jansen + + * Christian Joensson + + * Michel Kern + + * David Kidd + + * Tobias Kuipers + + * Anand Krishnaswamy + + * A. O. V. Le Blanc + + * llewelly + + * Damon Love + + * Brad Lucier + + * Matthias Klose + + * Martin Knoblauch + + * Rick Lutowski + + * Jesse Macnish + + * Stefan Morrell + + * Anon A. Mous + + * Matthias Mueller + + * Pekka Nikander + + * Rick Niles + + * Jon Olson + + * Magnus Persson + + * Chris Pollard + + * Richard Polton + + * Derk Reefman + + * David Rees + + * Paul Reilly + + * Tom Reilly + + * Torsten Rueger + + * Danny Sadinoff + + * Marc Schifer + + * Erik Schnetter + + * Wayne K. Schroll + + * David Schuler + + * Vin Shelton + + * Tim Souder + + * Adam Sulmicki + + * Bill Thorson + + * George Talbot + + * Pedro A. M. Vazquez + + * Gregory Warnes + + * Ian Watson + + * David E. Young + + * And many others + + And finally we'd like to thank everyone who uses the compiler, provides +feedback and generally reminds us why we're doing this work in the first +place. + + +File: gccint.info, Node: Option Index, Next: Concept Index, Prev: Contributors, Up: Top + +Option Index +************ + +GCC's command line options are indexed here without any initial '-' or +'--'. Where an option has both positive and negative forms (such as +'-fOPTION' and '-fno-OPTION'), relevant entries in the manual are +indexed under the most appropriate form; it may sometimes be useful to +look up both forms. + + +* Menu: + +* fltrans: Internal flags. (line 18) +* fltrans-output-list: Internal flags. (line 23) +* fresolution: Internal flags. (line 27) +* fwpa: Internal flags. (line 9) +* msoft-float: Soft float library routines. + (line 6) + + +File: gccint.info, Node: Concept Index, Prev: Option Index, Up: Top + +Concept Index +************* + + +* Menu: + +* '!' in constraint: Multi-Alternative. (line 47) +* '#' in constraint: Modifiers. (line 67) +* '#' in template: Output Template. (line 66) +* #pragma: Misc. (line 387) +* '%' in constraint: Modifiers. (line 45) +* % in GTY option: GTY Options. (line 18) +* '%' in template: Output Template. (line 6) +* '&' in constraint: Modifiers. (line 25) +* (nil): RTL Objects. (line 73) +* '*' in constraint: Modifiers. (line 72) +* '*' in template: Output Statement. (line 29) +* '+' in constraint: Modifiers. (line 12) +* '-fsection-anchors': Special Accessors. (line 117) +* '-fsection-anchors' <1>: Anchored Addresses. (line 6) +* '/c' in RTL dump: Flags. (line 221) +* '/f' in RTL dump: Flags. (line 229) +* '/i' in RTL dump: Flags. (line 274) +* '/j' in RTL dump: Flags. (line 286) +* '/s' in RTL dump: Flags. (line 245) +* '/u' in RTL dump: Flags. (line 296) +* '/v' in RTL dump: Flags. (line 328) +* '0' in constraint: Simple Constraints. (line 128) +* '<' in constraint: Simple Constraints. (line 47) +* '=' in constraint: Modifiers. (line 8) +* '>' in constraint: Simple Constraints. (line 59) +* '?' in constraint: Multi-Alternative. (line 41) +* \: Output Template. (line 46) +* __absvdi2: Integer library routines. + (line 106) +* __absvsi2: Integer library routines. + (line 105) +* __addda3: Fixed-point fractional library routines. + (line 44) +* __adddf3: Soft float library routines. + (line 22) +* __adddq3: Fixed-point fractional library routines. + (line 31) +* __addha3: Fixed-point fractional library routines. + (line 41) +* __addhq3: Fixed-point fractional library routines. + (line 29) +* __addqq3: Fixed-point fractional library routines. + (line 27) +* __addsa3: Fixed-point fractional library routines. + (line 43) +* __addsf3: Soft float library routines. + (line 21) +* __addsq3: Fixed-point fractional library routines. + (line 30) +* __addta3: Fixed-point fractional library routines. + (line 45) +* __addtf3: Soft float library routines. + (line 23) +* __adduda3: Fixed-point fractional library routines. + (line 51) +* __addudq3: Fixed-point fractional library routines. + (line 39) +* __adduha3: Fixed-point fractional library routines. + (line 47) +* __adduhq3: Fixed-point fractional library routines. + (line 35) +* __adduqq3: Fixed-point fractional library routines. + (line 33) +* __addusa3: Fixed-point fractional library routines. + (line 49) +* __addusq3: Fixed-point fractional library routines. + (line 37) +* __adduta3: Fixed-point fractional library routines. + (line 53) +* __addvdi3: Integer library routines. + (line 110) +* __addvsi3: Integer library routines. + (line 109) +* __addxf3: Soft float library routines. + (line 25) +* __ashlda3: Fixed-point fractional library routines. + (line 350) +* __ashldi3: Integer library routines. + (line 13) +* __ashldq3: Fixed-point fractional library routines. + (line 338) +* __ashlha3: Fixed-point fractional library routines. + (line 348) +* __ashlhq3: Fixed-point fractional library routines. + (line 336) +* __ashlqq3: Fixed-point fractional library routines. + (line 335) +* __ashlsa3: Fixed-point fractional library routines. + (line 349) +* __ashlsi3: Integer library routines. + (line 12) +* __ashlsq3: Fixed-point fractional library routines. + (line 337) +* __ashlta3: Fixed-point fractional library routines. + (line 351) +* __ashlti3: Integer library routines. + (line 14) +* __ashluda3: Fixed-point fractional library routines. + (line 357) +* __ashludq3: Fixed-point fractional library routines. + (line 346) +* __ashluha3: Fixed-point fractional library routines. + (line 353) +* __ashluhq3: Fixed-point fractional library routines. + (line 342) +* __ashluqq3: Fixed-point fractional library routines. + (line 340) +* __ashlusa3: Fixed-point fractional library routines. + (line 355) +* __ashlusq3: Fixed-point fractional library routines. + (line 344) +* __ashluta3: Fixed-point fractional library routines. + (line 359) +* __ashrda3: Fixed-point fractional library routines. + (line 370) +* __ashrdi3: Integer library routines. + (line 18) +* __ashrdq3: Fixed-point fractional library routines. + (line 366) +* __ashrha3: Fixed-point fractional library routines. + (line 368) +* __ashrhq3: Fixed-point fractional library routines. + (line 364) +* __ashrqq3: Fixed-point fractional library routines. + (line 363) +* __ashrsa3: Fixed-point fractional library routines. + (line 369) +* __ashrsi3: Integer library routines. + (line 17) +* __ashrsq3: Fixed-point fractional library routines. + (line 365) +* __ashrta3: Fixed-point fractional library routines. + (line 371) +* __ashrti3: Integer library routines. + (line 19) +* __bid_adddd3: Decimal float library routines. + (line 23) +* __bid_addsd3: Decimal float library routines. + (line 19) +* __bid_addtd3: Decimal float library routines. + (line 27) +* __bid_divdd3: Decimal float library routines. + (line 66) +* __bid_divsd3: Decimal float library routines. + (line 62) +* __bid_divtd3: Decimal float library routines. + (line 70) +* __bid_eqdd2: Decimal float library routines. + (line 258) +* __bid_eqsd2: Decimal float library routines. + (line 256) +* __bid_eqtd2: Decimal float library routines. + (line 260) +* __bid_extendddtd2: Decimal float library routines. + (line 91) +* __bid_extendddtf: Decimal float library routines. + (line 139) +* __bid_extendddxf: Decimal float library routines. + (line 133) +* __bid_extenddfdd: Decimal float library routines. + (line 146) +* __bid_extenddftd: Decimal float library routines. + (line 106) +* __bid_extendsddd2: Decimal float library routines. + (line 87) +* __bid_extendsddf: Decimal float library routines. + (line 127) +* __bid_extendsdtd2: Decimal float library routines. + (line 89) +* __bid_extendsdtf: Decimal float library routines. + (line 137) +* __bid_extendsdxf: Decimal float library routines. + (line 131) +* __bid_extendsfdd: Decimal float library routines. + (line 102) +* __bid_extendsfsd: Decimal float library routines. + (line 144) +* __bid_extendsftd: Decimal float library routines. + (line 104) +* __bid_extendtftd: Decimal float library routines. + (line 148) +* __bid_extendxftd: Decimal float library routines. + (line 108) +* __bid_fixdddi: Decimal float library routines. + (line 169) +* __bid_fixddsi: Decimal float library routines. + (line 161) +* __bid_fixsddi: Decimal float library routines. + (line 167) +* __bid_fixsdsi: Decimal float library routines. + (line 159) +* __bid_fixtddi: Decimal float library routines. + (line 171) +* __bid_fixtdsi: Decimal float library routines. + (line 163) +* __bid_fixunsdddi: Decimal float library routines. + (line 186) +* __bid_fixunsddsi: Decimal float library routines. + (line 177) +* __bid_fixunssddi: Decimal float library routines. + (line 184) +* __bid_fixunssdsi: Decimal float library routines. + (line 175) +* __bid_fixunstddi: Decimal float library routines. + (line 188) +* __bid_fixunstdsi: Decimal float library routines. + (line 179) +* __bid_floatdidd: Decimal float library routines. + (line 204) +* __bid_floatdisd: Decimal float library routines. + (line 202) +* __bid_floatditd: Decimal float library routines. + (line 206) +* __bid_floatsidd: Decimal float library routines. + (line 195) +* __bid_floatsisd: Decimal float library routines. + (line 193) +* __bid_floatsitd: Decimal float library routines. + (line 197) +* __bid_floatunsdidd: Decimal float library routines. + (line 222) +* __bid_floatunsdisd: Decimal float library routines. + (line 220) +* __bid_floatunsditd: Decimal float library routines. + (line 224) +* __bid_floatunssidd: Decimal float library routines. + (line 213) +* __bid_floatunssisd: Decimal float library routines. + (line 211) +* __bid_floatunssitd: Decimal float library routines. + (line 215) +* __bid_gedd2: Decimal float library routines. + (line 276) +* __bid_gesd2: Decimal float library routines. + (line 274) +* __bid_getd2: Decimal float library routines. + (line 278) +* __bid_gtdd2: Decimal float library routines. + (line 303) +* __bid_gtsd2: Decimal float library routines. + (line 301) +* __bid_gttd2: Decimal float library routines. + (line 305) +* __bid_ledd2: Decimal float library routines. + (line 294) +* __bid_lesd2: Decimal float library routines. + (line 292) +* __bid_letd2: Decimal float library routines. + (line 296) +* __bid_ltdd2: Decimal float library routines. + (line 285) +* __bid_ltsd2: Decimal float library routines. + (line 283) +* __bid_lttd2: Decimal float library routines. + (line 287) +* __bid_muldd3: Decimal float library routines. + (line 52) +* __bid_mulsd3: Decimal float library routines. + (line 48) +* __bid_multd3: Decimal float library routines. + (line 56) +* __bid_nedd2: Decimal float library routines. + (line 267) +* __bid_negdd2: Decimal float library routines. + (line 77) +* __bid_negsd2: Decimal float library routines. + (line 75) +* __bid_negtd2: Decimal float library routines. + (line 79) +* __bid_nesd2: Decimal float library routines. + (line 265) +* __bid_netd2: Decimal float library routines. + (line 269) +* __bid_subdd3: Decimal float library routines. + (line 37) +* __bid_subsd3: Decimal float library routines. + (line 33) +* __bid_subtd3: Decimal float library routines. + (line 41) +* __bid_truncdddf: Decimal float library routines. + (line 152) +* __bid_truncddsd2: Decimal float library routines. + (line 93) +* __bid_truncddsf: Decimal float library routines. + (line 123) +* __bid_truncdfsd: Decimal float library routines. + (line 110) +* __bid_truncsdsf: Decimal float library routines. + (line 150) +* __bid_trunctddd2: Decimal float library routines. + (line 97) +* __bid_trunctddf: Decimal float library routines. + (line 129) +* __bid_trunctdsd2: Decimal float library routines. + (line 95) +* __bid_trunctdsf: Decimal float library routines. + (line 125) +* __bid_trunctdtf: Decimal float library routines. + (line 154) +* __bid_trunctdxf: Decimal float library routines. + (line 135) +* __bid_trunctfdd: Decimal float library routines. + (line 118) +* __bid_trunctfsd: Decimal float library routines. + (line 114) +* __bid_truncxfdd: Decimal float library routines. + (line 116) +* __bid_truncxfsd: Decimal float library routines. + (line 112) +* __bid_unorddd2: Decimal float library routines. + (line 234) +* __bid_unordsd2: Decimal float library routines. + (line 232) +* __bid_unordtd2: Decimal float library routines. + (line 236) +* __bswapdi2: Integer library routines. + (line 161) +* __bswapsi2: Integer library routines. + (line 160) +* __builtin_classify_type: Varargs. (line 48) +* __builtin_next_arg: Varargs. (line 39) +* __builtin_saveregs: Varargs. (line 22) +* __clear_cache: Miscellaneous routines. + (line 9) +* __clzdi2: Integer library routines. + (line 130) +* __clzsi2: Integer library routines. + (line 129) +* __clzti2: Integer library routines. + (line 131) +* __cmpda2: Fixed-point fractional library routines. + (line 450) +* __cmpdf2: Soft float library routines. + (line 163) +* __cmpdi2: Integer library routines. + (line 86) +* __cmpdq2: Fixed-point fractional library routines. + (line 439) +* __cmpha2: Fixed-point fractional library routines. + (line 448) +* __cmphq2: Fixed-point fractional library routines. + (line 437) +* __cmpqq2: Fixed-point fractional library routines. + (line 436) +* __cmpsa2: Fixed-point fractional library routines. + (line 449) +* __cmpsf2: Soft float library routines. + (line 162) +* __cmpsq2: Fixed-point fractional library routines. + (line 438) +* __cmpta2: Fixed-point fractional library routines. + (line 451) +* __cmptf2: Soft float library routines. + (line 164) +* __cmpti2: Integer library routines. + (line 87) +* __cmpuda2: Fixed-point fractional library routines. + (line 456) +* __cmpudq2: Fixed-point fractional library routines. + (line 446) +* __cmpuha2: Fixed-point fractional library routines. + (line 453) +* __cmpuhq2: Fixed-point fractional library routines. + (line 443) +* __cmpuqq2: Fixed-point fractional library routines. + (line 441) +* __cmpusa2: Fixed-point fractional library routines. + (line 455) +* __cmpusq2: Fixed-point fractional library routines. + (line 444) +* __cmputa2: Fixed-point fractional library routines. + (line 458) +* __CTOR_LIST__: Initialization. (line 25) +* __ctzdi2: Integer library routines. + (line 137) +* __ctzsi2: Integer library routines. + (line 136) +* __ctzti2: Integer library routines. + (line 138) +* __divda3: Fixed-point fractional library routines. + (line 226) +* __divdc3: Soft float library routines. + (line 250) +* __divdf3: Soft float library routines. + (line 47) +* __divdi3: Integer library routines. + (line 24) +* __divdq3: Fixed-point fractional library routines. + (line 221) +* __divha3: Fixed-point fractional library routines. + (line 223) +* __divhq3: Fixed-point fractional library routines. + (line 219) +* __divqq3: Fixed-point fractional library routines. + (line 217) +* __divsa3: Fixed-point fractional library routines. + (line 225) +* __divsc3: Soft float library routines. + (line 248) +* __divsf3: Soft float library routines. + (line 46) +* __divsi3: Integer library routines. + (line 23) +* __divsq3: Fixed-point fractional library routines. + (line 220) +* __divta3: Fixed-point fractional library routines. + (line 227) +* __divtc3: Soft float library routines. + (line 252) +* __divtf3: Soft float library routines. + (line 48) +* __divti3: Integer library routines. + (line 25) +* __divxc3: Soft float library routines. + (line 254) +* __divxf3: Soft float library routines. + (line 50) +* __dpd_adddd3: Decimal float library routines. + (line 21) +* __dpd_addsd3: Decimal float library routines. + (line 17) +* __dpd_addtd3: Decimal float library routines. + (line 25) +* __dpd_divdd3: Decimal float library routines. + (line 64) +* __dpd_divsd3: Decimal float library routines. + (line 60) +* __dpd_divtd3: Decimal float library routines. + (line 68) +* __dpd_eqdd2: Decimal float library routines. + (line 257) +* __dpd_eqsd2: Decimal float library routines. + (line 255) +* __dpd_eqtd2: Decimal float library routines. + (line 259) +* __dpd_extendddtd2: Decimal float library routines. + (line 90) +* __dpd_extendddtf: Decimal float library routines. + (line 138) +* __dpd_extendddxf: Decimal float library routines. + (line 132) +* __dpd_extenddfdd: Decimal float library routines. + (line 145) +* __dpd_extenddftd: Decimal float library routines. + (line 105) +* __dpd_extendsddd2: Decimal float library routines. + (line 86) +* __dpd_extendsddf: Decimal float library routines. + (line 126) +* __dpd_extendsdtd2: Decimal float library routines. + (line 88) +* __dpd_extendsdtf: Decimal float library routines. + (line 136) +* __dpd_extendsdxf: Decimal float library routines. + (line 130) +* __dpd_extendsfdd: Decimal float library routines. + (line 101) +* __dpd_extendsfsd: Decimal float library routines. + (line 143) +* __dpd_extendsftd: Decimal float library routines. + (line 103) +* __dpd_extendtftd: Decimal float library routines. + (line 147) +* __dpd_extendxftd: Decimal float library routines. + (line 107) +* __dpd_fixdddi: Decimal float library routines. + (line 168) +* __dpd_fixddsi: Decimal float library routines. + (line 160) +* __dpd_fixsddi: Decimal float library routines. + (line 166) +* __dpd_fixsdsi: Decimal float library routines. + (line 158) +* __dpd_fixtddi: Decimal float library routines. + (line 170) +* __dpd_fixtdsi: Decimal float library routines. + (line 162) +* __dpd_fixunsdddi: Decimal float library routines. + (line 185) +* __dpd_fixunsddsi: Decimal float library routines. + (line 176) +* __dpd_fixunssddi: Decimal float library routines. + (line 183) +* __dpd_fixunssdsi: Decimal float library routines. + (line 174) +* __dpd_fixunstddi: Decimal float library routines. + (line 187) +* __dpd_fixunstdsi: Decimal float library routines. + (line 178) +* __dpd_floatdidd: Decimal float library routines. + (line 203) +* __dpd_floatdisd: Decimal float library routines. + (line 201) +* __dpd_floatditd: Decimal float library routines. + (line 205) +* __dpd_floatsidd: Decimal float library routines. + (line 194) +* __dpd_floatsisd: Decimal float library routines. + (line 192) +* __dpd_floatsitd: Decimal float library routines. + (line 196) +* __dpd_floatunsdidd: Decimal float library routines. + (line 221) +* __dpd_floatunsdisd: Decimal float library routines. + (line 219) +* __dpd_floatunsditd: Decimal float library routines. + (line 223) +* __dpd_floatunssidd: Decimal float library routines. + (line 212) +* __dpd_floatunssisd: Decimal float library routines. + (line 210) +* __dpd_floatunssitd: Decimal float library routines. + (line 214) +* __dpd_gedd2: Decimal float library routines. + (line 275) +* __dpd_gesd2: Decimal float library routines. + (line 273) +* __dpd_getd2: Decimal float library routines. + (line 277) +* __dpd_gtdd2: Decimal float library routines. + (line 302) +* __dpd_gtsd2: Decimal float library routines. + (line 300) +* __dpd_gttd2: Decimal float library routines. + (line 304) +* __dpd_ledd2: Decimal float library routines. + (line 293) +* __dpd_lesd2: Decimal float library routines. + (line 291) +* __dpd_letd2: Decimal float library routines. + (line 295) +* __dpd_ltdd2: Decimal float library routines. + (line 284) +* __dpd_ltsd2: Decimal float library routines. + (line 282) +* __dpd_lttd2: Decimal float library routines. + (line 286) +* __dpd_muldd3: Decimal float library routines. + (line 50) +* __dpd_mulsd3: Decimal float library routines. + (line 46) +* __dpd_multd3: Decimal float library routines. + (line 54) +* __dpd_nedd2: Decimal float library routines. + (line 266) +* __dpd_negdd2: Decimal float library routines. + (line 76) +* __dpd_negsd2: Decimal float library routines. + (line 74) +* __dpd_negtd2: Decimal float library routines. + (line 78) +* __dpd_nesd2: Decimal float library routines. + (line 264) +* __dpd_netd2: Decimal float library routines. + (line 268) +* __dpd_subdd3: Decimal float library routines. + (line 35) +* __dpd_subsd3: Decimal float library routines. + (line 31) +* __dpd_subtd3: Decimal float library routines. + (line 39) +* __dpd_truncdddf: Decimal float library routines. + (line 151) +* __dpd_truncddsd2: Decimal float library routines. + (line 92) +* __dpd_truncddsf: Decimal float library routines. + (line 122) +* __dpd_truncdfsd: Decimal float library routines. + (line 109) +* __dpd_truncsdsf: Decimal float library routines. + (line 149) +* __dpd_trunctddd2: Decimal float library routines. + (line 96) +* __dpd_trunctddf: Decimal float library routines. + (line 128) +* __dpd_trunctdsd2: Decimal float library routines. + (line 94) +* __dpd_trunctdsf: Decimal float library routines. + (line 124) +* __dpd_trunctdtf: Decimal float library routines. + (line 153) +* __dpd_trunctdxf: Decimal float library routines. + (line 134) +* __dpd_trunctfdd: Decimal float library routines. + (line 117) +* __dpd_trunctfsd: Decimal float library routines. + (line 113) +* __dpd_truncxfdd: Decimal float library routines. + (line 115) +* __dpd_truncxfsd: Decimal float library routines. + (line 111) +* __dpd_unorddd2: Decimal float library routines. + (line 233) +* __dpd_unordsd2: Decimal float library routines. + (line 231) +* __dpd_unordtd2: Decimal float library routines. + (line 235) +* __DTOR_LIST__: Initialization. (line 25) +* __eqdf2: Soft float library routines. + (line 193) +* __eqsf2: Soft float library routines. + (line 192) +* __eqtf2: Soft float library routines. + (line 194) +* __extenddftf2: Soft float library routines. + (line 67) +* __extenddfxf2: Soft float library routines. + (line 68) +* __extendsfdf2: Soft float library routines. + (line 64) +* __extendsftf2: Soft float library routines. + (line 65) +* __extendsfxf2: Soft float library routines. + (line 66) +* __ffsdi2: Integer library routines. + (line 143) +* __ffsti2: Integer library routines. + (line 144) +* __fixdfdi: Soft float library routines. + (line 87) +* __fixdfsi: Soft float library routines. + (line 80) +* __fixdfti: Soft float library routines. + (line 93) +* __fixsfdi: Soft float library routines. + (line 86) +* __fixsfsi: Soft float library routines. + (line 79) +* __fixsfti: Soft float library routines. + (line 92) +* __fixtfdi: Soft float library routines. + (line 88) +* __fixtfsi: Soft float library routines. + (line 81) +* __fixtfti: Soft float library routines. + (line 94) +* __fixunsdfdi: Soft float library routines. + (line 107) +* __fixunsdfsi: Soft float library routines. + (line 100) +* __fixunsdfti: Soft float library routines. + (line 114) +* __fixunssfdi: Soft float library routines. + (line 106) +* __fixunssfsi: Soft float library routines. + (line 99) +* __fixunssfti: Soft float library routines. + (line 113) +* __fixunstfdi: Soft float library routines. + (line 108) +* __fixunstfsi: Soft float library routines. + (line 101) +* __fixunstfti: Soft float library routines. + (line 115) +* __fixunsxfdi: Soft float library routines. + (line 109) +* __fixunsxfsi: Soft float library routines. + (line 102) +* __fixunsxfti: Soft float library routines. + (line 116) +* __fixxfdi: Soft float library routines. + (line 89) +* __fixxfsi: Soft float library routines. + (line 82) +* __fixxfti: Soft float library routines. + (line 95) +* __floatdidf: Soft float library routines. + (line 127) +* __floatdisf: Soft float library routines. + (line 126) +* __floatditf: Soft float library routines. + (line 128) +* __floatdixf: Soft float library routines. + (line 129) +* __floatsidf: Soft float library routines. + (line 121) +* __floatsisf: Soft float library routines. + (line 120) +* __floatsitf: Soft float library routines. + (line 122) +* __floatsixf: Soft float library routines. + (line 123) +* __floattidf: Soft float library routines. + (line 133) +* __floattisf: Soft float library routines. + (line 132) +* __floattitf: Soft float library routines. + (line 134) +* __floattixf: Soft float library routines. + (line 135) +* __floatundidf: Soft float library routines. + (line 145) +* __floatundisf: Soft float library routines. + (line 144) +* __floatunditf: Soft float library routines. + (line 146) +* __floatundixf: Soft float library routines. + (line 147) +* __floatunsidf: Soft float library routines. + (line 139) +* __floatunsisf: Soft float library routines. + (line 138) +* __floatunsitf: Soft float library routines. + (line 140) +* __floatunsixf: Soft float library routines. + (line 141) +* __floatuntidf: Soft float library routines. + (line 151) +* __floatuntisf: Soft float library routines. + (line 150) +* __floatuntitf: Soft float library routines. + (line 152) +* __floatuntixf: Soft float library routines. + (line 153) +* __fractdadf: Fixed-point fractional library routines. + (line 635) +* __fractdadi: Fixed-point fractional library routines. + (line 632) +* __fractdadq: Fixed-point fractional library routines. + (line 615) +* __fractdaha2: Fixed-point fractional library routines. + (line 616) +* __fractdahi: Fixed-point fractional library routines. + (line 630) +* __fractdahq: Fixed-point fractional library routines. + (line 613) +* __fractdaqi: Fixed-point fractional library routines. + (line 629) +* __fractdaqq: Fixed-point fractional library routines. + (line 612) +* __fractdasa2: Fixed-point fractional library routines. + (line 617) +* __fractdasf: Fixed-point fractional library routines. + (line 634) +* __fractdasi: Fixed-point fractional library routines. + (line 631) +* __fractdasq: Fixed-point fractional library routines. + (line 614) +* __fractdata2: Fixed-point fractional library routines. + (line 618) +* __fractdati: Fixed-point fractional library routines. + (line 633) +* __fractdauda: Fixed-point fractional library routines. + (line 626) +* __fractdaudq: Fixed-point fractional library routines. + (line 622) +* __fractdauha: Fixed-point fractional library routines. + (line 624) +* __fractdauhq: Fixed-point fractional library routines. + (line 620) +* __fractdauqq: Fixed-point fractional library routines. + (line 619) +* __fractdausa: Fixed-point fractional library routines. + (line 625) +* __fractdausq: Fixed-point fractional library routines. + (line 621) +* __fractdauta: Fixed-point fractional library routines. + (line 627) +* __fractdfda: Fixed-point fractional library routines. + (line 1024) +* __fractdfdq: Fixed-point fractional library routines. + (line 1021) +* __fractdfha: Fixed-point fractional library routines. + (line 1022) +* __fractdfhq: Fixed-point fractional library routines. + (line 1019) +* __fractdfqq: Fixed-point fractional library routines. + (line 1018) +* __fractdfsa: Fixed-point fractional library routines. + (line 1023) +* __fractdfsq: Fixed-point fractional library routines. + (line 1020) +* __fractdfta: Fixed-point fractional library routines. + (line 1025) +* __fractdfuda: Fixed-point fractional library routines. + (line 1032) +* __fractdfudq: Fixed-point fractional library routines. + (line 1029) +* __fractdfuha: Fixed-point fractional library routines. + (line 1030) +* __fractdfuhq: Fixed-point fractional library routines. + (line 1027) +* __fractdfuqq: Fixed-point fractional library routines. + (line 1026) +* __fractdfusa: Fixed-point fractional library routines. + (line 1031) +* __fractdfusq: Fixed-point fractional library routines. + (line 1028) +* __fractdfuta: Fixed-point fractional library routines. + (line 1033) +* __fractdida: Fixed-point fractional library routines. + (line 974) +* __fractdidq: Fixed-point fractional library routines. + (line 971) +* __fractdiha: Fixed-point fractional library routines. + (line 972) +* __fractdihq: Fixed-point fractional library routines. + (line 969) +* __fractdiqq: Fixed-point fractional library routines. + (line 968) +* __fractdisa: Fixed-point fractional library routines. + (line 973) +* __fractdisq: Fixed-point fractional library routines. + (line 970) +* __fractdita: Fixed-point fractional library routines. + (line 975) +* __fractdiuda: Fixed-point fractional library routines. + (line 982) +* __fractdiudq: Fixed-point fractional library routines. + (line 979) +* __fractdiuha: Fixed-point fractional library routines. + (line 980) +* __fractdiuhq: Fixed-point fractional library routines. + (line 977) +* __fractdiuqq: Fixed-point fractional library routines. + (line 976) +* __fractdiusa: Fixed-point fractional library routines. + (line 981) +* __fractdiusq: Fixed-point fractional library routines. + (line 978) +* __fractdiuta: Fixed-point fractional library routines. + (line 983) +* __fractdqda: Fixed-point fractional library routines. + (line 543) +* __fractdqdf: Fixed-point fractional library routines. + (line 565) +* __fractdqdi: Fixed-point fractional library routines. + (line 562) +* __fractdqha: Fixed-point fractional library routines. + (line 541) +* __fractdqhi: Fixed-point fractional library routines. + (line 560) +* __fractdqhq2: Fixed-point fractional library routines. + (line 539) +* __fractdqqi: Fixed-point fractional library routines. + (line 559) +* __fractdqqq2: Fixed-point fractional library routines. + (line 538) +* __fractdqsa: Fixed-point fractional library routines. + (line 542) +* __fractdqsf: Fixed-point fractional library routines. + (line 564) +* __fractdqsi: Fixed-point fractional library routines. + (line 561) +* __fractdqsq2: Fixed-point fractional library routines. + (line 540) +* __fractdqta: Fixed-point fractional library routines. + (line 544) +* __fractdqti: Fixed-point fractional library routines. + (line 563) +* __fractdquda: Fixed-point fractional library routines. + (line 555) +* __fractdqudq: Fixed-point fractional library routines. + (line 550) +* __fractdquha: Fixed-point fractional library routines. + (line 552) +* __fractdquhq: Fixed-point fractional library routines. + (line 547) +* __fractdquqq: Fixed-point fractional library routines. + (line 545) +* __fractdqusa: Fixed-point fractional library routines. + (line 554) +* __fractdqusq: Fixed-point fractional library routines. + (line 548) +* __fractdquta: Fixed-point fractional library routines. + (line 557) +* __fracthada2: Fixed-point fractional library routines. + (line 571) +* __fracthadf: Fixed-point fractional library routines. + (line 589) +* __fracthadi: Fixed-point fractional library routines. + (line 586) +* __fracthadq: Fixed-point fractional library routines. + (line 569) +* __fracthahi: Fixed-point fractional library routines. + (line 584) +* __fracthahq: Fixed-point fractional library routines. + (line 567) +* __fracthaqi: Fixed-point fractional library routines. + (line 583) +* __fracthaqq: Fixed-point fractional library routines. + (line 566) +* __fracthasa2: Fixed-point fractional library routines. + (line 570) +* __fracthasf: Fixed-point fractional library routines. + (line 588) +* __fracthasi: Fixed-point fractional library routines. + (line 585) +* __fracthasq: Fixed-point fractional library routines. + (line 568) +* __fracthata2: Fixed-point fractional library routines. + (line 572) +* __fracthati: Fixed-point fractional library routines. + (line 587) +* __fracthauda: Fixed-point fractional library routines. + (line 580) +* __fracthaudq: Fixed-point fractional library routines. + (line 576) +* __fracthauha: Fixed-point fractional library routines. + (line 578) +* __fracthauhq: Fixed-point fractional library routines. + (line 574) +* __fracthauqq: Fixed-point fractional library routines. + (line 573) +* __fracthausa: Fixed-point fractional library routines. + (line 579) +* __fracthausq: Fixed-point fractional library routines. + (line 575) +* __fracthauta: Fixed-point fractional library routines. + (line 581) +* __fracthida: Fixed-point fractional library routines. + (line 942) +* __fracthidq: Fixed-point fractional library routines. + (line 939) +* __fracthiha: Fixed-point fractional library routines. + (line 940) +* __fracthihq: Fixed-point fractional library routines. + (line 937) +* __fracthiqq: Fixed-point fractional library routines. + (line 936) +* __fracthisa: Fixed-point fractional library routines. + (line 941) +* __fracthisq: Fixed-point fractional library routines. + (line 938) +* __fracthita: Fixed-point fractional library routines. + (line 943) +* __fracthiuda: Fixed-point fractional library routines. + (line 950) +* __fracthiudq: Fixed-point fractional library routines. + (line 947) +* __fracthiuha: Fixed-point fractional library routines. + (line 948) +* __fracthiuhq: Fixed-point fractional library routines. + (line 945) +* __fracthiuqq: Fixed-point fractional library routines. + (line 944) +* __fracthiusa: Fixed-point fractional library routines. + (line 949) +* __fracthiusq: Fixed-point fractional library routines. + (line 946) +* __fracthiuta: Fixed-point fractional library routines. + (line 951) +* __fracthqda: Fixed-point fractional library routines. + (line 497) +* __fracthqdf: Fixed-point fractional library routines. + (line 513) +* __fracthqdi: Fixed-point fractional library routines. + (line 510) +* __fracthqdq2: Fixed-point fractional library routines. + (line 494) +* __fracthqha: Fixed-point fractional library routines. + (line 495) +* __fracthqhi: Fixed-point fractional library routines. + (line 508) +* __fracthqqi: Fixed-point fractional library routines. + (line 507) +* __fracthqqq2: Fixed-point fractional library routines. + (line 492) +* __fracthqsa: Fixed-point fractional library routines. + (line 496) +* __fracthqsf: Fixed-point fractional library routines. + (line 512) +* __fracthqsi: Fixed-point fractional library routines. + (line 509) +* __fracthqsq2: Fixed-point fractional library routines. + (line 493) +* __fracthqta: Fixed-point fractional library routines. + (line 498) +* __fracthqti: Fixed-point fractional library routines. + (line 511) +* __fracthquda: Fixed-point fractional library routines. + (line 505) +* __fracthqudq: Fixed-point fractional library routines. + (line 502) +* __fracthquha: Fixed-point fractional library routines. + (line 503) +* __fracthquhq: Fixed-point fractional library routines. + (line 500) +* __fracthquqq: Fixed-point fractional library routines. + (line 499) +* __fracthqusa: Fixed-point fractional library routines. + (line 504) +* __fracthqusq: Fixed-point fractional library routines. + (line 501) +* __fracthquta: Fixed-point fractional library routines. + (line 506) +* __fractqida: Fixed-point fractional library routines. + (line 924) +* __fractqidq: Fixed-point fractional library routines. + (line 921) +* __fractqiha: Fixed-point fractional library routines. + (line 922) +* __fractqihq: Fixed-point fractional library routines. + (line 919) +* __fractqiqq: Fixed-point fractional library routines. + (line 918) +* __fractqisa: Fixed-point fractional library routines. + (line 923) +* __fractqisq: Fixed-point fractional library routines. + (line 920) +* __fractqita: Fixed-point fractional library routines. + (line 925) +* __fractqiuda: Fixed-point fractional library routines. + (line 933) +* __fractqiudq: Fixed-point fractional library routines. + (line 929) +* __fractqiuha: Fixed-point fractional library routines. + (line 931) +* __fractqiuhq: Fixed-point fractional library routines. + (line 927) +* __fractqiuqq: Fixed-point fractional library routines. + (line 926) +* __fractqiusa: Fixed-point fractional library routines. + (line 932) +* __fractqiusq: Fixed-point fractional library routines. + (line 928) +* __fractqiuta: Fixed-point fractional library routines. + (line 934) +* __fractqqda: Fixed-point fractional library routines. + (line 473) +* __fractqqdf: Fixed-point fractional library routines. + (line 491) +* __fractqqdi: Fixed-point fractional library routines. + (line 488) +* __fractqqdq2: Fixed-point fractional library routines. + (line 470) +* __fractqqha: Fixed-point fractional library routines. + (line 471) +* __fractqqhi: Fixed-point fractional library routines. + (line 486) +* __fractqqhq2: Fixed-point fractional library routines. + (line 468) +* __fractqqqi: Fixed-point fractional library routines. + (line 485) +* __fractqqsa: Fixed-point fractional library routines. + (line 472) +* __fractqqsf: Fixed-point fractional library routines. + (line 490) +* __fractqqsi: Fixed-point fractional library routines. + (line 487) +* __fractqqsq2: Fixed-point fractional library routines. + (line 469) +* __fractqqta: Fixed-point fractional library routines. + (line 474) +* __fractqqti: Fixed-point fractional library routines. + (line 489) +* __fractqquda: Fixed-point fractional library routines. + (line 482) +* __fractqqudq: Fixed-point fractional library routines. + (line 478) +* __fractqquha: Fixed-point fractional library routines. + (line 480) +* __fractqquhq: Fixed-point fractional library routines. + (line 476) +* __fractqquqq: Fixed-point fractional library routines. + (line 475) +* __fractqqusa: Fixed-point fractional library routines. + (line 481) +* __fractqqusq: Fixed-point fractional library routines. + (line 477) +* __fractqquta: Fixed-point fractional library routines. + (line 483) +* __fractsada2: Fixed-point fractional library routines. + (line 595) +* __fractsadf: Fixed-point fractional library routines. + (line 611) +* __fractsadi: Fixed-point fractional library routines. + (line 608) +* __fractsadq: Fixed-point fractional library routines. + (line 593) +* __fractsaha2: Fixed-point fractional library routines. + (line 594) +* __fractsahi: Fixed-point fractional library routines. + (line 606) +* __fractsahq: Fixed-point fractional library routines. + (line 591) +* __fractsaqi: Fixed-point fractional library routines. + (line 605) +* __fractsaqq: Fixed-point fractional library routines. + (line 590) +* __fractsasf: Fixed-point fractional library routines. + (line 610) +* __fractsasi: Fixed-point fractional library routines. + (line 607) +* __fractsasq: Fixed-point fractional library routines. + (line 592) +* __fractsata2: Fixed-point fractional library routines. + (line 596) +* __fractsati: Fixed-point fractional library routines. + (line 609) +* __fractsauda: Fixed-point fractional library routines. + (line 603) +* __fractsaudq: Fixed-point fractional library routines. + (line 600) +* __fractsauha: Fixed-point fractional library routines. + (line 601) +* __fractsauhq: Fixed-point fractional library routines. + (line 598) +* __fractsauqq: Fixed-point fractional library routines. + (line 597) +* __fractsausa: Fixed-point fractional library routines. + (line 602) +* __fractsausq: Fixed-point fractional library routines. + (line 599) +* __fractsauta: Fixed-point fractional library routines. + (line 604) +* __fractsfda: Fixed-point fractional library routines. + (line 1008) +* __fractsfdq: Fixed-point fractional library routines. + (line 1005) +* __fractsfha: Fixed-point fractional library routines. + (line 1006) +* __fractsfhq: Fixed-point fractional library routines. + (line 1003) +* __fractsfqq: Fixed-point fractional library routines. + (line 1002) +* __fractsfsa: Fixed-point fractional library routines. + (line 1007) +* __fractsfsq: Fixed-point fractional library routines. + (line 1004) +* __fractsfta: Fixed-point fractional library routines. + (line 1009) +* __fractsfuda: Fixed-point fractional library routines. + (line 1016) +* __fractsfudq: Fixed-point fractional library routines. + (line 1013) +* __fractsfuha: Fixed-point fractional library routines. + (line 1014) +* __fractsfuhq: Fixed-point fractional library routines. + (line 1011) +* __fractsfuqq: Fixed-point fractional library routines. + (line 1010) +* __fractsfusa: Fixed-point fractional library routines. + (line 1015) +* __fractsfusq: Fixed-point fractional library routines. + (line 1012) +* __fractsfuta: Fixed-point fractional library routines. + (line 1017) +* __fractsida: Fixed-point fractional library routines. + (line 958) +* __fractsidq: Fixed-point fractional library routines. + (line 955) +* __fractsiha: Fixed-point fractional library routines. + (line 956) +* __fractsihq: Fixed-point fractional library routines. + (line 953) +* __fractsiqq: Fixed-point fractional library routines. + (line 952) +* __fractsisa: Fixed-point fractional library routines. + (line 957) +* __fractsisq: Fixed-point fractional library routines. + (line 954) +* __fractsita: Fixed-point fractional library routines. + (line 959) +* __fractsiuda: Fixed-point fractional library routines. + (line 966) +* __fractsiudq: Fixed-point fractional library routines. + (line 963) +* __fractsiuha: Fixed-point fractional library routines. + (line 964) +* __fractsiuhq: Fixed-point fractional library routines. + (line 961) +* __fractsiuqq: Fixed-point fractional library routines. + (line 960) +* __fractsiusa: Fixed-point fractional library routines. + (line 965) +* __fractsiusq: Fixed-point fractional library routines. + (line 962) +* __fractsiuta: Fixed-point fractional library routines. + (line 967) +* __fractsqda: Fixed-point fractional library routines. + (line 519) +* __fractsqdf: Fixed-point fractional library routines. + (line 537) +* __fractsqdi: Fixed-point fractional library routines. + (line 534) +* __fractsqdq2: Fixed-point fractional library routines. + (line 516) +* __fractsqha: Fixed-point fractional library routines. + (line 517) +* __fractsqhi: Fixed-point fractional library routines. + (line 532) +* __fractsqhq2: Fixed-point fractional library routines. + (line 515) +* __fractsqqi: Fixed-point fractional library routines. + (line 531) +* __fractsqqq2: Fixed-point fractional library routines. + (line 514) +* __fractsqsa: Fixed-point fractional library routines. + (line 518) +* __fractsqsf: Fixed-point fractional library routines. + (line 536) +* __fractsqsi: Fixed-point fractional library routines. + (line 533) +* __fractsqta: Fixed-point fractional library routines. + (line 520) +* __fractsqti: Fixed-point fractional library routines. + (line 535) +* __fractsquda: Fixed-point fractional library routines. + (line 528) +* __fractsqudq: Fixed-point fractional library routines. + (line 524) +* __fractsquha: Fixed-point fractional library routines. + (line 526) +* __fractsquhq: Fixed-point fractional library routines. + (line 522) +* __fractsquqq: Fixed-point fractional library routines. + (line 521) +* __fractsqusa: Fixed-point fractional library routines. + (line 527) +* __fractsqusq: Fixed-point fractional library routines. + (line 523) +* __fractsquta: Fixed-point fractional library routines. + (line 529) +* __fracttada2: Fixed-point fractional library routines. + (line 642) +* __fracttadf: Fixed-point fractional library routines. + (line 663) +* __fracttadi: Fixed-point fractional library routines. + (line 660) +* __fracttadq: Fixed-point fractional library routines. + (line 639) +* __fracttaha2: Fixed-point fractional library routines. + (line 640) +* __fracttahi: Fixed-point fractional library routines. + (line 658) +* __fracttahq: Fixed-point fractional library routines. + (line 637) +* __fracttaqi: Fixed-point fractional library routines. + (line 657) +* __fracttaqq: Fixed-point fractional library routines. + (line 636) +* __fracttasa2: Fixed-point fractional library routines. + (line 641) +* __fracttasf: Fixed-point fractional library routines. + (line 662) +* __fracttasi: Fixed-point fractional library routines. + (line 659) +* __fracttasq: Fixed-point fractional library routines. + (line 638) +* __fracttati: Fixed-point fractional library routines. + (line 661) +* __fracttauda: Fixed-point fractional library routines. + (line 653) +* __fracttaudq: Fixed-point fractional library routines. + (line 648) +* __fracttauha: Fixed-point fractional library routines. + (line 650) +* __fracttauhq: Fixed-point fractional library routines. + (line 645) +* __fracttauqq: Fixed-point fractional library routines. + (line 643) +* __fracttausa: Fixed-point fractional library routines. + (line 652) +* __fracttausq: Fixed-point fractional library routines. + (line 646) +* __fracttauta: Fixed-point fractional library routines. + (line 655) +* __fracttida: Fixed-point fractional library routines. + (line 990) +* __fracttidq: Fixed-point fractional library routines. + (line 987) +* __fracttiha: Fixed-point fractional library routines. + (line 988) +* __fracttihq: Fixed-point fractional library routines. + (line 985) +* __fracttiqq: Fixed-point fractional library routines. + (line 984) +* __fracttisa: Fixed-point fractional library routines. + (line 989) +* __fracttisq: Fixed-point fractional library routines. + (line 986) +* __fracttita: Fixed-point fractional library routines. + (line 991) +* __fracttiuda: Fixed-point fractional library routines. + (line 999) +* __fracttiudq: Fixed-point fractional library routines. + (line 995) +* __fracttiuha: Fixed-point fractional library routines. + (line 997) +* __fracttiuhq: Fixed-point fractional library routines. + (line 993) +* __fracttiuqq: Fixed-point fractional library routines. + (line 992) +* __fracttiusa: Fixed-point fractional library routines. + (line 998) +* __fracttiusq: Fixed-point fractional library routines. + (line 994) +* __fracttiuta: Fixed-point fractional library routines. + (line 1000) +* __fractudada: Fixed-point fractional library routines. + (line 857) +* __fractudadf: Fixed-point fractional library routines. + (line 880) +* __fractudadi: Fixed-point fractional library routines. + (line 877) +* __fractudadq: Fixed-point fractional library routines. + (line 853) +* __fractudaha: Fixed-point fractional library routines. + (line 855) +* __fractudahi: Fixed-point fractional library routines. + (line 875) +* __fractudahq: Fixed-point fractional library routines. + (line 851) +* __fractudaqi: Fixed-point fractional library routines. + (line 874) +* __fractudaqq: Fixed-point fractional library routines. + (line 850) +* __fractudasa: Fixed-point fractional library routines. + (line 856) +* __fractudasf: Fixed-point fractional library routines. + (line 879) +* __fractudasi: Fixed-point fractional library routines. + (line 876) +* __fractudasq: Fixed-point fractional library routines. + (line 852) +* __fractudata: Fixed-point fractional library routines. + (line 858) +* __fractudati: Fixed-point fractional library routines. + (line 878) +* __fractudaudq: Fixed-point fractional library routines. + (line 866) +* __fractudauha2: Fixed-point fractional library routines. + (line 868) +* __fractudauhq: Fixed-point fractional library routines. + (line 862) +* __fractudauqq: Fixed-point fractional library routines. + (line 860) +* __fractudausa2: Fixed-point fractional library routines. + (line 870) +* __fractudausq: Fixed-point fractional library routines. + (line 864) +* __fractudauta2: Fixed-point fractional library routines. + (line 872) +* __fractudqda: Fixed-point fractional library routines. + (line 764) +* __fractudqdf: Fixed-point fractional library routines. + (line 790) +* __fractudqdi: Fixed-point fractional library routines. + (line 786) +* __fractudqdq: Fixed-point fractional library routines. + (line 759) +* __fractudqha: Fixed-point fractional library routines. + (line 761) +* __fractudqhi: Fixed-point fractional library routines. + (line 784) +* __fractudqhq: Fixed-point fractional library routines. + (line 756) +* __fractudqqi: Fixed-point fractional library routines. + (line 782) +* __fractudqqq: Fixed-point fractional library routines. + (line 754) +* __fractudqsa: Fixed-point fractional library routines. + (line 763) +* __fractudqsf: Fixed-point fractional library routines. + (line 789) +* __fractudqsi: Fixed-point fractional library routines. + (line 785) +* __fractudqsq: Fixed-point fractional library routines. + (line 757) +* __fractudqta: Fixed-point fractional library routines. + (line 766) +* __fractudqti: Fixed-point fractional library routines. + (line 787) +* __fractudquda: Fixed-point fractional library routines. + (line 778) +* __fractudquha: Fixed-point fractional library routines. + (line 774) +* __fractudquhq2: Fixed-point fractional library routines. + (line 770) +* __fractudquqq2: Fixed-point fractional library routines. + (line 768) +* __fractudqusa: Fixed-point fractional library routines. + (line 776) +* __fractudqusq2: Fixed-point fractional library routines. + (line 772) +* __fractudquta: Fixed-point fractional library routines. + (line 780) +* __fractuhada: Fixed-point fractional library routines. + (line 798) +* __fractuhadf: Fixed-point fractional library routines. + (line 821) +* __fractuhadi: Fixed-point fractional library routines. + (line 818) +* __fractuhadq: Fixed-point fractional library routines. + (line 794) +* __fractuhaha: Fixed-point fractional library routines. + (line 796) +* __fractuhahi: Fixed-point fractional library routines. + (line 816) +* __fractuhahq: Fixed-point fractional library routines. + (line 792) +* __fractuhaqi: Fixed-point fractional library routines. + (line 815) +* __fractuhaqq: Fixed-point fractional library routines. + (line 791) +* __fractuhasa: Fixed-point fractional library routines. + (line 797) +* __fractuhasf: Fixed-point fractional library routines. + (line 820) +* __fractuhasi: Fixed-point fractional library routines. + (line 817) +* __fractuhasq: Fixed-point fractional library routines. + (line 793) +* __fractuhata: Fixed-point fractional library routines. + (line 799) +* __fractuhati: Fixed-point fractional library routines. + (line 819) +* __fractuhauda2: Fixed-point fractional library routines. + (line 811) +* __fractuhaudq: Fixed-point fractional library routines. + (line 807) +* __fractuhauhq: Fixed-point fractional library routines. + (line 803) +* __fractuhauqq: Fixed-point fractional library routines. + (line 801) +* __fractuhausa2: Fixed-point fractional library routines. + (line 809) +* __fractuhausq: Fixed-point fractional library routines. + (line 805) +* __fractuhauta2: Fixed-point fractional library routines. + (line 813) +* __fractuhqda: Fixed-point fractional library routines. + (line 701) +* __fractuhqdf: Fixed-point fractional library routines. + (line 722) +* __fractuhqdi: Fixed-point fractional library routines. + (line 719) +* __fractuhqdq: Fixed-point fractional library routines. + (line 698) +* __fractuhqha: Fixed-point fractional library routines. + (line 699) +* __fractuhqhi: Fixed-point fractional library routines. + (line 717) +* __fractuhqhq: Fixed-point fractional library routines. + (line 696) +* __fractuhqqi: Fixed-point fractional library routines. + (line 716) +* __fractuhqqq: Fixed-point fractional library routines. + (line 695) +* __fractuhqsa: Fixed-point fractional library routines. + (line 700) +* __fractuhqsf: Fixed-point fractional library routines. + (line 721) +* __fractuhqsi: Fixed-point fractional library routines. + (line 718) +* __fractuhqsq: Fixed-point fractional library routines. + (line 697) +* __fractuhqta: Fixed-point fractional library routines. + (line 702) +* __fractuhqti: Fixed-point fractional library routines. + (line 720) +* __fractuhquda: Fixed-point fractional library routines. + (line 712) +* __fractuhqudq2: Fixed-point fractional library routines. + (line 707) +* __fractuhquha: Fixed-point fractional library routines. + (line 709) +* __fractuhquqq2: Fixed-point fractional library routines. + (line 703) +* __fractuhqusa: Fixed-point fractional library routines. + (line 711) +* __fractuhqusq2: Fixed-point fractional library routines. + (line 705) +* __fractuhquta: Fixed-point fractional library routines. + (line 714) +* __fractunsdadi: Fixed-point fractional library routines. + (line 1554) +* __fractunsdahi: Fixed-point fractional library routines. + (line 1552) +* __fractunsdaqi: Fixed-point fractional library routines. + (line 1551) +* __fractunsdasi: Fixed-point fractional library routines. + (line 1553) +* __fractunsdati: Fixed-point fractional library routines. + (line 1555) +* __fractunsdida: Fixed-point fractional library routines. + (line 1706) +* __fractunsdidq: Fixed-point fractional library routines. + (line 1703) +* __fractunsdiha: Fixed-point fractional library routines. + (line 1704) +* __fractunsdihq: Fixed-point fractional library routines. + (line 1701) +* __fractunsdiqq: Fixed-point fractional library routines. + (line 1700) +* __fractunsdisa: Fixed-point fractional library routines. + (line 1705) +* __fractunsdisq: Fixed-point fractional library routines. + (line 1702) +* __fractunsdita: Fixed-point fractional library routines. + (line 1707) +* __fractunsdiuda: Fixed-point fractional library routines. + (line 1718) +* __fractunsdiudq: Fixed-point fractional library routines. + (line 1713) +* __fractunsdiuha: Fixed-point fractional library routines. + (line 1715) +* __fractunsdiuhq: Fixed-point fractional library routines. + (line 1710) +* __fractunsdiuqq: Fixed-point fractional library routines. + (line 1708) +* __fractunsdiusa: Fixed-point fractional library routines. + (line 1717) +* __fractunsdiusq: Fixed-point fractional library routines. + (line 1711) +* __fractunsdiuta: Fixed-point fractional library routines. + (line 1720) +* __fractunsdqdi: Fixed-point fractional library routines. + (line 1538) +* __fractunsdqhi: Fixed-point fractional library routines. + (line 1536) +* __fractunsdqqi: Fixed-point fractional library routines. + (line 1535) +* __fractunsdqsi: Fixed-point fractional library routines. + (line 1537) +* __fractunsdqti: Fixed-point fractional library routines. + (line 1539) +* __fractunshadi: Fixed-point fractional library routines. + (line 1544) +* __fractunshahi: Fixed-point fractional library routines. + (line 1542) +* __fractunshaqi: Fixed-point fractional library routines. + (line 1541) +* __fractunshasi: Fixed-point fractional library routines. + (line 1543) +* __fractunshati: Fixed-point fractional library routines. + (line 1545) +* __fractunshida: Fixed-point fractional library routines. + (line 1662) +* __fractunshidq: Fixed-point fractional library routines. + (line 1659) +* __fractunshiha: Fixed-point fractional library routines. + (line 1660) +* __fractunshihq: Fixed-point fractional library routines. + (line 1657) +* __fractunshiqq: Fixed-point fractional library routines. + (line 1656) +* __fractunshisa: Fixed-point fractional library routines. + (line 1661) +* __fractunshisq: Fixed-point fractional library routines. + (line 1658) +* __fractunshita: Fixed-point fractional library routines. + (line 1663) +* __fractunshiuda: Fixed-point fractional library routines. + (line 1674) +* __fractunshiudq: Fixed-point fractional library routines. + (line 1669) +* __fractunshiuha: Fixed-point fractional library routines. + (line 1671) +* __fractunshiuhq: Fixed-point fractional library routines. + (line 1666) +* __fractunshiuqq: Fixed-point fractional library routines. + (line 1664) +* __fractunshiusa: Fixed-point fractional library routines. + (line 1673) +* __fractunshiusq: Fixed-point fractional library routines. + (line 1667) +* __fractunshiuta: Fixed-point fractional library routines. + (line 1676) +* __fractunshqdi: Fixed-point fractional library routines. + (line 1528) +* __fractunshqhi: Fixed-point fractional library routines. + (line 1526) +* __fractunshqqi: Fixed-point fractional library routines. + (line 1525) +* __fractunshqsi: Fixed-point fractional library routines. + (line 1527) +* __fractunshqti: Fixed-point fractional library routines. + (line 1529) +* __fractunsqida: Fixed-point fractional library routines. + (line 1640) +* __fractunsqidq: Fixed-point fractional library routines. + (line 1637) +* __fractunsqiha: Fixed-point fractional library routines. + (line 1638) +* __fractunsqihq: Fixed-point fractional library routines. + (line 1635) +* __fractunsqiqq: Fixed-point fractional library routines. + (line 1634) +* __fractunsqisa: Fixed-point fractional library routines. + (line 1639) +* __fractunsqisq: Fixed-point fractional library routines. + (line 1636) +* __fractunsqita: Fixed-point fractional library routines. + (line 1641) +* __fractunsqiuda: Fixed-point fractional library routines. + (line 1652) +* __fractunsqiudq: Fixed-point fractional library routines. + (line 1647) +* __fractunsqiuha: Fixed-point fractional library routines. + (line 1649) +* __fractunsqiuhq: Fixed-point fractional library routines. + (line 1644) +* __fractunsqiuqq: Fixed-point fractional library routines. + (line 1642) +* __fractunsqiusa: Fixed-point fractional library routines. + (line 1651) +* __fractunsqiusq: Fixed-point fractional library routines. + (line 1645) +* __fractunsqiuta: Fixed-point fractional library routines. + (line 1654) +* __fractunsqqdi: Fixed-point fractional library routines. + (line 1523) +* __fractunsqqhi: Fixed-point fractional library routines. + (line 1521) +* __fractunsqqqi: Fixed-point fractional library routines. + (line 1520) +* __fractunsqqsi: Fixed-point fractional library routines. + (line 1522) +* __fractunsqqti: Fixed-point fractional library routines. + (line 1524) +* __fractunssadi: Fixed-point fractional library routines. + (line 1549) +* __fractunssahi: Fixed-point fractional library routines. + (line 1547) +* __fractunssaqi: Fixed-point fractional library routines. + (line 1546) +* __fractunssasi: Fixed-point fractional library routines. + (line 1548) +* __fractunssati: Fixed-point fractional library routines. + (line 1550) +* __fractunssida: Fixed-point fractional library routines. + (line 1684) +* __fractunssidq: Fixed-point fractional library routines. + (line 1681) +* __fractunssiha: Fixed-point fractional library routines. + (line 1682) +* __fractunssihq: Fixed-point fractional library routines. + (line 1679) +* __fractunssiqq: Fixed-point fractional library routines. + (line 1678) +* __fractunssisa: Fixed-point fractional library routines. + (line 1683) +* __fractunssisq: Fixed-point fractional library routines. + (line 1680) +* __fractunssita: Fixed-point fractional library routines. + (line 1685) +* __fractunssiuda: Fixed-point fractional library routines. + (line 1696) +* __fractunssiudq: Fixed-point fractional library routines. + (line 1691) +* __fractunssiuha: Fixed-point fractional library routines. + (line 1693) +* __fractunssiuhq: Fixed-point fractional library routines. + (line 1688) +* __fractunssiuqq: Fixed-point fractional library routines. + (line 1686) +* __fractunssiusa: Fixed-point fractional library routines. + (line 1695) +* __fractunssiusq: Fixed-point fractional library routines. + (line 1689) +* __fractunssiuta: Fixed-point fractional library routines. + (line 1698) +* __fractunssqdi: Fixed-point fractional library routines. + (line 1533) +* __fractunssqhi: Fixed-point fractional library routines. + (line 1531) +* __fractunssqqi: Fixed-point fractional library routines. + (line 1530) +* __fractunssqsi: Fixed-point fractional library routines. + (line 1532) +* __fractunssqti: Fixed-point fractional library routines. + (line 1534) +* __fractunstadi: Fixed-point fractional library routines. + (line 1559) +* __fractunstahi: Fixed-point fractional library routines. + (line 1557) +* __fractunstaqi: Fixed-point fractional library routines. + (line 1556) +* __fractunstasi: Fixed-point fractional library routines. + (line 1558) +* __fractunstati: Fixed-point fractional library routines. + (line 1560) +* __fractunstida: Fixed-point fractional library routines. + (line 1729) +* __fractunstidq: Fixed-point fractional library routines. + (line 1725) +* __fractunstiha: Fixed-point fractional library routines. + (line 1727) +* __fractunstihq: Fixed-point fractional library routines. + (line 1723) +* __fractunstiqq: Fixed-point fractional library routines. + (line 1722) +* __fractunstisa: Fixed-point fractional library routines. + (line 1728) +* __fractunstisq: Fixed-point fractional library routines. + (line 1724) +* __fractunstita: Fixed-point fractional library routines. + (line 1730) +* __fractunstiuda: Fixed-point fractional library routines. + (line 1744) +* __fractunstiudq: Fixed-point fractional library routines. + (line 1738) +* __fractunstiuha: Fixed-point fractional library routines. + (line 1740) +* __fractunstiuhq: Fixed-point fractional library routines. + (line 1734) +* __fractunstiuqq: Fixed-point fractional library routines. + (line 1732) +* __fractunstiusa: Fixed-point fractional library routines. + (line 1742) +* __fractunstiusq: Fixed-point fractional library routines. + (line 1736) +* __fractunstiuta: Fixed-point fractional library routines. + (line 1746) +* __fractunsudadi: Fixed-point fractional library routines. + (line 1620) +* __fractunsudahi: Fixed-point fractional library routines. + (line 1616) +* __fractunsudaqi: Fixed-point fractional library routines. + (line 1614) +* __fractunsudasi: Fixed-point fractional library routines. + (line 1618) +* __fractunsudati: Fixed-point fractional library routines. + (line 1622) +* __fractunsudqdi: Fixed-point fractional library routines. + (line 1594) +* __fractunsudqhi: Fixed-point fractional library routines. + (line 1590) +* __fractunsudqqi: Fixed-point fractional library routines. + (line 1588) +* __fractunsudqsi: Fixed-point fractional library routines. + (line 1592) +* __fractunsudqti: Fixed-point fractional library routines. + (line 1596) +* __fractunsuhadi: Fixed-point fractional library routines. + (line 1604) +* __fractunsuhahi: Fixed-point fractional library routines. + (line 1600) +* __fractunsuhaqi: Fixed-point fractional library routines. + (line 1598) +* __fractunsuhasi: Fixed-point fractional library routines. + (line 1602) +* __fractunsuhati: Fixed-point fractional library routines. + (line 1606) +* __fractunsuhqdi: Fixed-point fractional library routines. + (line 1575) +* __fractunsuhqhi: Fixed-point fractional library routines. + (line 1573) +* __fractunsuhqqi: Fixed-point fractional library routines. + (line 1572) +* __fractunsuhqsi: Fixed-point fractional library routines. + (line 1574) +* __fractunsuhqti: Fixed-point fractional library routines. + (line 1576) +* __fractunsuqqdi: Fixed-point fractional library routines. + (line 1568) +* __fractunsuqqhi: Fixed-point fractional library routines. + (line 1564) +* __fractunsuqqqi: Fixed-point fractional library routines. + (line 1562) +* __fractunsuqqsi: Fixed-point fractional library routines. + (line 1566) +* __fractunsuqqti: Fixed-point fractional library routines. + (line 1570) +* __fractunsusadi: Fixed-point fractional library routines. + (line 1611) +* __fractunsusahi: Fixed-point fractional library routines. + (line 1609) +* __fractunsusaqi: Fixed-point fractional library routines. + (line 1608) +* __fractunsusasi: Fixed-point fractional library routines. + (line 1610) +* __fractunsusati: Fixed-point fractional library routines. + (line 1612) +* __fractunsusqdi: Fixed-point fractional library routines. + (line 1584) +* __fractunsusqhi: Fixed-point fractional library routines. + (line 1580) +* __fractunsusqqi: Fixed-point fractional library routines. + (line 1578) +* __fractunsusqsi: Fixed-point fractional library routines. + (line 1582) +* __fractunsusqti: Fixed-point fractional library routines. + (line 1586) +* __fractunsutadi: Fixed-point fractional library routines. + (line 1630) +* __fractunsutahi: Fixed-point fractional library routines. + (line 1626) +* __fractunsutaqi: Fixed-point fractional library routines. + (line 1624) +* __fractunsutasi: Fixed-point fractional library routines. + (line 1628) +* __fractunsutati: Fixed-point fractional library routines. + (line 1632) +* __fractuqqda: Fixed-point fractional library routines. + (line 671) +* __fractuqqdf: Fixed-point fractional library routines. + (line 694) +* __fractuqqdi: Fixed-point fractional library routines. + (line 691) +* __fractuqqdq: Fixed-point fractional library routines. + (line 667) +* __fractuqqha: Fixed-point fractional library routines. + (line 669) +* __fractuqqhi: Fixed-point fractional library routines. + (line 689) +* __fractuqqhq: Fixed-point fractional library routines. + (line 665) +* __fractuqqqi: Fixed-point fractional library routines. + (line 688) +* __fractuqqqq: Fixed-point fractional library routines. + (line 664) +* __fractuqqsa: Fixed-point fractional library routines. + (line 670) +* __fractuqqsf: Fixed-point fractional library routines. + (line 693) +* __fractuqqsi: Fixed-point fractional library routines. + (line 690) +* __fractuqqsq: Fixed-point fractional library routines. + (line 666) +* __fractuqqta: Fixed-point fractional library routines. + (line 672) +* __fractuqqti: Fixed-point fractional library routines. + (line 692) +* __fractuqquda: Fixed-point fractional library routines. + (line 684) +* __fractuqqudq2: Fixed-point fractional library routines. + (line 678) +* __fractuqquha: Fixed-point fractional library routines. + (line 680) +* __fractuqquhq2: Fixed-point fractional library routines. + (line 674) +* __fractuqqusa: Fixed-point fractional library routines. + (line 682) +* __fractuqqusq2: Fixed-point fractional library routines. + (line 676) +* __fractuqquta: Fixed-point fractional library routines. + (line 686) +* __fractusada: Fixed-point fractional library routines. + (line 828) +* __fractusadf: Fixed-point fractional library routines. + (line 849) +* __fractusadi: Fixed-point fractional library routines. + (line 846) +* __fractusadq: Fixed-point fractional library routines. + (line 825) +* __fractusaha: Fixed-point fractional library routines. + (line 826) +* __fractusahi: Fixed-point fractional library routines. + (line 844) +* __fractusahq: Fixed-point fractional library routines. + (line 823) +* __fractusaqi: Fixed-point fractional library routines. + (line 843) +* __fractusaqq: Fixed-point fractional library routines. + (line 822) +* __fractusasa: Fixed-point fractional library routines. + (line 827) +* __fractusasf: Fixed-point fractional library routines. + (line 848) +* __fractusasi: Fixed-point fractional library routines. + (line 845) +* __fractusasq: Fixed-point fractional library routines. + (line 824) +* __fractusata: Fixed-point fractional library routines. + (line 829) +* __fractusati: Fixed-point fractional library routines. + (line 847) +* __fractusauda2: Fixed-point fractional library routines. + (line 839) +* __fractusaudq: Fixed-point fractional library routines. + (line 835) +* __fractusauha2: Fixed-point fractional library routines. + (line 837) +* __fractusauhq: Fixed-point fractional library routines. + (line 832) +* __fractusauqq: Fixed-point fractional library routines. + (line 830) +* __fractusausq: Fixed-point fractional library routines. + (line 833) +* __fractusauta2: Fixed-point fractional library routines. + (line 841) +* __fractusqda: Fixed-point fractional library routines. + (line 730) +* __fractusqdf: Fixed-point fractional library routines. + (line 753) +* __fractusqdi: Fixed-point fractional library routines. + (line 750) +* __fractusqdq: Fixed-point fractional library routines. + (line 726) +* __fractusqha: Fixed-point fractional library routines. + (line 728) +* __fractusqhi: Fixed-point fractional library routines. + (line 748) +* __fractusqhq: Fixed-point fractional library routines. + (line 724) +* __fractusqqi: Fixed-point fractional library routines. + (line 747) +* __fractusqqq: Fixed-point fractional library routines. + (line 723) +* __fractusqsa: Fixed-point fractional library routines. + (line 729) +* __fractusqsf: Fixed-point fractional library routines. + (line 752) +* __fractusqsi: Fixed-point fractional library routines. + (line 749) +* __fractusqsq: Fixed-point fractional library routines. + (line 725) +* __fractusqta: Fixed-point fractional library routines. + (line 731) +* __fractusqti: Fixed-point fractional library routines. + (line 751) +* __fractusquda: Fixed-point fractional library routines. + (line 743) +* __fractusqudq2: Fixed-point fractional library routines. + (line 737) +* __fractusquha: Fixed-point fractional library routines. + (line 739) +* __fractusquhq2: Fixed-point fractional library routines. + (line 735) +* __fractusquqq2: Fixed-point fractional library routines. + (line 733) +* __fractusqusa: Fixed-point fractional library routines. + (line 741) +* __fractusquta: Fixed-point fractional library routines. + (line 745) +* __fractutada: Fixed-point fractional library routines. + (line 891) +* __fractutadf: Fixed-point fractional library routines. + (line 917) +* __fractutadi: Fixed-point fractional library routines. + (line 913) +* __fractutadq: Fixed-point fractional library routines. + (line 886) +* __fractutaha: Fixed-point fractional library routines. + (line 888) +* __fractutahi: Fixed-point fractional library routines. + (line 911) +* __fractutahq: Fixed-point fractional library routines. + (line 883) +* __fractutaqi: Fixed-point fractional library routines. + (line 909) +* __fractutaqq: Fixed-point fractional library routines. + (line 881) +* __fractutasa: Fixed-point fractional library routines. + (line 890) +* __fractutasf: Fixed-point fractional library routines. + (line 916) +* __fractutasi: Fixed-point fractional library routines. + (line 912) +* __fractutasq: Fixed-point fractional library routines. + (line 884) +* __fractutata: Fixed-point fractional library routines. + (line 893) +* __fractutati: Fixed-point fractional library routines. + (line 914) +* __fractutauda2: Fixed-point fractional library routines. + (line 907) +* __fractutaudq: Fixed-point fractional library routines. + (line 901) +* __fractutauha2: Fixed-point fractional library routines. + (line 903) +* __fractutauhq: Fixed-point fractional library routines. + (line 897) +* __fractutauqq: Fixed-point fractional library routines. + (line 895) +* __fractutausa2: Fixed-point fractional library routines. + (line 905) +* __fractutausq: Fixed-point fractional library routines. + (line 899) +* __gedf2: Soft float library routines. + (line 205) +* __gesf2: Soft float library routines. + (line 204) +* __getf2: Soft float library routines. + (line 206) +* __gtdf2: Soft float library routines. + (line 223) +* __gtsf2: Soft float library routines. + (line 222) +* __gttf2: Soft float library routines. + (line 224) +* __ledf2: Soft float library routines. + (line 217) +* __lesf2: Soft float library routines. + (line 216) +* __letf2: Soft float library routines. + (line 218) +* __lshrdi3: Integer library routines. + (line 30) +* __lshrsi3: Integer library routines. + (line 29) +* __lshrti3: Integer library routines. + (line 31) +* __lshruda3: Fixed-point fractional library routines. + (line 388) +* __lshrudq3: Fixed-point fractional library routines. + (line 382) +* __lshruha3: Fixed-point fractional library routines. + (line 384) +* __lshruhq3: Fixed-point fractional library routines. + (line 378) +* __lshruqq3: Fixed-point fractional library routines. + (line 376) +* __lshrusa3: Fixed-point fractional library routines. + (line 386) +* __lshrusq3: Fixed-point fractional library routines. + (line 380) +* __lshruta3: Fixed-point fractional library routines. + (line 390) +* __ltdf2: Soft float library routines. + (line 211) +* __ltsf2: Soft float library routines. + (line 210) +* __lttf2: Soft float library routines. + (line 212) +* __main: Collect2. (line 15) +* __moddi3: Integer library routines. + (line 36) +* __modsi3: Integer library routines. + (line 35) +* __modti3: Integer library routines. + (line 37) +* __morestack_current_segment: Miscellaneous routines. + (line 45) +* __morestack_initial_sp: Miscellaneous routines. + (line 46) +* __morestack_segments: Miscellaneous routines. + (line 44) +* __mulda3: Fixed-point fractional library routines. + (line 170) +* __muldc3: Soft float library routines. + (line 239) +* __muldf3: Soft float library routines. + (line 39) +* __muldi3: Integer library routines. + (line 42) +* __muldq3: Fixed-point fractional library routines. + (line 157) +* __mulha3: Fixed-point fractional library routines. + (line 167) +* __mulhq3: Fixed-point fractional library routines. + (line 155) +* __mulqq3: Fixed-point fractional library routines. + (line 153) +* __mulsa3: Fixed-point fractional library routines. + (line 169) +* __mulsc3: Soft float library routines. + (line 237) +* __mulsf3: Soft float library routines. + (line 38) +* __mulsi3: Integer library routines. + (line 41) +* __mulsq3: Fixed-point fractional library routines. + (line 156) +* __multa3: Fixed-point fractional library routines. + (line 171) +* __multc3: Soft float library routines. + (line 241) +* __multf3: Soft float library routines. + (line 40) +* __multi3: Integer library routines. + (line 43) +* __muluda3: Fixed-point fractional library routines. + (line 177) +* __muludq3: Fixed-point fractional library routines. + (line 165) +* __muluha3: Fixed-point fractional library routines. + (line 173) +* __muluhq3: Fixed-point fractional library routines. + (line 161) +* __muluqq3: Fixed-point fractional library routines. + (line 159) +* __mulusa3: Fixed-point fractional library routines. + (line 175) +* __mulusq3: Fixed-point fractional library routines. + (line 163) +* __muluta3: Fixed-point fractional library routines. + (line 179) +* __mulvdi3: Integer library routines. + (line 114) +* __mulvsi3: Integer library routines. + (line 113) +* __mulxc3: Soft float library routines. + (line 243) +* __mulxf3: Soft float library routines. + (line 42) +* __nedf2: Soft float library routines. + (line 199) +* __negda2: Fixed-point fractional library routines. + (line 298) +* __negdf2: Soft float library routines. + (line 55) +* __negdi2: Integer library routines. + (line 46) +* __negdq2: Fixed-point fractional library routines. + (line 288) +* __negha2: Fixed-point fractional library routines. + (line 296) +* __neghq2: Fixed-point fractional library routines. + (line 286) +* __negqq2: Fixed-point fractional library routines. + (line 285) +* __negsa2: Fixed-point fractional library routines. + (line 297) +* __negsf2: Soft float library routines. + (line 54) +* __negsq2: Fixed-point fractional library routines. + (line 287) +* __negta2: Fixed-point fractional library routines. + (line 299) +* __negtf2: Soft float library routines. + (line 56) +* __negti2: Integer library routines. + (line 47) +* __neguda2: Fixed-point fractional library routines. + (line 303) +* __negudq2: Fixed-point fractional library routines. + (line 294) +* __neguha2: Fixed-point fractional library routines. + (line 300) +* __neguhq2: Fixed-point fractional library routines. + (line 291) +* __neguqq2: Fixed-point fractional library routines. + (line 289) +* __negusa2: Fixed-point fractional library routines. + (line 302) +* __negusq2: Fixed-point fractional library routines. + (line 292) +* __neguta2: Fixed-point fractional library routines. + (line 305) +* __negvdi2: Integer library routines. + (line 118) +* __negvsi2: Integer library routines. + (line 117) +* __negxf2: Soft float library routines. + (line 57) +* __nesf2: Soft float library routines. + (line 198) +* __netf2: Soft float library routines. + (line 200) +* __paritydi2: Integer library routines. + (line 150) +* __paritysi2: Integer library routines. + (line 149) +* __parityti2: Integer library routines. + (line 151) +* __popcountdi2: Integer library routines. + (line 156) +* __popcountsi2: Integer library routines. + (line 155) +* __popcountti2: Integer library routines. + (line 157) +* __powidf2: Soft float library routines. + (line 232) +* __powisf2: Soft float library routines. + (line 231) +* __powitf2: Soft float library routines. + (line 233) +* __powixf2: Soft float library routines. + (line 234) +* __satfractdadq: Fixed-point fractional library routines. + (line 1152) +* __satfractdaha2: Fixed-point fractional library routines. + (line 1153) +* __satfractdahq: Fixed-point fractional library routines. + (line 1150) +* __satfractdaqq: Fixed-point fractional library routines. + (line 1149) +* __satfractdasa2: Fixed-point fractional library routines. + (line 1154) +* __satfractdasq: Fixed-point fractional library routines. + (line 1151) +* __satfractdata2: Fixed-point fractional library routines. + (line 1155) +* __satfractdauda: Fixed-point fractional library routines. + (line 1165) +* __satfractdaudq: Fixed-point fractional library routines. + (line 1160) +* __satfractdauha: Fixed-point fractional library routines. + (line 1162) +* __satfractdauhq: Fixed-point fractional library routines. + (line 1158) +* __satfractdauqq: Fixed-point fractional library routines. + (line 1156) +* __satfractdausa: Fixed-point fractional library routines. + (line 1164) +* __satfractdausq: Fixed-point fractional library routines. + (line 1159) +* __satfractdauta: Fixed-point fractional library routines. + (line 1166) +* __satfractdfda: Fixed-point fractional library routines. + (line 1505) +* __satfractdfdq: Fixed-point fractional library routines. + (line 1502) +* __satfractdfha: Fixed-point fractional library routines. + (line 1503) +* __satfractdfhq: Fixed-point fractional library routines. + (line 1500) +* __satfractdfqq: Fixed-point fractional library routines. + (line 1499) +* __satfractdfsa: Fixed-point fractional library routines. + (line 1504) +* __satfractdfsq: Fixed-point fractional library routines. + (line 1501) +* __satfractdfta: Fixed-point fractional library routines. + (line 1506) +* __satfractdfuda: Fixed-point fractional library routines. + (line 1514) +* __satfractdfudq: Fixed-point fractional library routines. + (line 1510) +* __satfractdfuha: Fixed-point fractional library routines. + (line 1512) +* __satfractdfuhq: Fixed-point fractional library routines. + (line 1508) +* __satfractdfuqq: Fixed-point fractional library routines. + (line 1507) +* __satfractdfusa: Fixed-point fractional library routines. + (line 1513) +* __satfractdfusq: Fixed-point fractional library routines. + (line 1509) +* __satfractdfuta: Fixed-point fractional library routines. + (line 1515) +* __satfractdida: Fixed-point fractional library routines. + (line 1455) +* __satfractdidq: Fixed-point fractional library routines. + (line 1452) +* __satfractdiha: Fixed-point fractional library routines. + (line 1453) +* __satfractdihq: Fixed-point fractional library routines. + (line 1450) +* __satfractdiqq: Fixed-point fractional library routines. + (line 1449) +* __satfractdisa: Fixed-point fractional library routines. + (line 1454) +* __satfractdisq: Fixed-point fractional library routines. + (line 1451) +* __satfractdita: Fixed-point fractional library routines. + (line 1456) +* __satfractdiuda: Fixed-point fractional library routines. + (line 1463) +* __satfractdiudq: Fixed-point fractional library routines. + (line 1460) +* __satfractdiuha: Fixed-point fractional library routines. + (line 1461) +* __satfractdiuhq: Fixed-point fractional library routines. + (line 1458) +* __satfractdiuqq: Fixed-point fractional library routines. + (line 1457) +* __satfractdiusa: Fixed-point fractional library routines. + (line 1462) +* __satfractdiusq: Fixed-point fractional library routines. + (line 1459) +* __satfractdiuta: Fixed-point fractional library routines. + (line 1464) +* __satfractdqda: Fixed-point fractional library routines. + (line 1097) +* __satfractdqha: Fixed-point fractional library routines. + (line 1095) +* __satfractdqhq2: Fixed-point fractional library routines. + (line 1093) +* __satfractdqqq2: Fixed-point fractional library routines. + (line 1092) +* __satfractdqsa: Fixed-point fractional library routines. + (line 1096) +* __satfractdqsq2: Fixed-point fractional library routines. + (line 1094) +* __satfractdqta: Fixed-point fractional library routines. + (line 1098) +* __satfractdquda: Fixed-point fractional library routines. + (line 1109) +* __satfractdqudq: Fixed-point fractional library routines. + (line 1104) +* __satfractdquha: Fixed-point fractional library routines. + (line 1106) +* __satfractdquhq: Fixed-point fractional library routines. + (line 1101) +* __satfractdquqq: Fixed-point fractional library routines. + (line 1099) +* __satfractdqusa: Fixed-point fractional library routines. + (line 1108) +* __satfractdqusq: Fixed-point fractional library routines. + (line 1102) +* __satfractdquta: Fixed-point fractional library routines. + (line 1111) +* __satfracthada2: Fixed-point fractional library routines. + (line 1118) +* __satfracthadq: Fixed-point fractional library routines. + (line 1116) +* __satfracthahq: Fixed-point fractional library routines. + (line 1114) +* __satfracthaqq: Fixed-point fractional library routines. + (line 1113) +* __satfracthasa2: Fixed-point fractional library routines. + (line 1117) +* __satfracthasq: Fixed-point fractional library routines. + (line 1115) +* __satfracthata2: Fixed-point fractional library routines. + (line 1119) +* __satfracthauda: Fixed-point fractional library routines. + (line 1130) +* __satfracthaudq: Fixed-point fractional library routines. + (line 1125) +* __satfracthauha: Fixed-point fractional library routines. + (line 1127) +* __satfracthauhq: Fixed-point fractional library routines. + (line 1122) +* __satfracthauqq: Fixed-point fractional library routines. + (line 1120) +* __satfracthausa: Fixed-point fractional library routines. + (line 1129) +* __satfracthausq: Fixed-point fractional library routines. + (line 1123) +* __satfracthauta: Fixed-point fractional library routines. + (line 1132) +* __satfracthida: Fixed-point fractional library routines. + (line 1423) +* __satfracthidq: Fixed-point fractional library routines. + (line 1420) +* __satfracthiha: Fixed-point fractional library routines. + (line 1421) +* __satfracthihq: Fixed-point fractional library routines. + (line 1418) +* __satfracthiqq: Fixed-point fractional library routines. + (line 1417) +* __satfracthisa: Fixed-point fractional library routines. + (line 1422) +* __satfracthisq: Fixed-point fractional library routines. + (line 1419) +* __satfracthita: Fixed-point fractional library routines. + (line 1424) +* __satfracthiuda: Fixed-point fractional library routines. + (line 1431) +* __satfracthiudq: Fixed-point fractional library routines. + (line 1428) +* __satfracthiuha: Fixed-point fractional library routines. + (line 1429) +* __satfracthiuhq: Fixed-point fractional library routines. + (line 1426) +* __satfracthiuqq: Fixed-point fractional library routines. + (line 1425) +* __satfracthiusa: Fixed-point fractional library routines. + (line 1430) +* __satfracthiusq: Fixed-point fractional library routines. + (line 1427) +* __satfracthiuta: Fixed-point fractional library routines. + (line 1432) +* __satfracthqda: Fixed-point fractional library routines. + (line 1063) +* __satfracthqdq2: Fixed-point fractional library routines. + (line 1060) +* __satfracthqha: Fixed-point fractional library routines. + (line 1061) +* __satfracthqqq2: Fixed-point fractional library routines. + (line 1058) +* __satfracthqsa: Fixed-point fractional library routines. + (line 1062) +* __satfracthqsq2: Fixed-point fractional library routines. + (line 1059) +* __satfracthqta: Fixed-point fractional library routines. + (line 1064) +* __satfracthquda: Fixed-point fractional library routines. + (line 1071) +* __satfracthqudq: Fixed-point fractional library routines. + (line 1068) +* __satfracthquha: Fixed-point fractional library routines. + (line 1069) +* __satfracthquhq: Fixed-point fractional library routines. + (line 1066) +* __satfracthquqq: Fixed-point fractional library routines. + (line 1065) +* __satfracthqusa: Fixed-point fractional library routines. + (line 1070) +* __satfracthqusq: Fixed-point fractional library routines. + (line 1067) +* __satfracthquta: Fixed-point fractional library routines. + (line 1072) +* __satfractqida: Fixed-point fractional library routines. + (line 1401) +* __satfractqidq: Fixed-point fractional library routines. + (line 1398) +* __satfractqiha: Fixed-point fractional library routines. + (line 1399) +* __satfractqihq: Fixed-point fractional library routines. + (line 1396) +* __satfractqiqq: Fixed-point fractional library routines. + (line 1395) +* __satfractqisa: Fixed-point fractional library routines. + (line 1400) +* __satfractqisq: Fixed-point fractional library routines. + (line 1397) +* __satfractqita: Fixed-point fractional library routines. + (line 1402) +* __satfractqiuda: Fixed-point fractional library routines. + (line 1413) +* __satfractqiudq: Fixed-point fractional library routines. + (line 1408) +* __satfractqiuha: Fixed-point fractional library routines. + (line 1410) +* __satfractqiuhq: Fixed-point fractional library routines. + (line 1405) +* __satfractqiuqq: Fixed-point fractional library routines. + (line 1403) +* __satfractqiusa: Fixed-point fractional library routines. + (line 1412) +* __satfractqiusq: Fixed-point fractional library routines. + (line 1406) +* __satfractqiuta: Fixed-point fractional library routines. + (line 1415) +* __satfractqqda: Fixed-point fractional library routines. + (line 1042) +* __satfractqqdq2: Fixed-point fractional library routines. + (line 1039) +* __satfractqqha: Fixed-point fractional library routines. + (line 1040) +* __satfractqqhq2: Fixed-point fractional library routines. + (line 1037) +* __satfractqqsa: Fixed-point fractional library routines. + (line 1041) +* __satfractqqsq2: Fixed-point fractional library routines. + (line 1038) +* __satfractqqta: Fixed-point fractional library routines. + (line 1043) +* __satfractqquda: Fixed-point fractional library routines. + (line 1054) +* __satfractqqudq: Fixed-point fractional library routines. + (line 1049) +* __satfractqquha: Fixed-point fractional library routines. + (line 1051) +* __satfractqquhq: Fixed-point fractional library routines. + (line 1046) +* __satfractqquqq: Fixed-point fractional library routines. + (line 1044) +* __satfractqqusa: Fixed-point fractional library routines. + (line 1053) +* __satfractqqusq: Fixed-point fractional library routines. + (line 1047) +* __satfractqquta: Fixed-point fractional library routines. + (line 1056) +* __satfractsada2: Fixed-point fractional library routines. + (line 1139) +* __satfractsadq: Fixed-point fractional library routines. + (line 1137) +* __satfractsaha2: Fixed-point fractional library routines. + (line 1138) +* __satfractsahq: Fixed-point fractional library routines. + (line 1135) +* __satfractsaqq: Fixed-point fractional library routines. + (line 1134) +* __satfractsasq: Fixed-point fractional library routines. + (line 1136) +* __satfractsata2: Fixed-point fractional library routines. + (line 1140) +* __satfractsauda: Fixed-point fractional library routines. + (line 1147) +* __satfractsaudq: Fixed-point fractional library routines. + (line 1144) +* __satfractsauha: Fixed-point fractional library routines. + (line 1145) +* __satfractsauhq: Fixed-point fractional library routines. + (line 1142) +* __satfractsauqq: Fixed-point fractional library routines. + (line 1141) +* __satfractsausa: Fixed-point fractional library routines. + (line 1146) +* __satfractsausq: Fixed-point fractional library routines. + (line 1143) +* __satfractsauta: Fixed-point fractional library routines. + (line 1148) +* __satfractsfda: Fixed-point fractional library routines. + (line 1489) +* __satfractsfdq: Fixed-point fractional library routines. + (line 1486) +* __satfractsfha: Fixed-point fractional library routines. + (line 1487) +* __satfractsfhq: Fixed-point fractional library routines. + (line 1484) +* __satfractsfqq: Fixed-point fractional library routines. + (line 1483) +* __satfractsfsa: Fixed-point fractional library routines. + (line 1488) +* __satfractsfsq: Fixed-point fractional library routines. + (line 1485) +* __satfractsfta: Fixed-point fractional library routines. + (line 1490) +* __satfractsfuda: Fixed-point fractional library routines. + (line 1497) +* __satfractsfudq: Fixed-point fractional library routines. + (line 1494) +* __satfractsfuha: Fixed-point fractional library routines. + (line 1495) +* __satfractsfuhq: Fixed-point fractional library routines. + (line 1492) +* __satfractsfuqq: Fixed-point fractional library routines. + (line 1491) +* __satfractsfusa: Fixed-point fractional library routines. + (line 1496) +* __satfractsfusq: Fixed-point fractional library routines. + (line 1493) +* __satfractsfuta: Fixed-point fractional library routines. + (line 1498) +* __satfractsida: Fixed-point fractional library routines. + (line 1439) +* __satfractsidq: Fixed-point fractional library routines. + (line 1436) +* __satfractsiha: Fixed-point fractional library routines. + (line 1437) +* __satfractsihq: Fixed-point fractional library routines. + (line 1434) +* __satfractsiqq: Fixed-point fractional library routines. + (line 1433) +* __satfractsisa: Fixed-point fractional library routines. + (line 1438) +* __satfractsisq: Fixed-point fractional library routines. + (line 1435) +* __satfractsita: Fixed-point fractional library routines. + (line 1440) +* __satfractsiuda: Fixed-point fractional library routines. + (line 1447) +* __satfractsiudq: Fixed-point fractional library routines. + (line 1444) +* __satfractsiuha: Fixed-point fractional library routines. + (line 1445) +* __satfractsiuhq: Fixed-point fractional library routines. + (line 1442) +* __satfractsiuqq: Fixed-point fractional library routines. + (line 1441) +* __satfractsiusa: Fixed-point fractional library routines. + (line 1446) +* __satfractsiusq: Fixed-point fractional library routines. + (line 1443) +* __satfractsiuta: Fixed-point fractional library routines. + (line 1448) +* __satfractsqda: Fixed-point fractional library routines. + (line 1078) +* __satfractsqdq2: Fixed-point fractional library routines. + (line 1075) +* __satfractsqha: Fixed-point fractional library routines. + (line 1076) +* __satfractsqhq2: Fixed-point fractional library routines. + (line 1074) +* __satfractsqqq2: Fixed-point fractional library routines. + (line 1073) +* __satfractsqsa: Fixed-point fractional library routines. + (line 1077) +* __satfractsqta: Fixed-point fractional library routines. + (line 1079) +* __satfractsquda: Fixed-point fractional library routines. + (line 1089) +* __satfractsqudq: Fixed-point fractional library routines. + (line 1084) +* __satfractsquha: Fixed-point fractional library routines. + (line 1086) +* __satfractsquhq: Fixed-point fractional library routines. + (line 1082) +* __satfractsquqq: Fixed-point fractional library routines. + (line 1080) +* __satfractsqusa: Fixed-point fractional library routines. + (line 1088) +* __satfractsqusq: Fixed-point fractional library routines. + (line 1083) +* __satfractsquta: Fixed-point fractional library routines. + (line 1090) +* __satfracttada2: Fixed-point fractional library routines. + (line 1174) +* __satfracttadq: Fixed-point fractional library routines. + (line 1171) +* __satfracttaha2: Fixed-point fractional library routines. + (line 1172) +* __satfracttahq: Fixed-point fractional library routines. + (line 1169) +* __satfracttaqq: Fixed-point fractional library routines. + (line 1168) +* __satfracttasa2: Fixed-point fractional library routines. + (line 1173) +* __satfracttasq: Fixed-point fractional library routines. + (line 1170) +* __satfracttauda: Fixed-point fractional library routines. + (line 1185) +* __satfracttaudq: Fixed-point fractional library routines. + (line 1180) +* __satfracttauha: Fixed-point fractional library routines. + (line 1182) +* __satfracttauhq: Fixed-point fractional library routines. + (line 1177) +* __satfracttauqq: Fixed-point fractional library routines. + (line 1175) +* __satfracttausa: Fixed-point fractional library routines. + (line 1184) +* __satfracttausq: Fixed-point fractional library routines. + (line 1178) +* __satfracttauta: Fixed-point fractional library routines. + (line 1187) +* __satfracttida: Fixed-point fractional library routines. + (line 1471) +* __satfracttidq: Fixed-point fractional library routines. + (line 1468) +* __satfracttiha: Fixed-point fractional library routines. + (line 1469) +* __satfracttihq: Fixed-point fractional library routines. + (line 1466) +* __satfracttiqq: Fixed-point fractional library routines. + (line 1465) +* __satfracttisa: Fixed-point fractional library routines. + (line 1470) +* __satfracttisq: Fixed-point fractional library routines. + (line 1467) +* __satfracttita: Fixed-point fractional library routines. + (line 1472) +* __satfracttiuda: Fixed-point fractional library routines. + (line 1480) +* __satfracttiudq: Fixed-point fractional library routines. + (line 1476) +* __satfracttiuha: Fixed-point fractional library routines. + (line 1478) +* __satfracttiuhq: Fixed-point fractional library routines. + (line 1474) +* __satfracttiuqq: Fixed-point fractional library routines. + (line 1473) +* __satfracttiusa: Fixed-point fractional library routines. + (line 1479) +* __satfracttiusq: Fixed-point fractional library routines. + (line 1475) +* __satfracttiuta: Fixed-point fractional library routines. + (line 1481) +* __satfractudada: Fixed-point fractional library routines. + (line 1350) +* __satfractudadq: Fixed-point fractional library routines. + (line 1345) +* __satfractudaha: Fixed-point fractional library routines. + (line 1347) +* __satfractudahq: Fixed-point fractional library routines. + (line 1343) +* __satfractudaqq: Fixed-point fractional library routines. + (line 1341) +* __satfractudasa: Fixed-point fractional library routines. + (line 1349) +* __satfractudasq: Fixed-point fractional library routines. + (line 1344) +* __satfractudata: Fixed-point fractional library routines. + (line 1351) +* __satfractudaudq: Fixed-point fractional library routines. + (line 1359) +* __satfractudauha2: Fixed-point fractional library routines. + (line 1361) +* __satfractudauhq: Fixed-point fractional library routines. + (line 1355) +* __satfractudauqq: Fixed-point fractional library routines. + (line 1353) +* __satfractudausa2: Fixed-point fractional library routines. + (line 1363) +* __satfractudausq: Fixed-point fractional library routines. + (line 1357) +* __satfractudauta2: Fixed-point fractional library routines. + (line 1365) +* __satfractudqda: Fixed-point fractional library routines. + (line 1274) +* __satfractudqdq: Fixed-point fractional library routines. + (line 1269) +* __satfractudqha: Fixed-point fractional library routines. + (line 1271) +* __satfractudqhq: Fixed-point fractional library routines. + (line 1266) +* __satfractudqqq: Fixed-point fractional library routines. + (line 1264) +* __satfractudqsa: Fixed-point fractional library routines. + (line 1273) +* __satfractudqsq: Fixed-point fractional library routines. + (line 1267) +* __satfractudqta: Fixed-point fractional library routines. + (line 1276) +* __satfractudquda: Fixed-point fractional library routines. + (line 1288) +* __satfractudquha: Fixed-point fractional library routines. + (line 1284) +* __satfractudquhq2: Fixed-point fractional library routines. + (line 1280) +* __satfractudquqq2: Fixed-point fractional library routines. + (line 1278) +* __satfractudqusa: Fixed-point fractional library routines. + (line 1286) +* __satfractudqusq2: Fixed-point fractional library routines. + (line 1282) +* __satfractudquta: Fixed-point fractional library routines. + (line 1290) +* __satfractuhada: Fixed-point fractional library routines. + (line 1302) +* __satfractuhadq: Fixed-point fractional library routines. + (line 1297) +* __satfractuhaha: Fixed-point fractional library routines. + (line 1299) +* __satfractuhahq: Fixed-point fractional library routines. + (line 1294) +* __satfractuhaqq: Fixed-point fractional library routines. + (line 1292) +* __satfractuhasa: Fixed-point fractional library routines. + (line 1301) +* __satfractuhasq: Fixed-point fractional library routines. + (line 1295) +* __satfractuhata: Fixed-point fractional library routines. + (line 1304) +* __satfractuhauda2: Fixed-point fractional library routines. + (line 1316) +* __satfractuhaudq: Fixed-point fractional library routines. + (line 1312) +* __satfractuhauhq: Fixed-point fractional library routines. + (line 1308) +* __satfractuhauqq: Fixed-point fractional library routines. + (line 1306) +* __satfractuhausa2: Fixed-point fractional library routines. + (line 1314) +* __satfractuhausq: Fixed-point fractional library routines. + (line 1310) +* __satfractuhauta2: Fixed-point fractional library routines. + (line 1318) +* __satfractuhqda: Fixed-point fractional library routines. + (line 1223) +* __satfractuhqdq: Fixed-point fractional library routines. + (line 1220) +* __satfractuhqha: Fixed-point fractional library routines. + (line 1221) +* __satfractuhqhq: Fixed-point fractional library routines. + (line 1218) +* __satfractuhqqq: Fixed-point fractional library routines. + (line 1217) +* __satfractuhqsa: Fixed-point fractional library routines. + (line 1222) +* __satfractuhqsq: Fixed-point fractional library routines. + (line 1219) +* __satfractuhqta: Fixed-point fractional library routines. + (line 1224) +* __satfractuhquda: Fixed-point fractional library routines. + (line 1234) +* __satfractuhqudq2: Fixed-point fractional library routines. + (line 1229) +* __satfractuhquha: Fixed-point fractional library routines. + (line 1231) +* __satfractuhquqq2: Fixed-point fractional library routines. + (line 1225) +* __satfractuhqusa: Fixed-point fractional library routines. + (line 1233) +* __satfractuhqusq2: Fixed-point fractional library routines. + (line 1227) +* __satfractuhquta: Fixed-point fractional library routines. + (line 1236) +* __satfractunsdida: Fixed-point fractional library routines. + (line 1833) +* __satfractunsdidq: Fixed-point fractional library routines. + (line 1829) +* __satfractunsdiha: Fixed-point fractional library routines. + (line 1831) +* __satfractunsdihq: Fixed-point fractional library routines. + (line 1827) +* __satfractunsdiqq: Fixed-point fractional library routines. + (line 1826) +* __satfractunsdisa: Fixed-point fractional library routines. + (line 1832) +* __satfractunsdisq: Fixed-point fractional library routines. + (line 1828) +* __satfractunsdita: Fixed-point fractional library routines. + (line 1834) +* __satfractunsdiuda: Fixed-point fractional library routines. + (line 1848) +* __satfractunsdiudq: Fixed-point fractional library routines. + (line 1842) +* __satfractunsdiuha: Fixed-point fractional library routines. + (line 1844) +* __satfractunsdiuhq: Fixed-point fractional library routines. + (line 1838) +* __satfractunsdiuqq: Fixed-point fractional library routines. + (line 1836) +* __satfractunsdiusa: Fixed-point fractional library routines. + (line 1846) +* __satfractunsdiusq: Fixed-point fractional library routines. + (line 1840) +* __satfractunsdiuta: Fixed-point fractional library routines. + (line 1850) +* __satfractunshida: Fixed-point fractional library routines. + (line 1785) +* __satfractunshidq: Fixed-point fractional library routines. + (line 1781) +* __satfractunshiha: Fixed-point fractional library routines. + (line 1783) +* __satfractunshihq: Fixed-point fractional library routines. + (line 1779) +* __satfractunshiqq: Fixed-point fractional library routines. + (line 1778) +* __satfractunshisa: Fixed-point fractional library routines. + (line 1784) +* __satfractunshisq: Fixed-point fractional library routines. + (line 1780) +* __satfractunshita: Fixed-point fractional library routines. + (line 1786) +* __satfractunshiuda: Fixed-point fractional library routines. + (line 1800) +* __satfractunshiudq: Fixed-point fractional library routines. + (line 1794) +* __satfractunshiuha: Fixed-point fractional library routines. + (line 1796) +* __satfractunshiuhq: Fixed-point fractional library routines. + (line 1790) +* __satfractunshiuqq: Fixed-point fractional library routines. + (line 1788) +* __satfractunshiusa: Fixed-point fractional library routines. + (line 1798) +* __satfractunshiusq: Fixed-point fractional library routines. + (line 1792) +* __satfractunshiuta: Fixed-point fractional library routines. + (line 1802) +* __satfractunsqida: Fixed-point fractional library routines. + (line 1759) +* __satfractunsqidq: Fixed-point fractional library routines. + (line 1755) +* __satfractunsqiha: Fixed-point fractional library routines. + (line 1757) +* __satfractunsqihq: Fixed-point fractional library routines. + (line 1753) +* __satfractunsqiqq: Fixed-point fractional library routines. + (line 1752) +* __satfractunsqisa: Fixed-point fractional library routines. + (line 1758) +* __satfractunsqisq: Fixed-point fractional library routines. + (line 1754) +* __satfractunsqita: Fixed-point fractional library routines. + (line 1760) +* __satfractunsqiuda: Fixed-point fractional library routines. + (line 1774) +* __satfractunsqiudq: Fixed-point fractional library routines. + (line 1768) +* __satfractunsqiuha: Fixed-point fractional library routines. + (line 1770) +* __satfractunsqiuhq: Fixed-point fractional library routines. + (line 1764) +* __satfractunsqiuqq: Fixed-point fractional library routines. + (line 1762) +* __satfractunsqiusa: Fixed-point fractional library routines. + (line 1772) +* __satfractunsqiusq: Fixed-point fractional library routines. + (line 1766) +* __satfractunsqiuta: Fixed-point fractional library routines. + (line 1776) +* __satfractunssida: Fixed-point fractional library routines. + (line 1810) +* __satfractunssidq: Fixed-point fractional library routines. + (line 1807) +* __satfractunssiha: Fixed-point fractional library routines. + (line 1808) +* __satfractunssihq: Fixed-point fractional library routines. + (line 1805) +* __satfractunssiqq: Fixed-point fractional library routines. + (line 1804) +* __satfractunssisa: Fixed-point fractional library routines. + (line 1809) +* __satfractunssisq: Fixed-point fractional library routines. + (line 1806) +* __satfractunssita: Fixed-point fractional library routines. + (line 1811) +* __satfractunssiuda: Fixed-point fractional library routines. + (line 1822) +* __satfractunssiudq: Fixed-point fractional library routines. + (line 1817) +* __satfractunssiuha: Fixed-point fractional library routines. + (line 1819) +* __satfractunssiuhq: Fixed-point fractional library routines. + (line 1814) +* __satfractunssiuqq: Fixed-point fractional library routines. + (line 1812) +* __satfractunssiusa: Fixed-point fractional library routines. + (line 1821) +* __satfractunssiusq: Fixed-point fractional library routines. + (line 1815) +* __satfractunssiuta: Fixed-point fractional library routines. + (line 1824) +* __satfractunstida: Fixed-point fractional library routines. + (line 1862) +* __satfractunstidq: Fixed-point fractional library routines. + (line 1857) +* __satfractunstiha: Fixed-point fractional library routines. + (line 1859) +* __satfractunstihq: Fixed-point fractional library routines. + (line 1854) +* __satfractunstiqq: Fixed-point fractional library routines. + (line 1852) +* __satfractunstisa: Fixed-point fractional library routines. + (line 1861) +* __satfractunstisq: Fixed-point fractional library routines. + (line 1855) +* __satfractunstita: Fixed-point fractional library routines. + (line 1864) +* __satfractunstiuda: Fixed-point fractional library routines. + (line 1878) +* __satfractunstiudq: Fixed-point fractional library routines. + (line 1872) +* __satfractunstiuha: Fixed-point fractional library routines. + (line 1874) +* __satfractunstiuhq: Fixed-point fractional library routines. + (line 1868) +* __satfractunstiuqq: Fixed-point fractional library routines. + (line 1866) +* __satfractunstiusa: Fixed-point fractional library routines. + (line 1876) +* __satfractunstiusq: Fixed-point fractional library routines. + (line 1870) +* __satfractunstiuta: Fixed-point fractional library routines. + (line 1880) +* __satfractuqqda: Fixed-point fractional library routines. + (line 1199) +* __satfractuqqdq: Fixed-point fractional library routines. + (line 1194) +* __satfractuqqha: Fixed-point fractional library routines. + (line 1196) +* __satfractuqqhq: Fixed-point fractional library routines. + (line 1191) +* __satfractuqqqq: Fixed-point fractional library routines. + (line 1189) +* __satfractuqqsa: Fixed-point fractional library routines. + (line 1198) +* __satfractuqqsq: Fixed-point fractional library routines. + (line 1192) +* __satfractuqqta: Fixed-point fractional library routines. + (line 1201) +* __satfractuqquda: Fixed-point fractional library routines. + (line 1213) +* __satfractuqqudq2: Fixed-point fractional library routines. + (line 1207) +* __satfractuqquha: Fixed-point fractional library routines. + (line 1209) +* __satfractuqquhq2: Fixed-point fractional library routines. + (line 1203) +* __satfractuqqusa: Fixed-point fractional library routines. + (line 1211) +* __satfractuqqusq2: Fixed-point fractional library routines. + (line 1205) +* __satfractuqquta: Fixed-point fractional library routines. + (line 1215) +* __satfractusada: Fixed-point fractional library routines. + (line 1326) +* __satfractusadq: Fixed-point fractional library routines. + (line 1323) +* __satfractusaha: Fixed-point fractional library routines. + (line 1324) +* __satfractusahq: Fixed-point fractional library routines. + (line 1321) +* __satfractusaqq: Fixed-point fractional library routines. + (line 1320) +* __satfractusasa: Fixed-point fractional library routines. + (line 1325) +* __satfractusasq: Fixed-point fractional library routines. + (line 1322) +* __satfractusata: Fixed-point fractional library routines. + (line 1327) +* __satfractusauda2: Fixed-point fractional library routines. + (line 1337) +* __satfractusaudq: Fixed-point fractional library routines. + (line 1333) +* __satfractusauha2: Fixed-point fractional library routines. + (line 1335) +* __satfractusauhq: Fixed-point fractional library routines. + (line 1330) +* __satfractusauqq: Fixed-point fractional library routines. + (line 1328) +* __satfractusausq: Fixed-point fractional library routines. + (line 1331) +* __satfractusauta2: Fixed-point fractional library routines. + (line 1339) +* __satfractusqda: Fixed-point fractional library routines. + (line 1247) +* __satfractusqdq: Fixed-point fractional library routines. + (line 1242) +* __satfractusqha: Fixed-point fractional library routines. + (line 1244) +* __satfractusqhq: Fixed-point fractional library routines. + (line 1240) +* __satfractusqqq: Fixed-point fractional library routines. + (line 1238) +* __satfractusqsa: Fixed-point fractional library routines. + (line 1246) +* __satfractusqsq: Fixed-point fractional library routines. + (line 1241) +* __satfractusqta: Fixed-point fractional library routines. + (line 1248) +* __satfractusquda: Fixed-point fractional library routines. + (line 1260) +* __satfractusqudq2: Fixed-point fractional library routines. + (line 1254) +* __satfractusquha: Fixed-point fractional library routines. + (line 1256) +* __satfractusquhq2: Fixed-point fractional library routines. + (line 1252) +* __satfractusquqq2: Fixed-point fractional library routines. + (line 1250) +* __satfractusqusa: Fixed-point fractional library routines. + (line 1258) +* __satfractusquta: Fixed-point fractional library routines. + (line 1262) +* __satfractutada: Fixed-point fractional library routines. + (line 1377) +* __satfractutadq: Fixed-point fractional library routines. + (line 1372) +* __satfractutaha: Fixed-point fractional library routines. + (line 1374) +* __satfractutahq: Fixed-point fractional library routines. + (line 1369) +* __satfractutaqq: Fixed-point fractional library routines. + (line 1367) +* __satfractutasa: Fixed-point fractional library routines. + (line 1376) +* __satfractutasq: Fixed-point fractional library routines. + (line 1370) +* __satfractutata: Fixed-point fractional library routines. + (line 1379) +* __satfractutauda2: Fixed-point fractional library routines. + (line 1393) +* __satfractutaudq: Fixed-point fractional library routines. + (line 1387) +* __satfractutauha2: Fixed-point fractional library routines. + (line 1389) +* __satfractutauhq: Fixed-point fractional library routines. + (line 1383) +* __satfractutauqq: Fixed-point fractional library routines. + (line 1381) +* __satfractutausa2: Fixed-point fractional library routines. + (line 1391) +* __satfractutausq: Fixed-point fractional library routines. + (line 1385) +* __splitstack_find: Miscellaneous routines. + (line 15) +* __ssaddda3: Fixed-point fractional library routines. + (line 66) +* __ssadddq3: Fixed-point fractional library routines. + (line 61) +* __ssaddha3: Fixed-point fractional library routines. + (line 63) +* __ssaddhq3: Fixed-point fractional library routines. + (line 59) +* __ssaddqq3: Fixed-point fractional library routines. + (line 57) +* __ssaddsa3: Fixed-point fractional library routines. + (line 65) +* __ssaddsq3: Fixed-point fractional library routines. + (line 60) +* __ssaddta3: Fixed-point fractional library routines. + (line 67) +* __ssashlda3: Fixed-point fractional library routines. + (line 401) +* __ssashldq3: Fixed-point fractional library routines. + (line 397) +* __ssashlha3: Fixed-point fractional library routines. + (line 399) +* __ssashlhq3: Fixed-point fractional library routines. + (line 395) +* __ssashlsa3: Fixed-point fractional library routines. + (line 400) +* __ssashlsq3: Fixed-point fractional library routines. + (line 396) +* __ssashlta3: Fixed-point fractional library routines. + (line 402) +* __ssdivda3: Fixed-point fractional library routines. + (line 260) +* __ssdivdq3: Fixed-point fractional library routines. + (line 255) +* __ssdivha3: Fixed-point fractional library routines. + (line 257) +* __ssdivhq3: Fixed-point fractional library routines. + (line 253) +* __ssdivqq3: Fixed-point fractional library routines. + (line 251) +* __ssdivsa3: Fixed-point fractional library routines. + (line 259) +* __ssdivsq3: Fixed-point fractional library routines. + (line 254) +* __ssdivta3: Fixed-point fractional library routines. + (line 261) +* __ssmulda3: Fixed-point fractional library routines. + (line 192) +* __ssmuldq3: Fixed-point fractional library routines. + (line 187) +* __ssmulha3: Fixed-point fractional library routines. + (line 189) +* __ssmulhq3: Fixed-point fractional library routines. + (line 185) +* __ssmulqq3: Fixed-point fractional library routines. + (line 183) +* __ssmulsa3: Fixed-point fractional library routines. + (line 191) +* __ssmulsq3: Fixed-point fractional library routines. + (line 186) +* __ssmulta3: Fixed-point fractional library routines. + (line 193) +* __ssnegda2: Fixed-point fractional library routines. + (line 315) +* __ssnegdq2: Fixed-point fractional library routines. + (line 312) +* __ssnegha2: Fixed-point fractional library routines. + (line 313) +* __ssneghq2: Fixed-point fractional library routines. + (line 310) +* __ssnegqq2: Fixed-point fractional library routines. + (line 309) +* __ssnegsa2: Fixed-point fractional library routines. + (line 314) +* __ssnegsq2: Fixed-point fractional library routines. + (line 311) +* __ssnegta2: Fixed-point fractional library routines. + (line 316) +* __sssubda3: Fixed-point fractional library routines. + (line 128) +* __sssubdq3: Fixed-point fractional library routines. + (line 123) +* __sssubha3: Fixed-point fractional library routines. + (line 125) +* __sssubhq3: Fixed-point fractional library routines. + (line 121) +* __sssubqq3: Fixed-point fractional library routines. + (line 119) +* __sssubsa3: Fixed-point fractional library routines. + (line 127) +* __sssubsq3: Fixed-point fractional library routines. + (line 122) +* __sssubta3: Fixed-point fractional library routines. + (line 129) +* __subda3: Fixed-point fractional library routines. + (line 106) +* __subdf3: Soft float library routines. + (line 30) +* __subdq3: Fixed-point fractional library routines. + (line 93) +* __subha3: Fixed-point fractional library routines. + (line 103) +* __subhq3: Fixed-point fractional library routines. + (line 91) +* __subqq3: Fixed-point fractional library routines. + (line 89) +* __subsa3: Fixed-point fractional library routines. + (line 105) +* __subsf3: Soft float library routines. + (line 29) +* __subsq3: Fixed-point fractional library routines. + (line 92) +* __subta3: Fixed-point fractional library routines. + (line 107) +* __subtf3: Soft float library routines. + (line 31) +* __subuda3: Fixed-point fractional library routines. + (line 113) +* __subudq3: Fixed-point fractional library routines. + (line 101) +* __subuha3: Fixed-point fractional library routines. + (line 109) +* __subuhq3: Fixed-point fractional library routines. + (line 97) +* __subuqq3: Fixed-point fractional library routines. + (line 95) +* __subusa3: Fixed-point fractional library routines. + (line 111) +* __subusq3: Fixed-point fractional library routines. + (line 99) +* __subuta3: Fixed-point fractional library routines. + (line 115) +* __subvdi3: Integer library routines. + (line 122) +* __subvsi3: Integer library routines. + (line 121) +* __subxf3: Soft float library routines. + (line 33) +* __truncdfsf2: Soft float library routines. + (line 75) +* __trunctfdf2: Soft float library routines. + (line 72) +* __trunctfsf2: Soft float library routines. + (line 74) +* __truncxfdf2: Soft float library routines. + (line 71) +* __truncxfsf2: Soft float library routines. + (line 73) +* __ucmpdi2: Integer library routines. + (line 92) +* __ucmpti2: Integer library routines. + (line 93) +* __udivdi3: Integer library routines. + (line 52) +* __udivmoddi4: Integer library routines. + (line 59) +* __udivmodti4: Integer library routines. + (line 61) +* __udivsi3: Integer library routines. + (line 50) +* __udivti3: Integer library routines. + (line 54) +* __udivuda3: Fixed-point fractional library routines. + (line 244) +* __udivudq3: Fixed-point fractional library routines. + (line 238) +* __udivuha3: Fixed-point fractional library routines. + (line 240) +* __udivuhq3: Fixed-point fractional library routines. + (line 234) +* __udivuqq3: Fixed-point fractional library routines. + (line 232) +* __udivusa3: Fixed-point fractional library routines. + (line 242) +* __udivusq3: Fixed-point fractional library routines. + (line 236) +* __udivuta3: Fixed-point fractional library routines. + (line 246) +* __umoddi3: Integer library routines. + (line 69) +* __umodsi3: Integer library routines. + (line 67) +* __umodti3: Integer library routines. + (line 71) +* __unorddf2: Soft float library routines. + (line 172) +* __unordsf2: Soft float library routines. + (line 171) +* __unordtf2: Soft float library routines. + (line 173) +* __usadduda3: Fixed-point fractional library routines. + (line 83) +* __usaddudq3: Fixed-point fractional library routines. + (line 77) +* __usadduha3: Fixed-point fractional library routines. + (line 79) +* __usadduhq3: Fixed-point fractional library routines. + (line 73) +* __usadduqq3: Fixed-point fractional library routines. + (line 71) +* __usaddusa3: Fixed-point fractional library routines. + (line 81) +* __usaddusq3: Fixed-point fractional library routines. + (line 75) +* __usadduta3: Fixed-point fractional library routines. + (line 85) +* __usashluda3: Fixed-point fractional library routines. + (line 419) +* __usashludq3: Fixed-point fractional library routines. + (line 413) +* __usashluha3: Fixed-point fractional library routines. + (line 415) +* __usashluhq3: Fixed-point fractional library routines. + (line 409) +* __usashluqq3: Fixed-point fractional library routines. + (line 407) +* __usashlusa3: Fixed-point fractional library routines. + (line 417) +* __usashlusq3: Fixed-point fractional library routines. + (line 411) +* __usashluta3: Fixed-point fractional library routines. + (line 421) +* __usdivuda3: Fixed-point fractional library routines. + (line 278) +* __usdivudq3: Fixed-point fractional library routines. + (line 272) +* __usdivuha3: Fixed-point fractional library routines. + (line 274) +* __usdivuhq3: Fixed-point fractional library routines. + (line 268) +* __usdivuqq3: Fixed-point fractional library routines. + (line 266) +* __usdivusa3: Fixed-point fractional library routines. + (line 276) +* __usdivusq3: Fixed-point fractional library routines. + (line 270) +* __usdivuta3: Fixed-point fractional library routines. + (line 280) +* __usmuluda3: Fixed-point fractional library routines. + (line 210) +* __usmuludq3: Fixed-point fractional library routines. + (line 204) +* __usmuluha3: Fixed-point fractional library routines. + (line 206) +* __usmuluhq3: Fixed-point fractional library routines. + (line 200) +* __usmuluqq3: Fixed-point fractional library routines. + (line 198) +* __usmulusa3: Fixed-point fractional library routines. + (line 208) +* __usmulusq3: Fixed-point fractional library routines. + (line 202) +* __usmuluta3: Fixed-point fractional library routines. + (line 212) +* __usneguda2: Fixed-point fractional library routines. + (line 329) +* __usnegudq2: Fixed-point fractional library routines. + (line 324) +* __usneguha2: Fixed-point fractional library routines. + (line 326) +* __usneguhq2: Fixed-point fractional library routines. + (line 321) +* __usneguqq2: Fixed-point fractional library routines. + (line 319) +* __usnegusa2: Fixed-point fractional library routines. + (line 328) +* __usnegusq2: Fixed-point fractional library routines. + (line 322) +* __usneguta2: Fixed-point fractional library routines. + (line 331) +* __ussubuda3: Fixed-point fractional library routines. + (line 146) +* __ussubudq3: Fixed-point fractional library routines. + (line 140) +* __ussubuha3: Fixed-point fractional library routines. + (line 142) +* __ussubuhq3: Fixed-point fractional library routines. + (line 136) +* __ussubuqq3: Fixed-point fractional library routines. + (line 134) +* __ussubusa3: Fixed-point fractional library routines. + (line 144) +* __ussubusq3: Fixed-point fractional library routines. + (line 138) +* __ussubuta3: Fixed-point fractional library routines. + (line 148) +* abort: Portability. (line 20) +* abs: Arithmetic. (line 201) +* 'abs' and attributes: Expressions. (line 83) +* absence_set: Processor pipeline description. + (line 223) +* 'absM2' instruction pattern: Standard Names. (line 541) +* absolute value: Arithmetic. (line 201) +* ABS_EXPR: Unary and Binary Expressions. + (line 6) +* access to operands: Accessors. (line 6) +* access to special operands: Special Accessors. (line 6) +* accessors: Accessors. (line 6) +* ACCUMULATE_OUTGOING_ARGS: Stack Arguments. (line 48) +* 'ACCUMULATE_OUTGOING_ARGS' and stack frames: Function Entry. + (line 133) +* ACCUM_TYPE_SIZE: Type Layout. (line 87) +* ADA_LONG_TYPE_SIZE: Type Layout. (line 25) +* Adding a new GIMPLE statement code: Adding a new GIMPLE statement code. + (line 6) +* ADDITIONAL_REGISTER_NAMES: Instruction Output. (line 14) +* 'addM3' instruction pattern: Standard Names. (line 260) +* 'addMODEcc' instruction pattern: Standard Names. (line 1063) +* 'addptrM3' instruction pattern: Standard Names. (line 266) +* address constraints: Simple Constraints. (line 162) +* addressing modes: Addressing Modes. (line 6) +* address_operand: Machine-Independent Predicates. + (line 62) +* address_operand <1>: Simple Constraints. (line 166) +* addr_diff_vec: Side Effects. (line 313) +* 'addr_diff_vec', length of: Insn Lengths. (line 26) +* ADDR_EXPR: Storage References. (line 6) +* addr_vec: Side Effects. (line 308) +* 'addr_vec', length of: Insn Lengths. (line 26) +* ADJUST_FIELD_ALIGN: Storage Layout. (line 190) +* ADJUST_INSN_LENGTH: Insn Lengths. (line 35) +* ADJUST_REG_ALLOC_ORDER: Allocation Order. (line 22) +* aggregates as return values: Aggregate Return. (line 6) +* alias: Alias analysis. (line 6) +* 'allocate_stack' instruction pattern: Standard Names. (line 1377) +* ALL_REGS: Register Classes. (line 17) +* alternate entry points: Insns. (line 146) +* anchored addresses: Anchored Addresses. (line 6) +* and: Arithmetic. (line 159) +* 'and' and attributes: Expressions. (line 50) +* 'and', canonicalization of: Insn Canonicalizations. + (line 51) +* 'andM3' instruction pattern: Standard Names. (line 276) +* ANNOTATE_EXPR: Unary and Binary Expressions. + (line 6) +* annotations: Annotations. (line 6) +* APPLY_RESULT_SIZE: Scalar Return. (line 112) +* ARGS_GROW_DOWNWARD: Frame Layout. (line 34) +* argument passing: Interface. (line 36) +* arguments in registers: Register Arguments. (line 6) +* arguments on stack: Stack Arguments. (line 6) +* ARG_POINTER_CFA_OFFSET: Frame Layout. (line 192) +* ARG_POINTER_REGNUM: Frame Registers. (line 40) +* 'ARG_POINTER_REGNUM' and virtual registers: Regs and Memory. + (line 65) +* arg_pointer_rtx: Frame Registers. (line 104) +* arithmetic library: Soft float library routines. + (line 6) +* arithmetic shift: Arithmetic. (line 174) +* arithmetic shift with signed saturation: Arithmetic. (line 174) +* arithmetic shift with unsigned saturation: Arithmetic. (line 174) +* arithmetic, in RTL: Arithmetic. (line 6) +* ARITHMETIC_TYPE_P: Types for C++. (line 59) +* array: Types. (line 6) +* ARRAY_RANGE_REF: Storage References. (line 6) +* ARRAY_REF: Storage References. (line 6) +* ARRAY_TYPE: Types. (line 6) +* ashift: Arithmetic. (line 174) +* 'ashift' and attributes: Expressions. (line 83) +* ashiftrt: Arithmetic. (line 191) +* 'ashiftrt' and attributes: Expressions. (line 83) +* 'ashlM3' instruction pattern: Standard Names. (line 516) +* 'ashrM3' instruction pattern: Standard Names. (line 526) +* ASM_APP_OFF: File Framework. (line 76) +* ASM_APP_ON: File Framework. (line 69) +* ASM_COMMENT_START: File Framework. (line 64) +* ASM_DECLARE_FUNCTION_NAME: Label Output. (line 108) +* ASM_DECLARE_FUNCTION_SIZE: Label Output. (line 123) +* ASM_DECLARE_OBJECT_NAME: Label Output. (line 136) +* ASM_DECLARE_REGISTER_GLOBAL: Label Output. (line 164) +* ASM_FINAL_SPEC: Driver. (line 81) +* ASM_FINISH_DECLARE_OBJECT: Label Output. (line 172) +* ASM_FORMAT_PRIVATE_NAME: Label Output. (line 391) +* asm_fprintf: Instruction Output. (line 150) +* ASM_FPRINTF_EXTENSIONS: Instruction Output. (line 160) +* ASM_GENERATE_INTERNAL_LABEL: Label Output. (line 375) +* asm_input: Side Effects. (line 295) +* 'asm_input' and '/v': Flags. (line 76) +* ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX: Exception Handling. (line 80) +* asm_noperands: Insns. (line 304) +* ASM_NO_SKIP_IN_TEXT: Alignment Output. (line 78) +* 'asm_operands' and '/v': Flags. (line 76) +* 'asm_operands', RTL sharing: Sharing. (line 45) +* 'asm_operands', usage: Assembler. (line 6) +* ASM_OUTPUT_ADDR_DIFF_ELT: Dispatch Tables. (line 8) +* ASM_OUTPUT_ADDR_VEC_ELT: Dispatch Tables. (line 25) +* ASM_OUTPUT_ALIGN: Alignment Output. (line 85) +* ASM_OUTPUT_ALIGNED_BSS: Uninitialized Data. (line 45) +* ASM_OUTPUT_ALIGNED_COMMON: Uninitialized Data. (line 29) +* ASM_OUTPUT_ALIGNED_DECL_COMMON: Uninitialized Data. (line 36) +* ASM_OUTPUT_ALIGNED_DECL_LOCAL: Uninitialized Data. (line 89) +* ASM_OUTPUT_ALIGNED_LOCAL: Uninitialized Data. (line 82) +* ASM_OUTPUT_ALIGN_WITH_NOP: Alignment Output. (line 90) +* ASM_OUTPUT_ASCII: Data Output. (line 50) +* ASM_OUTPUT_CASE_END: Dispatch Tables. (line 50) +* ASM_OUTPUT_CASE_LABEL: Dispatch Tables. (line 37) +* ASM_OUTPUT_COMMON: Uninitialized Data. (line 9) +* ASM_OUTPUT_DEBUG_LABEL: Label Output. (line 363) +* ASM_OUTPUT_DEF: Label Output. (line 412) +* ASM_OUTPUT_DEF_FROM_DECLS: Label Output. (line 419) +* ASM_OUTPUT_DWARF_DELTA: SDB and DWARF. (line 73) +* ASM_OUTPUT_DWARF_OFFSET: SDB and DWARF. (line 82) +* ASM_OUTPUT_DWARF_PCREL: SDB and DWARF. (line 88) +* ASM_OUTPUT_DWARF_TABLE_REF: SDB and DWARF. (line 93) +* ASM_OUTPUT_DWARF_VMS_DELTA: SDB and DWARF. (line 77) +* ASM_OUTPUT_EXTERNAL: Label Output. (line 292) +* ASM_OUTPUT_FDESC: Data Output. (line 59) +* ASM_OUTPUT_FUNCTION_LABEL: Label Output. (line 16) +* ASM_OUTPUT_INTERNAL_LABEL: Label Output. (line 27) +* ASM_OUTPUT_LABEL: Label Output. (line 8) +* ASM_OUTPUT_LABELREF: Label Output. (line 314) +* ASM_OUTPUT_LABEL_REF: Label Output. (line 336) +* ASM_OUTPUT_LOCAL: Uninitialized Data. (line 69) +* ASM_OUTPUT_MAX_SKIP_ALIGN: Alignment Output. (line 94) +* ASM_OUTPUT_MEASURED_SIZE: Label Output. (line 51) +* ASM_OUTPUT_OPCODE: Instruction Output. (line 35) +* ASM_OUTPUT_POOL_EPILOGUE: Data Output. (line 108) +* ASM_OUTPUT_POOL_PROLOGUE: Data Output. (line 72) +* ASM_OUTPUT_REG_POP: Instruction Output. (line 206) +* ASM_OUTPUT_REG_PUSH: Instruction Output. (line 201) +* ASM_OUTPUT_SIZE_DIRECTIVE: Label Output. (line 45) +* ASM_OUTPUT_SKIP: Alignment Output. (line 72) +* ASM_OUTPUT_SOURCE_FILENAME: File Framework. (line 83) +* ASM_OUTPUT_SPECIAL_POOL_ENTRY: Data Output. (line 83) +* ASM_OUTPUT_SYMBOL_REF: Label Output. (line 329) +* ASM_OUTPUT_TYPE_DIRECTIVE: Label Output. (line 98) +* ASM_OUTPUT_WEAKREF: Label Output. (line 224) +* ASM_OUTPUT_WEAK_ALIAS: Label Output. (line 438) +* ASM_PREFERRED_EH_DATA_FORMAT: Exception Handling. (line 66) +* ASM_SPEC: Driver. (line 73) +* ASM_STABD_OP: DBX Options. (line 34) +* ASM_STABN_OP: DBX Options. (line 41) +* ASM_STABS_OP: DBX Options. (line 28) +* ASM_WEAKEN_DECL: Label Output. (line 216) +* ASM_WEAKEN_LABEL: Label Output. (line 203) +* assembler format: File Framework. (line 6) +* assembler instructions in RTL: Assembler. (line 6) +* ASSEMBLER_DIALECT: Instruction Output. (line 172) +* assemble_name: Label Output. (line 8) +* assemble_name_raw: Label Output. (line 27) +* assigning attribute values to insns: Tagging Insns. (line 6) +* ASSUME_EXTENDED_UNWIND_CONTEXT: Frame Registers. (line 165) +* asterisk in template: Output Statement. (line 29) +* AS_NEEDS_DASH_FOR_PIPED_INPUT: Driver. (line 88) +* 'atan2M3' instruction pattern: Standard Names. (line 624) +* atomic: GTY Options. (line 270) +* 'atomic_addMODE' instruction pattern: Standard Names. (line 1788) +* 'atomic_add_fetchMODE' instruction pattern: Standard Names. + (line 1819) +* 'atomic_andMODE' instruction pattern: Standard Names. (line 1788) +* 'atomic_and_fetchMODE' instruction pattern: Standard Names. + (line 1819) +* 'atomic_compare_and_swapMODE' instruction pattern: Standard Names. + (line 1724) +* 'atomic_exchangeMODE' instruction pattern: Standard Names. (line 1776) +* 'atomic_fetch_addMODE' instruction pattern: Standard Names. + (line 1803) +* 'atomic_fetch_andMODE' instruction pattern: Standard Names. + (line 1803) +* 'atomic_fetch_nandMODE' instruction pattern: Standard Names. + (line 1803) +* 'atomic_fetch_orMODE' instruction pattern: Standard Names. (line 1803) +* 'atomic_fetch_subMODE' instruction pattern: Standard Names. + (line 1803) +* 'atomic_fetch_xorMODE' instruction pattern: Standard Names. + (line 1803) +* 'atomic_loadMODE' instruction pattern: Standard Names. (line 1755) +* 'atomic_nandMODE' instruction pattern: Standard Names. (line 1788) +* 'atomic_nand_fetchMODE' instruction pattern: Standard Names. + (line 1819) +* 'atomic_orMODE' instruction pattern: Standard Names. (line 1788) +* 'atomic_or_fetchMODE' instruction pattern: Standard Names. (line 1819) +* 'atomic_storeMODE' instruction pattern: Standard Names. (line 1765) +* 'atomic_subMODE' instruction pattern: Standard Names. (line 1788) +* 'atomic_sub_fetchMODE' instruction pattern: Standard Names. + (line 1819) +* 'atomic_test_and_set' instruction pattern: Standard Names. (line 1837) +* 'atomic_xorMODE' instruction pattern: Standard Names. (line 1788) +* 'atomic_xor_fetchMODE' instruction pattern: Standard Names. + (line 1819) +* attr: Expressions. (line 163) +* attr <1>: Tagging Insns. (line 54) +* attribute expressions: Expressions. (line 6) +* attribute specifications: Attr Example. (line 6) +* attribute specifications example: Attr Example. (line 6) +* attributes: Attributes. (line 6) +* attributes, defining: Defining Attributes. + (line 6) +* attributes, target-specific: Target Attributes. (line 6) +* ATTRIBUTE_ALIGNED_VALUE: Storage Layout. (line 172) +* attr_flag: Expressions. (line 138) +* autoincrement addressing, availability: Portability. (line 20) +* autoincrement/decrement addressing: Simple Constraints. (line 30) +* automata_option: Processor pipeline description. + (line 304) +* automaton based pipeline description: Processor pipeline description. + (line 6) +* automaton based pipeline description <1>: Processor pipeline description. + (line 49) +* automaton based scheduler: Processor pipeline description. + (line 6) +* AVOID_CCMODE_COPIES: Values in Registers. + (line 150) +* backslash: Output Template. (line 46) +* barrier: Insns. (line 176) +* 'barrier' and '/f': Flags. (line 107) +* 'barrier' and '/v': Flags. (line 44) +* BASE_REG_CLASS: Register Classes. (line 111) +* basic block: Basic Blocks. (line 6) +* Basic Statements: Basic Statements. (line 6) +* basic-block.h: Control Flow. (line 6) +* basic_block: Basic Blocks. (line 6) +* BASIC_BLOCK: Basic Blocks. (line 14) +* BB_HEAD, BB_END: Maintaining the CFG. + (line 76) +* bb_seq: GIMPLE sequences. (line 72) +* BIGGEST_ALIGNMENT: Storage Layout. (line 162) +* BIGGEST_FIELD_ALIGNMENT: Storage Layout. (line 183) +* BImode: Machine Modes. (line 22) +* BIND_EXPR: Unary and Binary Expressions. + (line 6) +* BINFO_TYPE: Classes. (line 6) +* bit-fields: Bit-Fields. (line 6) +* BITFIELD_NBYTES_LIMITED: Storage Layout. (line 393) +* BITS_BIG_ENDIAN: Storage Layout. (line 11) +* 'BITS_BIG_ENDIAN', effect on 'sign_extract': Bit-Fields. (line 8) +* BITS_PER_UNIT: Machine Modes. (line 345) +* BITS_PER_WORD: Storage Layout. (line 50) +* bitwise complement: Arithmetic. (line 155) +* bitwise exclusive-or: Arithmetic. (line 169) +* bitwise inclusive-or: Arithmetic. (line 164) +* bitwise logical-and: Arithmetic. (line 159) +* BIT_AND_EXPR: Unary and Binary Expressions. + (line 6) +* BIT_IOR_EXPR: Unary and Binary Expressions. + (line 6) +* BIT_NOT_EXPR: Unary and Binary Expressions. + (line 6) +* BIT_XOR_EXPR: Unary and Binary Expressions. + (line 6) +* BLKmode: Machine Modes. (line 185) +* 'BLKmode', and function return values: Calls. (line 23) +* 'blockage' instruction pattern: Standard Names. (line 1579) +* Blocks: Blocks. (line 6) +* BLOCK_FOR_INSN, gimple_bb: Maintaining the CFG. + (line 28) +* BLOCK_REG_PADDING: Register Arguments. (line 228) +* bool: Misc. (line 891) +* BOOLEAN_TYPE: Types. (line 6) +* BOOL_TYPE_SIZE: Type Layout. (line 43) +* branch prediction: Profile information. + (line 24) +* BRANCH_COST: Costs. (line 104) +* break_out_memory_refs: Addressing Modes. (line 134) +* BREAK_STMT: Statements for C++. (line 6) +* BSS_SECTION_ASM_OP: Sections. (line 67) +* bswap: Arithmetic. (line 247) +* 'bswapM2' instruction pattern: Standard Names. (line 534) +* 'btruncM2' instruction pattern: Standard Names. (line 642) +* build0: Macros and Functions. + (line 16) +* build1: Macros and Functions. + (line 17) +* build2: Macros and Functions. + (line 18) +* build3: Macros and Functions. + (line 19) +* build4: Macros and Functions. + (line 20) +* build5: Macros and Functions. + (line 21) +* build6: Macros and Functions. + (line 22) +* 'builtin_longjmp' instruction pattern: Standard Names. (line 1475) +* 'builtin_setjmp_receiver' instruction pattern: Standard Names. + (line 1465) +* 'builtin_setjmp_setup' instruction pattern: Standard Names. + (line 1454) +* BYTES_BIG_ENDIAN: Storage Layout. (line 23) +* 'BYTES_BIG_ENDIAN', effect on 'subreg': Regs and Memory. (line 219) +* byte_mode: Machine Modes. (line 358) +* C statements for assembler output: Output Statement. (line 6) +* call: Flags. (line 221) +* call <1>: Side Effects. (line 92) +* 'call' instruction pattern: Standard Names. (line 1120) +* 'call' usage: Calls. (line 10) +* 'call', in 'call_insn': Flags. (line 33) +* 'call', in 'mem': Flags. (line 81) +* call-clobbered register: Register Basics. (line 35) +* call-clobbered register <1>: Register Basics. (line 46) +* call-clobbered register <2>: Register Basics. (line 53) +* call-saved register: Register Basics. (line 35) +* call-saved register <1>: Register Basics. (line 46) +* call-saved register <2>: Register Basics. (line 53) +* call-used register: Register Basics. (line 35) +* call-used register <1>: Register Basics. (line 46) +* call-used register <2>: Register Basics. (line 53) +* CALLER_SAVE_PROFITABLE: Caller Saves. (line 10) +* calling conventions: Stack and Calling. (line 6) +* calling functions in RTL: Calls. (line 6) +* CALL_EXPR: Unary and Binary Expressions. + (line 6) +* call_insn: Insns. (line 95) +* 'call_insn' and '/c': Flags. (line 33) +* 'call_insn' and '/f': Flags. (line 107) +* 'call_insn' and '/i': Flags. (line 24) +* 'call_insn' and '/j': Flags. (line 161) +* 'call_insn' and '/s': Flags. (line 49) +* 'call_insn' and '/s' <1>: Flags. (line 148) +* 'call_insn' and '/u': Flags. (line 19) +* 'call_insn' and '/u' <1>: Flags. (line 39) +* 'call_insn' and '/u' or '/i': Flags. (line 29) +* 'call_insn' and '/v': Flags. (line 44) +* CALL_INSN_FUNCTION_USAGE: Insns. (line 101) +* 'call_pop' instruction pattern: Standard Names. (line 1148) +* CALL_POPS_ARGS: Stack Arguments. (line 132) +* CALL_REALLY_USED_REGISTERS: Register Basics. (line 45) +* CALL_USED_REGISTERS: Register Basics. (line 34) +* call_used_regs: Register Basics. (line 59) +* 'call_value' instruction pattern: Standard Names. (line 1140) +* 'call_value_pop' instruction pattern: Standard Names. (line 1148) +* canadian: Configure Terms. (line 6) +* CANNOT_CHANGE_MODE_CLASS: Register Classes. (line 533) +* 'CANNOT_CHANGE_MODE_CLASS' and subreg semantics: Regs and Memory. + (line 276) +* canonicalization of instructions: Insn Canonicalizations. + (line 6) +* 'canonicalize_funcptr_for_compare' instruction pattern: Standard Names. + (line 1309) +* can_create_pseudo_p: Standard Names. (line 75) +* can_fallthru: Basic Blocks. (line 67) +* 'casesi' instruction pattern: Standard Names. (line 1241) +* CASE_VECTOR_MODE: Misc. (line 26) +* CASE_VECTOR_PC_RELATIVE: Misc. (line 39) +* CASE_VECTOR_SHORTEN_MODE: Misc. (line 30) +* 'cbranchMODE4' instruction pattern: Standard Names. (line 1109) +* cc0: Regs and Memory. (line 303) +* cc0 <1>: CC0 Condition Codes. + (line 6) +* 'cc0', RTL sharing: Sharing. (line 27) +* cc0_rtx: Regs and Memory. (line 329) +* CC1PLUS_SPEC: Driver. (line 63) +* CC1_SPEC: Driver. (line 55) +* CCmode: Machine Modes. (line 178) +* CCmode <1>: MODE_CC Condition Codes. + (line 6) +* cc_status: CC0 Condition Codes. + (line 6) +* CC_STATUS_MDEP: CC0 Condition Codes. + (line 16) +* CC_STATUS_MDEP_INIT: CC0 Condition Codes. + (line 22) +* CDImode: Machine Modes. (line 204) +* 'ceilM2' instruction pattern: Standard Names. (line 658) +* CEIL_DIV_EXPR: Unary and Binary Expressions. + (line 6) +* CEIL_MOD_EXPR: Unary and Binary Expressions. + (line 6) +* CFA_FRAME_BASE_OFFSET: Frame Layout. (line 224) +* CFG verification: Maintaining the CFG. + (line 117) +* CFG, Control Flow Graph: Control Flow. (line 6) +* cfghooks.h: Maintaining the CFG. + (line 6) +* cgraph_finalize_function: Parsing pass. (line 51) +* chain_circular: GTY Options. (line 209) +* chain_next: GTY Options. (line 209) +* chain_prev: GTY Options. (line 209) +* change_address: Standard Names. (line 47) +* CHAR_TYPE_SIZE: Type Layout. (line 38) +* 'check_stack' instruction pattern: Standard Names. (line 1395) +* CHImode: Machine Modes. (line 204) +* CILK_PLUS: Cilk Plus Transformation. + (line 6) +* class definitions, register: Register Classes. (line 6) +* class preference constraints: Class Preferences. (line 6) +* class, scope: Classes. (line 6) +* classes of RTX codes: RTL Classes. (line 6) +* CLASSTYPE_DECLARED_CLASS: Classes. (line 6) +* CLASSTYPE_HAS_MUTABLE: Classes. (line 85) +* CLASSTYPE_NON_POD_P: Classes. (line 90) +* CLASS_MAX_NREGS: Register Classes. (line 521) +* CLASS_TYPE_P: Types for C++. (line 63) +* Cleanups: Cleanups. (line 6) +* CLEANUP_DECL: Statements for C++. (line 6) +* CLEANUP_EXPR: Statements for C++. (line 6) +* CLEANUP_POINT_EXPR: Unary and Binary Expressions. + (line 6) +* CLEANUP_STMT: Statements for C++. (line 6) +* CLEAR_BY_PIECES_P: Costs. (line 187) +* 'clear_cache' instruction pattern: Standard Names. (line 1900) +* CLEAR_INSN_CACHE: Trampolines. (line 98) +* CLEAR_RATIO: Costs. (line 175) +* clobber: Side Effects. (line 106) +* clrsb: Arithmetic. (line 216) +* clz: Arithmetic. (line 223) +* 'clzM2' instruction pattern: Standard Names. (line 723) +* CLZ_DEFINED_VALUE_AT_ZERO: Misc. (line 304) +* 'cmpmemM' instruction pattern: Standard Names. (line 863) +* 'cmpstrM' instruction pattern: Standard Names. (line 842) +* 'cmpstrnM' instruction pattern: Standard Names. (line 829) +* code generation RTL sequences: Expander Definitions. + (line 6) +* code iterators in '.md' files: Code Iterators. (line 6) +* codes, RTL expression: RTL Objects. (line 47) +* code_label: Insns. (line 125) +* CODE_LABEL: Basic Blocks. (line 50) +* 'code_label' and '/i': Flags. (line 59) +* 'code_label' and '/v': Flags. (line 44) +* CODE_LABEL_NUMBER: Insns. (line 125) +* COImode: Machine Modes. (line 204) +* COLLECT2_HOST_INITIALIZATION: Host Misc. (line 32) +* COLLECT_EXPORT_LIST: Misc. (line 791) +* COLLECT_SHARED_FINI_FUNC: Macros for Initialization. + (line 43) +* COLLECT_SHARED_INIT_FUNC: Macros for Initialization. + (line 32) +* commit_edge_insertions: Maintaining the CFG. + (line 105) +* compare: Arithmetic. (line 46) +* 'compare', canonicalization of: Insn Canonicalizations. + (line 36) +* comparison_operator: Machine-Independent Predicates. + (line 110) +* compiler passes and files: Passes. (line 6) +* complement, bitwise: Arithmetic. (line 155) +* COMPLEX_CST: Constant expressions. + (line 6) +* COMPLEX_EXPR: Unary and Binary Expressions. + (line 6) +* COMPLEX_TYPE: Types. (line 6) +* COMPONENT_REF: Storage References. (line 6) +* Compound Expressions: Compound Expressions. + (line 6) +* Compound Lvalues: Compound Lvalues. (line 6) +* COMPOUND_EXPR: Unary and Binary Expressions. + (line 6) +* COMPOUND_LITERAL_EXPR: Unary and Binary Expressions. + (line 6) +* COMPOUND_LITERAL_EXPR_DECL: Unary and Binary Expressions. + (line 377) +* COMPOUND_LITERAL_EXPR_DECL_EXPR: Unary and Binary Expressions. + (line 377) +* computed jump: Edges. (line 127) +* computing the length of an insn: Insn Lengths. (line 6) +* concat: Regs and Memory. (line 381) +* concatn: Regs and Memory. (line 387) +* cond: Comparisons. (line 90) +* 'cond' and attributes: Expressions. (line 37) +* condition code register: Regs and Memory. (line 303) +* condition code status: Condition Code. (line 6) +* condition codes: Comparisons. (line 20) +* conditional execution: Conditional Execution. + (line 6) +* Conditional Expressions: Conditional Expressions. + (line 6) +* conditions, in patterns: Patterns. (line 43) +* cond_exec: Side Effects. (line 253) +* COND_EXPR: Unary and Binary Expressions. + (line 6) +* configuration file: Filesystem. (line 6) +* configuration file <1>: Host Misc. (line 6) +* configure terms: Configure Terms. (line 6) +* CONJ_EXPR: Unary and Binary Expressions. + (line 6) +* const: Constants. (line 109) +* const0_rtx: Constants. (line 21) +* CONST0_RTX: Constants. (line 129) +* const1_rtx: Constants. (line 21) +* CONST1_RTX: Constants. (line 129) +* const2_rtx: Constants. (line 21) +* CONST2_RTX: Constants. (line 129) +* constant attributes: Constant Attributes. + (line 6) +* constant definitions: Constant Definitions. + (line 6) +* constants in constraints: Simple Constraints. (line 68) +* CONSTANT_ADDRESS_P: Addressing Modes. (line 28) +* CONSTANT_ALIGNMENT: Storage Layout. (line 236) +* CONSTANT_P: Addressing Modes. (line 35) +* CONSTANT_POOL_ADDRESS_P: Flags. (line 10) +* CONSTANT_POOL_BEFORE_FUNCTION: Data Output. (line 64) +* constm1_rtx: Constants. (line 21) +* constraint modifier characters: Modifiers. (line 6) +* constraint, matching: Simple Constraints. (line 140) +* constraints: Constraints. (line 6) +* constraints, defining: Define Constraints. (line 6) +* constraints, defining, obsolete method: Old Constraints. (line 6) +* constraints, machine specific: Machine Constraints. + (line 6) +* constraints, testing: C Constraint Interface. + (line 6) +* CONSTRAINT_LEN: Old Constraints. (line 11) +* constraint_num: C Constraint Interface. + (line 37) +* constraint_satisfied_p: C Constraint Interface. + (line 52) +* CONSTRUCTOR: Unary and Binary Expressions. + (line 6) +* constructors, automatic calls: Collect2. (line 15) +* constructors, output of: Initialization. (line 6) +* CONST_DECL: Declarations. (line 6) +* const_double: Constants. (line 37) +* 'const_double', RTL sharing: Sharing. (line 29) +* CONST_DOUBLE_LOW: Constants. (line 49) +* CONST_DOUBLE_OK_FOR_CONSTRAINT_P: Old Constraints. (line 66) +* CONST_DOUBLE_OK_FOR_LETTER_P: Old Constraints. (line 51) +* const_double_operand: Machine-Independent Predicates. + (line 20) +* const_fixed: Constants. (line 62) +* const_int: Constants. (line 8) +* 'const_int' and attribute tests: Expressions. (line 47) +* 'const_int' and attributes: Expressions. (line 10) +* 'const_int', RTL sharing: Sharing. (line 23) +* const_int_operand: Machine-Independent Predicates. + (line 15) +* CONST_OK_FOR_CONSTRAINT_P: Old Constraints. (line 46) +* CONST_OK_FOR_LETTER_P: Old Constraints. (line 38) +* const_string: Constants. (line 81) +* 'const_string' and attributes: Expressions. (line 20) +* const_true_rtx: Constants. (line 31) +* const_vector: Constants. (line 69) +* 'const_vector', RTL sharing: Sharing. (line 32) +* container: Containers. (line 6) +* CONTINUE_STMT: Statements for C++. (line 6) +* contributors: Contributors. (line 6) +* controlling register usage: Register Basics. (line 73) +* controlling the compilation driver: Driver. (line 6) +* conventions, run-time: Interface. (line 6) +* conversions: Conversions. (line 6) +* CONVERT_EXPR: Unary and Binary Expressions. + (line 6) +* 'copysignM3' instruction pattern: Standard Names. (line 704) +* copy_rtx: Addressing Modes. (line 189) +* copy_rtx_if_shared: Sharing. (line 64) +* 'cosM2' instruction pattern: Standard Names. (line 570) +* costs of instructions: Costs. (line 6) +* CPLUSPLUS_CPP_SPEC: Driver. (line 50) +* CPP_SPEC: Driver. (line 43) +* CP_INTEGRAL_TYPE: Types for C++. (line 55) +* cp_namespace_decls: Namespaces. (line 49) +* CP_TYPE_CONST_NON_VOLATILE_P: Types for C++. (line 33) +* CP_TYPE_CONST_P: Types for C++. (line 24) +* cp_type_quals: Types for C++. (line 6) +* cp_type_quals <1>: Types for C++. (line 16) +* CP_TYPE_RESTRICT_P: Types for C++. (line 30) +* CP_TYPE_VOLATILE_P: Types for C++. (line 27) +* CQImode: Machine Modes. (line 204) +* cross compilation and floating point: Floating Point. (line 6) +* crtl->args.pops_args: Function Entry. (line 104) +* crtl->args.pretend_args_size: Function Entry. (line 110) +* crtl->outgoing_args_size: Stack Arguments. (line 48) +* CRTSTUFF_T_CFLAGS: Target Fragment. (line 15) +* CRTSTUFF_T_CFLAGS_S: Target Fragment. (line 19) +* CRT_CALL_STATIC_FUNCTION: Sections. (line 120) +* CSImode: Machine Modes. (line 204) +* 'cstoreMODE4' instruction pattern: Standard Names. (line 1070) +* CTImode: Machine Modes. (line 204) +* 'ctrapMM4' instruction pattern: Standard Names. (line 1547) +* ctz: Arithmetic. (line 231) +* 'ctzM2' instruction pattern: Standard Names. (line 732) +* CTZ_DEFINED_VALUE_AT_ZERO: Misc. (line 305) +* CUMULATIVE_ARGS: Register Arguments. (line 126) +* current_function_is_leaf: Leaf Functions. (line 50) +* current_function_uses_only_leaf_regs: Leaf Functions. (line 50) +* current_insn_predicate: Conditional Execution. + (line 27) +* C_COMMON_OVERRIDE_OPTIONS: Run-time Target. (line 136) +* c_register_pragma: Misc. (line 407) +* c_register_pragma_with_expansion: Misc. (line 409) +* DAmode: Machine Modes. (line 154) +* data bypass: Processor pipeline description. + (line 105) +* data bypass <1>: Processor pipeline description. + (line 196) +* data dependence delays: Processor pipeline description. + (line 6) +* Data Dependency Analysis: Dependency analysis. + (line 6) +* data structures: Per-Function Data. (line 6) +* DATA_ABI_ALIGNMENT: Storage Layout. (line 228) +* DATA_ALIGNMENT: Storage Layout. (line 215) +* DATA_SECTION_ASM_OP: Sections. (line 52) +* DBR_OUTPUT_SEQEND: Instruction Output. (line 133) +* dbr_sequence_length: Instruction Output. (line 133) +* DBX_BLOCKS_FUNCTION_RELATIVE: DBX Options. (line 100) +* DBX_CONTIN_CHAR: DBX Options. (line 63) +* DBX_CONTIN_LENGTH: DBX Options. (line 53) +* DBX_DEBUGGING_INFO: DBX Options. (line 8) +* DBX_FUNCTION_FIRST: DBX Options. (line 94) +* DBX_LINES_FUNCTION_RELATIVE: DBX Options. (line 106) +* DBX_NO_XREFS: DBX Options. (line 47) +* DBX_OUTPUT_MAIN_SOURCE_FILENAME: File Names and DBX. (line 8) +* DBX_OUTPUT_MAIN_SOURCE_FILE_END: File Names and DBX. (line 33) +* DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END: File Names and DBX. + (line 41) +* DBX_OUTPUT_SOURCE_LINE: DBX Hooks. (line 8) +* DBX_REGISTER_NUMBER: All Debuggers. (line 8) +* DBX_REGPARM_STABS_CODE: DBX Options. (line 84) +* DBX_REGPARM_STABS_LETTER: DBX Options. (line 89) +* DBX_STATIC_CONST_VAR_CODE: DBX Options. (line 79) +* DBX_STATIC_STAB_DATA_SECTION: DBX Options. (line 70) +* DBX_TYPE_DECL_STABS_CODE: DBX Options. (line 75) +* DBX_USE_BINCL: DBX Options. (line 112) +* DCmode: Machine Modes. (line 199) +* DDmode: Machine Modes. (line 93) +* De Morgan's law: Insn Canonicalizations. + (line 51) +* dead_or_set_p: define_peephole. (line 65) +* DEBUGGER_ARG_OFFSET: All Debuggers. (line 36) +* DEBUGGER_AUTO_OFFSET: All Debuggers. (line 27) +* debug_expr: Debug Information. (line 22) +* DEBUG_EXPR_DECL: Declarations. (line 6) +* debug_insn: Insns. (line 236) +* DEBUG_SYMS_TEXT: DBX Options. (line 24) +* decimal float library: Decimal float library routines. + (line 6) +* declaration: Declarations. (line 6) +* declarations, RTL: RTL Declarations. (line 6) +* DECLARE_LIBRARY_RENAMES: Library Calls. (line 8) +* DECL_ALIGN: Declarations. (line 6) +* DECL_ANTICIPATED: Functions for C++. (line 42) +* DECL_ARGUMENTS: Function Basics. (line 36) +* DECL_ARRAY_DELETE_OPERATOR_P: Functions for C++. (line 158) +* DECL_ARTIFICIAL: Working with declarations. + (line 24) +* DECL_ARTIFICIAL <1>: Function Basics. (line 6) +* DECL_ARTIFICIAL <2>: Function Properties. + (line 47) +* DECL_ASSEMBLER_NAME: Function Basics. (line 6) +* DECL_ASSEMBLER_NAME <1>: Function Basics. (line 19) +* DECL_ATTRIBUTES: Attributes. (line 21) +* DECL_BASE_CONSTRUCTOR_P: Functions for C++. (line 88) +* DECL_COMPLETE_CONSTRUCTOR_P: Functions for C++. (line 84) +* DECL_COMPLETE_DESTRUCTOR_P: Functions for C++. (line 98) +* DECL_CONSTRUCTOR_P: Functions for C++. (line 77) +* DECL_CONST_MEMFUNC_P: Functions for C++. (line 71) +* DECL_CONTEXT: Namespaces. (line 31) +* DECL_CONV_FN_P: Functions for C++. (line 105) +* DECL_COPY_CONSTRUCTOR_P: Functions for C++. (line 92) +* DECL_DESTRUCTOR_P: Functions for C++. (line 95) +* DECL_EXTERNAL: Declarations. (line 6) +* DECL_EXTERNAL <1>: Function Properties. + (line 25) +* DECL_EXTERN_C_FUNCTION_P: Functions for C++. (line 46) +* DECL_FUNCTION_MEMBER_P: Functions for C++. (line 61) +* DECL_FUNCTION_SPECIFIC_OPTIMIZATION: Function Basics. (line 6) +* DECL_FUNCTION_SPECIFIC_OPTIMIZATION <1>: Function Properties. + (line 61) +* DECL_FUNCTION_SPECIFIC_TARGET: Function Basics. (line 6) +* DECL_FUNCTION_SPECIFIC_TARGET <1>: Function Properties. + (line 55) +* DECL_GLOBAL_CTOR_P: Functions for C++. (line 108) +* DECL_GLOBAL_DTOR_P: Functions for C++. (line 112) +* DECL_INITIAL: Declarations. (line 6) +* DECL_INITIAL <1>: Function Basics. (line 51) +* DECL_LINKONCE_P: Functions for C++. (line 50) +* DECL_LOCAL_FUNCTION_P: Functions for C++. (line 38) +* DECL_MAIN_P: Functions for C++. (line 34) +* DECL_NAME: Working with declarations. + (line 7) +* DECL_NAME <1>: Function Basics. (line 6) +* DECL_NAME <2>: Function Basics. (line 9) +* DECL_NAME <3>: Namespaces. (line 20) +* DECL_NAMESPACE_ALIAS: Namespaces. (line 35) +* DECL_NAMESPACE_STD_P: Namespaces. (line 45) +* DECL_NONCONVERTING_P: Functions for C++. (line 80) +* DECL_NONSTATIC_MEMBER_FUNCTION_P: Functions for C++. (line 68) +* DECL_NON_THUNK_FUNCTION_P: Functions for C++. (line 138) +* DECL_OVERLOADED_OPERATOR_P: Functions for C++. (line 102) +* DECL_PURE_P: Function Properties. + (line 40) +* DECL_RESULT: Function Basics. (line 41) +* DECL_SAVED_TREE: Function Basics. (line 44) +* DECL_SIZE: Declarations. (line 6) +* DECL_STATIC_FUNCTION_P: Functions for C++. (line 65) +* DECL_STMT: Statements for C++. (line 6) +* DECL_STMT_DECL: Statements for C++. (line 6) +* DECL_THUNK_P: Functions for C++. (line 116) +* DECL_VIRTUAL_P: Function Properties. + (line 44) +* DECL_VOLATILE_MEMFUNC_P: Functions for C++. (line 74) +* 'decrement_and_branch_until_zero' instruction pattern: Standard Names. + (line 1278) +* default: GTY Options. (line 82) +* default_file_start: File Framework. (line 8) +* DEFAULT_GDB_EXTENSIONS: DBX Options. (line 17) +* DEFAULT_PCC_STRUCT_RETURN: Aggregate Return. (line 34) +* DEFAULT_SIGNED_CHAR: Type Layout. (line 160) +* define_address_constraint: Define Constraints. (line 99) +* define_asm_attributes: Tagging Insns. (line 73) +* define_attr: Defining Attributes. + (line 6) +* define_automaton: Processor pipeline description. + (line 53) +* define_bypass: Processor pipeline description. + (line 196) +* define_code_attr: Code Iterators. (line 6) +* define_code_iterator: Code Iterators. (line 6) +* define_cond_exec: Conditional Execution. + (line 13) +* define_constants: Constant Definitions. + (line 6) +* define_constraint: Define Constraints. (line 45) +* define_cpu_unit: Processor pipeline description. + (line 68) +* define_c_enum: Constant Definitions. + (line 49) +* define_delay: Delay Slots. (line 25) +* define_enum: Constant Definitions. + (line 118) +* define_enum_attr: Defining Attributes. + (line 83) +* define_enum_attr <1>: Constant Definitions. + (line 136) +* define_expand: Expander Definitions. + (line 11) +* define_insn: Patterns. (line 6) +* 'define_insn' example: Example. (line 6) +* define_insn_and_split: Insn Splitting. (line 170) +* define_insn_reservation: Processor pipeline description. + (line 105) +* define_int_attr: Int Iterators. (line 6) +* define_int_iterator: Int Iterators. (line 6) +* define_memory_constraint: Define Constraints. (line 80) +* define_mode_attr: Substitutions. (line 6) +* define_mode_iterator: Defining Mode Iterators. + (line 6) +* define_peephole: define_peephole. (line 6) +* define_peephole2: define_peephole2. (line 6) +* define_predicate: Defining Predicates. + (line 6) +* define_query_cpu_unit: Processor pipeline description. + (line 90) +* define_register_constraint: Define Constraints. (line 26) +* define_reservation: Processor pipeline description. + (line 185) +* define_special_predicate: Defining Predicates. + (line 6) +* define_split: Insn Splitting. (line 32) +* define_subst: Define Subst. (line 6) +* define_subst <1>: Define Subst Example. + (line 6) +* define_subst <2>: Define Subst Pattern Matching. + (line 6) +* define_subst <3>: Define Subst Output Template. + (line 6) +* define_subst <4>: Define Subst. (line 14) +* define_subst <5>: Subst Iterators. (line 6) +* define_subst_attr: Subst Iterators. (line 6) +* define_subst_attr <1>: Subst Iterators. (line 26) +* defining attributes and their values: Defining Attributes. + (line 6) +* defining constraints: Define Constraints. (line 6) +* defining constraints, obsolete method: Old Constraints. (line 6) +* defining jump instruction patterns: Jump Patterns. (line 6) +* defining looping instruction patterns: Looping Patterns. (line 6) +* defining peephole optimizers: Peephole Definitions. + (line 6) +* defining predicates: Defining Predicates. + (line 6) +* defining RTL sequences for code generation: Expander Definitions. + (line 6) +* delay slots, defining: Delay Slots. (line 6) +* deletable: GTY Options. (line 158) +* DELETE_IF_ORDINARY: Filesystem. (line 79) +* Dependent Patterns: Dependent Patterns. (line 6) +* desc: GTY Options. (line 82) +* destructors, output of: Initialization. (line 6) +* deterministic finite state automaton: Processor pipeline description. + (line 6) +* deterministic finite state automaton <1>: Processor pipeline description. + (line 304) +* DFmode: Machine Modes. (line 76) +* DF_SIZE: Type Layout. (line 136) +* digits in constraint: Simple Constraints. (line 128) +* DImode: Machine Modes. (line 45) +* directory options .md: Including Patterns. (line 45) +* DIR_SEPARATOR: Filesystem. (line 18) +* DIR_SEPARATOR_2: Filesystem. (line 19) +* disabling certain registers: Register Basics. (line 73) +* dispatch table: Dispatch Tables. (line 8) +* div: Arithmetic. (line 117) +* 'div' and attributes: Expressions. (line 83) +* division: Arithmetic. (line 117) +* division <1>: Arithmetic. (line 131) +* division <2>: Arithmetic. (line 137) +* 'divM3' instruction pattern: Standard Names. (line 276) +* 'divmodM4' instruction pattern: Standard Names. (line 496) +* DOLLARS_IN_IDENTIFIERS: Misc. (line 452) +* 'doloop_begin' instruction pattern: Standard Names. (line 1300) +* 'doloop_end' instruction pattern: Standard Names. (line 1288) +* DONE: Expander Definitions. + (line 77) +* DONT_USE_BUILTIN_SETJMP: Exception Region Output. + (line 77) +* DOUBLE_TYPE_SIZE: Type Layout. (line 52) +* DO_BODY: Statements for C++. (line 6) +* DO_COND: Statements for C++. (line 6) +* DO_STMT: Statements for C++. (line 6) +* DQmode: Machine Modes. (line 118) +* driver: Driver. (line 6) +* DRIVER_SELF_SPECS: Driver. (line 8) +* dump examples: Dump examples. (line 6) +* dump setup: Dump setup. (line 6) +* dump types: Dump types. (line 6) +* dump verbosity: Dump output verbosity. + (line 6) +* DUMPFILE_FORMAT: Filesystem. (line 67) +* dump_basic_block: Dump types. (line 29) +* dump_generic_expr: Dump types. (line 31) +* dump_gimple_stmt: Dump types. (line 33) +* dump_printf: Dump types. (line 6) +* DWARF2_ASM_LINE_DEBUG_INFO: SDB and DWARF. (line 49) +* DWARF2_DEBUGGING_INFO: SDB and DWARF. (line 12) +* DWARF2_FRAME_INFO: SDB and DWARF. (line 29) +* DWARF2_FRAME_REG_OUT: Frame Registers. (line 151) +* DWARF2_UNWIND_INFO: Exception Region Output. + (line 38) +* DWARF_ALT_FRAME_RETURN_COLUMN: Frame Layout. (line 150) +* DWARF_CIE_DATA_ALIGNMENT: Exception Region Output. + (line 89) +* DWARF_FRAME_REGISTERS: Frame Registers. (line 109) +* DWARF_FRAME_REGNUM: Frame Registers. (line 143) +* DWARF_REG_TO_UNWIND_COLUMN: Frame Registers. (line 134) +* DWARF_ZERO_REG: Frame Layout. (line 161) +* DYNAMIC_CHAIN_ADDRESS: Frame Layout. (line 90) +* 'E' in constraint: Simple Constraints. (line 87) +* earlyclobber operand: Modifiers. (line 25) +* edge: Edges. (line 6) +* edge in the flow graph: Edges. (line 6) +* edge iterators: Edges. (line 15) +* edge splitting: Maintaining the CFG. + (line 105) +* EDGE_ABNORMAL: Edges. (line 127) +* EDGE_ABNORMAL, EDGE_ABNORMAL_CALL: Edges. (line 171) +* EDGE_ABNORMAL, EDGE_EH: Edges. (line 95) +* EDGE_ABNORMAL, EDGE_SIBCALL: Edges. (line 121) +* EDGE_FALLTHRU, force_nonfallthru: Edges. (line 85) +* 'EDOM', implicit usage: Library Calls. (line 59) +* EH_FRAME_IN_DATA_SECTION: Exception Region Output. + (line 19) +* EH_FRAME_SECTION_NAME: Exception Region Output. + (line 9) +* 'eh_return' instruction pattern: Standard Names. (line 1481) +* EH_RETURN_DATA_REGNO: Exception Handling. (line 6) +* EH_RETURN_HANDLER_RTX: Exception Handling. (line 38) +* EH_RETURN_STACKADJ_RTX: Exception Handling. (line 21) +* EH_TABLES_CAN_BE_READ_ONLY: Exception Region Output. + (line 28) +* EH_USES: Function Entry. (line 155) +* ei_edge: Edges. (line 43) +* ei_end_p: Edges. (line 27) +* ei_last: Edges. (line 23) +* ei_next: Edges. (line 35) +* ei_one_before_end_p: Edges. (line 31) +* ei_prev: Edges. (line 39) +* ei_safe_safe: Edges. (line 47) +* ei_start: Edges. (line 19) +* ELIMINABLE_REGS: Elimination. (line 46) +* ELSE_CLAUSE: Statements for C++. (line 6) +* Embedded C: Fixed-point fractional library routines. + (line 6) +* EMIT_MODE_SET: Mode Switching. (line 74) +* Empty Statements: Empty Statements. (line 6) +* EMPTY_CLASS_EXPR: Statements for C++. (line 6) +* EMPTY_FIELD_BOUNDARY: Storage Layout. (line 306) +* Emulated TLS: Emulated TLS. (line 6) +* enabled: Disable Insn Alternatives. + (line 6) +* ENDFILE_SPEC: Driver. (line 155) +* endianness: Portability. (line 20) +* ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR: Basic Blocks. (line 10) +* enum machine_mode: Machine Modes. (line 6) +* enum reg_class: Register Classes. (line 70) +* ENUMERAL_TYPE: Types. (line 6) +* enumerations: Constant Definitions. + (line 49) +* epilogue: Function Entry. (line 6) +* 'epilogue' instruction pattern: Standard Names. (line 1519) +* EPILOGUE_USES: Function Entry. (line 149) +* eq: Comparisons. (line 52) +* 'eq' and attributes: Expressions. (line 83) +* equal: Comparisons. (line 52) +* eq_attr: Expressions. (line 104) +* EQ_EXPR: Unary and Binary Expressions. + (line 6) +* 'errno', implicit usage: Library Calls. (line 71) +* EXACT_DIV_EXPR: Unary and Binary Expressions. + (line 6) +* examining SSA_NAMEs: SSA. (line 214) +* exception handling: Edges. (line 95) +* exception handling <1>: Exception Handling. (line 6) +* 'exception_receiver' instruction pattern: Standard Names. (line 1446) +* exclamation point: Multi-Alternative. (line 47) +* exclusion_set: Processor pipeline description. + (line 223) +* exclusive-or, bitwise: Arithmetic. (line 169) +* EXIT_EXPR: Unary and Binary Expressions. + (line 6) +* EXIT_IGNORE_STACK: Function Entry. (line 137) +* expander definitions: Expander Definitions. + (line 6) +* 'expM2' instruction pattern: Standard Names. (line 599) +* expression: Expression trees. (line 6) +* expression codes: RTL Objects. (line 47) +* EXPR_FILENAME: Working with declarations. + (line 14) +* EXPR_LINENO: Working with declarations. + (line 20) +* expr_list: Insns. (line 540) +* EXPR_STMT: Statements for C++. (line 6) +* EXPR_STMT_EXPR: Statements for C++. (line 6) +* 'extendMN2' instruction pattern: Standard Names. (line 921) +* extensible constraints: Simple Constraints. (line 171) +* EXTRA_ADDRESS_CONSTRAINT: Old Constraints. (line 120) +* EXTRA_CONSTRAINT: Old Constraints. (line 71) +* EXTRA_CONSTRAINT_STR: Old Constraints. (line 92) +* EXTRA_MEMORY_CONSTRAINT: Old Constraints. (line 97) +* EXTRA_SPECS: Driver. (line 182) +* 'extv' instruction pattern: Standard Names. (line 1012) +* 'extvM' instruction pattern: Standard Names. (line 957) +* 'extvmisalignM' instruction pattern: Standard Names. (line 967) +* 'extzv' instruction pattern: Standard Names. (line 1030) +* 'extzvM' instruction pattern: Standard Names. (line 981) +* 'extzvmisalignM' instruction pattern: Standard Names. (line 984) +* 'F' in constraint: Simple Constraints. (line 92) +* FAIL: Expander Definitions. + (line 83) +* fall-thru: Edges. (line 68) +* FATAL_EXIT_CODE: Host Misc. (line 6) +* FDL, GNU Free Documentation License: GNU Free Documentation License. + (line 6) +* features, optional, in system conventions: Run-time Target. + (line 59) +* ffs: Arithmetic. (line 211) +* 'ffsM2' instruction pattern: Standard Names. (line 713) +* FIELD_DECL: Declarations. (line 6) +* files and passes of the compiler: Passes. (line 6) +* files, generated: Files. (line 6) +* file_end_indicate_exec_stack: File Framework. (line 39) +* final_absence_set: Processor pipeline description. + (line 223) +* FINAL_PRESCAN_INSN: Instruction Output. (line 60) +* final_presence_set: Processor pipeline description. + (line 223) +* final_sequence: Instruction Output. (line 144) +* FIND_BASE_TERM: Addressing Modes. (line 117) +* finite state automaton minimization: Processor pipeline description. + (line 304) +* FINI_ARRAY_SECTION_ASM_OP: Sections. (line 113) +* FINI_SECTION_ASM_OP: Sections. (line 98) +* FIRST_PARM_OFFSET: Frame Layout. (line 65) +* 'FIRST_PARM_OFFSET' and virtual registers: Regs and Memory. + (line 65) +* FIRST_PSEUDO_REGISTER: Register Basics. (line 8) +* FIRST_STACK_REG: Stack Registers. (line 26) +* FIRST_VIRTUAL_REGISTER: Regs and Memory. (line 51) +* fix: Conversions. (line 66) +* fixed register: Register Basics. (line 15) +* fixed-point fractional library: Fixed-point fractional library routines. + (line 6) +* FIXED_CONVERT_EXPR: Unary and Binary Expressions. + (line 6) +* FIXED_CST: Constant expressions. + (line 6) +* FIXED_POINT_TYPE: Types. (line 6) +* FIXED_REGISTERS: Register Basics. (line 14) +* fixed_regs: Register Basics. (line 59) +* 'fixMN2' instruction pattern: Standard Names. (line 888) +* 'fixunsMN2' instruction pattern: Standard Names. (line 897) +* 'fixuns_truncMN2' instruction pattern: Standard Names. (line 912) +* 'fix_truncMN2' instruction pattern: Standard Names. (line 908) +* FIX_TRUNC_EXPR: Unary and Binary Expressions. + (line 6) +* flags in RTL expression: Flags. (line 6) +* float: Conversions. (line 58) +* floating point and cross compilation: Floating Point. (line 6) +* 'floatMN2' instruction pattern: Standard Names. (line 880) +* 'floatunsMN2' instruction pattern: Standard Names. (line 884) +* FLOAT_EXPR: Unary and Binary Expressions. + (line 6) +* float_extend: Conversions. (line 33) +* FLOAT_LIB_COMPARE_RETURNS_BOOL: Library Calls. (line 32) +* FLOAT_STORE_FLAG_VALUE: Misc. (line 286) +* float_truncate: Conversions. (line 53) +* FLOAT_TYPE_SIZE: Type Layout. (line 48) +* FLOAT_WORDS_BIG_ENDIAN: Storage Layout. (line 41) +* 'FLOAT_WORDS_BIG_ENDIAN', (lack of) effect on 'subreg': Regs and Memory. + (line 224) +* 'floorM2' instruction pattern: Standard Names. (line 634) +* FLOOR_DIV_EXPR: Unary and Binary Expressions. + (line 6) +* FLOOR_MOD_EXPR: Unary and Binary Expressions. + (line 6) +* flow-insensitive alias analysis: Alias analysis. (line 6) +* flow-sensitive alias analysis: Alias analysis. (line 6) +* fma: Arithmetic. (line 112) +* 'fmaM4' instruction pattern: Standard Names. (line 286) +* 'fmodM3' instruction pattern: Standard Names. (line 552) +* 'fmsM4' instruction pattern: Standard Names. (line 293) +* 'fnmaM4' instruction pattern: Standard Names. (line 299) +* 'fnmsM4' instruction pattern: Standard Names. (line 305) +* FORCE_CODE_SECTION_ALIGN: Sections. (line 144) +* force_reg: Standard Names. (line 36) +* FOR_BODY: Statements for C++. (line 6) +* FOR_COND: Statements for C++. (line 6) +* FOR_EXPR: Statements for C++. (line 6) +* FOR_INIT_STMT: Statements for C++. (line 6) +* FOR_STMT: Statements for C++. (line 6) +* fractional types: Fixed-point fractional library routines. + (line 6) +* 'fractMN2' instruction pattern: Standard Names. (line 930) +* 'fractunsMN2' instruction pattern: Standard Names. (line 945) +* fract_convert: Conversions. (line 82) +* FRACT_TYPE_SIZE: Type Layout. (line 67) +* frame layout: Frame Layout. (line 6) +* FRAME_ADDR_RTX: Frame Layout. (line 114) +* FRAME_GROWS_DOWNWARD: Frame Layout. (line 30) +* 'FRAME_GROWS_DOWNWARD' and virtual registers: Regs and Memory. + (line 69) +* FRAME_POINTER_CFA_OFFSET: Frame Layout. (line 210) +* frame_pointer_needed: Function Entry. (line 34) +* FRAME_POINTER_REGNUM: Frame Registers. (line 13) +* 'FRAME_POINTER_REGNUM' and virtual registers: Regs and Memory. + (line 74) +* frame_pointer_rtx: Frame Registers. (line 104) +* frame_related: Flags. (line 229) +* 'frame_related', in 'insn', 'call_insn', 'jump_insn', 'barrier', and 'set': Flags. + (line 107) +* 'frame_related', in 'mem': Flags. (line 85) +* 'frame_related', in 'reg': Flags. (line 94) +* 'frame_related', in 'symbol_ref': Flags. (line 165) +* frequency, count, BB_FREQ_BASE: Profile information. + (line 30) +* 'ftruncM2' instruction pattern: Standard Names. (line 903) +* function: Functions. (line 6) +* function <1>: Functions for C++. (line 6) +* function call conventions: Interface. (line 6) +* function entry and exit: Function Entry. (line 6) +* function entry point, alternate function entry point: Edges. + (line 180) +* function properties: Function Properties. + (line 6) +* function-call insns: Calls. (line 6) +* functions, leaf: Leaf Functions. (line 6) +* FUNCTION_ARG_OFFSET: Register Arguments. (line 196) +* FUNCTION_ARG_PADDING: Register Arguments. (line 203) +* FUNCTION_ARG_REGNO_P: Register Arguments. (line 251) +* FUNCTION_BOUNDARY: Storage Layout. (line 159) +* FUNCTION_DECL: Functions. (line 6) +* FUNCTION_DECL <1>: Functions for C++. (line 6) +* FUNCTION_MODE: Misc. (line 341) +* FUNCTION_PROFILER: Profiling. (line 8) +* FUNCTION_TYPE: Types. (line 6) +* FUNCTION_VALUE: Scalar Return. (line 52) +* FUNCTION_VALUE_REGNO_P: Scalar Return. (line 78) +* fundamental type: Types. (line 6) +* 'G' in constraint: Simple Constraints. (line 96) +* 'g' in constraint: Simple Constraints. (line 118) +* garbage collector, invocation: Invoking the garbage collector. + (line 6) +* garbage collector, troubleshooting: Troubleshooting. (line 6) +* GCC and portability: Portability. (line 6) +* GCC_DRIVER_HOST_INITIALIZATION: Host Misc. (line 36) +* gcov_type: Profile information. + (line 41) +* ge: Comparisons. (line 72) +* 'ge' and attributes: Expressions. (line 83) +* gencodes: RTL passes. (line 18) +* general_operand: Machine-Independent Predicates. + (line 104) +* GENERAL_REGS: Register Classes. (line 22) +* generated files: Files. (line 6) +* generating assembler output: Output Statement. (line 6) +* generating insns: RTL Template. (line 6) +* GENERIC: Parsing pass. (line 6) +* GENERIC <1>: GENERIC. (line 6) +* generic predicates: Machine-Independent Predicates. + (line 6) +* genflags: RTL passes. (line 18) +* GEN_ERRNO_RTX: Library Calls. (line 71) +* get_attr: Expressions. (line 99) +* get_attr_length: Insn Lengths. (line 46) +* GET_CLASS_NARROWEST_MODE: Machine Modes. (line 335) +* GET_CODE: RTL Objects. (line 47) +* get_frame_size: Elimination. (line 34) +* get_insns: Insns. (line 34) +* get_last_insn: Insns. (line 34) +* GET_MODE: Machine Modes. (line 282) +* GET_MODE_ALIGNMENT: Machine Modes. (line 322) +* GET_MODE_BITSIZE: Machine Modes. (line 306) +* GET_MODE_CLASS: Machine Modes. (line 296) +* GET_MODE_FBIT: Machine Modes. (line 313) +* GET_MODE_IBIT: Machine Modes. (line 309) +* GET_MODE_MASK: Machine Modes. (line 317) +* GET_MODE_NAME: Machine Modes. (line 293) +* GET_MODE_NUNITS: Machine Modes. (line 331) +* GET_MODE_SIZE: Machine Modes. (line 303) +* GET_MODE_UNIT_SIZE: Machine Modes. (line 325) +* GET_MODE_WIDER_MODE: Machine Modes. (line 299) +* GET_RTX_CLASS: RTL Classes. (line 6) +* GET_RTX_FORMAT: RTL Classes. (line 131) +* GET_RTX_LENGTH: RTL Classes. (line 128) +* 'get_thread_pointerMODE' instruction pattern: Standard Names. + (line 1869) +* geu: Comparisons. (line 72) +* 'geu' and attributes: Expressions. (line 83) +* GE_EXPR: Unary and Binary Expressions. + (line 6) +* GGC: Type Information. (line 6) +* ggc_collect: Invoking the garbage collector. + (line 6) +* GIMPLE: Parsing pass. (line 13) +* GIMPLE <1>: Gimplification pass. + (line 6) +* GIMPLE <2>: GIMPLE. (line 6) +* GIMPLE Exception Handling: GIMPLE Exception Handling. + (line 6) +* GIMPLE instruction set: GIMPLE instruction set. + (line 6) +* GIMPLE sequences: GIMPLE sequences. (line 6) +* GIMPLE statement iterators: Basic Blocks. (line 78) +* GIMPLE statement iterators <1>: Maintaining the CFG. + (line 33) +* gimple_addresses_taken: Manipulating GIMPLE statements. + (line 89) +* 'GIMPLE_ASM': 'GIMPLE_ASM'. (line 6) +* gimple_asm_clobber_op: 'GIMPLE_ASM'. (line 44) +* gimple_asm_input_op: 'GIMPLE_ASM'. (line 29) +* gimple_asm_nclobbers: 'GIMPLE_ASM'. (line 26) +* gimple_asm_ninputs: 'GIMPLE_ASM'. (line 20) +* gimple_asm_noutputs: 'GIMPLE_ASM'. (line 23) +* gimple_asm_output_op: 'GIMPLE_ASM'. (line 36) +* gimple_asm_set_clobber_op: 'GIMPLE_ASM'. (line 48) +* gimple_asm_set_input_op: 'GIMPLE_ASM'. (line 32) +* gimple_asm_set_output_op: 'GIMPLE_ASM'. (line 40) +* gimple_asm_set_volatile: 'GIMPLE_ASM'. (line 59) +* gimple_asm_string: 'GIMPLE_ASM'. (line 52) +* gimple_asm_volatile_p: 'GIMPLE_ASM'. (line 56) +* 'GIMPLE_ASSIGN': 'GIMPLE_ASSIGN'. (line 6) +* gimple_assign_cast_p: Logical Operators. (line 158) +* gimple_assign_cast_p <1>: 'GIMPLE_ASSIGN'. (line 92) +* gimple_assign_lhs: 'GIMPLE_ASSIGN'. (line 50) +* gimple_assign_lhs_ptr: 'GIMPLE_ASSIGN'. (line 53) +* gimple_assign_rhs1: 'GIMPLE_ASSIGN'. (line 56) +* gimple_assign_rhs1_ptr: 'GIMPLE_ASSIGN'. (line 59) +* gimple_assign_rhs2: 'GIMPLE_ASSIGN'. (line 63) +* gimple_assign_rhs2_ptr: 'GIMPLE_ASSIGN'. (line 66) +* gimple_assign_rhs3: 'GIMPLE_ASSIGN'. (line 70) +* gimple_assign_rhs3_ptr: 'GIMPLE_ASSIGN'. (line 73) +* gimple_assign_rhs_class: 'GIMPLE_ASSIGN'. (line 44) +* gimple_assign_rhs_code: 'GIMPLE_ASSIGN'. (line 40) +* gimple_assign_set_lhs: 'GIMPLE_ASSIGN'. (line 77) +* gimple_assign_set_rhs1: 'GIMPLE_ASSIGN'. (line 80) +* gimple_assign_set_rhs2: 'GIMPLE_ASSIGN'. (line 84) +* gimple_assign_set_rhs3: 'GIMPLE_ASSIGN'. (line 88) +* gimple_bb: Manipulating GIMPLE statements. + (line 17) +* 'GIMPLE_BIND': 'GIMPLE_BIND'. (line 6) +* gimple_bind_add_seq: 'GIMPLE_BIND'. (line 34) +* gimple_bind_add_stmt: 'GIMPLE_BIND'. (line 31) +* gimple_bind_append_vars: 'GIMPLE_BIND'. (line 18) +* gimple_bind_block: 'GIMPLE_BIND'. (line 39) +* gimple_bind_body: 'GIMPLE_BIND'. (line 22) +* gimple_bind_set_block: 'GIMPLE_BIND'. (line 44) +* gimple_bind_set_body: 'GIMPLE_BIND'. (line 26) +* gimple_bind_set_vars: 'GIMPLE_BIND'. (line 14) +* gimple_bind_vars: 'GIMPLE_BIND'. (line 11) +* gimple_block: Manipulating GIMPLE statements. + (line 20) +* gimple_build_asm: 'GIMPLE_ASM'. (line 6) +* gimple_build_asm_vec: 'GIMPLE_ASM'. (line 15) +* gimple_build_assign: 'GIMPLE_ASSIGN'. (line 6) +* gimple_build_assign_with_ops: 'GIMPLE_ASSIGN'. (line 28) +* gimple_build_bind: 'GIMPLE_BIND'. (line 6) +* gimple_build_call: 'GIMPLE_CALL'. (line 6) +* gimple_build_call_from_tree: 'GIMPLE_CALL'. (line 15) +* gimple_build_call_vec: 'GIMPLE_CALL'. (line 23) +* gimple_build_catch: 'GIMPLE_CATCH'. (line 6) +* gimple_build_cond: 'GIMPLE_COND'. (line 6) +* gimple_build_cond_from_tree: 'GIMPLE_COND'. (line 14) +* gimple_build_debug_bind: 'GIMPLE_DEBUG'. (line 6) +* gimple_build_eh_filter: 'GIMPLE_EH_FILTER'. (line 6) +* gimple_build_goto: 'GIMPLE_LABEL'. (line 17) +* gimple_build_label: 'GIMPLE_LABEL'. (line 6) +* gimple_build_nop: 'GIMPLE_NOP'. (line 6) +* gimple_build_omp_atomic_load: 'GIMPLE_OMP_ATOMIC_LOAD'. + (line 6) +* gimple_build_omp_atomic_store: 'GIMPLE_OMP_ATOMIC_STORE'. + (line 6) +* gimple_build_omp_continue: 'GIMPLE_OMP_CONTINUE'. + (line 6) +* gimple_build_omp_critical: 'GIMPLE_OMP_CRITICAL'. + (line 6) +* gimple_build_omp_for: 'GIMPLE_OMP_FOR'. (line 6) +* gimple_build_omp_master: 'GIMPLE_OMP_MASTER'. + (line 6) +* gimple_build_omp_ordered: 'GIMPLE_OMP_ORDERED'. + (line 6) +* gimple_build_omp_parallel: 'GIMPLE_OMP_PARALLEL'. + (line 6) +* gimple_build_omp_return: 'GIMPLE_OMP_RETURN'. + (line 6) +* gimple_build_omp_section: 'GIMPLE_OMP_SECTION'. + (line 6) +* gimple_build_omp_sections: 'GIMPLE_OMP_SECTIONS'. + (line 6) +* gimple_build_omp_sections_switch: 'GIMPLE_OMP_SECTIONS'. + (line 13) +* gimple_build_omp_single: 'GIMPLE_OMP_SINGLE'. + (line 6) +* gimple_build_resx: 'GIMPLE_RESX'. (line 6) +* gimple_build_return: 'GIMPLE_RETURN'. (line 6) +* gimple_build_switch: 'GIMPLE_SWITCH'. (line 6) +* gimple_build_try: 'GIMPLE_TRY'. (line 6) +* gimple_build_wce: 'GIMPLE_WITH_CLEANUP_EXPR'. + (line 6) +* 'GIMPLE_CALL': 'GIMPLE_CALL'. (line 6) +* gimple_call_arg: 'GIMPLE_CALL'. (line 65) +* gimple_call_arg_ptr: 'GIMPLE_CALL'. (line 69) +* gimple_call_cannot_inline_p: 'GIMPLE_CALL'. (line 90) +* gimple_call_chain: 'GIMPLE_CALL'. (line 56) +* gimple_call_copy_skip_args: 'GIMPLE_CALL'. (line 96) +* gimple_call_fn: 'GIMPLE_CALL'. (line 37) +* gimple_call_fndecl: 'GIMPLE_CALL'. (line 45) +* gimple_call_lhs: 'GIMPLE_CALL'. (line 28) +* gimple_call_lhs_ptr: 'GIMPLE_CALL'. (line 31) +* gimple_call_mark_uninlinable: 'GIMPLE_CALL'. (line 87) +* gimple_call_noreturn_p: 'GIMPLE_CALL'. (line 93) +* gimple_call_num_args: 'GIMPLE_CALL'. (line 62) +* gimple_call_return_type: 'GIMPLE_CALL'. (line 53) +* gimple_call_set_arg: 'GIMPLE_CALL'. (line 74) +* gimple_call_set_chain: 'GIMPLE_CALL'. (line 59) +* gimple_call_set_fn: 'GIMPLE_CALL'. (line 41) +* gimple_call_set_fndecl: 'GIMPLE_CALL'. (line 50) +* gimple_call_set_lhs: 'GIMPLE_CALL'. (line 34) +* gimple_call_set_tail: 'GIMPLE_CALL'. (line 79) +* gimple_call_tail_p: 'GIMPLE_CALL'. (line 84) +* 'GIMPLE_CATCH': 'GIMPLE_CATCH'. (line 6) +* gimple_catch_handler: 'GIMPLE_CATCH'. (line 19) +* gimple_catch_set_handler: 'GIMPLE_CATCH'. (line 26) +* gimple_catch_set_types: 'GIMPLE_CATCH'. (line 23) +* gimple_catch_types: 'GIMPLE_CATCH'. (line 12) +* gimple_catch_types_ptr: 'GIMPLE_CATCH'. (line 15) +* gimple_code: Manipulating GIMPLE statements. + (line 14) +* 'GIMPLE_COND': 'GIMPLE_COND'. (line 6) +* gimple_cond_code: 'GIMPLE_COND'. (line 20) +* gimple_cond_false_label: 'GIMPLE_COND'. (line 59) +* gimple_cond_lhs: 'GIMPLE_COND'. (line 29) +* gimple_cond_make_false: 'GIMPLE_COND'. (line 63) +* gimple_cond_make_true: 'GIMPLE_COND'. (line 66) +* gimple_cond_rhs: 'GIMPLE_COND'. (line 37) +* gimple_cond_set_code: 'GIMPLE_COND'. (line 24) +* gimple_cond_set_false_label: 'GIMPLE_COND'. (line 54) +* gimple_cond_set_lhs: 'GIMPLE_COND'. (line 33) +* gimple_cond_set_rhs: 'GIMPLE_COND'. (line 41) +* gimple_cond_set_true_label: 'GIMPLE_COND'. (line 49) +* gimple_cond_true_label: 'GIMPLE_COND'. (line 45) +* gimple_copy: Manipulating GIMPLE statements. + (line 146) +* 'GIMPLE_DEBUG': 'GIMPLE_DEBUG'. (line 6) +* 'GIMPLE_DEBUG_BIND': 'GIMPLE_DEBUG'. (line 6) +* gimple_debug_bind_get_value: 'GIMPLE_DEBUG'. (line 46) +* gimple_debug_bind_get_value_ptr: 'GIMPLE_DEBUG'. (line 50) +* gimple_debug_bind_get_var: 'GIMPLE_DEBUG'. (line 43) +* gimple_debug_bind_has_value_p: 'GIMPLE_DEBUG'. (line 68) +* gimple_debug_bind_p: Logical Operators. (line 162) +* gimple_debug_bind_reset_value: 'GIMPLE_DEBUG'. (line 64) +* gimple_debug_bind_set_value: 'GIMPLE_DEBUG'. (line 59) +* gimple_debug_bind_set_var: 'GIMPLE_DEBUG'. (line 55) +* gimple_def_ops: Manipulating GIMPLE statements. + (line 93) +* 'GIMPLE_EH_FILTER': 'GIMPLE_EH_FILTER'. (line 6) +* gimple_eh_filter_failure: 'GIMPLE_EH_FILTER'. (line 18) +* gimple_eh_filter_must_not_throw: 'GIMPLE_EH_FILTER'. (line 32) +* gimple_eh_filter_set_failure: 'GIMPLE_EH_FILTER'. (line 27) +* gimple_eh_filter_set_must_not_throw: 'GIMPLE_EH_FILTER'. (line 35) +* gimple_eh_filter_set_types: 'GIMPLE_EH_FILTER'. (line 22) +* gimple_eh_filter_types: 'GIMPLE_EH_FILTER'. (line 11) +* gimple_eh_filter_types_ptr: 'GIMPLE_EH_FILTER'. (line 14) +* gimple_expr_code: Manipulating GIMPLE statements. + (line 30) +* gimple_expr_type: Manipulating GIMPLE statements. + (line 23) +* gimple_goto_dest: 'GIMPLE_LABEL'. (line 20) +* gimple_goto_set_dest: 'GIMPLE_LABEL'. (line 23) +* gimple_has_mem_ops: Manipulating GIMPLE statements. + (line 71) +* gimple_has_ops: Manipulating GIMPLE statements. + (line 68) +* gimple_has_volatile_ops: Manipulating GIMPLE statements. + (line 133) +* 'GIMPLE_LABEL': 'GIMPLE_LABEL'. (line 6) +* gimple_label_label: 'GIMPLE_LABEL'. (line 10) +* gimple_label_set_label: 'GIMPLE_LABEL'. (line 13) +* gimple_loaded_syms: Manipulating GIMPLE statements. + (line 121) +* gimple_locus: Manipulating GIMPLE statements. + (line 41) +* gimple_locus_empty_p: Manipulating GIMPLE statements. + (line 47) +* gimple_modified_p: Manipulating GIMPLE statements. + (line 129) +* 'GIMPLE_NOP': 'GIMPLE_NOP'. (line 6) +* gimple_nop_p: 'GIMPLE_NOP'. (line 9) +* gimple_no_warning_p: Manipulating GIMPLE statements. + (line 50) +* gimple_num_ops: Logical Operators. (line 76) +* gimple_num_ops <1>: Manipulating GIMPLE statements. + (line 74) +* 'GIMPLE_OMP_ATOMIC_LOAD': 'GIMPLE_OMP_ATOMIC_LOAD'. + (line 6) +* gimple_omp_atomic_load_lhs: 'GIMPLE_OMP_ATOMIC_LOAD'. + (line 16) +* gimple_omp_atomic_load_rhs: 'GIMPLE_OMP_ATOMIC_LOAD'. + (line 23) +* gimple_omp_atomic_load_set_lhs: 'GIMPLE_OMP_ATOMIC_LOAD'. + (line 12) +* gimple_omp_atomic_load_set_rhs: 'GIMPLE_OMP_ATOMIC_LOAD'. + (line 19) +* 'GIMPLE_OMP_ATOMIC_STORE': 'GIMPLE_OMP_ATOMIC_STORE'. + (line 6) +* gimple_omp_atomic_store_set_val: 'GIMPLE_OMP_ATOMIC_STORE'. + (line 10) +* gimple_omp_atomic_store_val: 'GIMPLE_OMP_ATOMIC_STORE'. + (line 14) +* gimple_omp_body: 'GIMPLE_OMP_PARALLEL'. + (line 23) +* 'GIMPLE_OMP_CONTINUE': 'GIMPLE_OMP_CONTINUE'. + (line 6) +* gimple_omp_continue_control_def: 'GIMPLE_OMP_CONTINUE'. + (line 12) +* gimple_omp_continue_control_def_ptr: 'GIMPLE_OMP_CONTINUE'. + (line 16) +* gimple_omp_continue_control_use: 'GIMPLE_OMP_CONTINUE'. + (line 23) +* gimple_omp_continue_control_use_ptr: 'GIMPLE_OMP_CONTINUE'. + (line 27) +* gimple_omp_continue_set_control_def: 'GIMPLE_OMP_CONTINUE'. + (line 19) +* gimple_omp_continue_set_control_use: 'GIMPLE_OMP_CONTINUE'. + (line 30) +* 'GIMPLE_OMP_CRITICAL': 'GIMPLE_OMP_CRITICAL'. + (line 6) +* gimple_omp_critical_name: 'GIMPLE_OMP_CRITICAL'. + (line 12) +* gimple_omp_critical_name_ptr: 'GIMPLE_OMP_CRITICAL'. + (line 15) +* gimple_omp_critical_set_name: 'GIMPLE_OMP_CRITICAL'. + (line 19) +* 'GIMPLE_OMP_FOR': 'GIMPLE_OMP_FOR'. (line 6) +* gimple_omp_for_clauses: 'GIMPLE_OMP_FOR'. (line 19) +* gimple_omp_for_clauses_ptr: 'GIMPLE_OMP_FOR'. (line 22) +* gimple_omp_for_cond: 'GIMPLE_OMP_FOR'. (line 82) +* gimple_omp_for_final: 'GIMPLE_OMP_FOR'. (line 50) +* gimple_omp_for_final_ptr: 'GIMPLE_OMP_FOR'. (line 53) +* gimple_omp_for_incr: 'GIMPLE_OMP_FOR'. (line 60) +* gimple_omp_for_incr_ptr: 'GIMPLE_OMP_FOR'. (line 63) +* gimple_omp_for_index: 'GIMPLE_OMP_FOR'. (line 30) +* gimple_omp_for_index_ptr: 'GIMPLE_OMP_FOR'. (line 33) +* gimple_omp_for_initial: 'GIMPLE_OMP_FOR'. (line 40) +* gimple_omp_for_initial_ptr: 'GIMPLE_OMP_FOR'. (line 43) +* gimple_omp_for_pre_body: 'GIMPLE_OMP_FOR'. (line 69) +* gimple_omp_for_set_clauses: 'GIMPLE_OMP_FOR'. (line 25) +* gimple_omp_for_set_cond: 'GIMPLE_OMP_FOR'. (line 78) +* gimple_omp_for_set_final: 'GIMPLE_OMP_FOR'. (line 56) +* gimple_omp_for_set_incr: 'GIMPLE_OMP_FOR'. (line 66) +* gimple_omp_for_set_index: 'GIMPLE_OMP_FOR'. (line 36) +* gimple_omp_for_set_initial: 'GIMPLE_OMP_FOR'. (line 46) +* gimple_omp_for_set_pre_body: 'GIMPLE_OMP_FOR'. (line 73) +* 'GIMPLE_OMP_MASTER': 'GIMPLE_OMP_MASTER'. + (line 6) +* 'GIMPLE_OMP_ORDERED': 'GIMPLE_OMP_ORDERED'. + (line 6) +* 'GIMPLE_OMP_PARALLEL': 'GIMPLE_OMP_PARALLEL'. + (line 6) +* gimple_omp_parallel_child_fn: 'GIMPLE_OMP_PARALLEL'. + (line 41) +* gimple_omp_parallel_child_fn_ptr: 'GIMPLE_OMP_PARALLEL'. + (line 45) +* gimple_omp_parallel_clauses: 'GIMPLE_OMP_PARALLEL'. + (line 30) +* gimple_omp_parallel_clauses_ptr: 'GIMPLE_OMP_PARALLEL'. + (line 33) +* gimple_omp_parallel_combined_p: 'GIMPLE_OMP_PARALLEL'. + (line 15) +* gimple_omp_parallel_data_arg: 'GIMPLE_OMP_PARALLEL'. + (line 53) +* gimple_omp_parallel_data_arg_ptr: 'GIMPLE_OMP_PARALLEL'. + (line 57) +* gimple_omp_parallel_set_child_fn: 'GIMPLE_OMP_PARALLEL'. + (line 49) +* gimple_omp_parallel_set_clauses: 'GIMPLE_OMP_PARALLEL'. + (line 36) +* gimple_omp_parallel_set_combined_p: 'GIMPLE_OMP_PARALLEL'. + (line 19) +* gimple_omp_parallel_set_data_arg: 'GIMPLE_OMP_PARALLEL'. + (line 60) +* 'GIMPLE_OMP_RETURN': 'GIMPLE_OMP_RETURN'. + (line 6) +* gimple_omp_return_nowait_p: 'GIMPLE_OMP_RETURN'. + (line 13) +* gimple_omp_return_set_nowait: 'GIMPLE_OMP_RETURN'. + (line 10) +* 'GIMPLE_OMP_SECTION': 'GIMPLE_OMP_SECTION'. + (line 6) +* 'GIMPLE_OMP_SECTIONS': 'GIMPLE_OMP_SECTIONS'. + (line 6) +* gimple_omp_sections_clauses: 'GIMPLE_OMP_SECTIONS'. + (line 29) +* gimple_omp_sections_clauses_ptr: 'GIMPLE_OMP_SECTIONS'. + (line 32) +* gimple_omp_sections_control: 'GIMPLE_OMP_SECTIONS'. + (line 16) +* gimple_omp_sections_control_ptr: 'GIMPLE_OMP_SECTIONS'. + (line 20) +* gimple_omp_sections_set_clauses: 'GIMPLE_OMP_SECTIONS'. + (line 35) +* gimple_omp_sections_set_control: 'GIMPLE_OMP_SECTIONS'. + (line 24) +* gimple_omp_section_last_p: 'GIMPLE_OMP_SECTION'. + (line 11) +* gimple_omp_section_set_last: 'GIMPLE_OMP_SECTION'. + (line 15) +* gimple_omp_set_body: 'GIMPLE_OMP_PARALLEL'. + (line 26) +* 'GIMPLE_OMP_SINGLE': 'GIMPLE_OMP_SINGLE'. + (line 6) +* gimple_omp_single_clauses: 'GIMPLE_OMP_SINGLE'. + (line 13) +* gimple_omp_single_clauses_ptr: 'GIMPLE_OMP_SINGLE'. + (line 16) +* gimple_omp_single_set_clauses: 'GIMPLE_OMP_SINGLE'. + (line 19) +* gimple_op: Logical Operators. (line 79) +* gimple_op <1>: Manipulating GIMPLE statements. + (line 80) +* gimple_ops: Logical Operators. (line 82) +* gimple_ops <1>: Manipulating GIMPLE statements. + (line 77) +* gimple_op_ptr: Manipulating GIMPLE statements. + (line 83) +* 'GIMPLE_PHI': 'GIMPLE_PHI'. (line 6) +* gimple_phi_arg: 'GIMPLE_PHI'. (line 24) +* gimple_phi_arg <1>: SSA. (line 62) +* gimple_phi_arg_def: SSA. (line 68) +* gimple_phi_arg_edge: SSA. (line 65) +* gimple_phi_capacity: 'GIMPLE_PHI'. (line 6) +* gimple_phi_num_args: 'GIMPLE_PHI'. (line 10) +* gimple_phi_num_args <1>: SSA. (line 58) +* gimple_phi_result: 'GIMPLE_PHI'. (line 15) +* gimple_phi_result <1>: SSA. (line 55) +* gimple_phi_result_ptr: 'GIMPLE_PHI'. (line 18) +* gimple_phi_set_arg: 'GIMPLE_PHI'. (line 28) +* gimple_phi_set_result: 'GIMPLE_PHI'. (line 21) +* gimple_plf: Manipulating GIMPLE statements. + (line 64) +* 'GIMPLE_RESX': 'GIMPLE_RESX'. (line 6) +* gimple_resx_region: 'GIMPLE_RESX'. (line 12) +* gimple_resx_set_region: 'GIMPLE_RESX'. (line 15) +* 'GIMPLE_RETURN': 'GIMPLE_RETURN'. (line 6) +* gimple_return_retval: 'GIMPLE_RETURN'. (line 9) +* gimple_return_set_retval: 'GIMPLE_RETURN'. (line 12) +* gimple_seq_add_seq: GIMPLE sequences. (line 30) +* gimple_seq_add_stmt: GIMPLE sequences. (line 24) +* gimple_seq_alloc: GIMPLE sequences. (line 61) +* gimple_seq_copy: GIMPLE sequences. (line 65) +* gimple_seq_deep_copy: GIMPLE sequences. (line 36) +* gimple_seq_empty_p: GIMPLE sequences. (line 69) +* gimple_seq_first: GIMPLE sequences. (line 43) +* gimple_seq_init: GIMPLE sequences. (line 58) +* gimple_seq_last: GIMPLE sequences. (line 46) +* gimple_seq_reverse: GIMPLE sequences. (line 39) +* gimple_seq_set_first: GIMPLE sequences. (line 53) +* gimple_seq_set_last: GIMPLE sequences. (line 49) +* gimple_seq_singleton_p: GIMPLE sequences. (line 78) +* gimple_set_block: Manipulating GIMPLE statements. + (line 38) +* gimple_set_def_ops: Manipulating GIMPLE statements. + (line 96) +* gimple_set_has_volatile_ops: Manipulating GIMPLE statements. + (line 136) +* gimple_set_locus: Manipulating GIMPLE statements. + (line 44) +* gimple_set_op: Manipulating GIMPLE statements. + (line 86) +* gimple_set_plf: Manipulating GIMPLE statements. + (line 60) +* gimple_set_use_ops: Manipulating GIMPLE statements. + (line 103) +* gimple_set_vdef_ops: Manipulating GIMPLE statements. + (line 117) +* gimple_set_visited: Manipulating GIMPLE statements. + (line 53) +* gimple_set_vuse_ops: Manipulating GIMPLE statements. + (line 110) +* gimple_statement_base: Tuple representation. + (line 14) +* gimple_statement_with_ops: Tuple representation. + (line 96) +* gimple_stored_syms: Manipulating GIMPLE statements. + (line 125) +* 'GIMPLE_SWITCH': 'GIMPLE_SWITCH'. (line 6) +* gimple_switch_default_label: 'GIMPLE_SWITCH'. (line 38) +* gimple_switch_index: 'GIMPLE_SWITCH'. (line 23) +* gimple_switch_label: 'GIMPLE_SWITCH'. (line 29) +* gimple_switch_num_labels: 'GIMPLE_SWITCH'. (line 14) +* gimple_switch_set_default_label: 'GIMPLE_SWITCH'. (line 41) +* gimple_switch_set_index: 'GIMPLE_SWITCH'. (line 26) +* gimple_switch_set_label: 'GIMPLE_SWITCH'. (line 33) +* gimple_switch_set_num_labels: 'GIMPLE_SWITCH'. (line 18) +* 'GIMPLE_TRY': 'GIMPLE_TRY'. (line 6) +* gimple_try_catch_is_cleanup: 'GIMPLE_TRY'. (line 19) +* gimple_try_cleanup: 'GIMPLE_TRY'. (line 26) +* gimple_try_eval: 'GIMPLE_TRY'. (line 22) +* gimple_try_kind: 'GIMPLE_TRY'. (line 15) +* gimple_try_set_catch_is_cleanup: 'GIMPLE_TRY'. (line 30) +* gimple_try_set_cleanup: 'GIMPLE_TRY'. (line 39) +* gimple_try_set_eval: 'GIMPLE_TRY'. (line 34) +* gimple_use_ops: Manipulating GIMPLE statements. + (line 100) +* gimple_vdef_ops: Manipulating GIMPLE statements. + (line 114) +* gimple_visited_p: Manipulating GIMPLE statements. + (line 57) +* gimple_vuse_ops: Manipulating GIMPLE statements. + (line 107) +* gimple_wce_cleanup: 'GIMPLE_WITH_CLEANUP_EXPR'. + (line 10) +* gimple_wce_cleanup_eh_only: 'GIMPLE_WITH_CLEANUP_EXPR'. + (line 17) +* gimple_wce_set_cleanup: 'GIMPLE_WITH_CLEANUP_EXPR'. + (line 13) +* gimple_wce_set_cleanup_eh_only: 'GIMPLE_WITH_CLEANUP_EXPR'. + (line 20) +* 'GIMPLE_WITH_CLEANUP_EXPR': 'GIMPLE_WITH_CLEANUP_EXPR'. + (line 6) +* gimplification: Parsing pass. (line 13) +* gimplification <1>: Gimplification pass. + (line 6) +* gimplifier: Parsing pass. (line 13) +* gimplify_assign: 'GIMPLE_ASSIGN'. (line 17) +* gimplify_expr: Gimplification pass. + (line 18) +* gimplify_function_tree: Gimplification pass. + (line 18) +* GLOBAL_INIT_PRIORITY: Functions for C++. (line 141) +* global_regs: Register Basics. (line 59) +* 'GO_IF_LEGITIMATE_ADDRESS': Addressing Modes. (line 90) +* greater than: Comparisons. (line 60) +* greater than <1>: Comparisons. (line 64) +* greater than <2>: Comparisons. (line 72) +* gsi_after_labels: Sequence iterators. (line 74) +* gsi_bb: Sequence iterators. (line 82) +* gsi_commit_edge_inserts: Sequence iterators. (line 193) +* gsi_commit_edge_inserts <1>: Maintaining the CFG. + (line 105) +* gsi_commit_one_edge_insert: Sequence iterators. (line 188) +* gsi_end_p: Sequence iterators. (line 59) +* gsi_end_p <1>: Maintaining the CFG. + (line 48) +* gsi_for_stmt: Sequence iterators. (line 156) +* gsi_insert_after: Sequence iterators. (line 145) +* gsi_insert_after <1>: Maintaining the CFG. + (line 60) +* gsi_insert_before: Sequence iterators. (line 134) +* gsi_insert_before <1>: Maintaining the CFG. + (line 66) +* gsi_insert_on_edge: Sequence iterators. (line 173) +* gsi_insert_on_edge <1>: Maintaining the CFG. + (line 105) +* gsi_insert_on_edge_immediate: Sequence iterators. (line 183) +* gsi_insert_seq_after: Sequence iterators. (line 152) +* gsi_insert_seq_before: Sequence iterators. (line 141) +* gsi_insert_seq_on_edge: Sequence iterators. (line 177) +* gsi_last: Sequence iterators. (line 49) +* gsi_last <1>: Maintaining the CFG. + (line 44) +* gsi_last_bb: Sequence iterators. (line 55) +* gsi_link_after: Sequence iterators. (line 113) +* gsi_link_before: Sequence iterators. (line 103) +* gsi_link_seq_after: Sequence iterators. (line 108) +* gsi_link_seq_before: Sequence iterators. (line 97) +* gsi_move_after: Sequence iterators. (line 159) +* gsi_move_before: Sequence iterators. (line 164) +* gsi_move_to_bb_end: Sequence iterators. (line 169) +* gsi_next: Sequence iterators. (line 65) +* gsi_next <1>: Maintaining the CFG. + (line 52) +* gsi_one_before_end_p: Sequence iterators. (line 62) +* gsi_prev: Sequence iterators. (line 68) +* gsi_prev <1>: Maintaining the CFG. + (line 56) +* gsi_remove: Sequence iterators. (line 88) +* gsi_remove <1>: Maintaining the CFG. + (line 72) +* gsi_replace: Sequence iterators. (line 128) +* gsi_seq: Sequence iterators. (line 85) +* gsi_split_seq_after: Sequence iterators. (line 118) +* gsi_split_seq_before: Sequence iterators. (line 123) +* gsi_start: Sequence iterators. (line 39) +* gsi_start <1>: Maintaining the CFG. + (line 40) +* gsi_start_bb: Sequence iterators. (line 45) +* gsi_stmt: Sequence iterators. (line 71) +* gsi_stmt_ptr: Sequence iterators. (line 79) +* gt: Comparisons. (line 60) +* 'gt' and attributes: Expressions. (line 83) +* gtu: Comparisons. (line 64) +* 'gtu' and attributes: Expressions. (line 83) +* GTY: Type Information. (line 6) +* GT_EXPR: Unary and Binary Expressions. + (line 6) +* 'H' in constraint: Simple Constraints. (line 96) +* HAmode: Machine Modes. (line 146) +* HANDLER: Statements for C++. (line 6) +* HANDLER_BODY: Statements for C++. (line 6) +* HANDLER_PARMS: Statements for C++. (line 6) +* HANDLE_PRAGMA_PACK_WITH_EXPANSION: Misc. (line 442) +* hard registers: Regs and Memory. (line 9) +* HARD_FRAME_POINTER_IS_ARG_POINTER: Frame Registers. (line 57) +* HARD_FRAME_POINTER_IS_FRAME_POINTER: Frame Registers. (line 50) +* HARD_FRAME_POINTER_REGNUM: Frame Registers. (line 19) +* HARD_REGNO_CALLER_SAVE_MODE: Caller Saves. (line 19) +* HARD_REGNO_CALL_PART_CLOBBERED: Register Basics. (line 52) +* HARD_REGNO_MODE_OK: Values in Registers. + (line 57) +* HARD_REGNO_NREGS: Values in Registers. + (line 10) +* HARD_REGNO_NREGS_HAS_PADDING: Values in Registers. + (line 24) +* HARD_REGNO_NREGS_WITH_PADDING: Values in Registers. + (line 42) +* HARD_REGNO_RENAME_OK: Values in Registers. + (line 117) +* HAS_INIT_SECTION: Macros for Initialization. + (line 18) +* HAS_LONG_COND_BRANCH: Misc. (line 8) +* HAS_LONG_UNCOND_BRANCH: Misc. (line 17) +* HAVE_DOS_BASED_FILE_SYSTEM: Filesystem. (line 11) +* HAVE_POST_DECREMENT: Addressing Modes. (line 11) +* HAVE_POST_INCREMENT: Addressing Modes. (line 10) +* HAVE_POST_MODIFY_DISP: Addressing Modes. (line 17) +* HAVE_POST_MODIFY_REG: Addressing Modes. (line 23) +* HAVE_PRE_DECREMENT: Addressing Modes. (line 9) +* HAVE_PRE_INCREMENT: Addressing Modes. (line 8) +* HAVE_PRE_MODIFY_DISP: Addressing Modes. (line 16) +* HAVE_PRE_MODIFY_REG: Addressing Modes. (line 22) +* HCmode: Machine Modes. (line 199) +* HFmode: Machine Modes. (line 61) +* high: Constants. (line 119) +* HImode: Machine Modes. (line 29) +* 'HImode', in 'insn': Insns. (line 268) +* HONOR_REG_ALLOC_ORDER: Allocation Order. (line 36) +* host configuration: Host Config. (line 6) +* host functions: Host Common. (line 6) +* host hooks: Host Common. (line 6) +* host makefile fragment: Host Fragment. (line 6) +* HOST_BIT_BUCKET: Filesystem. (line 51) +* HOST_EXECUTABLE_SUFFIX: Filesystem. (line 45) +* HOST_HOOKS_EXTRA_SIGNALS: Host Common. (line 11) +* HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY: Host Common. (line 43) +* HOST_HOOKS_GT_PCH_GET_ADDRESS: Host Common. (line 15) +* HOST_HOOKS_GT_PCH_USE_ADDRESS: Host Common. (line 24) +* HOST_LACKS_INODE_NUMBERS: Filesystem. (line 89) +* HOST_LONG_FORMAT: Host Misc. (line 45) +* HOST_LONG_LONG_FORMAT: Host Misc. (line 41) +* HOST_OBJECT_SUFFIX: Filesystem. (line 40) +* HOST_PTR_PRINTF: Host Misc. (line 49) +* HOT_TEXT_SECTION_NAME: Sections. (line 42) +* HQmode: Machine Modes. (line 110) +* 'i' in constraint: Simple Constraints. (line 68) +* 'I' in constraint: Simple Constraints. (line 79) +* identifier: Identifiers. (line 6) +* IDENTIFIER_LENGTH: Identifiers. (line 22) +* IDENTIFIER_NODE: Identifiers. (line 6) +* IDENTIFIER_OPNAME_P: Identifiers. (line 27) +* IDENTIFIER_POINTER: Identifiers. (line 17) +* IDENTIFIER_TYPENAME_P: Identifiers. (line 33) +* IEEE 754-2008: Decimal float library routines. + (line 6) +* IFCVT_MACHDEP_INIT: Misc. (line 567) +* IFCVT_MODIFY_CANCEL: Misc. (line 561) +* IFCVT_MODIFY_FINAL: Misc. (line 555) +* IFCVT_MODIFY_INSN: Misc. (line 549) +* IFCVT_MODIFY_MULTIPLE_TESTS: Misc. (line 541) +* IFCVT_MODIFY_TESTS: Misc. (line 531) +* IF_COND: Statements for C++. (line 6) +* if_marked: GTY Options. (line 165) +* IF_STMT: Statements for C++. (line 6) +* if_then_else: Comparisons. (line 80) +* 'if_then_else' and attributes: Expressions. (line 32) +* 'if_then_else' usage: Side Effects. (line 56) +* IMAGPART_EXPR: Unary and Binary Expressions. + (line 6) +* Immediate Uses: SSA Operands. (line 258) +* immediate_operand: Machine-Independent Predicates. + (line 10) +* IMMEDIATE_PREFIX: Instruction Output. (line 153) +* include: Including Patterns. (line 6) +* INCLUDE_DEFAULTS: Driver. (line 327) +* inclusive-or, bitwise: Arithmetic. (line 164) +* INCOMING_FRAME_SP_OFFSET: Frame Layout. (line 181) +* INCOMING_REGNO: Register Basics. (line 87) +* INCOMING_RETURN_ADDR_RTX: Frame Layout. (line 137) +* INCOMING_STACK_BOUNDARY: Storage Layout. (line 154) +* INDEX_REG_CLASS: Register Classes. (line 140) +* 'indirect_jump' instruction pattern: Standard Names. (line 1237) +* indirect_operand: Machine-Independent Predicates. + (line 70) +* INDIRECT_REF: Storage References. (line 6) +* initialization routines: Initialization. (line 6) +* INITIAL_ELIMINATION_OFFSET: Elimination. (line 84) +* INITIAL_FRAME_ADDRESS_RTX: Frame Layout. (line 81) +* INITIAL_FRAME_POINTER_OFFSET: Elimination. (line 34) +* INIT_ARRAY_SECTION_ASM_OP: Sections. (line 106) +* INIT_CUMULATIVE_ARGS: Register Arguments. (line 147) +* INIT_CUMULATIVE_INCOMING_ARGS: Register Arguments. (line 175) +* INIT_CUMULATIVE_LIBCALL_ARGS: Register Arguments. (line 169) +* INIT_ENVIRONMENT: Driver. (line 305) +* INIT_EXPANDERS: Per-Function Data. (line 36) +* INIT_EXPR: Unary and Binary Expressions. + (line 6) +* init_machine_status: Per-Function Data. (line 42) +* init_one_libfunc: Library Calls. (line 15) +* INIT_SECTION_ASM_OP: Sections. (line 90) +* INIT_SECTION_ASM_OP <1>: Macros for Initialization. + (line 9) +* inlining: Target Attributes. (line 95) +* insert_insn_on_edge: Maintaining the CFG. + (line 105) +* insn: Insns. (line 63) +* 'insn' and '/f': Flags. (line 107) +* 'insn' and '/j': Flags. (line 157) +* 'insn' and '/s': Flags. (line 49) +* 'insn' and '/s' <1>: Flags. (line 148) +* 'insn' and '/u': Flags. (line 39) +* 'insn' and '/v': Flags. (line 44) +* insn attributes: Insn Attributes. (line 6) +* insn canonicalization: Insn Canonicalizations. + (line 6) +* insn includes: Including Patterns. (line 6) +* insn lengths, computing: Insn Lengths. (line 6) +* insn notes, notes: Basic Blocks. (line 52) +* insn splitting: Insn Splitting. (line 6) +* insn-attr.h: Defining Attributes. + (line 34) +* insns: Insns. (line 6) +* insns, generating: RTL Template. (line 6) +* insns, recognizing: RTL Template. (line 6) +* INSN_ANNULLED_BRANCH_P: Flags. (line 39) +* INSN_CODE: Insns. (line 295) +* INSN_DELETED_P: Flags. (line 44) +* INSN_FROM_TARGET_P: Flags. (line 49) +* insn_list: Insns. (line 540) +* INSN_REFERENCES_ARE_DELAYED: Misc. (line 469) +* INSN_SETS_ARE_DELAYED: Misc. (line 458) +* INSN_UID: Insns. (line 23) +* INSN_VAR_LOCATION: Insns. (line 236) +* instruction attributes: Insn Attributes. (line 6) +* instruction latency time: Processor pipeline description. + (line 6) +* instruction latency time <1>: Processor pipeline description. + (line 105) +* instruction latency time <2>: Processor pipeline description. + (line 196) +* instruction patterns: Patterns. (line 6) +* instruction splitting: Insn Splitting. (line 6) +* 'insv' instruction pattern: Standard Names. (line 1036) +* 'insvM' instruction pattern: Standard Names. (line 988) +* 'insvmisalignM' instruction pattern: Standard Names. (line 998) +* int iterators in '.md' files: Int Iterators. (line 6) +* INT16_TYPE: Type Layout. (line 253) +* INT32_TYPE: Type Layout. (line 254) +* INT64_TYPE: Type Layout. (line 255) +* INT8_TYPE: Type Layout. (line 252) +* INTEGER_CST: Constant expressions. + (line 6) +* INTEGER_TYPE: Types. (line 6) +* Interdependence of Patterns: Dependent Patterns. (line 6) +* interfacing to GCC output: Interface. (line 6) +* interlock delays: Processor pipeline description. + (line 6) +* intermediate representation lowering: Parsing pass. (line 13) +* INTMAX_TYPE: Type Layout. (line 229) +* INTPTR_TYPE: Type Layout. (line 276) +* introduction: Top. (line 6) +* INT_FAST16_TYPE: Type Layout. (line 269) +* INT_FAST32_TYPE: Type Layout. (line 270) +* INT_FAST64_TYPE: Type Layout. (line 271) +* INT_FAST8_TYPE: Type Layout. (line 268) +* INT_LEAST16_TYPE: Type Layout. (line 261) +* INT_LEAST32_TYPE: Type Layout. (line 262) +* INT_LEAST64_TYPE: Type Layout. (line 263) +* INT_LEAST8_TYPE: Type Layout. (line 260) +* INT_TYPE_SIZE: Type Layout. (line 11) +* INVOKE__main: Macros for Initialization. + (line 50) +* in_struct: Flags. (line 245) +* 'in_struct', in 'code_label' and 'note': Flags. (line 59) +* 'in_struct', in 'insn' and 'jump_insn' and 'call_insn': Flags. + (line 49) +* 'in_struct', in 'insn', 'call_insn', 'jump_insn' and 'jump_table_data': Flags. + (line 148) +* 'in_struct', in 'subreg': Flags. (line 187) +* ior: Arithmetic. (line 164) +* 'ior' and attributes: Expressions. (line 50) +* 'ior', canonicalization of: Insn Canonicalizations. + (line 51) +* 'iorM3' instruction pattern: Standard Names. (line 276) +* IRA_HARD_REGNO_ADD_COST_MULTIPLIER: Allocation Order. (line 44) +* IS_ASM_LOGICAL_LINE_SEPARATOR: Data Output. (line 119) +* is_gimple_addressable: Logical Operators. (line 113) +* is_gimple_asm_val: Logical Operators. (line 117) +* is_gimple_assign: Logical Operators. (line 149) +* is_gimple_call: Logical Operators. (line 152) +* is_gimple_call_addr: Logical Operators. (line 120) +* is_gimple_constant: Logical Operators. (line 128) +* is_gimple_debug: Logical Operators. (line 155) +* is_gimple_ip_invariant: Logical Operators. (line 137) +* is_gimple_ip_invariant_address: Logical Operators. (line 142) +* is_gimple_mem_ref_addr: Logical Operators. (line 124) +* is_gimple_min_invariant: Logical Operators. (line 131) +* is_gimple_omp: Logical Operators. (line 166) +* is_gimple_val: Logical Operators. (line 107) +* iterators in '.md' files: Iterators. (line 6) +* IV analysis on GIMPLE: Scalar evolutions. (line 6) +* IV analysis on RTL: loop-iv. (line 6) +* JMP_BUF_SIZE: Exception Region Output. + (line 82) +* jump: Flags. (line 286) +* 'jump' instruction pattern: Standard Names. (line 1115) +* jump instruction patterns: Jump Patterns. (line 6) +* jump instructions and 'set': Side Effects. (line 56) +* 'jump', in 'call_insn': Flags. (line 161) +* 'jump', in 'insn': Flags. (line 157) +* 'jump', in 'mem': Flags. (line 70) +* Jumps: Jumps. (line 6) +* JUMP_ALIGN: Alignment Output. (line 8) +* jump_insn: Insns. (line 73) +* 'jump_insn' and '/f': Flags. (line 107) +* 'jump_insn' and '/s': Flags. (line 49) +* 'jump_insn' and '/s' <1>: Flags. (line 148) +* 'jump_insn' and '/u': Flags. (line 39) +* 'jump_insn' and '/v': Flags. (line 44) +* JUMP_LABEL: Insns. (line 80) +* JUMP_TABLES_IN_TEXT_SECTION: Sections. (line 150) +* jump_table_data: Insns. (line 166) +* 'jump_table_data' and '/s': Flags. (line 148) +* 'jump_table_data' and '/v': Flags. (line 44) +* LABEL_ALIGN: Alignment Output. (line 57) +* LABEL_ALIGN_AFTER_BARRIER: Alignment Output. (line 26) +* LABEL_ALTERNATE_NAME: Edges. (line 180) +* LABEL_ALT_ENTRY_P: Insns. (line 146) +* LABEL_DECL: Declarations. (line 6) +* LABEL_KIND: Insns. (line 146) +* LABEL_NUSES: Insns. (line 142) +* LABEL_PRESERVE_P: Flags. (line 59) +* label_ref: Constants. (line 96) +* 'label_ref' and '/v': Flags. (line 65) +* 'label_ref', RTL sharing: Sharing. (line 35) +* LABEL_REF_NONLOCAL_P: Flags. (line 65) +* language-dependent trees: Language-dependent trees. + (line 6) +* language-independent intermediate representation: Parsing pass. + (line 13) +* lang_hooks.gimplify_expr: Gimplification pass. + (line 18) +* lang_hooks.parse_file: Parsing pass. (line 6) +* large return values: Aggregate Return. (line 6) +* LARGEST_EXPONENT_IS_NORMAL: Storage Layout. (line 483) +* LAST_STACK_REG: Stack Registers. (line 30) +* LAST_VIRTUAL_REGISTER: Regs and Memory. (line 51) +* 'lceilMN2': Standard Names. (line 699) +* LCSSA: LCSSA. (line 6) +* LDD_SUFFIX: Macros for Initialization. + (line 121) +* LD_FINI_SWITCH: Macros for Initialization. + (line 28) +* LD_INIT_SWITCH: Macros for Initialization. + (line 24) +* le: Comparisons. (line 76) +* 'le' and attributes: Expressions. (line 83) +* leaf functions: Leaf Functions. (line 6) +* leaf_function_p: Standard Names. (line 1199) +* LEAF_REGISTERS: Leaf Functions. (line 23) +* LEAF_REG_REMAP: Leaf Functions. (line 37) +* left rotate: Arithmetic. (line 196) +* left shift: Arithmetic. (line 174) +* LEGITIMATE_PIC_OPERAND_P: PIC. (line 31) +* LEGITIMIZE_RELOAD_ADDRESS: Addressing Modes. (line 150) +* length: GTY Options. (line 47) +* less than: Comparisons. (line 68) +* less than or equal: Comparisons. (line 76) +* leu: Comparisons. (line 76) +* 'leu' and attributes: Expressions. (line 83) +* LE_EXPR: Unary and Binary Expressions. + (line 6) +* 'lfloorMN2': Standard Names. (line 694) +* LIB2FUNCS_EXTRA: Target Fragment. (line 11) +* LIBCALL_VALUE: Scalar Return. (line 56) +* 'libgcc.a': Library Calls. (line 6) +* LIBGCC2_CFLAGS: Target Fragment. (line 8) +* LIBGCC2_GNU_PREFIX: Type Layout. (line 127) +* LIBGCC2_HAS_DF_MODE: Type Layout. (line 108) +* LIBGCC2_HAS_TF_MODE: Type Layout. (line 121) +* LIBGCC2_HAS_XF_MODE: Type Layout. (line 115) +* LIBGCC2_LONG_DOUBLE_TYPE_SIZE: Type Layout. (line 102) +* LIBGCC2_UNWIND_ATTRIBUTE: Misc. (line 996) +* LIBGCC_SPEC: Driver. (line 115) +* library subroutine names: Library Calls. (line 6) +* LIBRARY_PATH_ENV: Misc. (line 509) +* LIB_SPEC: Driver. (line 107) +* LIMIT_RELOAD_CLASS: Register Classes. (line 296) +* LINK_COMMAND_SPEC: Driver. (line 236) +* LINK_EH_SPEC: Driver. (line 142) +* LINK_GCC_C_SEQUENCE_SPEC: Driver. (line 232) +* LINK_LIBGCC_SPECIAL_1: Driver. (line 227) +* LINK_SPEC: Driver. (line 100) +* list: Containers. (line 6) +* Liveness representation: Liveness information. + (line 6) +* load address instruction: Simple Constraints. (line 162) +* LOAD_EXTEND_OP: Misc. (line 59) +* 'load_multiple' instruction pattern: Standard Names. (line 136) +* Local Register Allocator (LRA): RTL passes. (line 187) +* LOCAL_ALIGNMENT: Storage Layout. (line 249) +* LOCAL_CLASS_P: Classes. (line 73) +* LOCAL_DECL_ALIGNMENT: Storage Layout. (line 286) +* LOCAL_INCLUDE_DIR: Driver. (line 312) +* LOCAL_LABEL_PREFIX: Instruction Output. (line 151) +* LOCAL_REGNO: Register Basics. (line 101) +* Logical Operators: Logical Operators. (line 6) +* logical-and, bitwise: Arithmetic. (line 159) +* LOGICAL_OP_NON_SHORT_CIRCUIT: Costs. (line 264) +* 'logM2' instruction pattern: Standard Names. (line 607) +* LOG_LINKS: Insns. (line 314) +* 'longjmp' and automatic variables: Interface. (line 52) +* LONG_ACCUM_TYPE_SIZE: Type Layout. (line 92) +* LONG_DOUBLE_TYPE_SIZE: Type Layout. (line 57) +* LONG_FRACT_TYPE_SIZE: Type Layout. (line 72) +* LONG_LONG_ACCUM_TYPE_SIZE: Type Layout. (line 97) +* LONG_LONG_FRACT_TYPE_SIZE: Type Layout. (line 77) +* LONG_LONG_TYPE_SIZE: Type Layout. (line 32) +* LONG_TYPE_SIZE: Type Layout. (line 21) +* Loop analysis: Loop representation. + (line 6) +* Loop manipulation: Loop manipulation. (line 6) +* Loop querying: Loop querying. (line 6) +* Loop representation: Loop representation. + (line 6) +* Loop-closed SSA form: LCSSA. (line 6) +* looping instruction patterns: Looping Patterns. (line 6) +* LOOP_ALIGN: Alignment Output. (line 40) +* LOOP_EXPR: Unary and Binary Expressions. + (line 6) +* lowering, language-dependent intermediate representation: Parsing pass. + (line 13) +* lo_sum: Arithmetic. (line 25) +* 'lrintMN2': Standard Names. (line 684) +* 'lroundMN2': Standard Names. (line 689) +* lshiftrt: Arithmetic. (line 191) +* 'lshiftrt' and attributes: Expressions. (line 83) +* LSHIFT_EXPR: Unary and Binary Expressions. + (line 6) +* 'lshrM3' instruction pattern: Standard Names. (line 526) +* lt: Comparisons. (line 68) +* 'lt' and attributes: Expressions. (line 83) +* LTGT_EXPR: Unary and Binary Expressions. + (line 6) +* lto: LTO. (line 6) +* ltrans: LTO. (line 6) +* ltu: Comparisons. (line 68) +* LT_EXPR: Unary and Binary Expressions. + (line 6) +* 'm' in constraint: Simple Constraints. (line 17) +* machine attributes: Target Attributes. (line 6) +* machine description macros: Target Macros. (line 6) +* machine descriptions: Machine Desc. (line 6) +* machine mode conversions: Conversions. (line 6) +* machine modes: Machine Modes. (line 6) +* machine specific constraints: Machine Constraints. + (line 6) +* machine-independent predicates: Machine-Independent Predicates. + (line 6) +* macros, target description: Target Macros. (line 6) +* 'maddMN4' instruction pattern: Standard Names. (line 449) +* makefile fragment: Fragments. (line 6) +* makefile targets: Makefile. (line 6) +* MAKE_DECL_ONE_ONLY: Label Output. (line 246) +* make_safe_from: Expander Definitions. + (line 151) +* MALLOC_ABI_ALIGNMENT: Storage Layout. (line 168) +* Manipulating GIMPLE statements: Manipulating GIMPLE statements. + (line 6) +* marking roots: GGC Roots. (line 6) +* mark_hook: GTY Options. (line 181) +* MASK_RETURN_ADDR: Exception Region Output. + (line 34) +* matching constraint: Simple Constraints. (line 140) +* matching operands: Output Template. (line 49) +* match_dup: RTL Template. (line 73) +* match_dup <1>: define_peephole2. (line 28) +* 'match_dup' and attributes: Insn Lengths. (line 16) +* match_operand: RTL Template. (line 16) +* 'match_operand' and attributes: Expressions. (line 55) +* match_operator: RTL Template. (line 95) +* match_op_dup: RTL Template. (line 163) +* match_parallel: RTL Template. (line 172) +* match_par_dup: RTL Template. (line 219) +* match_scratch: RTL Template. (line 58) +* match_scratch <1>: define_peephole2. (line 28) +* 'match_test' and attributes: Expressions. (line 64) +* math library: Soft float library routines. + (line 6) +* math, in RTL: Arithmetic. (line 6) +* matherr: Library Calls. (line 59) +* MATH_LIBRARY: Misc. (line 502) +* 'maxM3' instruction pattern: Standard Names. (line 311) +* MAX_BITSIZE_MODE_ANY_INT: Machine Modes. (line 349) +* MAX_BITSIZE_MODE_ANY_MODE: Machine Modes. (line 355) +* MAX_BITS_PER_WORD: Storage Layout. (line 54) +* MAX_CONDITIONAL_EXECUTE: Misc. (line 524) +* MAX_FIXED_MODE_SIZE: Storage Layout. (line 431) +* MAX_MOVE_MAX: Misc. (line 105) +* MAX_OFILE_ALIGNMENT: Storage Layout. (line 203) +* MAX_REGS_PER_ADDRESS: Addressing Modes. (line 42) +* MAX_STACK_ALIGNMENT: Storage Layout. (line 197) +* maybe_undef: GTY Options. (line 190) +* may_trap_p, tree_could_trap_p: Edges. (line 114) +* mcount: Profiling. (line 12) +* MD_CAN_REDIRECT_BRANCH: Misc. (line 711) +* MD_EXEC_PREFIX: Driver. (line 267) +* MD_FALLBACK_FRAME_STATE_FOR: Exception Handling. (line 93) +* MD_HANDLE_UNWABI: Exception Handling. (line 112) +* MD_STARTFILE_PREFIX: Driver. (line 295) +* MD_STARTFILE_PREFIX_1: Driver. (line 300) +* mem: Regs and Memory. (line 370) +* 'mem' and '/c': Flags. (line 81) +* 'mem' and '/f': Flags. (line 85) +* 'mem' and '/j': Flags. (line 70) +* 'mem' and '/u': Flags. (line 134) +* 'mem' and '/v': Flags. (line 76) +* 'mem', RTL sharing: Sharing. (line 40) +* memory model: Memory model. (line 6) +* memory reference, nonoffsettable: Simple Constraints. (line 254) +* memory references in constraints: Simple Constraints. (line 17) +* 'memory_barrier' instruction pattern: Standard Names. (line 1587) +* MEMORY_MOVE_COST: Costs. (line 53) +* memory_operand: Machine-Independent Predicates. + (line 57) +* MEM_ADDR_SPACE: Special Accessors. (line 48) +* MEM_ALIAS_SET: Special Accessors. (line 9) +* MEM_ALIGN: Special Accessors. (line 45) +* MEM_EXPR: Special Accessors. (line 19) +* MEM_KEEP_ALIAS_SET_P: Flags. (line 70) +* MEM_NOTRAP_P: Flags. (line 81) +* MEM_OFFSET: Special Accessors. (line 31) +* MEM_OFFSET_KNOWN_P: Special Accessors. (line 27) +* MEM_POINTER: Flags. (line 85) +* MEM_READONLY_P: Flags. (line 134) +* MEM_REF: Storage References. (line 6) +* 'mem_signal_fenceMODE' instruction pattern: Standard Names. + (line 1857) +* MEM_SIZE: Special Accessors. (line 39) +* MEM_SIZE_KNOWN_P: Special Accessors. (line 35) +* 'mem_thread_fenceMODE' instruction pattern: Standard Names. + (line 1849) +* MEM_VOLATILE_P: Flags. (line 76) +* METHOD_TYPE: Types. (line 6) +* MINIMUM_ALIGNMENT: Storage Layout. (line 299) +* MINIMUM_ATOMIC_ALIGNMENT: Storage Layout. (line 176) +* 'minM3' instruction pattern: Standard Names. (line 311) +* minus: Arithmetic. (line 38) +* 'minus' and attributes: Expressions. (line 83) +* 'minus', canonicalization of: Insn Canonicalizations. + (line 27) +* MINUS_EXPR: Unary and Binary Expressions. + (line 6) +* MIN_UNITS_PER_WORD: Storage Layout. (line 64) +* MIPS coprocessor-definition macros: MIPS Coprocessors. (line 6) +* mnemonic attribute: Mnemonic Attribute. (line 6) +* mod: Arithmetic. (line 137) +* 'mod' and attributes: Expressions. (line 83) +* mode classes: Machine Modes. (line 221) +* mode iterators in '.md' files: Mode Iterators. (line 6) +* mode switching: Mode Switching. (line 6) +* MODES_TIEABLE_P: Values in Registers. + (line 127) +* MODE_ACCUM: Machine Modes. (line 251) +* MODE_AFTER: Mode Switching. (line 48) +* MODE_BASE_REG_CLASS: Register Classes. (line 116) +* MODE_BASE_REG_REG_CLASS: Register Classes. (line 122) +* MODE_CC: Machine Modes. (line 270) +* MODE_CC <1>: MODE_CC Condition Codes. + (line 6) +* MODE_CODE_BASE_REG_CLASS: Register Classes. (line 129) +* MODE_COMPLEX_FLOAT: Machine Modes. (line 262) +* MODE_COMPLEX_INT: Machine Modes. (line 259) +* MODE_DECIMAL_FLOAT: Machine Modes. (line 239) +* MODE_ENTRY: Mode Switching. (line 54) +* MODE_EXIT: Mode Switching. (line 60) +* MODE_FLOAT: Machine Modes. (line 235) +* MODE_FRACT: Machine Modes. (line 243) +* MODE_FUNCTION: Machine Modes. (line 266) +* MODE_INT: Machine Modes. (line 227) +* MODE_NEEDED: Mode Switching. (line 41) +* MODE_PARTIAL_INT: Machine Modes. (line 231) +* MODE_PRIORITY_TO_MODE: Mode Switching. (line 66) +* MODE_RANDOM: Machine Modes. (line 275) +* MODE_UACCUM: Machine Modes. (line 255) +* MODE_UFRACT: Machine Modes. (line 247) +* modifiers in constraints: Modifiers. (line 6) +* MODIFY_EXPR: Unary and Binary Expressions. + (line 6) +* MODIFY_JNI_METHOD_CALL: Misc. (line 798) +* 'modM3' instruction pattern: Standard Names. (line 276) +* modulo scheduling: RTL passes. (line 123) +* MOVE_BY_PIECES_P: Costs. (line 164) +* MOVE_MAX: Misc. (line 100) +* MOVE_MAX_PIECES: Costs. (line 170) +* MOVE_RATIO: Costs. (line 148) +* 'movM' instruction pattern: Standard Names. (line 11) +* 'movmemM' instruction pattern: Standard Names. (line 756) +* 'movmisalignM' instruction pattern: Standard Names. (line 125) +* 'movMODEcc' instruction pattern: Standard Names. (line 1050) +* 'movstr' instruction pattern: Standard Names. (line 791) +* 'movstrictM' instruction pattern: Standard Names. (line 119) +* 'msubMN4' instruction pattern: Standard Names. (line 472) +* 'mulhisi3' instruction pattern: Standard Names. (line 425) +* 'mulM3' instruction pattern: Standard Names. (line 276) +* 'mulqihi3' instruction pattern: Standard Names. (line 429) +* 'mulsidi3' instruction pattern: Standard Names. (line 429) +* mult: Arithmetic. (line 93) +* 'mult' and attributes: Expressions. (line 83) +* 'mult', canonicalization of: Insn Canonicalizations. + (line 27) +* 'mult', canonicalization of <1>: Insn Canonicalizations. + (line 91) +* MULTIARCH_DIRNAME: Target Fragment. (line 170) +* MULTILIB_DEFAULTS: Driver. (line 252) +* MULTILIB_DIRNAMES: Target Fragment. (line 44) +* MULTILIB_EXCEPTIONS: Target Fragment. (line 70) +* MULTILIB_EXTRA_OPTS: Target Fragment. (line 132) +* MULTILIB_MATCHES: Target Fragment. (line 63) +* MULTILIB_OPTIONS: Target Fragment. (line 24) +* MULTILIB_OSDIRNAMES: Target Fragment. (line 139) +* MULTILIB_REQUIRED: Target Fragment. (line 82) +* MULTILIB_REUSE: Target Fragment. (line 103) +* multiple alternative constraints: Multi-Alternative. (line 6) +* MULTIPLE_SYMBOL_SPACES: Misc. (line 482) +* multiplication: Arithmetic. (line 93) +* multiplication with signed saturation: Arithmetic. (line 93) +* multiplication with unsigned saturation: Arithmetic. (line 93) +* MULT_EXPR: Unary and Binary Expressions. + (line 6) +* MULT_HIGHPART_EXPR: Unary and Binary Expressions. + (line 6) +* 'n' in constraint: Simple Constraints. (line 73) +* name: Identifiers. (line 6) +* named address spaces: Named Address Spaces. + (line 6) +* named patterns and conditions: Patterns. (line 47) +* names, pattern: Standard Names. (line 6) +* namespace, scope: Namespaces. (line 6) +* NAMESPACE_DECL: Declarations. (line 6) +* NAMESPACE_DECL <1>: Namespaces. (line 6) +* NATIVE_SYSTEM_HEADER_COMPONENT: Driver. (line 322) +* ne: Comparisons. (line 56) +* 'ne' and attributes: Expressions. (line 83) +* 'nearbyintM2' instruction pattern: Standard Names. (line 666) +* neg: Arithmetic. (line 82) +* 'neg' and attributes: Expressions. (line 83) +* 'neg', canonicalization of: Insn Canonicalizations. + (line 27) +* NEGATE_EXPR: Unary and Binary Expressions. + (line 6) +* negation: Arithmetic. (line 82) +* negation with signed saturation: Arithmetic. (line 82) +* negation with unsigned saturation: Arithmetic. (line 82) +* 'negM2' instruction pattern: Standard Names. (line 538) +* nested functions, trampolines for: Trampolines. (line 6) +* nested_ptr: GTY Options. (line 198) +* next_bb, prev_bb, FOR_EACH_BB, FOR_ALL_BB: Basic Blocks. (line 25) +* NEXT_INSN: Insns. (line 30) +* NEXT_OBJC_RUNTIME: Library Calls. (line 82) +* NE_EXPR: Unary and Binary Expressions. + (line 6) +* nil: RTL Objects. (line 73) +* NM_FLAGS: Macros for Initialization. + (line 110) +* nondeterministic finite state automaton: Processor pipeline description. + (line 304) +* nonimmediate_operand: Machine-Independent Predicates. + (line 100) +* nonlocal goto handler: Edges. (line 171) +* 'nonlocal_goto' instruction pattern: Standard Names. (line 1419) +* 'nonlocal_goto_receiver' instruction pattern: Standard Names. + (line 1436) +* nonmemory_operand: Machine-Independent Predicates. + (line 96) +* nonoffsettable memory reference: Simple Constraints. (line 254) +* NON_LVALUE_EXPR: Unary and Binary Expressions. + (line 6) +* 'nop' instruction pattern: Standard Names. (line 1232) +* NOP_EXPR: Unary and Binary Expressions. + (line 6) +* normal predicates: Predicates. (line 31) +* not: Arithmetic. (line 155) +* 'not' and attributes: Expressions. (line 50) +* not equal: Comparisons. (line 56) +* 'not', canonicalization of: Insn Canonicalizations. + (line 27) +* note: Insns. (line 183) +* 'note' and '/i': Flags. (line 59) +* 'note' and '/v': Flags. (line 44) +* NOTE_INSN_BASIC_BLOCK: Basic Blocks. (line 50) +* NOTE_INSN_BASIC_BLOCK <1>: Basic Blocks. (line 52) +* NOTE_INSN_BLOCK_BEG: Insns. (line 208) +* NOTE_INSN_BLOCK_END: Insns. (line 208) +* NOTE_INSN_DELETED: Insns. (line 198) +* NOTE_INSN_DELETED_LABEL: Insns. (line 203) +* NOTE_INSN_EH_REGION_BEG: Insns. (line 214) +* NOTE_INSN_EH_REGION_END: Insns. (line 214) +* NOTE_INSN_FUNCTION_BEG: Insns. (line 221) +* NOTE_INSN_VAR_LOCATION: Insns. (line 225) +* NOTE_LINE_NUMBER: Insns. (line 183) +* NOTE_SOURCE_FILE: Insns. (line 183) +* NOTE_VAR_LOCATION: Insns. (line 225) +* NOTICE_UPDATE_CC: CC0 Condition Codes. + (line 30) +* NO_DBX_BNSYM_ENSYM: DBX Hooks. (line 25) +* NO_DBX_FUNCTION_END: DBX Hooks. (line 19) +* NO_DBX_GCC_MARKER: File Names and DBX. (line 27) +* NO_DBX_MAIN_SOURCE_DIRECTORY: File Names and DBX. (line 22) +* NO_DOLLAR_IN_LABEL: Label Output. (line 64) +* NO_DOT_IN_LABEL: Label Output. (line 70) +* NO_FUNCTION_CSE: Costs. (line 260) +* NO_IMPLICIT_EXTERN_C: Misc. (line 381) +* NO_PROFILE_COUNTERS: Profiling. (line 27) +* NO_REGS: Register Classes. (line 17) +* Number of iterations analysis: Number of iterations. + (line 6) +* NUM_MACHINE_MODES: Machine Modes. (line 288) +* NUM_MODES_FOR_MODE_SWITCHING: Mode Switching. (line 29) +* N_REG_CLASSES: Register Classes. (line 81) +* 'o' in constraint: Simple Constraints. (line 23) +* OBJC_GEN_METHOD_LABEL: Label Output. (line 447) +* OBJC_JBLEN: Misc. (line 991) +* OBJECT_FORMAT_COFF: Macros for Initialization. + (line 96) +* offsettable address: Simple Constraints. (line 23) +* OFFSET_TYPE: Types. (line 6) +* OImode: Machine Modes. (line 51) +* Omega a solver for linear programming problems: Omega. (line 6) +* OMP_ATOMIC: OpenMP. (line 6) +* OMP_CLAUSE: OpenMP. (line 6) +* OMP_CONTINUE: OpenMP. (line 6) +* OMP_CRITICAL: OpenMP. (line 6) +* OMP_FOR: OpenMP. (line 6) +* OMP_MASTER: OpenMP. (line 6) +* OMP_ORDERED: OpenMP. (line 6) +* OMP_PARALLEL: OpenMP. (line 6) +* OMP_RETURN: OpenMP. (line 6) +* OMP_SECTION: OpenMP. (line 6) +* OMP_SECTIONS: OpenMP. (line 6) +* OMP_SINGLE: OpenMP. (line 6) +* 'one_cmplM2' instruction pattern: Standard Names. (line 753) +* operand access: Accessors. (line 6) +* Operand Access Routines: SSA Operands. (line 116) +* operand constraints: Constraints. (line 6) +* Operand Iterators: SSA Operands. (line 116) +* operand predicates: Predicates. (line 6) +* operand substitution: Output Template. (line 6) +* Operands: Operands. (line 6) +* operands: SSA Operands. (line 6) +* operands <1>: Patterns. (line 53) +* operator predicates: Predicates. (line 6) +* 'optc-gen.awk': Options. (line 6) +* OPTGROUP_ALL: Optimization groups. + (line 25) +* OPTGROUP_INLINE: Optimization groups. + (line 15) +* OPTGROUP_IPA: Optimization groups. + (line 9) +* OPTGROUP_LOOP: Optimization groups. + (line 12) +* OPTGROUP_OTHER: Optimization groups. + (line 21) +* OPTGROUP_VEC: Optimization groups. + (line 18) +* optimization dumps: Optimization info. (line 6) +* optimization groups: Optimization groups. + (line 6) +* optimization info file names: Dump files and streams. + (line 6) +* Optimization infrastructure for GIMPLE: Tree SSA. (line 6) +* OPTIMIZE_MODE_SWITCHING: Mode Switching. (line 8) +* option specification files: Options. (line 6) +* optional hardware or system features: Run-time Target. (line 59) +* options, directory search: Including Patterns. (line 45) +* OPTION_DEFAULT_SPECS: Driver. (line 25) +* order of register allocation: Allocation Order. (line 6) +* ordered_comparison_operator: Machine-Independent Predicates. + (line 115) +* ORDERED_EXPR: Unary and Binary Expressions. + (line 6) +* Ordering of Patterns: Pattern Ordering. (line 6) +* ORIGINAL_REGNO: Special Accessors. (line 53) +* other register constraints: Simple Constraints. (line 171) +* outgoing_args_size: Stack Arguments. (line 48) +* OUTGOING_REGNO: Register Basics. (line 94) +* OUTGOING_REG_PARM_STACK_SPACE: Stack Arguments. (line 73) +* output of assembler code: File Framework. (line 6) +* output statements: Output Statement. (line 6) +* output templates: Output Template. (line 6) +* output_asm_insn: Output Statement. (line 52) +* OUTPUT_QUOTED_STRING: File Framework. (line 106) +* OVERLAPPING_REGISTER_NAMES: Instruction Output. (line 20) +* OVERLOAD: Functions for C++. (line 6) +* OVERRIDE_ABI_FORMAT: Register Arguments. (line 139) +* OVL_CURRENT: Functions for C++. (line 6) +* OVL_NEXT: Functions for C++. (line 6) +* 'p' in constraint: Simple Constraints. (line 162) +* PAD_VARARGS_DOWN: Register Arguments. (line 220) +* parallel: Side Effects. (line 209) +* parameters, c++ abi: C++ ABI. (line 6) +* parameters, miscellaneous: Misc. (line 6) +* parameters, precompiled headers: PCH Target. (line 6) +* paramN_is: GTY Options. (line 138) +* param_is: GTY Options. (line 119) +* parity: Arithmetic. (line 243) +* 'parityM2' instruction pattern: Standard Names. (line 747) +* PARM_BOUNDARY: Storage Layout. (line 133) +* PARM_DECL: Declarations. (line 6) +* PARSE_LDD_OUTPUT: Macros for Initialization. + (line 125) +* pass dumps: Passes. (line 6) +* passes and files of the compiler: Passes. (line 6) +* passing arguments: Interface. (line 36) +* pass_duplicate_computed_gotos: Edges. (line 161) +* PATH_SEPARATOR: Filesystem. (line 31) +* PATTERN: Insns. (line 284) +* pattern conditions: Patterns. (line 43) +* pattern names: Standard Names. (line 6) +* Pattern Ordering: Pattern Ordering. (line 6) +* patterns: Patterns. (line 6) +* pc: Regs and Memory. (line 357) +* 'pc' and attributes: Insn Lengths. (line 20) +* 'pc', RTL sharing: Sharing. (line 25) +* PCC_BITFIELD_TYPE_MATTERS: Storage Layout. (line 325) +* PCC_STATIC_STRUCT_RETURN: Aggregate Return. (line 64) +* PC_REGNUM: Register Basics. (line 108) +* pc_rtx: Regs and Memory. (line 362) +* PDImode: Machine Modes. (line 40) +* peephole optimization, RTL representation: Side Effects. (line 243) +* peephole optimizer definitions: Peephole Definitions. + (line 6) +* per-function data: Per-Function Data. (line 6) +* percent sign: Output Template. (line 6) +* PHI nodes: SSA. (line 31) +* PIC: PIC. (line 6) +* PIC_OFFSET_TABLE_REGNUM: PIC. (line 15) +* PIC_OFFSET_TABLE_REG_CALL_CLOBBERED: PIC. (line 25) +* pipeline hazard recognizer: Processor pipeline description. + (line 6) +* pipeline hazard recognizer <1>: Processor pipeline description. + (line 53) +* Plugins: Plugins. (line 6) +* plus: Arithmetic. (line 14) +* 'plus' and attributes: Expressions. (line 83) +* 'plus', canonicalization of: Insn Canonicalizations. + (line 27) +* PLUS_EXPR: Unary and Binary Expressions. + (line 6) +* Pmode: Misc. (line 329) +* pmode_register_operand: Machine-Independent Predicates. + (line 34) +* pointer: Types. (line 6) +* POINTERS_EXTEND_UNSIGNED: Storage Layout. (line 76) +* POINTER_PLUS_EXPR: Unary and Binary Expressions. + (line 6) +* POINTER_SIZE: Storage Layout. (line 70) +* POINTER_TYPE: Types. (line 6) +* popcount: Arithmetic. (line 239) +* 'popcountM2' instruction pattern: Standard Names. (line 741) +* pops_args: Function Entry. (line 104) +* pop_operand: Machine-Independent Predicates. + (line 87) +* portability: Portability. (line 6) +* position independent code: PIC. (line 6) +* POSTDECREMENT_EXPR: Unary and Binary Expressions. + (line 6) +* POSTINCREMENT_EXPR: Unary and Binary Expressions. + (line 6) +* post_dec: Incdec. (line 25) +* post_inc: Incdec. (line 30) +* post_modify: Incdec. (line 33) +* post_order_compute, inverted_post_order_compute, walk_dominator_tree: Basic Blocks. + (line 34) +* POWI_MAX_MULTS: Misc. (line 860) +* 'powM3' instruction pattern: Standard Names. (line 615) +* pragma: Misc. (line 387) +* PREDECREMENT_EXPR: Unary and Binary Expressions. + (line 6) +* predefined macros: Run-time Target. (line 6) +* predicates: Predicates. (line 6) +* predicates and machine modes: Predicates. (line 31) +* predication: Conditional Execution. + (line 6) +* predict.def: Profile information. + (line 24) +* PREFERRED_DEBUGGING_TYPE: All Debuggers. (line 41) +* PREFERRED_RELOAD_CLASS: Register Classes. (line 249) +* PREFERRED_STACK_BOUNDARY: Storage Layout. (line 147) +* prefetch: Side Effects. (line 323) +* 'prefetch' and '/v': Flags. (line 214) +* 'prefetch' instruction pattern: Standard Names. (line 1562) +* PREFETCH_SCHEDULE_BARRIER_P: Flags. (line 214) +* PREINCREMENT_EXPR: Unary and Binary Expressions. + (line 6) +* presence_set: Processor pipeline description. + (line 223) +* preserving SSA form: SSA. (line 74) +* preserving virtual SSA form: SSA. (line 182) +* pretend_args_size: Function Entry. (line 110) +* prev_active_insn: define_peephole. (line 60) +* PREV_INSN: Insns. (line 26) +* pre_dec: Incdec. (line 8) +* PRE_GCC3_DWARF_FRAME_REGISTERS: Frame Registers. (line 126) +* pre_inc: Incdec. (line 22) +* pre_modify: Incdec. (line 52) +* PRINT_OPERAND: Instruction Output. (line 95) +* PRINT_OPERAND_ADDRESS: Instruction Output. (line 122) +* PRINT_OPERAND_PUNCT_VALID_P: Instruction Output. (line 115) +* 'probe_stack' instruction pattern: Standard Names. (line 1411) +* 'probe_stack_address' instruction pattern: Standard Names. (line 1404) +* processor functional units: Processor pipeline description. + (line 6) +* processor functional units <1>: Processor pipeline description. + (line 68) +* processor pipeline description: Processor pipeline description. + (line 6) +* product: Arithmetic. (line 93) +* profile feedback: Profile information. + (line 14) +* profile representation: Profile information. + (line 6) +* PROFILE_BEFORE_PROLOGUE: Profiling. (line 34) +* PROFILE_HOOK: Profiling. (line 22) +* profiling, code generation: Profiling. (line 6) +* program counter: Regs and Memory. (line 358) +* prologue: Function Entry. (line 6) +* 'prologue' instruction pattern: Standard Names. (line 1500) +* PROMOTE_MODE: Storage Layout. (line 87) +* pseudo registers: Regs and Memory. (line 9) +* PSImode: Machine Modes. (line 32) +* PTRDIFF_TYPE: Type Layout. (line 200) +* purge_dead_edges: Edges. (line 103) +* purge_dead_edges <1>: Maintaining the CFG. + (line 81) +* push address instruction: Simple Constraints. (line 162) +* 'pushM1' instruction pattern: Standard Names. (line 253) +* PUSH_ARGS: Stack Arguments. (line 17) +* PUSH_ARGS_REVERSED: Stack Arguments. (line 25) +* push_operand: Machine-Independent Predicates. + (line 80) +* push_reload: Addressing Modes. (line 176) +* PUSH_ROUNDING: Stack Arguments. (line 31) +* PUT_CODE: RTL Objects. (line 47) +* PUT_MODE: Machine Modes. (line 285) +* PUT_REG_NOTE_KIND: Insns. (line 346) +* PUT_SDB_: SDB and DWARF. (line 105) +* QCmode: Machine Modes. (line 199) +* QFmode: Machine Modes. (line 57) +* QImode: Machine Modes. (line 25) +* 'QImode', in 'insn': Insns. (line 268) +* QQmode: Machine Modes. (line 106) +* qualified type: Types. (line 6) +* qualified type <1>: Types for C++. (line 6) +* querying function unit reservations: Processor pipeline description. + (line 90) +* question mark: Multi-Alternative. (line 41) +* quotient: Arithmetic. (line 117) +* 'r' in constraint: Simple Constraints. (line 64) +* RDIV_EXPR: Unary and Binary Expressions. + (line 6) +* READONLY_DATA_SECTION_ASM_OP: Sections. (line 62) +* real operands: SSA Operands. (line 6) +* REALPART_EXPR: Unary and Binary Expressions. + (line 6) +* REAL_ARITHMETIC: Floating Point. (line 64) +* REAL_CST: Constant expressions. + (line 6) +* REAL_LIBGCC_SPEC: Driver. (line 124) +* REAL_NM_FILE_NAME: Macros for Initialization. + (line 105) +* REAL_TYPE: Types. (line 6) +* REAL_VALUES_EQUAL: Floating Point. (line 31) +* REAL_VALUES_LESS: Floating Point. (line 37) +* REAL_VALUE_ABS: Floating Point. (line 81) +* REAL_VALUE_ATOF: Floating Point. (line 48) +* REAL_VALUE_FIX: Floating Point. (line 40) +* REAL_VALUE_FROM_INT: Floating Point. (line 90) +* REAL_VALUE_ISINF: Floating Point. (line 58) +* REAL_VALUE_ISNAN: Floating Point. (line 61) +* REAL_VALUE_NEGATE: Floating Point. (line 78) +* REAL_VALUE_NEGATIVE: Floating Point. (line 55) +* REAL_VALUE_TO_INT: Floating Point. (line 84) +* REAL_VALUE_TO_TARGET_DECIMAL128: Data Output. (line 143) +* REAL_VALUE_TO_TARGET_DECIMAL32: Data Output. (line 141) +* REAL_VALUE_TO_TARGET_DECIMAL64: Data Output. (line 142) +* REAL_VALUE_TO_TARGET_DOUBLE: Data Output. (line 139) +* REAL_VALUE_TO_TARGET_LONG_DOUBLE: Data Output. (line 140) +* REAL_VALUE_TO_TARGET_SINGLE: Data Output. (line 138) +* REAL_VALUE_TYPE: Floating Point. (line 25) +* REAL_VALUE_UNSIGNED_FIX: Floating Point. (line 43) +* recognizing insns: RTL Template. (line 6) +* recog_data.operand: Instruction Output. (line 54) +* RECORD_TYPE: Types. (line 6) +* RECORD_TYPE <1>: Classes. (line 6) +* redirect_edge_and_branch: Profile information. + (line 71) +* redirect_edge_and_branch, redirect_jump: Maintaining the CFG. + (line 90) +* 'reduc_smax_M' instruction pattern: Standard Names. (line 317) +* 'reduc_smin_M' instruction pattern: Standard Names. (line 317) +* 'reduc_splus_M' instruction pattern: Standard Names. (line 329) +* 'reduc_umax_M' instruction pattern: Standard Names. (line 323) +* 'reduc_umin_M' instruction pattern: Standard Names. (line 323) +* 'reduc_uplus_M' instruction pattern: Standard Names. (line 335) +* reference: Types. (line 6) +* REFERENCE_TYPE: Types. (line 6) +* reg: Regs and Memory. (line 9) +* 'reg' and '/f': Flags. (line 94) +* 'reg' and '/i': Flags. (line 89) +* 'reg' and '/v': Flags. (line 98) +* 'reg', RTL sharing: Sharing. (line 17) +* regclass_for_constraint: C Constraint Interface. + (line 58) +* register allocation order: Allocation Order. (line 6) +* register class definitions: Register Classes. (line 6) +* register class preference constraints: Class Preferences. (line 6) +* register pairs: Values in Registers. + (line 69) +* Register Transfer Language (RTL): RTL. (line 6) +* register usage: Registers. (line 6) +* registers arguments: Register Arguments. (line 6) +* registers in constraints: Simple Constraints. (line 64) +* REGISTER_MOVE_COST: Costs. (line 9) +* REGISTER_NAMES: Instruction Output. (line 8) +* register_operand: Machine-Independent Predicates. + (line 29) +* REGISTER_PREFIX: Instruction Output. (line 150) +* REGISTER_TARGET_PRAGMAS: Misc. (line 387) +* REGMODE_NATURAL_SIZE: Values in Registers. + (line 49) +* REGNO_MODE_CODE_OK_FOR_BASE_P: Register Classes. (line 172) +* REGNO_MODE_OK_FOR_BASE_P: Register Classes. (line 150) +* REGNO_MODE_OK_FOR_REG_BASE_P: Register Classes. (line 160) +* REGNO_OK_FOR_BASE_P: Register Classes. (line 146) +* REGNO_OK_FOR_INDEX_P: Register Classes. (line 186) +* REGNO_REG_CLASS: Register Classes. (line 105) +* regs_ever_live: Function Entry. (line 21) +* regular expressions: Processor pipeline description. + (line 6) +* regular expressions <1>: Processor pipeline description. + (line 105) +* REG_ALLOC_ORDER: Allocation Order. (line 8) +* REG_BR_PRED: Insns. (line 526) +* REG_BR_PROB: Insns. (line 519) +* REG_BR_PROB_BASE, BB_FREQ_BASE, count: Profile information. + (line 82) +* REG_BR_PROB_BASE, EDGE_FREQUENCY: Profile information. + (line 52) +* REG_CC_SETTER: Insns. (line 491) +* REG_CC_USER: Insns. (line 491) +* reg_class_contents: Register Basics. (line 59) +* REG_CLASS_CONTENTS: Register Classes. (line 91) +* REG_CLASS_FROM_CONSTRAINT: Old Constraints. (line 33) +* REG_CLASS_FROM_LETTER: Old Constraints. (line 25) +* REG_CLASS_NAMES: Register Classes. (line 86) +* REG_CROSSING_JUMP: Insns. (line 405) +* REG_DEAD: Insns. (line 357) +* REG_DEAD, REG_UNUSED: Liveness information. + (line 32) +* REG_DEP_ANTI: Insns. (line 513) +* REG_DEP_OUTPUT: Insns. (line 509) +* REG_DEP_TRUE: Insns. (line 506) +* REG_EH_REGION, EDGE_ABNORMAL_CALL: Edges. (line 109) +* REG_EQUAL: Insns. (line 420) +* REG_EQUIV: Insns. (line 420) +* REG_EXPR: Special Accessors. (line 58) +* REG_FRAME_RELATED_EXPR: Insns. (line 532) +* REG_FUNCTION_VALUE_P: Flags. (line 89) +* REG_INC: Insns. (line 373) +* 'reg_label' and '/v': Flags. (line 65) +* REG_LABEL_OPERAND: Insns. (line 387) +* REG_LABEL_TARGET: Insns. (line 396) +* reg_names: Register Basics. (line 59) +* reg_names <1>: Instruction Output. (line 107) +* REG_NONNEG: Insns. (line 379) +* REG_NOTES: Insns. (line 321) +* REG_NOTE_KIND: Insns. (line 346) +* REG_OFFSET: Special Accessors. (line 62) +* REG_OK_STRICT: Addressing Modes. (line 99) +* REG_PARM_STACK_SPACE: Stack Arguments. (line 58) +* 'REG_PARM_STACK_SPACE', and 'TARGET_FUNCTION_ARG': Register Arguments. + (line 50) +* REG_POINTER: Flags. (line 94) +* REG_SETJMP: Insns. (line 414) +* REG_UNUSED: Insns. (line 366) +* REG_USERVAR_P: Flags. (line 98) +* REG_VALUE_IN_UNWIND_CONTEXT: Frame Registers. (line 158) +* REG_WORDS_BIG_ENDIAN: Storage Layout. (line 35) +* relative costs: Costs. (line 6) +* RELATIVE_PREFIX_NOT_LINKDIR: Driver. (line 262) +* reloading: RTL passes. (line 170) +* reload_completed: Standard Names. (line 1199) +* 'reload_in' instruction pattern: Standard Names. (line 98) +* reload_in_progress: Standard Names. (line 57) +* 'reload_out' instruction pattern: Standard Names. (line 98) +* remainder: Arithmetic. (line 137) +* 'remainderM3' instruction pattern: Standard Names. (line 561) +* reorder: GTY Options. (line 224) +* representation of RTL: RTL. (line 6) +* reservation delays: Processor pipeline description. + (line 6) +* 'restore_stack_block' instruction pattern: Standard Names. (line 1325) +* 'restore_stack_function' instruction pattern: Standard Names. + (line 1325) +* 'restore_stack_nonlocal' instruction pattern: Standard Names. + (line 1325) +* rest_of_decl_compilation: Parsing pass. (line 51) +* rest_of_type_compilation: Parsing pass. (line 51) +* RESULT_DECL: Declarations. (line 6) +* return: Side Effects. (line 72) +* 'return' instruction pattern: Standard Names. (line 1173) +* return values in registers: Scalar Return. (line 6) +* returning aggregate values: Aggregate Return. (line 6) +* returning structures and unions: Interface. (line 10) +* RETURN_ADDRESS_POINTER_REGNUM: Frame Registers. (line 64) +* RETURN_ADDR_IN_PREVIOUS_FRAME: Frame Layout. (line 133) +* RETURN_ADDR_OFFSET: Exception Handling. (line 59) +* RETURN_ADDR_RTX: Frame Layout. (line 122) +* RETURN_EXPR: Statements for C++. (line 6) +* RETURN_STMT: Statements for C++. (line 6) +* return_val: Flags. (line 274) +* 'return_val', in 'call_insn': Flags. (line 24) +* 'return_val', in 'reg': Flags. (line 89) +* 'return_val', in 'symbol_ref': Flags. (line 202) +* reverse probability: Profile information. + (line 66) +* REVERSE_CONDITION: MODE_CC Condition Codes. + (line 90) +* REVERSIBLE_CC_MODE: MODE_CC Condition Codes. + (line 76) +* right rotate: Arithmetic. (line 196) +* right shift: Arithmetic. (line 191) +* 'rintM2' instruction pattern: Standard Names. (line 674) +* RISC: Processor pipeline description. + (line 6) +* RISC <1>: Processor pipeline description. + (line 223) +* roots, marking: GGC Roots. (line 6) +* rotate: Arithmetic. (line 196) +* rotate <1>: Arithmetic. (line 196) +* rotatert: Arithmetic. (line 196) +* 'rotlM3' instruction pattern: Standard Names. (line 526) +* 'rotrM3' instruction pattern: Standard Names. (line 526) +* 'roundM2' instruction pattern: Standard Names. (line 650) +* ROUND_DIV_EXPR: Unary and Binary Expressions. + (line 6) +* ROUND_MOD_EXPR: Unary and Binary Expressions. + (line 6) +* ROUND_TOWARDS_ZERO: Storage Layout. (line 474) +* ROUND_TYPE_ALIGN: Storage Layout. (line 422) +* RSHIFT_EXPR: Unary and Binary Expressions. + (line 6) +* RTL addition: Arithmetic. (line 14) +* RTL addition with signed saturation: Arithmetic. (line 14) +* RTL addition with unsigned saturation: Arithmetic. (line 14) +* RTL classes: RTL Classes. (line 6) +* RTL comparison: Arithmetic. (line 46) +* RTL comparison operations: Comparisons. (line 6) +* RTL constant expression types: Constants. (line 6) +* RTL constants: Constants. (line 6) +* RTL declarations: RTL Declarations. (line 6) +* RTL difference: Arithmetic. (line 38) +* RTL expression: RTL Objects. (line 6) +* RTL expressions for arithmetic: Arithmetic. (line 6) +* RTL format: RTL Classes. (line 72) +* RTL format characters: RTL Classes. (line 77) +* RTL function-call insns: Calls. (line 6) +* RTL insn template: RTL Template. (line 6) +* RTL integers: RTL Objects. (line 6) +* RTL memory expressions: Regs and Memory. (line 6) +* RTL object types: RTL Objects. (line 6) +* RTL postdecrement: Incdec. (line 6) +* RTL postincrement: Incdec. (line 6) +* RTL predecrement: Incdec. (line 6) +* RTL preincrement: Incdec. (line 6) +* RTL register expressions: Regs and Memory. (line 6) +* RTL representation: RTL. (line 6) +* RTL side effect expressions: Side Effects. (line 6) +* RTL strings: RTL Objects. (line 6) +* RTL structure sharing assumptions: Sharing. (line 6) +* RTL subtraction: Arithmetic. (line 38) +* RTL subtraction with signed saturation: Arithmetic. (line 38) +* RTL subtraction with unsigned saturation: Arithmetic. (line 38) +* RTL sum: Arithmetic. (line 14) +* RTL vectors: RTL Objects. (line 6) +* RTL_CONST_CALL_P: Flags. (line 19) +* RTL_CONST_OR_PURE_CALL_P: Flags. (line 29) +* RTL_LOOPING_CONST_OR_PURE_CALL_P: Flags. (line 33) +* RTL_PURE_CALL_P: Flags. (line 24) +* RTX (See RTL): RTL Objects. (line 6) +* RTX codes, classes of: RTL Classes. (line 6) +* RTX_FRAME_RELATED_P: Flags. (line 107) +* run-time conventions: Interface. (line 6) +* run-time target specification: Run-time Target. (line 6) +* 's' in constraint: Simple Constraints. (line 100) +* same_type_p: Types. (line 86) +* SAmode: Machine Modes. (line 150) +* 'satfractMN2' instruction pattern: Standard Names. (line 938) +* 'satfractunsMN2' instruction pattern: Standard Names. (line 951) +* satisfies_constraint_: C Constraint Interface. + (line 46) +* sat_fract: Conversions. (line 90) +* SAVE_EXPR: Unary and Binary Expressions. + (line 6) +* 'save_stack_block' instruction pattern: Standard Names. (line 1325) +* 'save_stack_function' instruction pattern: Standard Names. (line 1325) +* 'save_stack_nonlocal' instruction pattern: Standard Names. (line 1325) +* SBSS_SECTION_ASM_OP: Sections. (line 75) +* Scalar evolutions: Scalar evolutions. (line 6) +* scalars, returned as values: Scalar Return. (line 6) +* SCHED_GROUP_P: Flags. (line 148) +* SCmode: Machine Modes. (line 199) +* scratch: Regs and Memory. (line 294) +* scratch operands: Regs and Memory. (line 294) +* 'scratch', RTL sharing: Sharing. (line 35) +* scratch_operand: Machine-Independent Predicates. + (line 49) +* SDATA_SECTION_ASM_OP: Sections. (line 57) +* SDB_ALLOW_FORWARD_REFERENCES: SDB and DWARF. (line 123) +* SDB_ALLOW_UNKNOWN_REFERENCES: SDB and DWARF. (line 118) +* SDB_DEBUGGING_INFO: SDB and DWARF. (line 8) +* SDB_DELIM: SDB and DWARF. (line 111) +* SDB_OUTPUT_SOURCE_LINE: SDB and DWARF. (line 128) +* SDmode: Machine Modes. (line 88) +* 'sdot_prodM' instruction pattern: Standard Names. (line 341) +* search options: Including Patterns. (line 45) +* SECONDARY_INPUT_RELOAD_CLASS: Register Classes. (line 391) +* SECONDARY_MEMORY_NEEDED: Register Classes. (line 447) +* SECONDARY_MEMORY_NEEDED_MODE: Register Classes. (line 466) +* SECONDARY_MEMORY_NEEDED_RTX: Register Classes. (line 457) +* SECONDARY_OUTPUT_RELOAD_CLASS: Register Classes. (line 392) +* SECONDARY_RELOAD_CLASS: Register Classes. (line 390) +* SELECT_CC_MODE: MODE_CC Condition Codes. + (line 6) +* sequence: Side Effects. (line 258) +* Sequence iterators: Sequence iterators. (line 6) +* set: Side Effects. (line 15) +* 'set' and '/f': Flags. (line 107) +* 'setmemM' instruction pattern: Standard Names. (line 802) +* SETUP_FRAME_ADDRESSES: Frame Layout. (line 100) +* SET_ASM_OP: Label Output. (line 416) +* SET_ASM_OP <1>: Label Output. (line 427) +* set_attr: Tagging Insns. (line 31) +* set_attr_alternative: Tagging Insns. (line 49) +* set_bb_seq: GIMPLE sequences. (line 75) +* SET_BY_PIECES_P: Costs. (line 205) +* SET_DEST: Side Effects. (line 69) +* SET_IS_RETURN_P: Flags. (line 157) +* SET_LABEL_KIND: Insns. (line 146) +* set_optab_libfunc: Library Calls. (line 15) +* SET_RATIO: Costs. (line 193) +* SET_SRC: Side Effects. (line 69) +* 'set_thread_pointerMODE' instruction pattern: Standard Names. + (line 1869) +* SET_TYPE_STRUCTURAL_EQUALITY: Types. (line 6) +* SET_TYPE_STRUCTURAL_EQUALITY <1>: Types. (line 81) +* SFmode: Machine Modes. (line 69) +* SF_SIZE: Type Layout. (line 135) +* sharing of RTL components: Sharing. (line 6) +* shift: Arithmetic. (line 174) +* SHIFT_COUNT_TRUNCATED: Misc. (line 112) +* SHLIB_SUFFIX: Macros for Initialization. + (line 133) +* SHORT_ACCUM_TYPE_SIZE: Type Layout. (line 82) +* SHORT_FRACT_TYPE_SIZE: Type Layout. (line 62) +* SHORT_IMMEDIATES_SIGN_EXTEND: Misc. (line 86) +* SHORT_TYPE_SIZE: Type Layout. (line 15) +* 'sibcall_epilogue' instruction pattern: Standard Names. (line 1532) +* sibling call: Edges. (line 121) +* SIBLING_CALL_P: Flags. (line 161) +* signed division: Arithmetic. (line 117) +* signed division with signed saturation: Arithmetic. (line 117) +* signed maximum: Arithmetic. (line 142) +* signed minimum: Arithmetic. (line 142) +* sign_extend: Conversions. (line 23) +* sign_extract: Bit-Fields. (line 8) +* 'sign_extract', canonicalization of: Insn Canonicalizations. + (line 87) +* SIG_ATOMIC_TYPE: Type Layout. (line 251) +* SImode: Machine Modes. (line 37) +* simple constraints: Simple Constraints. (line 6) +* simple_return: Side Effects. (line 86) +* 'simple_return' instruction pattern: Standard Names. (line 1188) +* 'sincosM3' instruction pattern: Standard Names. (line 586) +* 'sinM2' instruction pattern: Standard Names. (line 578) +* SIZETYPE: Type Layout. (line 190) +* SIZE_ASM_OP: Label Output. (line 33) +* SIZE_TYPE: Type Layout. (line 174) +* skip: GTY Options. (line 76) +* SLOW_BYTE_ACCESS: Costs. (line 117) +* SLOW_UNALIGNED_ACCESS: Costs. (line 132) +* smax: Arithmetic. (line 142) +* smin: Arithmetic. (line 142) +* sms, swing, software pipelining: RTL passes. (line 123) +* 'smulM3_highpart' instruction pattern: Standard Names. (line 441) +* soft float library: Soft float library routines. + (line 6) +* special: GTY Options. (line 311) +* special predicates: Predicates. (line 31) +* SPECS: Target Fragment. (line 191) +* speed of instructions: Costs. (line 6) +* splitting instructions: Insn Splitting. (line 6) +* split_block: Maintaining the CFG. + (line 97) +* SQmode: Machine Modes. (line 114) +* sqrt: Arithmetic. (line 207) +* 'sqrtM2' instruction pattern: Standard Names. (line 544) +* square root: Arithmetic. (line 207) +* SSA: SSA. (line 6) +* 'ssaddM3' instruction pattern: Standard Names. (line 276) +* 'ssashlM3' instruction pattern: Standard Names. (line 516) +* SSA_NAME_DEF_STMT: SSA. (line 216) +* SSA_NAME_VERSION: SSA. (line 221) +* 'ssdivM3' instruction pattern: Standard Names. (line 276) +* 'ssmaddMN4' instruction pattern: Standard Names. (line 464) +* 'ssmsubMN4' instruction pattern: Standard Names. (line 488) +* 'ssmulM3' instruction pattern: Standard Names. (line 276) +* 'ssnegM2' instruction pattern: Standard Names. (line 538) +* 'sssubM3' instruction pattern: Standard Names. (line 276) +* 'ssum_widenM3' instruction pattern: Standard Names. (line 350) +* ss_abs: Arithmetic. (line 201) +* ss_ashift: Arithmetic. (line 174) +* ss_div: Arithmetic. (line 117) +* ss_minus: Arithmetic. (line 38) +* ss_mult: Arithmetic. (line 93) +* ss_neg: Arithmetic. (line 82) +* ss_plus: Arithmetic. (line 14) +* ss_truncate: Conversions. (line 43) +* stack arguments: Stack Arguments. (line 6) +* stack frame layout: Frame Layout. (line 6) +* stack smashing protection: Stack Smashing Protection. + (line 6) +* STACK_ALIGNMENT_NEEDED: Frame Layout. (line 47) +* STACK_BOUNDARY: Storage Layout. (line 139) +* STACK_CHECK_BUILTIN: Stack Checking. (line 31) +* STACK_CHECK_FIXED_FRAME_SIZE: Stack Checking. (line 82) +* STACK_CHECK_MAX_FRAME_SIZE: Stack Checking. (line 73) +* STACK_CHECK_MAX_VAR_SIZE: Stack Checking. (line 89) +* STACK_CHECK_MOVING_SP: Stack Checking. (line 53) +* STACK_CHECK_PROBE_INTERVAL_EXP: Stack Checking. (line 45) +* STACK_CHECK_PROTECT: Stack Checking. (line 62) +* STACK_CHECK_STATIC_BUILTIN: Stack Checking. (line 38) +* STACK_DYNAMIC_OFFSET: Frame Layout. (line 73) +* 'STACK_DYNAMIC_OFFSET' and virtual registers: Regs and Memory. + (line 83) +* STACK_GROWS_DOWNWARD: Frame Layout. (line 8) +* STACK_PARMS_IN_REG_PARM_AREA: Stack Arguments. (line 83) +* STACK_POINTER_OFFSET: Frame Layout. (line 57) +* 'STACK_POINTER_OFFSET' and virtual registers: Regs and Memory. + (line 93) +* STACK_POINTER_REGNUM: Frame Registers. (line 8) +* 'STACK_POINTER_REGNUM' and virtual registers: Regs and Memory. + (line 83) +* stack_pointer_rtx: Frame Registers. (line 104) +* 'stack_protect_set' instruction pattern: Standard Names. (line 1879) +* 'stack_protect_test' instruction pattern: Standard Names. (line 1890) +* STACK_PUSH_CODE: Frame Layout. (line 16) +* STACK_REGS: Stack Registers. (line 19) +* STACK_REG_COVER_CLASS: Stack Registers. (line 22) +* STACK_SAVEAREA_MODE: Storage Layout. (line 438) +* STACK_SIZE_MODE: Storage Layout. (line 449) +* STACK_SLOT_ALIGNMENT: Storage Layout. (line 270) +* standard pattern names: Standard Names. (line 6) +* STANDARD_STARTFILE_PREFIX: Driver. (line 274) +* STANDARD_STARTFILE_PREFIX_1: Driver. (line 281) +* STANDARD_STARTFILE_PREFIX_2: Driver. (line 288) +* STARTFILE_SPEC: Driver. (line 147) +* STARTING_FRAME_OFFSET: Frame Layout. (line 38) +* 'STARTING_FRAME_OFFSET' and virtual registers: Regs and Memory. + (line 74) +* Statement and operand traversals: Statement and operand traversals. + (line 6) +* Statement Sequences: Statement Sequences. + (line 6) +* Statements: Statements. (line 6) +* statements: Function Properties. + (line 6) +* statements <1>: Statements for C++. (line 6) +* Static profile estimation: Profile information. + (line 24) +* static single assignment: SSA. (line 6) +* STATIC_CHAIN_INCOMING_REGNUM: Frame Registers. (line 77) +* STATIC_CHAIN_REGNUM: Frame Registers. (line 76) +* 'stdarg.h' and register arguments: Register Arguments. (line 45) +* STDC_0_IN_SYSTEM_HEADERS: Misc. (line 350) +* STMT_EXPR: Unary and Binary Expressions. + (line 6) +* STMT_IS_FULL_EXPR_P: Statements for C++. (line 22) +* storage layout: Storage Layout. (line 6) +* STORE_BY_PIECES_P: Costs. (line 212) +* STORE_FLAG_VALUE: Misc. (line 201) +* 'store_multiple' instruction pattern: Standard Names. (line 159) +* strcpy: Storage Layout. (line 223) +* STRICT_ALIGNMENT: Storage Layout. (line 320) +* strict_low_part: RTL Declarations. (line 9) +* strict_memory_address_p: Addressing Modes. (line 186) +* STRING_CST: Constant expressions. + (line 6) +* STRING_POOL_ADDRESS_P: Flags. (line 165) +* 'strlenM' instruction pattern: Standard Names. (line 873) +* structure value address: Aggregate Return. (line 6) +* structures, returning: Interface. (line 10) +* STRUCTURE_SIZE_BOUNDARY: Storage Layout. (line 312) +* 'subM3' instruction pattern: Standard Names. (line 276) +* SUBOBJECT: Statements for C++. (line 6) +* SUBOBJECT_CLEANUP: Statements for C++. (line 6) +* subreg: Regs and Memory. (line 97) +* 'subreg' and '/s': Flags. (line 187) +* 'subreg' and '/u': Flags. (line 180) +* 'subreg' and '/u' and '/v': Flags. (line 170) +* 'subreg', in 'strict_low_part': RTL Declarations. (line 9) +* SUBREG_BYTE: Regs and Memory. (line 285) +* SUBREG_PROMOTED_UNSIGNED_P: Flags. (line 170) +* SUBREG_PROMOTED_UNSIGNED_SET: Flags. (line 180) +* SUBREG_PROMOTED_VAR_P: Flags. (line 187) +* SUBREG_REG: Regs and Memory. (line 285) +* subst iterators in '.md' files: Subst Iterators. (line 6) +* SUCCESS_EXIT_CODE: Host Misc. (line 12) +* SUPPORTS_INIT_PRIORITY: Macros for Initialization. + (line 57) +* SUPPORTS_ONE_ONLY: Label Output. (line 255) +* SUPPORTS_WEAK: Label Output. (line 229) +* SWITCHABLE_TARGET: Run-time Target. (line 164) +* SWITCH_BODY: Statements for C++. (line 6) +* SWITCH_COND: Statements for C++. (line 6) +* SWITCH_STMT: Statements for C++. (line 6) +* symbolic label: Sharing. (line 20) +* SYMBOL_FLAG_ANCHOR: Special Accessors. (line 117) +* SYMBOL_FLAG_EXTERNAL: Special Accessors. (line 99) +* SYMBOL_FLAG_FUNCTION: Special Accessors. (line 92) +* SYMBOL_FLAG_HAS_BLOCK_INFO: Special Accessors. (line 113) +* SYMBOL_FLAG_LOCAL: Special Accessors. (line 95) +* SYMBOL_FLAG_SMALL: Special Accessors. (line 104) +* SYMBOL_FLAG_TLS_SHIFT: Special Accessors. (line 108) +* symbol_ref: Constants. (line 86) +* 'symbol_ref' and '/f': Flags. (line 165) +* 'symbol_ref' and '/i': Flags. (line 202) +* 'symbol_ref' and '/u': Flags. (line 10) +* 'symbol_ref' and '/v': Flags. (line 206) +* 'symbol_ref', RTL sharing: Sharing. (line 20) +* SYMBOL_REF_ANCHOR_P: Special Accessors. (line 117) +* SYMBOL_REF_BLOCK: Special Accessors. (line 130) +* SYMBOL_REF_BLOCK_OFFSET: Special Accessors. (line 135) +* SYMBOL_REF_CONSTANT: Special Accessors. (line 78) +* SYMBOL_REF_DATA: Special Accessors. (line 82) +* SYMBOL_REF_DECL: Special Accessors. (line 67) +* SYMBOL_REF_EXTERNAL_P: Special Accessors. (line 99) +* SYMBOL_REF_FLAG: Flags. (line 206) +* 'SYMBOL_REF_FLAG', in 'TARGET_ENCODE_SECTION_INFO': Sections. + (line 277) +* SYMBOL_REF_FLAGS: Special Accessors. (line 86) +* SYMBOL_REF_FUNCTION_P: Special Accessors. (line 92) +* SYMBOL_REF_HAS_BLOCK_INFO_P: Special Accessors. (line 113) +* SYMBOL_REF_LOCAL_P: Special Accessors. (line 95) +* SYMBOL_REF_SMALL_P: Special Accessors. (line 104) +* SYMBOL_REF_TLS_MODEL: Special Accessors. (line 108) +* SYMBOL_REF_USED: Flags. (line 197) +* SYMBOL_REF_WEAK: Flags. (line 202) +* 'sync_addMODE' instruction pattern: Standard Names. (line 1635) +* 'sync_andMODE' instruction pattern: Standard Names. (line 1635) +* 'sync_compare_and_swapMODE' instruction pattern: Standard Names. + (line 1594) +* 'sync_iorMODE' instruction pattern: Standard Names. (line 1635) +* 'sync_lock_releaseMODE' instruction pattern: Standard Names. + (line 1704) +* 'sync_lock_test_and_setMODE' instruction pattern: Standard Names. + (line 1677) +* 'sync_nandMODE' instruction pattern: Standard Names. (line 1635) +* 'sync_new_addMODE' instruction pattern: Standard Names. (line 1669) +* 'sync_new_andMODE' instruction pattern: Standard Names. (line 1669) +* 'sync_new_iorMODE' instruction pattern: Standard Names. (line 1669) +* 'sync_new_nandMODE' instruction pattern: Standard Names. (line 1669) +* 'sync_new_subMODE' instruction pattern: Standard Names. (line 1669) +* 'sync_new_xorMODE' instruction pattern: Standard Names. (line 1669) +* 'sync_old_addMODE' instruction pattern: Standard Names. (line 1651) +* 'sync_old_andMODE' instruction pattern: Standard Names. (line 1651) +* 'sync_old_iorMODE' instruction pattern: Standard Names. (line 1651) +* 'sync_old_nandMODE' instruction pattern: Standard Names. (line 1651) +* 'sync_old_subMODE' instruction pattern: Standard Names. (line 1651) +* 'sync_old_xorMODE' instruction pattern: Standard Names. (line 1651) +* 'sync_subMODE' instruction pattern: Standard Names. (line 1635) +* 'sync_xorMODE' instruction pattern: Standard Names. (line 1635) +* SYSROOT_HEADERS_SUFFIX_SPEC: Driver. (line 176) +* SYSROOT_SUFFIX_SPEC: Driver. (line 171) +* 't-TARGET': Target Fragment. (line 6) +* table jump: Basic Blocks. (line 67) +* 'tablejump' instruction pattern: Standard Names. (line 1261) +* tag: GTY Options. (line 82) +* tagging insns: Tagging Insns. (line 6) +* tail calls: Tail Calls. (line 6) +* TAmode: Machine Modes. (line 158) +* target attributes: Target Attributes. (line 6) +* target description macros: Target Macros. (line 6) +* target functions: Target Structure. (line 6) +* target hooks: Target Structure. (line 6) +* target makefile fragment: Target Fragment. (line 6) +* target specifications: Run-time Target. (line 6) +* targetm: Target Structure. (line 6) +* targets, makefile: Makefile. (line 6) +* TARGET_ADDRESS_COST: Costs. (line 300) +* TARGET_ADDR_SPACE_ADDRESS_MODE: Named Address Spaces. + (line 43) +* TARGET_ADDR_SPACE_CONVERT: Named Address Spaces. + (line 85) +* TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P: Named Address Spaces. + (line 61) +* TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS: Named Address Spaces. + (line 69) +* TARGET_ADDR_SPACE_POINTER_MODE: Named Address Spaces. + (line 36) +* TARGET_ADDR_SPACE_SUBSET_P: Named Address Spaces. + (line 76) +* TARGET_ADDR_SPACE_VALID_POINTER_MODE: Named Address Spaces. + (line 50) +* TARGET_ALIGN_ANON_BITFIELD: Storage Layout. (line 397) +* TARGET_ALLOCATE_INITIAL_VALUE: Misc. (line 734) +* TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS: Misc. (line 1013) +* TARGET_ALWAYS_STRIP_DOTDOT: Driver. (line 246) +* TARGET_ARG_PARTIAL_BYTES: Register Arguments. (line 81) +* TARGET_ARM_EABI_UNWINDER: Exception Region Output. + (line 127) +* TARGET_ARRAY_MODE_SUPPORTED_P: Register Arguments. (line 333) +* TARGET_ASAN_SHADOW_OFFSET: Misc. (line 1041) +* TARGET_ASM_ALIGNED_DI_OP: Data Output. (line 9) +* TARGET_ASM_ALIGNED_HI_OP: Data Output. (line 7) +* TARGET_ASM_ALIGNED_SI_OP: Data Output. (line 8) +* TARGET_ASM_ALIGNED_TI_OP: Data Output. (line 10) +* TARGET_ASM_ASSEMBLE_VISIBILITY: Label Output. (line 266) +* TARGET_ASM_BYTE_OP: Data Output. (line 6) +* TARGET_ASM_CAN_OUTPUT_MI_THUNK: Function Entry. (line 202) +* TARGET_ASM_CLOSE_PAREN: Data Output. (line 129) +* TARGET_ASM_CODE_END: File Framework. (line 57) +* TARGET_ASM_CONSTRUCTOR: Macros for Initialization. + (line 68) +* TARGET_ASM_DECLARE_CONSTANT_NAME: Label Output. (line 149) +* TARGET_ASM_DESTRUCTOR: Macros for Initialization. + (line 82) +* TARGET_ASM_EMIT_EXCEPT_PERSONALITY: Dispatch Tables. (line 80) +* TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL: Dispatch Tables. (line 73) +* TARGET_ASM_EMIT_UNWIND_LABEL: Dispatch Tables. (line 61) +* TARGET_ASM_EXTERNAL_LIBCALL: Label Output. (line 302) +* TARGET_ASM_FILE_END: File Framework. (line 35) +* TARGET_ASM_FILE_START: File Framework. (line 8) +* TARGET_ASM_FILE_START_APP_OFF: File Framework. (line 16) +* TARGET_ASM_FILE_START_FILE_DIRECTIVE: File Framework. (line 29) +* TARGET_ASM_FINAL_POSTSCAN_INSN: Instruction Output. (line 82) +* TARGET_ASM_FUNCTION_BEGIN_EPILOGUE: Function Entry. (line 59) +* TARGET_ASM_FUNCTION_END_PROLOGUE: Function Entry. (line 53) +* TARGET_ASM_FUNCTION_EPILOGUE: Function Entry. (line 65) +* TARGET_ASM_FUNCTION_PROLOGUE: Function Entry. (line 9) +* TARGET_ASM_FUNCTION_RODATA_SECTION: Sections. (line 213) +* TARGET_ASM_FUNCTION_SECTION: File Framework. (line 121) +* TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS: File Framework. + (line 131) +* TARGET_ASM_GLOBALIZE_DECL_NAME: Label Output. (line 194) +* TARGET_ASM_GLOBALIZE_LABEL: Label Output. (line 185) +* TARGET_ASM_INIT_SECTIONS: Sections. (line 159) +* TARGET_ASM_INTEGER: Data Output. (line 25) +* TARGET_ASM_INTERNAL_LABEL: Label Output. (line 345) +* TARGET_ASM_JUMP_ALIGN_MAX_SKIP: Alignment Output. (line 21) +* TARGET_ASM_LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP: Alignment Output. + (line 34) +* TARGET_ASM_LABEL_ALIGN_MAX_SKIP: Alignment Output. (line 68) +* TARGET_ASM_LOOP_ALIGN_MAX_SKIP: Alignment Output. (line 53) +* TARGET_ASM_LTO_END: File Framework. (line 52) +* TARGET_ASM_LTO_START: File Framework. (line 47) +* TARGET_ASM_MARK_DECL_PRESERVED: Label Output. (line 308) +* TARGET_ASM_MERGEABLE_RODATA_PREFIX: Sections. (line 221) +* TARGET_ASM_NAMED_SECTION: File Framework. (line 113) +* TARGET_ASM_OPEN_PAREN: Data Output. (line 128) +* TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA: Data Output. (line 38) +* TARGET_ASM_OUTPUT_ANCHOR: Anchored Addresses. (line 42) +* TARGET_ASM_OUTPUT_DWARF_DTPREL: SDB and DWARF. (line 99) +* TARGET_ASM_OUTPUT_IDENT: File Framework. (line 100) +* TARGET_ASM_OUTPUT_MI_THUNK: Function Entry. (line 160) +* TARGET_ASM_OUTPUT_SOURCE_FILENAME: File Framework. (line 91) +* TARGET_ASM_RECORD_GCC_SWITCHES: File Framework. (line 162) +* TARGET_ASM_RECORD_GCC_SWITCHES_SECTION: File Framework. (line 207) +* TARGET_ASM_RELOC_RW_MASK: Sections. (line 168) +* TARGET_ASM_SELECT_RTX_SECTION: Sections. (line 230) +* TARGET_ASM_SELECT_SECTION: Sections. (line 179) +* TARGET_ASM_TM_CLONE_TABLE_SECTION: Sections. (line 226) +* TARGET_ASM_TRAMPOLINE_TEMPLATE: Trampolines. (line 28) +* TARGET_ASM_TTYPE: Exception Region Output. + (line 121) +* TARGET_ASM_UNALIGNED_DI_OP: Data Output. (line 13) +* TARGET_ASM_UNALIGNED_HI_OP: Data Output. (line 11) +* TARGET_ASM_UNALIGNED_SI_OP: Data Output. (line 12) +* TARGET_ASM_UNALIGNED_TI_OP: Data Output. (line 14) +* TARGET_ASM_UNIQUE_SECTION: Sections. (line 201) +* TARGET_ASM_UNWIND_EMIT: Dispatch Tables. (line 87) +* TARGET_ASM_UNWIND_EMIT_BEFORE_INSN: Dispatch Tables. (line 92) +* TARGET_ATOMIC_ALIGN_FOR_MODE: Misc. (line 1060) +* TARGET_ATOMIC_ASSIGN_EXPAND_FENV: Misc. (line 1066) +* TARGET_ATOMIC_TEST_AND_SET_TRUEVAL: Misc. (line 1051) +* TARGET_ATTRIBUTE_TABLE: Target Attributes. (line 10) +* TARGET_ATTRIBUTE_TAKES_IDENTIFIER_P: Target Attributes. (line 17) +* TARGET_BINDS_LOCAL_P: Sections. (line 308) +* TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED: Misc. (line 831) +* TARGET_BRANCH_TARGET_REGISTER_CLASS: Misc. (line 824) +* TARGET_BUILD_BUILTIN_VA_LIST: Register Arguments. (line 271) +* TARGET_BUILTIN_DECL: Misc. (line 603) +* TARGET_BUILTIN_RECIPROCAL: Addressing Modes. (line 261) +* TARGET_BUILTIN_SETJMP_FRAME_VALUE: Frame Layout. (line 107) +* TARGET_CALLEE_COPIES: Register Arguments. (line 113) +* TARGET_CANNOT_FORCE_CONST_MEM: Addressing Modes. (line 234) +* TARGET_CANNOT_MODIFY_JUMPS_P: Misc. (line 811) +* TARGET_CANONICALIZE_COMPARISON: MODE_CC Condition Codes. + (line 54) +* TARGET_CANONICAL_VA_LIST_TYPE: Register Arguments. (line 292) +* TARGET_CAN_ELIMINATE: Elimination. (line 73) +* TARGET_CAN_FOLLOW_JUMP: Misc. (line 720) +* TARGET_CAN_INLINE_P: Target Attributes. (line 159) +* TARGET_CAN_USE_DOLOOP_P: Misc. (line 675) +* TARGET_CASE_VALUES_THRESHOLD: Misc. (line 46) +* TARGET_CC_MODES_COMPATIBLE: MODE_CC Condition Codes. + (line 118) +* TARGET_CHECK_PCH_TARGET_FLAGS: PCH Target. (line 26) +* TARGET_CHECK_STRING_OBJECT_FORMAT_ARG: Run-time Target. (line 119) +* TARGET_CLASS_LIKELY_SPILLED_P: Register Classes. (line 489) +* TARGET_CLASS_MAX_NREGS: Register Classes. (line 505) +* TARGET_COMMUTATIVE_P: Misc. (line 727) +* TARGET_COMPARE_VERSION_PRIORITY: Misc. (line 652) +* TARGET_COMP_TYPE_ATTRIBUTES: Target Attributes. (line 25) +* TARGET_CONDITIONAL_REGISTER_USAGE: Register Basics. (line 59) +* TARGET_CONST_ANCHOR: Misc. (line 1024) +* TARGET_CONST_NOT_OK_FOR_DEBUG_P: Addressing Modes. (line 230) +* TARGET_CONVERT_TO_TYPE: Misc. (line 978) +* TARGET_CPU_CPP_BUILTINS: Run-time Target. (line 8) +* TARGET_CSTORE_MODE: Register Classes. (line 588) +* TARGET_CXX_ADJUST_CLASS_AT_DEFINITION: C++ ABI. (line 86) +* TARGET_CXX_CDTOR_RETURNS_THIS: C++ ABI. (line 37) +* TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT: C++ ABI. (line 61) +* TARGET_CXX_COOKIE_HAS_SIZE: C++ ABI. (line 24) +* TARGET_CXX_DECL_MANGLING_CONTEXT: C++ ABI. (line 92) +* TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY: C++ ABI. (line 52) +* TARGET_CXX_GET_COOKIE_SIZE: C++ ABI. (line 17) +* TARGET_CXX_GUARD_MASK_BIT: C++ ABI. (line 11) +* TARGET_CXX_GUARD_TYPE: C++ ABI. (line 6) +* TARGET_CXX_IMPLICIT_EXTERN_C: Misc. (line 373) +* TARGET_CXX_IMPORT_EXPORT_CLASS: C++ ABI. (line 28) +* TARGET_CXX_KEY_METHOD_MAY_BE_INLINE: C++ ABI. (line 42) +* TARGET_CXX_LIBRARY_RTTI_COMDAT: C++ ABI. (line 68) +* TARGET_CXX_USE_AEABI_ATEXIT: C++ ABI. (line 73) +* TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT: C++ ABI. (line 79) +* TARGET_C_PREINCLUDE: Misc. (line 361) +* TARGET_DEBUG_UNWIND_INFO: SDB and DWARF. (line 36) +* TARGET_DECIMAL_FLOAT_SUPPORTED_P: Storage Layout. (line 521) +* TARGET_DECLSPEC: Target Attributes. (line 72) +* TARGET_DEFAULT_PACK_STRUCT: Misc. (line 446) +* TARGET_DEFAULT_SHORT_ENUMS: Type Layout. (line 166) +* TARGET_DEFAULT_TARGET_FLAGS: Run-time Target. (line 55) +* TARGET_DEFERRED_OUTPUT_DEFS: Label Output. (line 430) +* TARGET_DELAY_SCHED2: SDB and DWARF. (line 65) +* TARGET_DELAY_VARTRACK: SDB and DWARF. (line 69) +* TARGET_DELEGITIMIZE_ADDRESS: Addressing Modes. (line 221) +* TARGET_DIFFERENT_ADDR_DISPLACEMENT_P: Register Classes. (line 574) +* TARGET_DLLIMPORT_DECL_ATTRIBUTES: Target Attributes. (line 55) +* TARGET_DWARF_CALLING_CONVENTION: SDB and DWARF. (line 16) +* TARGET_DWARF_HANDLE_FRAME_UNSPEC: Frame Layout. (line 169) +* TARGET_DWARF_REGISTER_SPAN: Exception Region Output. + (line 104) +* TARGET_EDOM: Library Calls. (line 59) +* TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS: Emulated TLS. (line 67) +* TARGET_EMUTLS_GET_ADDRESS: Emulated TLS. (line 18) +* TARGET_EMUTLS_REGISTER_COMMON: Emulated TLS. (line 23) +* TARGET_EMUTLS_TMPL_PREFIX: Emulated TLS. (line 44) +* TARGET_EMUTLS_TMPL_SECTION: Emulated TLS. (line 35) +* TARGET_EMUTLS_VAR_ALIGN_FIXED: Emulated TLS. (line 62) +* TARGET_EMUTLS_VAR_FIELDS: Emulated TLS. (line 48) +* TARGET_EMUTLS_VAR_INIT: Emulated TLS. (line 55) +* TARGET_EMUTLS_VAR_PREFIX: Emulated TLS. (line 40) +* TARGET_EMUTLS_VAR_SECTION: Emulated TLS. (line 30) +* TARGET_ENCODE_SECTION_INFO: Sections. (line 251) +* 'TARGET_ENCODE_SECTION_INFO' and address validation: Addressing Modes. + (line 82) +* 'TARGET_ENCODE_SECTION_INFO' usage: Instruction Output. (line 127) +* TARGET_ENUM_VA_LIST_P: Register Arguments. (line 275) +* TARGET_EXCEPT_UNWIND_INFO: Exception Region Output. + (line 45) +* TARGET_EXECUTABLE_SUFFIX: Misc. (line 785) +* TARGET_EXPAND_BUILTIN: Misc. (line 613) +* TARGET_EXPAND_BUILTIN_SAVEREGS: Varargs. (line 64) +* TARGET_EXPAND_TO_RTL_HOOK: Storage Layout. (line 527) +* TARGET_EXPR: Unary and Binary Expressions. + (line 6) +* TARGET_EXTRA_INCLUDES: Misc. (line 870) +* TARGET_EXTRA_LIVE_ON_ENTRY: Tail Calls. (line 20) +* TARGET_EXTRA_PRE_INCLUDES: Misc. (line 877) +* TARGET_FIXED_CONDITION_CODE_REGS: MODE_CC Condition Codes. + (line 103) +* TARGET_FIXED_POINT_SUPPORTED_P: Storage Layout. (line 524) +* target_flags: Run-time Target. (line 51) +* TARGET_FLAGS_REGNUM: Register Arguments. (line 391) +* TARGET_FLOAT_EXCEPTIONS_ROUNDING_SUPPORTED_P: Run-time Target. + (line 183) +* TARGET_FLT_EVAL_METHOD: Type Layout. (line 147) +* TARGET_FN_ABI_VA_LIST: Register Arguments. (line 287) +* TARGET_FOLD_BUILTIN: Misc. (line 635) +* TARGET_FORCE_AT_COMP_DIR: SDB and DWARF. (line 60) +* TARGET_FORMAT_TYPES: Misc. (line 898) +* TARGET_FRAME_POINTER_REQUIRED: Elimination. (line 8) +* TARGET_FUNCTION_ARG: Register Arguments. (line 10) +* TARGET_FUNCTION_ARG_ADVANCE: Register Arguments. (line 184) +* TARGET_FUNCTION_ARG_BOUNDARY: Register Arguments. (line 238) +* TARGET_FUNCTION_ARG_ROUND_BOUNDARY: Register Arguments. (line 244) +* TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P: Target Attributes. (line 93) +* TARGET_FUNCTION_INCOMING_ARG: Register Arguments. (line 65) +* TARGET_FUNCTION_OK_FOR_SIBCALL: Tail Calls. (line 6) +* TARGET_FUNCTION_VALUE: Scalar Return. (line 9) +* TARGET_FUNCTION_VALUE_REGNO_P: Scalar Return. (line 96) +* TARGET_GENERATE_VERSION_DISPATCHER_BODY: Misc. (line 668) +* TARGET_GET_DRAP_RTX: Misc. (line 1007) +* TARGET_GET_FUNCTION_VERSIONS_DISPATCHER: Misc. (line 661) +* TARGET_GET_PCH_VALIDITY: PCH Target. (line 6) +* TARGET_GET_RAW_ARG_MODE: Aggregate Return. (line 82) +* TARGET_GET_RAW_RESULT_MODE: Aggregate Return. (line 76) +* TARGET_GIMPLE_FOLD_BUILTIN: Misc. (line 645) +* TARGET_GIMPLIFY_VA_ARG_EXPR: Register Arguments. (line 297) +* TARGET_HANDLE_C_OPTION: Run-time Target. (line 73) +* TARGET_HANDLE_OPTION: Run-time Target. (line 59) +* TARGET_HARD_REGNO_SCRATCH_OK: Values in Registers. + (line 141) +* TARGET_HAS_IFUNC_P: Misc. (line 1055) +* TARGET_HAS_NO_HW_DIVIDE: Library Calls. (line 52) +* TARGET_HAVE_CONDITIONAL_EXECUTION: Misc. (line 845) +* TARGET_HAVE_CTORS_DTORS: Macros for Initialization. + (line 63) +* TARGET_HAVE_NAMED_SECTIONS: File Framework. (line 139) +* TARGET_HAVE_SRODATA_SECTION: Sections. (line 297) +* TARGET_HAVE_SWITCHABLE_BSS_SECTIONS: File Framework. (line 144) +* TARGET_HAVE_TLS: Sections. (line 317) +* TARGET_INIT_BUILTINS: Misc. (line 587) +* TARGET_INIT_DWARF_REG_SIZES_EXTRA: Exception Region Output. + (line 113) +* TARGET_INIT_LIBFUNCS: Library Calls. (line 15) +* TARGET_INSERT_ATTRIBUTES: Target Attributes. (line 80) +* TARGET_INSTANTIATE_DECLS: Storage Layout. (line 535) +* TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN: Misc. (line 931) +* TARGET_INVALID_BINARY_OP: Misc. (line 950) +* TARGET_INVALID_CONVERSION: Misc. (line 937) +* TARGET_INVALID_PARAMETER_TYPE: Misc. (line 956) +* TARGET_INVALID_RETURN_TYPE: Misc. (line 963) +* TARGET_INVALID_UNARY_OP: Misc. (line 943) +* TARGET_INVALID_WITHIN_DOLOOP: Misc. (line 692) +* TARGET_IN_SMALL_DATA_P: Sections. (line 293) +* TARGET_LEGITIMATE_ADDRESS_P: Addressing Modes. (line 48) +* TARGET_LEGITIMATE_COMBINED_INSN: Misc. (line 706) +* TARGET_LEGITIMATE_CONSTANT_P: Addressing Modes. (line 213) +* TARGET_LEGITIMIZE_ADDRESS: Addressing Modes. (line 129) +* TARGET_LIBCALL_VALUE: Scalar Return. (line 65) +* TARGET_LIBC_HAS_FUNCTION: Library Calls. (line 77) +* TARGET_LIBFUNC_GNU_PREFIX: Library Calls. (line 24) +* TARGET_LIBGCC_CMP_RETURN_MODE: Storage Layout. (line 458) +* TARGET_LIBGCC_SDATA_SECTION: Sections. (line 131) +* TARGET_LIBGCC_SHIFT_COUNT_MODE: Storage Layout. (line 464) +* TARGET_LIB_INT_CMP_BIASED: Library Calls. (line 42) +* TARGET_LOOP_UNROLL_ADJUST: Misc. (line 851) +* TARGET_LRA_P: Register Classes. (line 548) +* TARGET_MACHINE_DEPENDENT_REORG: Misc. (line 572) +* TARGET_MANGLE_ASSEMBLER_NAME: Label Output. (line 321) +* TARGET_MANGLE_DECL_ASSEMBLER_NAME: Sections. (line 241) +* TARGET_MANGLE_TYPE: Storage Layout. (line 539) +* TARGET_MAX_ANCHOR_OFFSET: Anchored Addresses. (line 38) +* TARGET_MD_ASM_CLOBBERS: Misc. (line 491) +* TARGET_MEMBER_TYPE_FORCES_BLK: Storage Layout. (line 410) +* TARGET_MEMMODEL_CHECK: Misc. (line 1046) +* TARGET_MEMORY_MOVE_COST: Costs. (line 79) +* TARGET_MEM_CONSTRAINT: Addressing Modes. (line 107) +* TARGET_MEM_REF: Storage References. (line 6) +* TARGET_MERGE_DECL_ATTRIBUTES: Target Attributes. (line 45) +* TARGET_MERGE_TYPE_ATTRIBUTES: Target Attributes. (line 37) +* TARGET_MIN_ANCHOR_OFFSET: Anchored Addresses. (line 32) +* TARGET_MIN_DIVISIONS_FOR_RECIP_MUL: Misc. (line 90) +* TARGET_MODE_DEPENDENT_ADDRESS_P: Addressing Modes. (line 196) +* TARGET_MODE_REP_EXTENDED: Misc. (line 175) +* TARGET_MS_BITFIELD_LAYOUT_P: Storage Layout. (line 493) +* TARGET_MUST_PASS_IN_STACK: Register Arguments. (line 58) +* 'TARGET_MUST_PASS_IN_STACK', and 'TARGET_FUNCTION_ARG': Register Arguments. + (line 50) +* TARGET_NARROW_VOLATILE_BITFIELD: Storage Layout. (line 403) +* TARGET_N_FORMAT_TYPES: Misc. (line 903) +* TARGET_OBJC_CONSTRUCT_STRING_OBJECT: Run-time Target. (line 88) +* TARGET_OBJC_DECLARE_CLASS_DEFINITION: Run-time Target. (line 109) +* TARGET_OBJC_DECLARE_UNRESOLVED_CLASS_REFERENCE: Run-time Target. + (line 104) +* TARGET_OBJECT_SUFFIX: Misc. (line 780) +* TARGET_OBJFMT_CPP_BUILTINS: Run-time Target. (line 45) +* TARGET_OPTF: Misc. (line 885) +* TARGET_OPTION_DEFAULT_PARAMS: Run-time Target. (line 160) +* TARGET_OPTION_FUNCTION_VERSIONS: Target Attributes. (line 151) +* TARGET_OPTION_INIT_STRUCT: Run-time Target. (line 156) +* TARGET_OPTION_OPTIMIZATION_TABLE: Run-time Target. (line 142) +* TARGET_OPTION_OVERRIDE: Target Attributes. (line 138) +* TARGET_OPTION_PRAGMA_PARSE: Target Attributes. (line 131) +* TARGET_OPTION_PRINT: Target Attributes. (line 125) +* TARGET_OPTION_RESTORE: Target Attributes. (line 119) +* TARGET_OPTION_SAVE: Target Attributes. (line 112) +* TARGET_OPTION_VALID_ATTRIBUTE_P: Target Attributes. (line 100) +* TARGET_OS_CPP_BUILTINS: Run-time Target. (line 41) +* TARGET_OVERRIDES_FORMAT_ATTRIBUTES: Misc. (line 907) +* TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT: Misc. (line 913) +* TARGET_OVERRIDES_FORMAT_INIT: Misc. (line 917) +* TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE: Run-time Target. (line 126) +* TARGET_PASS_BY_REFERENCE: Register Arguments. (line 101) +* TARGET_PCH_VALID_P: PCH Target. (line 11) +* TARGET_POSIX_IO: Misc. (line 516) +* TARGET_PREFERRED_OUTPUT_RELOAD_CLASS: Register Classes. (line 284) +* TARGET_PREFERRED_RELOAD_CLASS: Register Classes. (line 213) +* TARGET_PREFERRED_RENAME_CLASS: Register Classes. (line 201) +* TARGET_PREPARE_PCH_SAVE: PCH Target. (line 34) +* TARGET_PRETEND_OUTGOING_VARARGS_NAMED: Varargs. (line 123) +* TARGET_PROFILE_BEFORE_PROLOGUE: Sections. (line 301) +* TARGET_PROMOTED_TYPE: Misc. (line 970) +* TARGET_PROMOTE_FUNCTION_MODE: Storage Layout. (line 109) +* TARGET_PROMOTE_PROTOTYPES: Stack Arguments. (line 10) +* TARGET_PTRMEMFUNC_VBIT_LOCATION: Type Layout. (line 293) +* TARGET_REF_MAY_ALIAS_ERRNO: Register Arguments. (line 308) +* TARGET_REGISTER_MOVE_COST: Costs. (line 31) +* TARGET_REGISTER_PRIORITY: Register Classes. (line 553) +* TARGET_REGISTER_USAGE_LEVELING_P: Register Classes. (line 564) +* TARGET_RELAXED_ORDERING: Misc. (line 922) +* TARGET_RESOLVE_OVERLOADED_BUILTIN: Misc. (line 624) +* TARGET_RETURN_IN_MEMORY: Aggregate Return. (line 15) +* TARGET_RETURN_IN_MSB: Scalar Return. (line 117) +* TARGET_RETURN_POPS_ARGS: Stack Arguments. (line 92) +* TARGET_RTX_COSTS: Costs. (line 269) +* TARGET_SCALAR_MODE_SUPPORTED_P: Register Arguments. (line 315) +* TARGET_SCHED_ADJUST_COST: Scheduling. (line 35) +* TARGET_SCHED_ADJUST_PRIORITY: Scheduling. (line 50) +* TARGET_SCHED_ALLOC_SCHED_CONTEXT: Scheduling. (line 283) +* TARGET_SCHED_CLEAR_SCHED_CONTEXT: Scheduling. (line 298) +* TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK: Scheduling. (line 98) +* TARGET_SCHED_DFA_NEW_CYCLE: Scheduling. (line 245) +* TARGET_SCHED_DFA_POST_ADVANCE_CYCLE: Scheduling. (line 169) +* TARGET_SCHED_DFA_POST_CYCLE_INSN: Scheduling. (line 153) +* TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE: Scheduling. (line 162) +* TARGET_SCHED_DFA_PRE_CYCLE_INSN: Scheduling. (line 141) +* TARGET_SCHED_DISPATCH: Scheduling. (line 365) +* TARGET_SCHED_DISPATCH_DO: Scheduling. (line 370) +* TARGET_SCHED_EXPOSED_PIPELINE: Scheduling. (line 374) +* TARGET_SCHED_FINISH: Scheduling. (line 119) +* TARGET_SCHED_FINISH_GLOBAL: Scheduling. (line 134) +* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BACKTRACK: Scheduling. (line 225) +* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_BEGIN: Scheduling. (line 214) +* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD: Scheduling. + (line 176) +* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD: Scheduling. + (line 204) +* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC: Scheduling. + (line 336) +* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_END: Scheduling. (line 230) +* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_FINI: Scheduling. (line 240) +* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_INIT: Scheduling. (line 235) +* TARGET_SCHED_FIRST_CYCLE_MULTIPASS_ISSUE: Scheduling. (line 219) +* TARGET_SCHED_FREE_SCHED_CONTEXT: Scheduling. (line 302) +* TARGET_SCHED_GEN_SPEC_CHECK: Scheduling. (line 324) +* TARGET_SCHED_H_I_D_EXTENDED: Scheduling. (line 278) +* TARGET_SCHED_INIT: Scheduling. (line 108) +* TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN: Scheduling. (line 158) +* TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN: Scheduling. (line 150) +* TARGET_SCHED_INIT_GLOBAL: Scheduling. (line 126) +* TARGET_SCHED_INIT_SCHED_CONTEXT: Scheduling. (line 287) +* TARGET_SCHED_ISSUE_RATE: Scheduling. (line 11) +* TARGET_SCHED_IS_COSTLY_DEPENDENCE: Scheduling. (line 256) +* TARGET_SCHED_MACRO_FUSION_P: Scheduling. (line 87) +* TARGET_SCHED_MACRO_FUSION_PAIR_P: Scheduling. (line 91) +* TARGET_SCHED_NEEDS_BLOCK_P: Scheduling. (line 317) +* TARGET_SCHED_REASSOCIATION_WIDTH: Scheduling. (line 379) +* TARGET_SCHED_REORDER: Scheduling. (line 58) +* TARGET_SCHED_REORDER2: Scheduling. (line 75) +* TARGET_SCHED_SET_SCHED_CONTEXT: Scheduling. (line 294) +* TARGET_SCHED_SET_SCHED_FLAGS: Scheduling. (line 349) +* TARGET_SCHED_SMS_RES_MII: Scheduling. (line 356) +* TARGET_SCHED_SPECULATE_INSN: Scheduling. (line 305) +* TARGET_SCHED_VARIABLE_ISSUE: Scheduling. (line 22) +* TARGET_SECONDARY_RELOAD: Register Classes. (line 312) +* TARGET_SECTION_TYPE_FLAGS: File Framework. (line 149) +* TARGET_SETUP_INCOMING_VARARGS: Varargs. (line 71) +* TARGET_SET_CURRENT_FUNCTION: Misc. (line 762) +* TARGET_SET_DEFAULT_TYPE_ATTRIBUTES: Target Attributes. (line 33) +* TARGET_SET_UP_BY_PROLOGUE: Tail Calls. (line 29) +* TARGET_SHIFT_TRUNCATION_MASK: Misc. (line 138) +* TARGET_SIMD_CLONE_ADJUST: Addressing Modes. (line 413) +* TARGET_SIMD_CLONE_COMPUTE_VECSIZE_AND_SIMDLEN: Addressing Modes. + (line 405) +* TARGET_SIMD_CLONE_USABLE: Addressing Modes. (line 417) +* TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P: Register Arguments. + (line 357) +* TARGET_SPILL_CLASS: Register Classes. (line 581) +* TARGET_SPLIT_COMPLEX_ARG: Register Arguments. (line 259) +* TARGET_STACK_PROTECT_FAIL: Stack Smashing Protection. + (line 16) +* TARGET_STACK_PROTECT_GUARD: Stack Smashing Protection. + (line 6) +* TARGET_STATIC_CHAIN: Frame Registers. (line 90) +* TARGET_STRICT_ARGUMENT_NAMING: Varargs. (line 107) +* TARGET_STRING_OBJECT_REF_TYPE_P: Run-time Target. (line 114) +* TARGET_STRIP_NAME_ENCODING: Sections. (line 288) +* TARGET_STRUCT_VALUE_RTX: Aggregate Return. (line 44) +* TARGET_SUPPORTS_SPLIT_STACK: Stack Smashing Protection. + (line 25) +* TARGET_SUPPORTS_WEAK: Label Output. (line 237) +* TARGET_TERMINATE_DW2_EH_FRAME_INFO: Exception Region Output. + (line 98) +* TARGET_TRAMPOLINE_ADJUST_ADDRESS: Trampolines. (line 74) +* TARGET_TRAMPOLINE_INIT: Trampolines. (line 54) +* TARGET_UNSPEC_MAY_TRAP_P: Misc. (line 753) +* TARGET_UNWIND_TABLES_DEFAULT: Exception Region Output. + (line 72) +* TARGET_UNWIND_WORD_MODE: Storage Layout. (line 470) +* TARGET_UPDATE_STACK_BOUNDARY: Misc. (line 1003) +* TARGET_USES_WEAK_UNWIND_INFO: Exception Handling. (line 123) +* TARGET_USE_ANCHORS_FOR_SYMBOL_P: Anchored Addresses. (line 53) +* TARGET_USE_BLOCKS_FOR_CONSTANT_P: Addressing Modes. (line 248) +* TARGET_USE_BLOCKS_FOR_DECL_P: Addressing Modes. (line 255) +* TARGET_USE_JCR_SECTION: Misc. (line 985) +* TARGET_VALID_DLLIMPORT_ATTRIBUTE_P: Target Attributes. (line 66) +* TARGET_VALID_POINTER_MODE: Register Arguments. (line 303) +* TARGET_VECTORIZE_ADD_STMT_COST: Addressing Modes. (line 367) +* TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES: Addressing Modes. + (line 350) +* TARGET_VECTORIZE_BUILTIN_CONVERSION: Addressing Modes. (line 312) +* TARGET_VECTORIZE_BUILTIN_GATHER: Addressing Modes. (line 398) +* TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD: Addressing Modes. (line 271) +* TARGET_VECTORIZE_BUILTIN_TM_LOAD: Addressing Modes. (line 390) +* TARGET_VECTORIZE_BUILTIN_TM_STORE: Addressing Modes. (line 394) +* TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST: Addressing Modes. + (line 297) +* TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION: Addressing Modes. + (line 324) +* TARGET_VECTORIZE_DESTROY_COST_DATA: Addressing Modes. (line 385) +* TARGET_VECTORIZE_FINISH_COST: Addressing Modes. (line 378) +* TARGET_VECTORIZE_INIT_COST: Addressing Modes. (line 358) +* TARGET_VECTORIZE_PREFERRED_SIMD_MODE: Addressing Modes. (line 343) +* TARGET_VECTORIZE_SUPPORT_VECTOR_MISALIGNMENT: Addressing Modes. + (line 333) +* TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE: Addressing Modes. + (line 303) +* TARGET_VECTORIZE_VEC_PERM_CONST_OK: Addressing Modes. (line 308) +* TARGET_VECTOR_ALIGNMENT: Storage Layout. (line 263) +* TARGET_VECTOR_MODE_SUPPORTED_P: Register Arguments. (line 327) +* TARGET_VTABLE_DATA_ENTRY_DISTANCE: Type Layout. (line 346) +* TARGET_VTABLE_ENTRY_ALIGN: Type Layout. (line 340) +* TARGET_VTABLE_USES_DESCRIPTORS: Type Layout. (line 329) +* TARGET_WANT_DEBUG_PUB_SECTIONS: SDB and DWARF. (line 55) +* TARGET_WARN_FUNC_RETURN: Tail Calls. (line 35) +* TARGET_WEAK_NOT_IN_ARCHIVE_TOC: Label Output. (line 273) +* TCmode: Machine Modes. (line 199) +* TDmode: Machine Modes. (line 97) +* TEMPLATE_DECL: Declarations. (line 6) +* Temporaries: Temporaries. (line 6) +* termination routines: Initialization. (line 6) +* testing constraints: C Constraint Interface. + (line 6) +* TEXT_SECTION_ASM_OP: Sections. (line 37) +* TFmode: Machine Modes. (line 101) +* TF_SIZE: Type Layout. (line 138) +* THEN_CLAUSE: Statements for C++. (line 6) +* THREAD_MODEL_SPEC: Driver. (line 162) +* THROW_EXPR: Unary and Binary Expressions. + (line 6) +* THUNK_DECL: Declarations. (line 6) +* THUNK_DELTA: Declarations. (line 6) +* TImode: Machine Modes. (line 48) +* 'TImode', in 'insn': Insns. (line 268) +* TLS_COMMON_ASM_OP: Sections. (line 80) +* TLS_SECTION_ASM_FLAG: Sections. (line 85) +* 'tm.h' macros: Target Macros. (line 6) +* TQFmode: Machine Modes. (line 65) +* TQmode: Machine Modes. (line 122) +* trampolines for nested functions: Trampolines. (line 6) +* TRAMPOLINE_ALIGNMENT: Trampolines. (line 48) +* TRAMPOLINE_SECTION: Trampolines. (line 39) +* TRAMPOLINE_SIZE: Trampolines. (line 44) +* TRANSFER_FROM_TRAMPOLINE: Trampolines. (line 110) +* 'trap' instruction pattern: Standard Names. (line 1542) +* tree: Tree overview. (line 6) +* tree <1>: Macros and Functions. + (line 6) +* Tree SSA: Tree SSA. (line 6) +* TREE_CHAIN: Macros and Functions. + (line 6) +* TREE_CODE: Tree overview. (line 6) +* tree_int_cst_equal: Constant expressions. + (line 6) +* TREE_INT_CST_HIGH: Constant expressions. + (line 6) +* TREE_INT_CST_LOW: Constant expressions. + (line 6) +* tree_int_cst_lt: Constant expressions. + (line 6) +* TREE_LIST: Containers. (line 6) +* TREE_OPERAND: Expression trees. (line 6) +* TREE_PUBLIC: Function Basics. (line 6) +* TREE_PUBLIC <1>: Function Properties. + (line 28) +* TREE_PURPOSE: Containers. (line 6) +* TREE_READONLY: Function Properties. + (line 37) +* tree_size: Macros and Functions. + (line 13) +* TREE_STATIC: Function Properties. + (line 31) +* TREE_STRING_LENGTH: Constant expressions. + (line 6) +* TREE_STRING_POINTER: Constant expressions. + (line 6) +* TREE_THIS_VOLATILE: Function Properties. + (line 34) +* TREE_TYPE: Macros and Functions. + (line 6) +* TREE_TYPE <1>: Types. (line 6) +* TREE_TYPE <2>: Working with declarations. + (line 11) +* TREE_TYPE <3>: Expression trees. (line 6) +* TREE_TYPE <4>: Expression trees. (line 17) +* TREE_TYPE <5>: Function Basics. (line 47) +* TREE_TYPE <6>: Types for C++. (line 6) +* TREE_VALUE: Containers. (line 6) +* TREE_VEC: Containers. (line 6) +* TREE_VEC_ELT: Containers. (line 6) +* TREE_VEC_LENGTH: Containers. (line 6) +* TRULY_NOOP_TRUNCATION: Misc. (line 162) +* truncate: Conversions. (line 38) +* 'truncMN2' instruction pattern: Standard Names. (line 916) +* TRUNC_DIV_EXPR: Unary and Binary Expressions. + (line 6) +* TRUNC_MOD_EXPR: Unary and Binary Expressions. + (line 6) +* TRUTH_ANDIF_EXPR: Unary and Binary Expressions. + (line 6) +* TRUTH_AND_EXPR: Unary and Binary Expressions. + (line 6) +* TRUTH_NOT_EXPR: Unary and Binary Expressions. + (line 6) +* TRUTH_ORIF_EXPR: Unary and Binary Expressions. + (line 6) +* TRUTH_OR_EXPR: Unary and Binary Expressions. + (line 6) +* TRUTH_XOR_EXPR: Unary and Binary Expressions. + (line 6) +* TRY_BLOCK: Statements for C++. (line 6) +* TRY_HANDLERS: Statements for C++. (line 6) +* TRY_STMTS: Statements for C++. (line 6) +* Tuple specific accessors: Tuple specific accessors. + (line 6) +* tuples: Tuple representation. + (line 6) +* type: Types. (line 6) +* type declaration: Declarations. (line 6) +* TYPENAME_TYPE: Types for C++. (line 6) +* TYPENAME_TYPE_FULLNAME: Types. (line 6) +* TYPENAME_TYPE_FULLNAME <1>: Types for C++. (line 6) +* TYPEOF_TYPE: Types for C++. (line 6) +* TYPE_ALIGN: Types. (line 6) +* TYPE_ALIGN <1>: Types. (line 30) +* TYPE_ALIGN <2>: Types for C++. (line 6) +* TYPE_ALIGN <3>: Types for C++. (line 44) +* TYPE_ARG_TYPES: Types. (line 6) +* TYPE_ARG_TYPES <1>: Types for C++. (line 6) +* TYPE_ASM_OP: Label Output. (line 76) +* TYPE_ATTRIBUTES: Attributes. (line 24) +* TYPE_BINFO: Classes. (line 6) +* TYPE_BUILT_IN: Types for C++. (line 66) +* TYPE_CANONICAL: Types. (line 6) +* TYPE_CANONICAL <1>: Types. (line 41) +* TYPE_CONTEXT: Types. (line 6) +* TYPE_CONTEXT <1>: Types for C++. (line 6) +* TYPE_DECL: Declarations. (line 6) +* TYPE_FIELDS: Types. (line 6) +* TYPE_FIELDS <1>: Types for C++. (line 6) +* TYPE_FIELDS <2>: Classes. (line 6) +* TYPE_HAS_ARRAY_NEW_OPERATOR: Classes. (line 96) +* TYPE_HAS_DEFAULT_CONSTRUCTOR: Classes. (line 81) +* TYPE_HAS_MUTABLE_P: Classes. (line 86) +* TYPE_HAS_NEW_OPERATOR: Classes. (line 93) +* TYPE_MAIN_VARIANT: Types. (line 6) +* TYPE_MAIN_VARIANT <1>: Types. (line 19) +* TYPE_MAIN_VARIANT <2>: Types for C++. (line 6) +* TYPE_MAX_VALUE: Types. (line 6) +* TYPE_METHODS: Classes. (line 6) +* TYPE_METHOD_BASETYPE: Types. (line 6) +* TYPE_METHOD_BASETYPE <1>: Types for C++. (line 6) +* TYPE_MIN_VALUE: Types. (line 6) +* TYPE_NAME: Types. (line 6) +* TYPE_NAME <1>: Types. (line 33) +* TYPE_NAME <2>: Types for C++. (line 6) +* TYPE_NAME <3>: Types for C++. (line 47) +* TYPE_NOTHROW_P: Functions for C++. (line 154) +* TYPE_OFFSET_BASETYPE: Types. (line 6) +* TYPE_OFFSET_BASETYPE <1>: Types for C++. (line 6) +* TYPE_OPERAND_FMT: Label Output. (line 87) +* TYPE_OVERLOADS_ARRAY_REF: Classes. (line 104) +* TYPE_OVERLOADS_ARROW: Classes. (line 107) +* TYPE_OVERLOADS_CALL_EXPR: Classes. (line 100) +* TYPE_POLYMORPHIC_P: Classes. (line 77) +* TYPE_PRECISION: Types. (line 6) +* TYPE_PRECISION <1>: Types for C++. (line 6) +* TYPE_PTRDATAMEM_P: Types for C++. (line 6) +* TYPE_PTRDATAMEM_P <1>: Types for C++. (line 69) +* TYPE_PTRFN_P: Types for C++. (line 76) +* TYPE_PTROBV_P: Types for C++. (line 6) +* TYPE_PTROB_P: Types for C++. (line 79) +* TYPE_PTR_P: Types for C++. (line 72) +* TYPE_QUAL_CONST: Types. (line 6) +* TYPE_QUAL_CONST <1>: Types for C++. (line 6) +* TYPE_QUAL_RESTRICT: Types. (line 6) +* TYPE_QUAL_RESTRICT <1>: Types for C++. (line 6) +* TYPE_QUAL_VOLATILE: Types. (line 6) +* TYPE_QUAL_VOLATILE <1>: Types for C++. (line 6) +* TYPE_RAISES_EXCEPTIONS: Functions for C++. (line 149) +* TYPE_SIZE: Types. (line 6) +* TYPE_SIZE <1>: Types. (line 25) +* TYPE_SIZE <2>: Types for C++. (line 6) +* TYPE_SIZE <3>: Types for C++. (line 39) +* TYPE_STRUCTURAL_EQUALITY_P: Types. (line 6) +* TYPE_STRUCTURAL_EQUALITY_P <1>: Types. (line 77) +* TYPE_UNQUALIFIED: Types. (line 6) +* TYPE_UNQUALIFIED <1>: Types for C++. (line 6) +* TYPE_VFIELD: Classes. (line 6) +* UDAmode: Machine Modes. (line 170) +* udiv: Arithmetic. (line 131) +* 'udivM3' instruction pattern: Standard Names. (line 276) +* 'udivmodM4' instruction pattern: Standard Names. (line 513) +* 'udot_prodM' instruction pattern: Standard Names. (line 342) +* UDQmode: Machine Modes. (line 138) +* UHAmode: Machine Modes. (line 162) +* UHQmode: Machine Modes. (line 130) +* UINT16_TYPE: Type Layout. (line 257) +* UINT32_TYPE: Type Layout. (line 258) +* UINT64_TYPE: Type Layout. (line 259) +* UINT8_TYPE: Type Layout. (line 256) +* UINTMAX_TYPE: Type Layout. (line 240) +* UINTPTR_TYPE: Type Layout. (line 277) +* UINT_FAST16_TYPE: Type Layout. (line 273) +* UINT_FAST32_TYPE: Type Layout. (line 274) +* UINT_FAST64_TYPE: Type Layout. (line 275) +* UINT_FAST8_TYPE: Type Layout. (line 272) +* UINT_LEAST16_TYPE: Type Layout. (line 265) +* UINT_LEAST32_TYPE: Type Layout. (line 266) +* UINT_LEAST64_TYPE: Type Layout. (line 267) +* UINT_LEAST8_TYPE: Type Layout. (line 264) +* 'umaddMN4' instruction pattern: Standard Names. (line 460) +* umax: Arithmetic. (line 150) +* 'umaxM3' instruction pattern: Standard Names. (line 276) +* umin: Arithmetic. (line 150) +* 'uminM3' instruction pattern: Standard Names. (line 276) +* umod: Arithmetic. (line 137) +* 'umodM3' instruction pattern: Standard Names. (line 276) +* 'umsubMN4' instruction pattern: Standard Names. (line 484) +* 'umulhisi3' instruction pattern: Standard Names. (line 432) +* 'umulM3_highpart' instruction pattern: Standard Names. (line 446) +* 'umulqihi3' instruction pattern: Standard Names. (line 432) +* 'umulsidi3' instruction pattern: Standard Names. (line 432) +* unchanging: Flags. (line 296) +* 'unchanging', in 'call_insn': Flags. (line 19) +* 'unchanging', in 'jump_insn', 'call_insn' and 'insn': Flags. + (line 39) +* 'unchanging', in 'mem': Flags. (line 134) +* 'unchanging', in 'subreg': Flags. (line 170) +* 'unchanging', in 'subreg' <1>: Flags. (line 180) +* 'unchanging', in 'symbol_ref': Flags. (line 10) +* UNEQ_EXPR: Unary and Binary Expressions. + (line 6) +* UNGE_EXPR: Unary and Binary Expressions. + (line 6) +* UNGT_EXPR: Unary and Binary Expressions. + (line 6) +* unions, returning: Interface. (line 10) +* UNION_TYPE: Types. (line 6) +* UNION_TYPE <1>: Classes. (line 6) +* UNITS_PER_WORD: Storage Layout. (line 60) +* UNKNOWN_TYPE: Types. (line 6) +* UNKNOWN_TYPE <1>: Types for C++. (line 6) +* UNLE_EXPR: Unary and Binary Expressions. + (line 6) +* UNLIKELY_EXECUTED_TEXT_SECTION_NAME: Sections. (line 48) +* UNLT_EXPR: Unary and Binary Expressions. + (line 6) +* UNORDERED_EXPR: Unary and Binary Expressions. + (line 6) +* unshare_all_rtl: Sharing. (line 58) +* unsigned division: Arithmetic. (line 131) +* unsigned division with unsigned saturation: Arithmetic. (line 131) +* unsigned greater than: Comparisons. (line 64) +* unsigned greater than <1>: Comparisons. (line 72) +* unsigned less than: Comparisons. (line 68) +* unsigned less than <1>: Comparisons. (line 76) +* unsigned minimum and maximum: Arithmetic. (line 150) +* unsigned_fix: Conversions. (line 77) +* unsigned_float: Conversions. (line 62) +* unsigned_fract_convert: Conversions. (line 97) +* unsigned_sat_fract: Conversions. (line 103) +* unspec: Side Effects. (line 298) +* unspec <1>: Constant Definitions. + (line 111) +* unspec_volatile: Side Effects. (line 298) +* unspec_volatile <1>: Constant Definitions. + (line 99) +* 'untyped_call' instruction pattern: Standard Names. (line 1158) +* 'untyped_return' instruction pattern: Standard Names. (line 1221) +* UPDATE_PATH_HOST_CANONICALIZE (PATH): Filesystem. (line 59) +* update_ssa: SSA. (line 74) +* update_stmt: Manipulating GIMPLE statements. + (line 140) +* update_stmt <1>: SSA Operands. (line 6) +* update_stmt_if_modified: Manipulating GIMPLE statements. + (line 143) +* UQQmode: Machine Modes. (line 126) +* 'usaddM3' instruction pattern: Standard Names. (line 276) +* USAmode: Machine Modes. (line 166) +* 'usashlM3' instruction pattern: Standard Names. (line 516) +* 'usdivM3' instruction pattern: Standard Names. (line 276) +* use: Side Effects. (line 168) +* used: Flags. (line 314) +* 'used', in 'symbol_ref': Flags. (line 197) +* user: GTY Options. (line 318) +* user gc: User GC. (line 6) +* USER_LABEL_PREFIX: Instruction Output. (line 152) +* USE_C_ALLOCA: Host Misc. (line 19) +* USE_LD_AS_NEEDED: Driver. (line 135) +* USE_LOAD_POST_DECREMENT: Costs. (line 225) +* USE_LOAD_POST_INCREMENT: Costs. (line 220) +* USE_LOAD_PRE_DECREMENT: Costs. (line 235) +* USE_LOAD_PRE_INCREMENT: Costs. (line 230) +* use_param: GTY Options. (line 119) +* use_paramN: GTY Options. (line 138) +* use_params: GTY Options. (line 147) +* USE_SELECT_SECTION_FOR_FUNCTIONS: Sections. (line 193) +* USE_STORE_POST_DECREMENT: Costs. (line 245) +* USE_STORE_POST_INCREMENT: Costs. (line 240) +* USE_STORE_PRE_DECREMENT: Costs. (line 255) +* USE_STORE_PRE_INCREMENT: Costs. (line 250) +* USING_STMT: Statements for C++. (line 6) +* 'usmaddMN4' instruction pattern: Standard Names. (line 468) +* 'usmsubMN4' instruction pattern: Standard Names. (line 492) +* 'usmulhisi3' instruction pattern: Standard Names. (line 436) +* 'usmulM3' instruction pattern: Standard Names. (line 276) +* 'usmulqihi3' instruction pattern: Standard Names. (line 436) +* 'usmulsidi3' instruction pattern: Standard Names. (line 436) +* 'usnegM2' instruction pattern: Standard Names. (line 538) +* USQmode: Machine Modes. (line 134) +* 'ussubM3' instruction pattern: Standard Names. (line 276) +* 'usum_widenM3' instruction pattern: Standard Names. (line 351) +* us_ashift: Arithmetic. (line 174) +* us_minus: Arithmetic. (line 38) +* us_mult: Arithmetic. (line 93) +* us_neg: Arithmetic. (line 82) +* us_plus: Arithmetic. (line 14) +* us_truncate: Conversions. (line 48) +* UTAmode: Machine Modes. (line 174) +* UTQmode: Machine Modes. (line 142) +* 'V' in constraint: Simple Constraints. (line 43) +* values, returned by functions: Scalar Return. (line 6) +* varargs implementation: Varargs. (line 6) +* variable: Declarations. (line 6) +* Variable Location Debug Information in RTL: Debug Information. + (line 6) +* variable_size: GTY Options. (line 245) +* VAR_DECL: Declarations. (line 6) +* var_location: Debug Information. (line 14) +* 'vashlM3' instruction pattern: Standard Names. (line 530) +* 'vashrM3' instruction pattern: Standard Names. (line 530) +* VA_ARG_EXPR: Unary and Binary Expressions. + (line 6) +* 'vcondMN' instruction pattern: Standard Names. (line 213) +* vector: Containers. (line 6) +* vector operations: Vector Operations. (line 6) +* VECTOR_CST: Constant expressions. + (line 6) +* VECTOR_STORE_FLAG_VALUE: Misc. (line 293) +* vec_concat: Vector Operations. (line 28) +* vec_duplicate: Vector Operations. (line 33) +* 'vec_extractM' instruction pattern: Standard Names. (line 203) +* 'vec_initM' instruction pattern: Standard Names. (line 208) +* 'vec_load_lanesMN' instruction pattern: Standard Names. (line 165) +* VEC_LSHIFT_EXPR: Vectors. (line 6) +* vec_merge: Vector Operations. (line 11) +* VEC_PACK_FIX_TRUNC_EXPR: Vectors. (line 6) +* VEC_PACK_SAT_EXPR: Vectors. (line 6) +* 'vec_pack_sfix_trunc_M' instruction pattern: Standard Names. + (line 377) +* 'vec_pack_ssat_M' instruction pattern: Standard Names. (line 370) +* VEC_PACK_TRUNC_EXPR: Vectors. (line 6) +* 'vec_pack_trunc_M' instruction pattern: Standard Names. (line 363) +* 'vec_pack_ufix_trunc_M' instruction pattern: Standard Names. + (line 377) +* 'vec_pack_usat_M' instruction pattern: Standard Names. (line 370) +* 'vec_permM' instruction pattern: Standard Names. (line 223) +* 'vec_perm_constM' instruction pattern: Standard Names. (line 239) +* VEC_RSHIFT_EXPR: Vectors. (line 6) +* vec_select: Vector Operations. (line 19) +* 'vec_setM' instruction pattern: Standard Names. (line 198) +* 'vec_shl_M' instruction pattern: Standard Names. (line 357) +* 'vec_shr_M' instruction pattern: Standard Names. (line 357) +* 'vec_store_lanesMN' instruction pattern: Standard Names. (line 187) +* 'vec_unpacks_float_hi_M' instruction pattern: Standard Names. + (line 398) +* 'vec_unpacks_float_lo_M' instruction pattern: Standard Names. + (line 398) +* 'vec_unpacks_hi_M' instruction pattern: Standard Names. (line 384) +* 'vec_unpacks_lo_M' instruction pattern: Standard Names. (line 384) +* 'vec_unpacku_float_hi_M' instruction pattern: Standard Names. + (line 398) +* 'vec_unpacku_float_lo_M' instruction pattern: Standard Names. + (line 398) +* 'vec_unpacku_hi_M' instruction pattern: Standard Names. (line 391) +* 'vec_unpacku_lo_M' instruction pattern: Standard Names. (line 391) +* VEC_UNPACK_FLOAT_HI_EXPR: Vectors. (line 6) +* VEC_UNPACK_FLOAT_LO_EXPR: Vectors. (line 6) +* VEC_UNPACK_HI_EXPR: Vectors. (line 6) +* VEC_UNPACK_LO_EXPR: Vectors. (line 6) +* VEC_WIDEN_MULT_HI_EXPR: Vectors. (line 6) +* VEC_WIDEN_MULT_LO_EXPR: Vectors. (line 6) +* 'vec_widen_smult_even_M' instruction pattern: Standard Names. + (line 407) +* 'vec_widen_smult_hi_M' instruction pattern: Standard Names. + (line 407) +* 'vec_widen_smult_lo_M' instruction pattern: Standard Names. + (line 407) +* 'vec_widen_smult_odd_M' instruction pattern: Standard Names. + (line 407) +* 'vec_widen_sshiftl_hi_M' instruction pattern: Standard Names. + (line 418) +* 'vec_widen_sshiftl_lo_M' instruction pattern: Standard Names. + (line 418) +* 'vec_widen_umult_even_M' instruction pattern: Standard Names. + (line 407) +* 'vec_widen_umult_hi_M' instruction pattern: Standard Names. + (line 407) +* 'vec_widen_umult_lo_M' instruction pattern: Standard Names. + (line 407) +* 'vec_widen_umult_odd_M' instruction pattern: Standard Names. + (line 407) +* 'vec_widen_ushiftl_hi_M' instruction pattern: Standard Names. + (line 418) +* 'vec_widen_ushiftl_lo_M' instruction pattern: Standard Names. + (line 418) +* verify_flow_info: Maintaining the CFG. + (line 117) +* virtual operands: SSA Operands. (line 6) +* VIRTUAL_INCOMING_ARGS_REGNUM: Regs and Memory. (line 59) +* VIRTUAL_OUTGOING_ARGS_REGNUM: Regs and Memory. (line 87) +* VIRTUAL_STACK_DYNAMIC_REGNUM: Regs and Memory. (line 78) +* VIRTUAL_STACK_VARS_REGNUM: Regs and Memory. (line 69) +* VLIW: Processor pipeline description. + (line 6) +* VLIW <1>: Processor pipeline description. + (line 223) +* 'vlshrM3' instruction pattern: Standard Names. (line 530) +* VMS: Filesystem. (line 37) +* VMS_DEBUGGING_INFO: VMS Debug. (line 8) +* VOIDmode: Machine Modes. (line 192) +* VOID_TYPE: Types. (line 6) +* volatil: Flags. (line 328) +* 'volatil', in 'insn', 'call_insn', 'jump_insn', 'code_label', 'jump_table_data', 'barrier', and 'note': Flags. + (line 44) +* 'volatil', in 'label_ref' and 'reg_label': Flags. (line 65) +* 'volatil', in 'mem', 'asm_operands', and 'asm_input': Flags. + (line 76) +* 'volatil', in 'reg': Flags. (line 98) +* 'volatil', in 'subreg': Flags. (line 170) +* 'volatil', in 'subreg' <1>: Flags. (line 180) +* 'volatil', in 'symbol_ref': Flags. (line 206) +* volatile memory references: Flags. (line 329) +* 'volatile', in 'prefetch': Flags. (line 214) +* voting between constraint alternatives: Class Preferences. (line 6) +* 'vrotlM3' instruction pattern: Standard Names. (line 530) +* 'vrotrM3' instruction pattern: Standard Names. (line 530) +* walk_dominator_tree: SSA. (line 227) +* walk_gimple_op: Statement and operand traversals. + (line 30) +* walk_gimple_seq: Statement and operand traversals. + (line 47) +* walk_gimple_stmt: Statement and operand traversals. + (line 10) +* WCHAR_TYPE: Type Layout. (line 208) +* WCHAR_TYPE_SIZE: Type Layout. (line 216) +* which_alternative: Output Statement. (line 58) +* WHILE_BODY: Statements for C++. (line 6) +* WHILE_COND: Statements for C++. (line 6) +* WHILE_STMT: Statements for C++. (line 6) +* whopr: LTO. (line 6) +* WIDEST_HARDWARE_FP_SIZE: Type Layout. (line 153) +* 'window_save' instruction pattern: Standard Names. (line 1513) +* WINT_TYPE: Type Layout. (line 221) +* WORDS_BIG_ENDIAN: Storage Layout. (line 28) +* 'WORDS_BIG_ENDIAN', effect on 'subreg': Regs and Memory. (line 215) +* word_mode: Machine Modes. (line 358) +* WORD_REGISTER_OPERATIONS: Misc. (line 53) +* wpa: LTO. (line 6) +* 'X' in constraint: Simple Constraints. (line 122) +* 'x-HOST': Host Fragment. (line 6) +* XCmode: Machine Modes. (line 199) +* XCOFF_DEBUGGING_INFO: DBX Options. (line 12) +* XEXP: Accessors. (line 6) +* XFmode: Machine Modes. (line 82) +* XF_SIZE: Type Layout. (line 137) +* XImode: Machine Modes. (line 54) +* XINT: Accessors. (line 6) +* 'xm-MACHINE.h': Filesystem. (line 6) +* 'xm-MACHINE.h' <1>: Host Misc. (line 6) +* xor: Arithmetic. (line 169) +* 'xor', canonicalization of: Insn Canonicalizations. + (line 78) +* 'xorM3' instruction pattern: Standard Names. (line 276) +* XSTR: Accessors. (line 6) +* XVEC: Accessors. (line 41) +* XVECEXP: Accessors. (line 48) +* XVECLEN: Accessors. (line 44) +* XWINT: Accessors. (line 6) +* zero_extend: Conversions. (line 28) +* 'zero_extendMN2' instruction pattern: Standard Names. (line 926) +* zero_extract: Bit-Fields. (line 30) +* 'zero_extract', canonicalization of: Insn Canonicalizations. + (line 87) + + + +Tag Table: +Node: Top1789 +Node: Contributing4877 +Node: Portability5606 +Node: Interface7394 +Node: Libgcc10435 +Node: Integer library routines12262 +Node: Soft float library routines19104 +Node: Decimal float library routines31042 +Node: Fixed-point fractional library routines46800 +Node: Exception handling routines147196 +Node: Miscellaneous routines148303 +Node: Languages150423 +Node: Source Tree151970 +Node: Configure Terms152552 +Node: Top Level155508 +Node: gcc Directory158970 +Node: Subdirectories159922 +Node: Configuration162090 +Node: Config Fragments162810 +Node: System Config164035 +Node: Configuration Files164971 +Node: Build167788 +Node: Makefile168200 +Ref: Makefile-Footnote-1175004 +Ref: Makefile-Footnote-2175151 +Node: Library Files175225 +Node: Headers175787 +Node: Documentation177870 +Node: Texinfo Manuals178729 +Node: Man Page Generation181058 +Node: Miscellaneous Docs182971 +Node: Front End184358 +Node: Front End Directory188032 +Node: Front End Config189348 +Node: Front End Makefile192164 +Node: Back End195932 +Node: Testsuites199713 +Node: Test Idioms200644 +Node: Test Directives204042 +Node: Directives204569 +Node: Selectors214866 +Node: Effective-Target Keywords216222 +Ref: arm_neon_ok223910 +Ref: arm_neonv2_ok224068 +Ref: arm_neon_fp16_ok224240 +Ref: arm_vfp3_ok224680 +Node: Add Options234179 +Node: Require Support235496 +Node: Final Actions238003 +Node: Ada Tests243168 +Node: C Tests244499 +Node: libgcj Tests248894 +Node: LTO Testing250021 +Node: gcov Testing251669 +Node: profopt Testing254659 +Node: compat Testing256374 +Node: Torture Tests260614 +Node: Options262229 +Node: Option file format262670 +Node: Option properties269659 +Node: Passes282686 +Node: Parsing pass283576 +Node: Cilk Plus Transformation287109 +Node: Gimplification pass290491 +Node: Pass manager292336 +Node: Tree SSA passes294182 +Node: RTL passes315249 +Node: Optimization info327613 +Node: Dump setup328432 +Node: Optimization groups329561 +Node: Dump files and streams330450 +Node: Dump output verbosity331648 +Node: Dump types332704 +Node: Dump examples334194 +Node: GENERIC335540 +Node: Deficiencies337416 +Node: Tree overview337657 +Node: Macros and Functions341781 +Node: Identifiers342606 +Node: Containers344215 +Node: Types345372 +Node: Declarations357446 +Node: Working with declarations357941 +Node: Internal structure363545 +Node: Current structure hierarchy363929 +Node: Adding new DECL node types366022 +Node: Attributes370306 +Node: Expression trees371550 +Node: Constant expressions373304 +Node: Storage References377517 +Node: Unary and Binary Expressions381036 +Node: Vectors401184 +Node: Statements405916 +Node: Basic Statements406436 +Node: Blocks410943 +Node: Statement Sequences412347 +Node: Empty Statements412680 +Node: Jumps413254 +Node: Cleanups413907 +Node: OpenMP415674 +Node: Functions421518 +Node: Function Basics421989 +Node: Function Properties425673 +Node: Language-dependent trees428454 +Node: C and C++ Trees429341 +Node: Types for C++432245 +Node: Namespaces437215 +Node: Classes440321 +Node: Functions for C++445398 +Node: Statements for C++451649 +Node: C++ Expressions460422 +Node: Java Trees461927 +Node: GIMPLE462040 +Node: Tuple representation465664 +Node: GIMPLE instruction set473968 +Node: GIMPLE Exception Handling475584 +Node: Temporaries477496 +Ref: Temporaries-Footnote-1478814 +Node: Operands478879 +Node: Compound Expressions479640 +Node: Compound Lvalues479874 +Node: Conditional Expressions480636 +Node: Logical Operators481295 +Node: Manipulating GIMPLE statements488153 +Node: Tuple specific accessors494089 +Node: 'GIMPLE_ASM'494908 +Node: 'GIMPLE_ASSIGN'497425 +Node: 'GIMPLE_BIND'501531 +Node: 'GIMPLE_CALL'503339 +Node: 'GIMPLE_CATCH'507610 +Node: 'GIMPLE_COND'508754 +Node: 'GIMPLE_DEBUG'511542 +Node: 'GIMPLE_EH_FILTER'514920 +Node: 'GIMPLE_LABEL'516408 +Node: 'GIMPLE_NOP'517383 +Node: 'GIMPLE_OMP_ATOMIC_LOAD'517752 +Node: 'GIMPLE_OMP_ATOMIC_STORE'518662 +Node: 'GIMPLE_OMP_CONTINUE'519302 +Node: 'GIMPLE_OMP_CRITICAL'520652 +Node: 'GIMPLE_OMP_FOR'521590 +Node: 'GIMPLE_OMP_MASTER'525105 +Node: 'GIMPLE_OMP_ORDERED'525489 +Node: 'GIMPLE_OMP_PARALLEL'525889 +Node: 'GIMPLE_OMP_RETURN'528522 +Node: 'GIMPLE_OMP_SECTION'529173 +Node: 'GIMPLE_OMP_SECTIONS'529839 +Node: 'GIMPLE_OMP_SINGLE'531446 +Node: 'GIMPLE_PHI'532384 +Node: 'GIMPLE_RESX'533671 +Node: 'GIMPLE_RETURN'534390 +Node: 'GIMPLE_SWITCH'534958 +Node: 'GIMPLE_TRY'536760 +Node: 'GIMPLE_WITH_CLEANUP_EXPR'538551 +Node: GIMPLE sequences539434 +Node: Sequence iterators542640 +Node: Adding a new GIMPLE statement code551095 +Node: Statement and operand traversals552371 +Node: Tree SSA554963 +Node: Annotations556751 +Node: SSA Operands557156 +Node: SSA571230 +Node: Alias analysis582262 +Node: Memory model586036 +Node: RTL587395 +Node: RTL Objects589583 +Node: RTL Classes593457 +Node: Accessors598454 +Node: Special Accessors600848 +Node: Flags606635 +Node: Machine Modes621399 +Node: Constants634687 +Node: Regs and Memory641415 +Node: Arithmetic659303 +Node: Comparisons669385 +Node: Bit-Fields673677 +Node: Vector Operations675229 +Node: Conversions677110 +Node: RTL Declarations681608 +Node: Side Effects682429 +Node: Incdec699439 +Node: Assembler702775 +Node: Debug Information704320 +Node: Insns705517 +Node: Calls731938 +Node: Sharing734531 +Node: Reading RTL737642 +Node: Control Flow738633 +Node: Basic Blocks740402 +Node: Edges745691 +Node: Profile information754320 +Node: Maintaining the CFG759004 +Node: Liveness information764865 +Node: Loop Analysis and Representation766991 +Node: Loop representation768101 +Node: Loop querying775664 +Node: Loop manipulation778480 +Node: LCSSA780841 +Node: Scalar evolutions782910 +Node: loop-iv786154 +Node: Number of iterations788076 +Node: Dependency analysis790882 +Node: Omega797246 +Node: Machine Desc798822 +Node: Overview801385 +Node: Patterns803425 +Node: Example806863 +Node: RTL Template808297 +Node: Output Template818952 +Node: Output Statement822915 +Node: Predicates827254 +Node: Machine-Independent Predicates830172 +Node: Defining Predicates835116 +Node: Constraints841079 +Node: Simple Constraints842561 +Node: Multi-Alternative855401 +Node: Class Preferences858242 +Node: Modifiers859134 +Node: Machine Constraints863380 +Node: Disable Insn Alternatives921548 +Node: Define Constraints924449 +Node: C Constraint Interface931234 +Node: Standard Names934886 +Ref: shift patterns958034 +Ref: prologue instruction pattern1002791 +Ref: window_save instruction pattern1003284 +Ref: epilogue instruction pattern1003561 +Node: Pattern Ordering1021147 +Node: Dependent Patterns1022383 +Node: Jump Patterns1024003 +Ref: Jump Patterns-Footnote-11026150 +Node: Looping Patterns1026198 +Node: Insn Canonicalizations1030927 +Node: Expander Definitions1035512 +Node: Insn Splitting1043726 +Node: Including Patterns1053327 +Node: Peephole Definitions1055108 +Node: define_peephole1056361 +Node: define_peephole21062691 +Node: Insn Attributes1065757 +Node: Defining Attributes1066939 +Ref: define_enum_attr1070432 +Node: Expressions1071468 +Node: Tagging Insns1078218 +Node: Attr Example1082571 +Node: Insn Lengths1084944 +Node: Constant Attributes1088003 +Node: Mnemonic Attribute1089179 +Node: Delay Slots1090698 +Node: Processor pipeline description1093921 +Ref: Processor pipeline description-Footnote-11112739 +Node: Conditional Execution1113063 +Node: Define Subst1116546 +Node: Define Subst Example1118582 +Node: Define Subst Pattern Matching1121576 +Node: Define Subst Output Template1122802 +Node: Constant Definitions1124872 +Ref: define_enum1128654 +Node: Iterators1129142 +Node: Mode Iterators1129720 +Node: Defining Mode Iterators1130698 +Node: Substitutions1132192 +Node: Examples1134434 +Node: Code Iterators1135882 +Node: Int Iterators1138161 +Node: Subst Iterators1140605 +Node: Target Macros1142297 +Node: Target Structure1145385 +Node: Driver1147501 +Node: Run-time Target1166313 +Node: Per-Function Data1176024 +Node: Storage Layout1178788 +Node: Type Layout1205040 +Node: Registers1220363 +Node: Register Basics1221337 +Node: Allocation Order1226845 +Node: Values in Registers1229291 +Node: Leaf Functions1236769 +Node: Stack Registers1239628 +Node: Register Classes1240900 +Node: Old Constraints1271844 +Node: Stack and Calling1278984 +Node: Frame Layout1279518 +Node: Exception Handling1290394 +Node: Stack Checking1296606 +Node: Frame Registers1301420 +Node: Elimination1309679 +Node: Stack Arguments1313909 +Node: Register Arguments1320772 +Node: Scalar Return1341073 +Node: Aggregate Return1347160 +Node: Caller Saves1351371 +Node: Function Entry1352548 +Node: Profiling1363642 +Node: Tail Calls1365341 +Node: Stack Smashing Protection1367244 +Node: Varargs1368872 +Node: Trampolines1375559 +Node: Library Calls1381602 +Node: Addressing Modes1386286 +Node: Anchored Addresses1407254 +Node: Condition Code1409897 +Node: CC0 Condition Codes1412224 +Node: MODE_CC Condition Codes1415470 +Node: Costs1421922 +Node: Scheduling1438384 +Node: Sections1458342 +Node: PIC1474040 +Node: Assembler Format1476099 +Node: File Framework1477237 +Ref: TARGET_HAVE_SWITCHABLE_BSS_SECTIONS1484169 +Node: Data Output1487439 +Node: Uninitialized Data1495208 +Node: Label Output1500219 +Node: Initialization1523175 +Node: Macros for Initialization1529136 +Node: Instruction Output1535855 +Node: Dispatch Tables1546478 +Node: Exception Region Output1550862 +Node: Alignment Output1557540 +Node: Debugging Info1562119 +Node: All Debuggers1562789 +Node: DBX Options1565644 +Node: DBX Hooks1571082 +Node: File Names and DBX1572391 +Node: SDB and DWARF1574503 +Node: VMS Debug1580575 +Node: Floating Point1581162 +Node: Mode Switching1585638 +Node: Target Attributes1589634 +Node: Emulated TLS1598092 +Node: MIPS Coprocessors1601482 +Node: PCH Target1602779 +Node: C++ ABI1604621 +Node: Named Address Spaces1609415 +Node: Misc1614349 +Ref: TARGET_SHIFT_TRUNCATION_MASK1621091 +Node: Host Config1669593 +Node: Host Common1670661 +Node: Filesystem1673035 +Node: Host Misc1677150 +Node: Fragments1679599 +Node: Target Fragment1680794 +Node: Host Fragment1691422 +Node: Collect21691662 +Node: Header Dirs1694298 +Node: Type Information1695721 +Node: GTY Options1698997 +Node: Inheritance and GTY1713517 +Ref: Inheritance and GTY-Footnote-11715080 +Node: User GC1715350 +Node: GGC Roots1719089 +Node: Files1719802 +Node: Invoking the garbage collector1722509 +Node: Troubleshooting1724014 +Node: Plugins1725089 +Node: Plugins loading1726207 +Node: Plugin API1727077 +Node: Plugins pass1734740 +Node: Plugins GC1736711 +Node: Plugins description1738376 +Node: Plugins attr1738912 +Node: Plugins recording1741185 +Node: Plugins gate1742035 +Node: Plugins tracking1742626 +Node: Plugins building1743214 +Node: LTO1745004 +Node: LTO Overview1745865 +Node: LTO object file layout1751697 +Node: IPA1756327 +Node: WHOPR1765292 +Node: Internal flags1769981 +Node: Funding1771392 +Node: GNU Project1773876 +Node: Copying1774525 +Node: GNU Free Documentation License1812036 +Node: Contributors1837156 +Node: Option Index1875028 +Node: Concept Index1875905 + +End Tag Table |