| This is doc/gccint.info, produced by makeinfo version 4.7 from |
| ../../gcc-4.5.3/gcc/doc/gccint.texi. |
| |
| Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, |
| 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 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.2 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, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, |
| 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 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.2 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 |
| (Broadcom stbgcc-4.5.3-1.3) version 4.5.3. 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. |
| |
| * 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, Prev: Top, 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 Other Builtins: (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 __udivmoddi3 (unsigned long A, |
| unsigned long B, unsigned long *C) |
| -- Runtime Function: unsigned long long __udivti3 (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. |
| |
| |
| 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. |
| |
| `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. |
| |
| `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. |
| |
| `libjava' |
| The Java runtime library. |
| |
| `libmudflap' |
| The `libmudflap' library, used for instrumenting pointer and array |
| dereferencing operations. |
| |
| `libobjc' |
| The Objective-C and Objective-C++ runtime library. |
| |
| `libssp' |
| The Stack protector runtime library. |
| |
| `libstdc++-v3' |
| The C++ runtime library. |
| |
| `lto-plugin' |
| Plugin used by `gold' 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 `cp' (for C++), `lto' (for LTO), `objc' (for |
| Objective-C) and `objcp' (for Objective-C++) 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. |
| |
| `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. |
| |
| * `gccbug', a script for reporting bugs in GCC, is constructed from |
| `gccbug.in'. |
| |
| * 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 `.c' file. FIXME: |
| why is such a separate header necessary? |
| |
| |
| 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)' |
| Rebuild all the stages up to N, with the appropriate flags, |
| "bubbling" the changes as described above. |
| |
| `all-stageN (N = 1...4)' |
| 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. 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)' |
| 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.texi' |
| `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'. 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', `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 mentioned in |
| `gcc/gccbug.in', as well as being 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' (*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. The associated `maintainer-scripts/snapshot-README' and |
| `maintainer-scripts/snapshot-index.html' files should be updated |
| to list the tarballs and diffs 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. In |
| addition the main directory contains `c-config-lang.in', which contains |
| limited information for the C language. 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. |
| |
| |
| 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::. |
| |
| 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 |
| |
| * 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. Use |
| `*-*-*' to match any target. |
| |
| 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. |
| |
| `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_int_mult' |
| Target supports a vector widening multiplication of `short' |
| operands into an `int' result, or supports promotion (unpacking) |
| from `short' to `int' and a non-widening multiplication 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_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_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_neon_ok' |
| ARM Target supports `-mfpu=neon -mfloat-abi=softfp'. 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. |
| |
| 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. |
| |
| `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. |
| |
| `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'. |
| |
| `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). |
| |
| `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'. |
| |
| `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: |
| |
| `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' |
| Removes Fortran module files generated for this test. |
| |
| `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 2.5 |
| testsuite, publicly available at |
| `http://www.adaic.org/compilers/acats/2.5'. |
| |
| 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 }' |
| This directive adds OPTIONS to the linker options used. |
| |
| `{ dg-suppress-ld-options OPTIONS }' |
| 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. |
| |
| * 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. |
| |
| `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::. |
| |
| `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. |
| |
| `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'. |
| |
| `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. |
| |
| `Var(VAR)' |
| The state of this option should be stored in variable 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. |
| |
| * 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 declare VAR in |
| `options.c' and leave it to be zero-initialized at start-up time. |
| You can modify this behavior using `VarExists' and `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. |
| |
| `VarExists' |
| The variable specified by the `Var' property already exists. No |
| definition should be added to `options.c' in response to this |
| option record. |
| |
| You should use this property only if the variable is declared |
| outside `options.c'. |
| |
| `Init(VALUE)' |
| The variable specified by the `Var' property should be statically |
| initialized to VALUE. |
| |
| `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 associated |
| macros are called `OPTION_MASK_NAME' and `OPTION_NAME' |
| respectively. |
| |
| You can disable automatic bit allocation using `MaskExists'. |
| |
| `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. |
| |
| `MaskExists' |
| The mask specified by the `Mask' property already exists. No |
| `MASK' or `TARGET' definitions should be added to `options.h' in |
| response to this option record. |
| |
| The main purpose of this property is to support synonymous options. |
| The first option should use `Mask(NAME)' and the others should use |
| `Mask(NAME) MaskExists'. |
| |
| `Report' |
| The state of the option should be printed by `-fverbose-asm'. |
| |
| `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. |
| |
| |
| 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. |
| * 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. |
| |
| |
| File: gccint.info, Node: Parsing pass, Next: Gimplification pass, 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 (CROSSREF), 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 (CROSSREF) on each |
| function, and uses the gimplifier callbacks to convert the |
| language-specific tree nodes directly to GIMPLE (CROSSREF) 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: Gimplification pass, Next: Pass manager, Prev: Parsing pass, Up: Passes |
| |
| 9.2 Gimplification pass |
| ======================= |
| |
| "Gimplification" is a whimsical term for the process of converting the |
| intermediate representation of a function into the GIMPLE language |
| (CROSSREF). 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.3 Pass manager |
| ================ |
| |
| The pass manager is located in `passes.c', `tree-optimize.c' and |
| `tree-pass.h'. 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.4 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'. |
| |
| * Mudflap declaration registration |
| |
| If mudflap (*note -fmudflap -fmudflapth -fmudflapir: (gcc)Optimize |
| Options.) is enabled, we generate code to register some variable |
| declarations with the mudflap runtime. Specifically, the runtime |
| tracks the lifetimes of those variable declarations that have |
| their addresses taken, or whose bounds are unknown at compile time |
| (`extern'). This pass generates new exception handling constructs |
| (`try'/`finally'), and so must run before those are lowered. In |
| addition, the pass enqueues declarations of static variables whose |
| lifetimes extend to the entire program. The pass is located in |
| `tree-mudflap.c' and is described by `pass_mudflap_1'. |
| |
| * 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 an 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 patch |
| re-introduces COND_EXPR at GIMPLE level. 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'. |
| |
| * Mudflap statement annotation |
| |
| If mudflap is enabled, we rewrite some memory accesses with code to |
| validate that the memory access is correct. In particular, |
| expressions involving pointer dereferences (`INDIRECT_REF', |
| `ARRAY_REF', etc.) are replaced by code that checks the selected |
| address range against the mudflap runtime's database of valid |
| regions. This check includes an inline lookup into a |
| direct-mapped cache, based on shift/mask operations of the pointer |
| value, with a fallback function call into the runtime. The pass |
| is located in `tree-mudflap.c' and is described by |
| `pass_mudflap_2'. |
| |
| * 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, Prev: Tree SSA passes, Up: Passes |
| |
| 9.5 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, 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'. |
| |
| * Register movement |
| |
| This pass looks for cases where matching constraints would force an |
| instruction to need a reload, and this reload would be a |
| register-to-register move. It then attempts to change the |
| registers used by the instruction to avoid the move instruction. |
| The code is located in `regmove.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: |
| |
| * Register move optimizations. This pass makes some simple RTL |
| code transformations which improve the subsequent register |
| allocation. The source file is `regmove.c'. |
| |
| * 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 |
| pass. Pseudo-registers spilled by the allocator or the |
| reload have still a chance to get hard-registers if the |
| reload 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. |
| |
| * 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. If mudflap is enabled, the queue of deferred |
| declarations and any addressed constants (e.g., string literals) |
| is processed by `mudflap_finish_file' into a synthetic constructor |
| function containing calls into the mudflap runtime. |
| |
| * 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: RTL, Next: Control Flow, Prev: Tree SSA, Up: Top |
| |
| 10 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 |
| |
| 10.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 |
| |
| 10.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' and `VEC_MERGE'. |
| |
| `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 |
| |
| 10.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 |
| |
| 10.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 (X)' |
| The offset from the start of `MEM_EXPR' as a `CONST_INT' rtx. |
| |
| `MEM_SIZE (X)' |
| The size in bytes of the memory reference as a `CONST_INT' |
| rtx. This is mostly relevant for `BLKmode' references as |
| otherwise the size is implied by the mode. |
| |
| `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 |
| |
| 10.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', `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_IN_STRUCT_P (X)' |
| In `mem' expressions, nonzero for reference to an entire structure, |
| union or array, or to a component of one. Zero for references to a |
| scalar variable or through a pointer to a scalar. If both this |
| flag and `MEM_SCALAR_P' are clear, then we don't know whether this |
| `mem' is in a structure or not. Both flags should never be |
| simultaneously set. Stored in the `in_struct' field and printed |
| as `/s'. |
| |
| `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_SCALAR_P (X)' |
| In `mem' expressions, nonzero for reference to a scalar known not |
| to be a member of a structure, union, or array. Zero for such |
| references and for indirections through pointers, even pointers |
| pointing to scalar types. If both this flag and `MEM_IN_STRUCT_P' |
| are clear, then we don't know whether this `mem' is in a structure |
| or not. Both flags should never be simultaneously set. Stored in |
| the `return_val' field and printed as `/i'. |
| |
| `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 transfered |
| 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' or |
| `jump_insn', 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 `mem' expressions, it is 1 if the memory datum referred to is |
| all or part of a structure or array; 0 if it is (or might be) a |
| scalar variable. A reference through a C pointer has 0 because |
| the pointer might point to a scalar variable. This information |
| allows the compiler to determine something about possible cases of |
| aliasing. |
| |
| 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 `mem' expressions, 1 means the memory reference is to a scalar |
| known not to be a member of a structure, union, or array. |
| |
| 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 |
| |
| 10.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. |
| |
| `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' (see *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 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 |
| |
| 10.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 `HOST_WIDE_INT' |
| must be sign extended to full width (e.g., with `gen_int_mode'). |
| |
| 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'. |
| |
| 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 |
| |
| 10.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 |
| |
| 10.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'. |
| |
| `(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 need not be M; depending on the target |
| machine, various mode combinations may be valid. |
| |
| `(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 will usually be an integer mode. |
| |
| `(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 will |
| usually be an integer mode. |
| |
| `(popcount:M X)' |
| Represents the number of 1-bits in X, represented as an integer of |
| mode M. The mode of X will usually be an integer mode. |
| |
| `(parity:M X)' |
| Represents the number of 1-bits modulo 2 in X, represented as an |
| integer of mode M. The mode of X will usually be an integer mode. |
| |
| `(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. |
| |
| |
| File: gccint.info, Node: Comparisons, Next: Bit-Fields, Prev: Arithmetic, Up: RTL |
| |
| 10.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 |
| |
| 10.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 |
| |
| 10.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 VEC1 VEC2)' |
| Describes a vector concat operation. The result is a |
| concatenation of the vectors VEC1 and VEC2; its length is the sum |
| of the lengths of the two inputs. |
| |
| `(vec_duplicate:M VEC)' |
| This operation converts 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, 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 |
| |
| 10.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 |
| |
| 10.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 |
| |
| 10.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. |
| |
| `(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', |
| `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. Each of the INSNS that appears in |
| the vector is suitable for appearing in the chain of insns, so it |
| must be an `insn', `jump_insn', `call_insn', `code_label', |
| `barrier' or `note'. |
| |
| A `sequence' RTX is never placed in an actual insn during RTL |
| generation. It represents the sequence of insns that result from a |
| `define_expand' _before_ those insns are passed to `emit_insn' to |
| insert them in the chain of insns. When actually inserted, the |
| individual sub-insns are separated out and the `sequence' is |
| forgotten. |
| |
| 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::. |
| |
| 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 |
| |
| 10.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 |
| |
| 10.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 |
| |
| 10.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 |
| |
| 10.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' and `clobber' |
| expressions that denote hard registers and `MEM's used or |
| clobbered by the called function. |
| |
| A `MEM' generally points to a stack slots 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. |
| |
| `CLOBBER'ed registers in this list augment registers specified in |
| `CALL_USED_REGISTERS' (*note Register Basics::). |
| |
| `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. |
| |
| `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_BLOCK_NUMBER' identifies which `CODE_LABEL' or `note' |
| of type `NOTE_INSN_DELETED_LABEL' is associated with the |
| given region. |
| |
| `NOTE_INSN_LOOP_BEG' |
| `NOTE_INSN_LOOP_END' |
| These types of notes indicate the position of the beginning |
| and end of a `while' or `for' loop. They enable the loop |
| optimizer to find loops quickly. |
| |
| `NOTE_INSN_LOOP_CONT' |
| Appears at the place in a loop that `continue' statements |
| jump to. |
| |
| `NOTE_INSN_LOOP_VTOP' |
| This note indicates the place in a loop where the exit test |
| begins for those loops in which the exit test has been |
| duplicated. This position becomes another virtual start of |
| the loop when considering loop invariants. |
| |
| `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', `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' and `insn_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' 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 as an `expr_list'. |
| |
| `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 value is stored as |
| a value 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 |
| |
| 10.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 |
| |
| 10.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 |
| |
| 10.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: GENERIC, Next: GIMPLE, Prev: Passes, Up: Top |
| |
| 11 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 most |
| 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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.2.2 Identifiers |
| ------------------ |
| |
| An `IDENTIFIER_NODE' represents a slightly more general concept that |
| 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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| |
| |
| File: gccint.info, Node: Attributes, Next: Expression trees, Prev: Declarations, Up: GENERIC |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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. |
| |
| `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 |
| |
| 11.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. |
| |
| `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. |
| |
| `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 operand with either be both of |
| integral type or both of floating type. 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. |
| |
| 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 array. The first operand is reserved for use by the |
| back end. The second operand is a `TREE_LIST'. If the |
| `TREE_TYPE' of the `CONSTRUCTOR' is a `RECORD_TYPE' or |
| `UNION_TYPE', then the `TREE_PURPOSE' of each node in the |
| `TREE_LIST' will be a `FIELD_DECL' and the `TREE_VALUE' of each |
| node will be the expression used to initialize that field. |
| |
| If the `TREE_TYPE' of the `CONSTRUCTOR' is an `ARRAY_TYPE', then |
| the `TREE_PURPOSE' of each element in the `TREE_LIST' will be an |
| `INTEGER_CST' or a `RANGE_EXPR' of two `INTEGER_CST's. A single |
| `INTEGER_CST' indicates which element of the array (indexed from |
| zero) is being assigned to. A `RANGE_EXPR' indicates an inclusive |
| range of elements to initialize. In both cases the `TREE_VALUE' |
| is the corresponding initializer. It is re-evaluated for each |
| element of a `RANGE_EXPR'. If the `TREE_PURPOSE' 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 set to |
| zero. |
| |
| `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'. |
| |
| |
| |
| File: gccint.info, Node: Vectors, Prev: Unary and Binary Expressions, Up: Expression trees |
| |
| 11.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_EXTRACT_EVEN_EXPR' |
| `VEC_EXTRACT_ODD_EXPR' |
| These nodes represent extracting of the even/odd elements of the |
| two input vectors, respectively. Their operands and result are |
| vectors that contain the same number of elements of the same type. |
| |
| `VEC_INTERLEAVE_HIGH_EXPR' |
| `VEC_INTERLEAVE_LOW_EXPR' |
| These nodes represent merging and interleaving of the high/low |
| elements of the two input vectors, respectively. The operands and |
| the result are vectors that contain the same number of elements |
| (`N') of the same type. In the case of |
| `VEC_INTERLEAVE_HIGH_EXPR', the high `N/2' elements of the first |
| input vector are interleaved with the high `N/2' elements of the |
| second input vector. In the case of `VEC_INTERLEAVE_LOW_EXPR', the |
| low `N/2' elements of the first input vector are interleaved with |
| the low `N/2' elements of the second input vector. |
| |
| |
| |
| File: gccint.info, Node: Statements, Next: Functions, Prev: Expression trees, Up: GENERIC |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 sub-codes 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', |
| and `OMP_CLAUSE_REDUCTION'. 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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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. |
| |
| |
| 11.8.2.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: |
| |
| |
| File: gccint.info, Node: Language-dependent trees, Next: C and C++ Trees, Prev: Functions, Up: GENERIC |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 macro 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_PTRMEM_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_PTRMEM_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, see *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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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 |
| |
| 11.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. |
| |
| 11.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. |
| |
| `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 |
| |
| 11.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 |
| |
| 11.11 Java Trees |
| ================ |
| |
| |
| File: gccint.info, Node: GIMPLE, Next: Tree SSA, Prev: GENERIC, Up: Top |
| |
| 12 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 |
| |
| 12.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. |
| |
| 12.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. |
| |
| 12.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 |
| `addresses_taken' 64 |
| `def_ops' 64 |
| `use_ops' 64 |
| `op' `num_ops' * 64 |
| Total size 56 + 8 * `num_ops' bytes |
| |
| * `gsbase' Inherited from `struct gimple_statement_base'. |
| |
| * `addresses_taken' Bitmap holding the UIDs of all the `VAR_DECL's |
| whose addresses are taken by this statement. For example, a |
| statement of the form `p = &b' will have the UID for symbol `b' in |
| this set. |
| |
| * `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. |
| |
| 12.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 |
| `addresses_taken' 64 |
| `def_ops' 64 |
| `use_ops' 64 |
| `vdef_ops' 64 |
| `vuse_ops' 64 |
| `stores' 64 |
| `loads' 64 |
| `op' `num_ops' * 64 |
| Total size 88 + 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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 an |
| `INDIRECT_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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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. |
| |
| 12.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_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_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>> |
| |
| 12.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. |
| |
| 12.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: is_gimple_operand (tree t) |
| This is the most permissive of the predicates. It essentially |
| checks whether t has a `gimple_rhs_class' of `GIMPLE_SINGLE_RHS'. |
| |
| -- GIMPLE function: 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: is_gimple_addressable (tree t) |
| Returns true if t is a symbol or memory reference whose address |
| can be taken. |
| |
| -- GIMPLE function: is_gimple_asm_val (tree t) |
| Similar to `is_gimple_val' but it also accepts hard registers. |
| |
| -- GIMPLE function: 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: is_gimple_constant (tree t) |
| Return true if t is a valid gimple constant. |
| |
| -- GIMPLE function: 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: is_gimple_min_invariant_address (tree t) |
| Return true if t is an `ADDR_EXPR' that does not change once a |
| function is running. |
| |
| -- GIMPLE function: 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: 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). |
| |
| 12.5.8 Statement validation |
| --------------------------- |
| |
| -- GIMPLE function: is_gimple_assign (gimple g) |
| Return true if the code of g is `GIMPLE_ASSIGN'. |
| |
| -- GIMPLE function: is_gimple_call (gimple g) |
| Return true if the code of g is `GIMPLE_CALL'. |
| |
| -- GIMPLE function: is_gimple_debug (gimple g) |
| Return true if the code of g is `GIMPLE_DEBUG'. |
| |
| -- GIMPLE function: gimple_assign_cast_p (gimple g) |
| Return true if g is a `GIMPLE_ASSIGN' that performs a type cast |
| operation. |
| |
| -- GIMPLE function: gimple_debug_bind_p (gimple g) |
| Return true if g is a `GIMPLE_DEBUG' that binds the value of an |
| expression to a variable. |
| |
| |
| File: gccint.info, Node: Manipulating GIMPLE statements, Next: Tuple specific accessors, Prev: Operands, Up: GIMPLE |
| |
| 12.6 Manipulating GIMPLE statements |
| =================================== |
| |
| This section documents all the functions available to handle each of |
| the GIMPLE instructions. |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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: gimple_asm_ninputs (gimple g) |
| Return the number of input operands for `GIMPLE_ASM' `G'. |
| |
| -- GIMPLE function: gimple_asm_noutputs (gimple g) |
| Return the number of output operands for `GIMPLE_ASM' `G'. |
| |
| -- GIMPLE function: 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. |
| |
| -- GIMPLE function: void gimple_asm_clear_volatile (gimple g) |
| Remove volatile marker from asm statement `G'. |
| |
| |
| File: gccint.info, Node: `GIMPLE_ASSIGN', Next: `GIMPLE_BIND', Prev: `GIMPLE_ASM', Up: Tuple specific accessors |
| |
| 12.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: 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: 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 a pointer to the second 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: 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 |
| |
| 12.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 |
| |
| 12.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: 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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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'. |
| |
| -- GIMPLE function: bool is_gimple_omp (gimple stmt) |
| Returns true when the gimple statement `STMT' is any of the OpenMP |
| types. |
| |
| |
| File: gccint.info, Node: `GIMPLE_OMP_RETURN', Next: `GIMPLE_OMP_SECTION', Prev: `GIMPLE_OMP_PARALLEL', Up: Tuple specific accessors |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.7.23 `GIMPLE_PHI' |
| -------------------- |
| |
| -- GIMPLE function: gimple make_phi_node (tree var, int len) |
| Build a `PHI' node with len argument slots for variable var. |
| |
| -- 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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.7.26 `GIMPLE_SWITCH' |
| ----------------------- |
| |
| -- GIMPLE function: gimple gimple_build_switch ( nlabels, tree index, |
| tree default_label, ...) |
| Build a `GIMPLE_SWITCH' statement. `NLABELS' are the number of |
| labels excluding the default label. The default label is passed |
| in `DEFAULT_LABEL'. The rest of the arguments are trees |
| representing the labels. Each label is a tree of code |
| `CASE_LABEL_EXPR'. |
| |
| -- GIMPLE function: gimple gimple_build_switch_vec (tree index, tree |
| default_label, `VEC'(tree,heap) *args) |
| This function is an alternate way of building `GIMPLE_SWITCH' |
| statements. `INDEX' and `DEFAULT_LABEL' are as in |
| gimple_build_switch. `ARGS' is a vector of `CASE_LABEL_EXPR' trees |
| that contain the labels. |
| |
| -- 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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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 |
| |
| 12.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', `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 |
| |
| 13 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 |
| |
| 13.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'. |
| |
| Presently, we define annotations for variables (`var_ann_t'). |
| Annotations are defined and documented in `tree-flow.h'. |
| |
| |
| File: gccint.info, Node: SSA Operands, Next: SSA, Prev: Annotations, Up: Tree SSA |
| |
| 13.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'. |
| |
| 13.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_VMAYUSE 0x08 /* USE portion of VDEFS. */ |
| #define SSA_OP_VDEF 0x10 /* DEF portion of VDEFS. */ |
| |
| /* These are commonly grouped operand flags. */ |
| #define SSA_OP_VIRTUAL_USES (SSA_OP_VUSE | SSA_OP_VMAYUSE) |
| #define SSA_OP_VIRTUAL_DEFS (SSA_OP_VDEF) |
| #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_VMAYUSE'). If all |
| you want to look at are the `VDEF's together, there is a fourth |
| iterator macro for this, which returns both a def_operand_p and a |
| use_operand_p for each `VDEF' in the statement. Note that you don't |
| need any flags for this one. |
| |
| use_operand_p use_p; |
| def_operand_p def_p; |
| ssa_op_iter iter; |
| |
| FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter) |
| { |
| my_code; |
| } |
| |
| There are many examples in the code as well, as well as the |
| documentation in `tree-ssa-operands.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; |
| } |
| |
| 13.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 |
| |
| 13.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 macros can be used to examine PHI nodes |
| |
| -- Macro: PHI_RESULT (PHI) |
| Returns the `SSA_NAME' created by PHI node PHI (i.e., PHI's LHS). |
| |
| -- Macro: 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. |
| |
| -- Macro: PHI_ARG_ELT (PHI, I) |
| Returns a tuple representing the Ith argument of PHI. Each |
| element of this tuple contains an `SSA_NAME' VAR and the incoming |
| edge through which VAR flows. |
| |
| -- Macro: PHI_ARG_EDGE (PHI, I) |
| Returns the incoming edge for the Ith argument of PHI. |
| |
| -- Macro: PHI_ARG_DEF (PHI, I) |
| Returns the `SSA_NAME' for the Ith argument of PHI. |
| |
| 13.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). On the other hand, if your pass |
| exposes a new symbol that should be put in SSA form for the first time, |
| the new symbol should be registered with `mark_sym_for_renaming'. |
| |
| 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. |
| |
| 13.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. |
| |
| 13.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. |
| |
| 13.3.4 Walking use-def chains |
| ----------------------------- |
| |
| -- Tree SSA function: void walk_use_def_chains (VAR, FN, DATA) |
| Walks use-def chains starting at the `SSA_NAME' node VAR. Calls |
| function FN at each reaching definition found. Function FN takes |
| three arguments: VAR, its defining statement (DEF_STMT) and a |
| generic pointer to whatever state information that FN may want to |
| maintain (DATA). Function FN is able to stop the walk by |
| returning `true', otherwise in order to continue the walk, FN |
| should return `false'. |
| |
| Note, that if DEF_STMT is a `PHI' node, the semantics are slightly |
| different. For each argument ARG of the PHI node, this function |
| will: |
| |
| 1. Walk the use-def chains for ARG. |
| |
| 2. Call `FN (ARG, PHI, DATA)'. |
| |
| Note how the first argument to FN is no longer the original |
| variable VAR, but the PHI argument currently being examined. If |
| FN wants to get at VAR, it should call `PHI_RESULT' (PHI). |
| |
| 13.3.5 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 |
| |
| 13.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 |
| |
| 13.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: Loop Analysis and Representation, Next: Machine Desc, Prev: Control Flow, Up: Top |
| |
| 14 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. |
| * Lambda:: Linear loop transformations framework. |
| * Omega:: A solver for linear programming problems. |
| |
| |
| File: gccint.info, Node: Loop representation, Next: Loop querying, Up: Loop Analysis and Representation |
| |
| 14.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'. At |
| the moment, loop structures are analyzed and this information is |
| updated only by the optimization passes that deal with loops, but some |
| efforts are being made to make it available throughout most of the |
| optimization 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 memory occupied by the loops structures should be freed with |
| `loop_optimizer_finalize' function. |
| |
| 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. |
| |
| |
| File: gccint.info, Node: Loop querying, Next: Loop manipulation, Prev: Loop representation, Up: Loop Analysis and Representation |
| |
| 14.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 |
| |
| 14.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 |
| |
| 14.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 |
| |
| 14.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 |
| |
| 14.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 |
| |
| 14.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: Lambda, Prev: Number of iterations, Up: Loop Analysis and Representation |
| |
| 14.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: Lambda, Next: Omega, Prev: Dependency analysis, Up: Loop Analysis and Representation |
| |
| 14.9 Linear loop transformations framework |
| ========================================== |
| |
| Lambda is a framework that allows transformations of loops using |
| non-singular matrix based transformations of the iteration space and |
| loop bounds. This allows compositions of skewing, scaling, interchange, |
| and reversal transformations. These transformations are often used to |
| improve cache behavior or remove inner loop dependencies to allow |
| parallelization and vectorization to take place. |
| |
| To perform these transformations, Lambda requires that the loopnest be |
| converted into an internal form that can be matrix transformed easily. |
| To do this conversion, the function `gcc_loopnest_to_lambda_loopnest' |
| is provided. If the loop cannot be transformed using lambda, this |
| function will return NULL. |
| |
| Once a `lambda_loopnest' is obtained from the conversion function, it |
| can be transformed by using `lambda_loopnest_transform', which takes a |
| transformation matrix to apply. Note that it is up to the caller to |
| verify that the transformation matrix is legal to apply to the loop |
| (dependence respecting, etc). Lambda simply applies whatever matrix it |
| is told to provide. It can be extended to make legal matrices out of |
| any non-singular matrix, but this is not currently implemented. |
| Legality of a matrix for a given loopnest can be verified using |
| `lambda_transform_legal_p'. |
| |
| Given a transformed loopnest, conversion back into gcc IR is done by |
| `lambda_loopnest_to_gcc_loopnest'. This function will modify the loops |
| so that they match the transformed loopnest. |
| |
| |
| File: gccint.info, Node: Omega, Prev: Lambda, Up: Loop Analysis and Representation |
| |
| 14.10 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: Control Flow, Next: Loop Analysis and Representation, Prev: RTL, Up: Top |
| |
| 15 Control Flow Graph |
| ********************* |
| |
| A control flow graph (CFG) is a data structure built on top of the |
| intermediate code representation (the RTL or `tree' 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'. |
| |
| * 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 |
| |
| 15.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. |
| |
| 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. 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. |
| |
| 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'. |
| |
| 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, and are not |
| elements of the `BASIC_BLOCK' array. Therefore they have been assigned |
| unique, negative index numbers. |
| |
| 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 (`tree' and RTL), there are |
| pointers to the head and end of a basic block for both representations. |
| |
| For RTL, these pointers are `rtx head, end'. In the RTL function |
| representation, the head pointer always points either to a |
| `NOTE_INSN_BASIC_BLOCK' or to a `CODE_LABEL', if present. In the RTL |
| representation of a function, the instruction stream contains not only |
| the "real" instructions, but also "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, making such updates difficult. The |
| `NOTE_INSN_BASIC_BLOCK' note is the only kind of note that may appear |
| in the instruction stream contained in a basic block. The instruction |
| stream of a basic block always follows a `NOTE_INSN_BASIC_BLOCK', but |
| zero or more `CODE_LABEL' nodes can precede the block note. A basic |
| block ends by control flow instruction or last instruction before |
| following `CODE_LABEL' or `NOTE_INSN_BASIC_BLOCK'. A `CODE_LABEL' |
| cannot appear in 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 `tree' representation, the head and end of the basic block are |
| being pointed to by the `stmt_list' field, but this special `tree' |
| should never be referenced directly. Instead, at the tree level |
| abstract containers and iterators are used to access statements and |
| expressions in basic blocks. These iterators are called "block |
| statement iterators" (BSIs). Grep for `^bsi' in the various `tree-*' |
| files. The following snippet will pretty-print all the statements of |
| the program in the GIMPLE representation. |
| |
| FOR_EACH_BB (bb) |
| { |
| block_stmt_iterator si; |
| |
| for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si)) |
| { |
| tree stmt = bsi_stmt (si); |
| print_generic_stmt (stderr, stmt, 0); |
| } |
| } |
| |
| |
| File: gccint.info, Node: Edges, Next: Profile information, Prev: Basic Blocks, Up: Control Flow |
| |
| 15.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, 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 `tree' 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. 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 `tree' 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 |
| |
| 15.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 |
| |
| 15.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 `tree' |
| 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). Often the CFG may be better viewed as |
| integral part of instruction chain, than structure built on the top of |
| it. However, in principle the control flow graph for the `tree' |
| representation is _not_ an integral part of the representation, in that |
| a function tree may be expanded without first building a flow graph |
| for the `tree' representation at all. This happens when compiling |
| without any `tree' optimization enabled. When the `tree' optimizations |
| are enabled and the instruction stream is rewritten in SSA form, the |
| CFG is very tightly coupled with the instruction stream. In |
| particular, statement insertion and removal has to be done with care. |
| In fact, the whole `tree' representation can not be easily used or |
| maintained without proper maintenance of the CFG simultaneously. |
| |
| 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 `tree' representation, the function `bb_for_stmt' |
| returns a pointer to the basic block containing the queried statement. |
| |
| When changes need to be applied to a function in its `tree' |
| representation, "block 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 `block_stmt_iterator' data structure and several modifier are |
| available, including the following: |
| |
| `bsi_start' |
| This function initializes a `block_stmt_iterator' that points to |
| the first non-empty statement in a basic block. |
| |
| `bsi_last' |
| This function initializes a `block_stmt_iterator' that points to |
| the last statement in a basic block. |
| |
| `bsi_end_p' |
| This predicate is `true' if a `block_stmt_iterator' represents the |
| end of a basic block. |
| |
| `bsi_next' |
| This function takes a `block_stmt_iterator' and makes it point to |
| its successor. |
| |
| `bsi_prev' |
| This function takes a `block_stmt_iterator' and makes it point to |
| its predecessor. |
| |
| `bsi_insert_after' |
| This function inserts a statement after the `block_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. |
| |
| `bsi_insert_before' |
| This function inserts a statement before the `block_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. |
| |
| `bsi_remove' |
| This function removes the `block_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 `tree' representation, the equivalent |
| functions are `bsi_insert_on_edge' which inserts a block statement |
| iterator on an edge, and `bsi_commit_edge_inserts' which flushes the |
| instruction to actual instruction stream. |
| |
| While debugging the optimization pass, a `verify_flow_info' function |
| may be useful to find bugs in the control flow graph updating code. |
| |
| Note that at present, the representation of control flow in the `tree' |
| representation is discarded before expanding to RTL. Long term the CFG |
| should be maintained and "expanded" to the RTL representation along |
| with the function `tree' itself. |
| |
| |
| File: gccint.info, Node: Liveness information, Prev: Maintaining the CFG, Up: Control Flow |
| |
| 15.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: 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. |
| * 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") |
| |
| |
| 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. |
| |
| * 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. |
| * Disable Insn Alternatives:: Disable insn alternatives using the `enabled' attribute. |
| * Machine Constraints:: Existing constraints for some particular machines. |
| * 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. |
| |
| `>' |
| A memory operand with autoincrement addressing (either |
| preincrement or postincrement) is allowed. |
| |
| `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: Disable Insn Alternatives, 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. |
| |
| 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: Define Constraints, Prev: Disable Insn Alternatives, 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. |
| |
| _ARM family--`config/arm/arm.h'_ |
| |
| `f' |
| Floating-point register |
| |
| `w' |
| VFP floating-point register |
| |
| `F' |
| One of the floating-point constants 0.0, 0.5, 1.0, 2.0, 3.0, |
| 4.0, 5.0 or 10.0 |
| |
| `G' |
| Floating-point constant that would satisfy the constraint `F' |
| if it were negated |
| |
| `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 |
| |
| `R' |
| Integer constant in the range -6 ... 5. |
| |
| `Q' |
| A memory address based on Y or Z pointer with displacement. |
| |
| _CRX Architecture--`config/crx/crx.h'_ |
| |
| `b' |
| Registers from r0 to r14 (registers without stack pointer) |
| |
| `l' |
| Register r16 (64-bit accumulator lo register) |
| |
| `h' |
| Register r17 (64-bit accumulator hi register) |
| |
| `k' |
| Register pair r16-r17. (64-bit accumulator lo-hi pair) |
| |
| `I' |
| Constant that fits in 3 bits |
| |
| `J' |
| Constant that fits in 4 bits |
| |
| `K' |
| Constant that fits in 5 bits |
| |
| `L' |
| Constant that is one of -1, 4, -4, 7, 8, 12, 16, 20, 32, 48 |
| |
| `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/rs6000.h'_ |
| |
| `b' |
| Address base register |
| |
| `d' |
| Floating point register (containing 64-bit value) |
| |
| `f' |
| Floating point register (containing 32-bit value) |
| |
| `v' |
| Altivec vector register |
| |
| `wd' |
| VSX vector register to hold vector double data |
| |
| `wf' |
| VSX vector register to hold vector float data |
| |
| `ws' |
| VSX vector register to hold scalar float data |
| |
| `wa' |
| Any VSX register |
| |
| `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' |
| `FPMEM' stack memory for FPR-GPR transfers |
| |
| `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. Note that on PowerPC targets, `m' can include |
| addresses that update the base register. It is therefore |
| 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. Use `es' rather than `m' if you don't want the base |
| register to be updated. |
| |
| `es' |
| A "stable" memory operand; that is, one which does not |
| include any automodification of the base register. Unlike |
| `m', this constraint can be used in `asm' statements that |
| might access the operand several times, or that might not |
| access it at all. |
| |
| `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, as a pair (for instructions that |
| return half the result in one and half in the other). |
| |
| `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. Remember that `m' allows postincrement and |
| postdecrement which require printing with `%Pn' on IA-64. |
| Use `S' to disallow postincrement and postdecrement. |
| |
| `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 |
| |
| _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. |
| |
| |
| _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. |
| |
| _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 |
| |
| |
| _Motorola 68HC11 & 68HC12 families--`config/m68hc11/m68hc11.h'_ |
| |
| `a' |
| Register `a' |
| |
| `b' |
| Register `b' |
| |
| `d' |
| Register `d' |
| |
| `q' |
| An 8-bit register |
| |
| `t' |
| Temporary soft register _.tmp |
| |
| `u' |
| A soft register _.d1 to _.d31 |
| |
| `w' |
| Stack pointer register |
| |
| `x' |
| Register `x' |
| |
| `y' |
| Register `y' |
| |
| `z' |
| Pseudo register `z' (replaced by `x' or `y' at the end) |
| |
| `A' |
| An address register: x, y or z |
| |
| `B' |
| An address register: x or y |
| |
| `D' |
| Register pair (x:d) to form a 32-bit value |
| |
| `L' |
| Constants in the range -65536 to 65535 |
| |
| `M' |
| Constants whose 16-bit low part is zero |
| |
| `N' |
| Constant integer 1 or -1 |
| |
| `O' |
| Constant integer 16 |
| |
| `P' |
| Constants in the range -8 to 2 |
| |
| |
| _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. |
| |
| |
| _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. |
| |
| `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 |
| |
| `M' |
| A constant in the range supported by `movrcc' instructions |
| |
| `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 |
| |
| `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 |
| |
| `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. |
| |
| |
| _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: Machine Constraints, Prev: Modifiers, 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: Machine Constraints, 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 `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_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_extract_evenM' |
| Extract even elements from the input vectors (operand 1 and |
| operand 2). The even elements of operand 2 are concatenated to |
| the even elements of operand 1 in their original order. The result |
| is stored in operand 0. The output and input vectors should have |
| the same modes. |
| |
| `vec_extract_oddM' |
| Extract odd elements from the input vectors (operand 1 and operand |
| 2). The odd elements of operand 2 are concatenated to the odd |
| elements of operand 1 in their original order. The result is |
| stored in operand 0. The output and input vectors should have the |
| same modes. |
| |
| `vec_interleave_highM' |
| Merge high elements of the two input vectors into the output |
| vector. The output and input vectors should have the same modes |
| (`N' elements). The high `N/2' elements of the first input vector |
| are interleaved with the high `N/2' elements of the second input |
| vector. |
| |
| `vec_interleave_lowM' |
| Merge low elements of the two input vectors into the output |
| vector. The output and input vectors should have the same modes |
| (`N' elements). The low `N/2' elements of the first input vector |
| are interleaved with the low `N/2' elements of the second input |
| vector. |
| |
| `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. |
| |
| `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. |
| |
| `ssaddM3', `usaddM3' |
| |
| `subM3', `sssubM3', `ussubM3' |
| |
| `mulM3', `ssmulM3', `usmulM3' |
| `divM3', `ssdivM3' |
| `udivM3', `usdivM3' |
| `modM3', `umodM3' |
| `uminM3', `umaxM3' |
| `andM3', `iorM3', `xorM3' |
| Similar, for other arithmetic operations. |
| |
| `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' |
| 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 elements of the two vectors, and put the N/2 |
| products 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. |
| |
| `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'. |
| |
| `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). |
| |
| `lroundM2' |
| 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). |
| |
| `lfloorM2' |
| 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). |
| |
| `lceilM2' |
| 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 `word_mode' for M. However, if you can |
| generate better code knowing the range of valid lengths is smaller |
| than those representable in a full word, 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 `word_mode'. |
| |
| 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. |
| |
| `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)'. |
| |
| 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 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 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. 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. |
| |
| `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. |
| |
| `extzv' |
| Like `extv' except that the bit-field value is zero-extended. |
| |
| `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. |
| |
| `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 |
| true, 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 `sCOND' patterns, you |
| should omit those operations from the machine description. |
| |
| 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 omit these patterns. |
| |
| If these operations are omitted, the compiler will usually |
| generate code that copies the constant one to the target and |
| branches around an assignment of zero to the target. If this code |
| is more efficient than the potential instructions used for the |
| `cstoreMODE4' pattern followed by those required to convert the |
| result into a 1 or a zero in `SImode', you should omit the |
| `cstoreMODE4' operations 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. |
| |
| 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_insn'. 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. This instruction takes five |
| operands: Operand 0 is the register to decrement and test; operand |
| 1 is the number of loop iterations as a `const_int' or |
| `const0_rtx' if this cannot be determined until run-time; operand |
| 2 is the actual or estimated maximum number of iterations as a |
| `const_int'; operand 3 is the number of enclosed loops as a |
| `const_int' (an innermost loop has a value of 1); operand 4 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. If nested |
| low-overhead looping is not supported, use a `define_expand' |
| (*note Expander Definitions::) and make the pattern fail if |
| operand 3 is not `const1_rtx'. Similarly, if the actual or |
| estimated maximum number of iterations is too large for this |
| instruction, make it fail. |
| |
| `doloop_begin' |
| Companion instruction to `doloop_end' required for machines that |
| need to perform some initialization, such as loading special |
| registers used by a low-overhead looping instruction. 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' |
| 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 transfered |
| 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. |
| |
| `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 from moving instructions across the boundary defined by |
| the blockage insn. Normally an UNSPEC_VOLATILE pattern. |
| |
| `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)'). |
| |
| `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 are 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. |
| |
| `stack_protect_set' |
| This pattern, if defined, moves a `Pmode' 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 `Pmode' 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 weren't 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. |
| |
| |
| 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. |
| |
| 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. |
| * 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. |
| |
| 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 |
| 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::. |
| |
| |
| |
| 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. |
| |
| `(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. Test the flags `very_likely', `likely', |
| `very_unlikely', and `unlikely' to determine if a conditional |
| branch is expected to be taken. |
| |
| If the `very_likely' flag is true, then the `likely' flag is also |
| true. Likewise for the `very_unlikely' and `unlikely' flags. |
| |
| 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. |
| |
| The `very_likely' and `likely' flags are true if the `insn' being |
| scheduled is not a conditional branch. The `very_unlikely' and |
| `unlikely' flags are false if the `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: Delay Slots, 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: Delay Slots, Next: Processor pipeline description, Prev: Constant Attributes, Up: Insn Attributes |
| |
| 16.19.7 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.8 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. The instructions in the string are separated by |
| commas. |
| |
| 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. |
| |
| * "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. |
| |
| * "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: Constant Definitions, 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") |
| |
| 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'. |
| |
| When `define_cond_exec' is used, an implicit reference to the |
| `predicable' instruction attribute is made. *Note Insn Attributes::. |
| This attribute must be boolean (i.e. have exactly two elements in its |
| LIST-OF-VALUES). Further, it must not be used with complex |
| expressions. That is, the default and all uses in the insns must be a |
| simple constant, not dependent on the alternative or anything else. |
| |
| 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: Constant Definitions, Next: Iterators, Prev: Conditional Execution, Up: Machine Desc |
| |
| 16.21 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. |
| |
| |
| File: gccint.info, Node: Iterators, Prev: Constant Definitions, Up: Machine Desc |
| |
| 16.22 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. |
| |
| |
| File: gccint.info, Node: Mode Iterators, Next: Code Iterators, Up: Iterators |
| |
| 16.22.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.22.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.22.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.22.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, Prev: Mode Iterators, Up: Iterators |
| |
| 16.22.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: 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. |
| |
| |
| 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: SWITCH_TAKES_ARG (CHAR) |
| A C expression which determines whether the option `-CHAR' takes |
| arguments. The value should be the number of arguments that |
| option takes-zero, for many options. |
| |
| By default, this macro is defined as `DEFAULT_SWITCH_TAKES_ARG', |
| which handles the standard options properly. You need not define |
| `SWITCH_TAKES_ARG' unless you wish to add additional options which |
| take arguments. Any redefinition should call |
| `DEFAULT_SWITCH_TAKES_ARG' and then check for additional options. |
| |
| -- Macro: WORD_SWITCH_TAKES_ARG (NAME) |
| A C expression which determines whether the option `-NAME' takes |
| arguments. The value should be the number of arguments that |
| option takes-zero, for many options. This macro rather than |
| `SWITCH_TAKES_ARG' is used for multi-character option names. |
| |
| By default, this macro is defined as |
| `DEFAULT_WORD_SWITCH_TAKES_ARG', which handles the standard options |
| properly. You need not define `WORD_SWITCH_TAKES_ARG' unless you |
| wish to add additional options which take arguments. Any |
| redefinition should call `DEFAULT_WORD_SWITCH_TAKES_ARG' and then |
| check for additional options. |
| |
| -- Macro: SWITCH_CURTAILS_COMPILATION (CHAR) |
| A C expression which determines whether the option `-CHAR' stops |
| compilation before the generation of an executable. The value is |
| boolean, nonzero if the option does stop an executable from being |
| generated, zero otherwise. |
| |
| By default, this macro is defined as |
| `DEFAULT_SWITCH_CURTAILS_COMPILATION', which handles the standard |
| options properly. You need not define |
| `SWITCH_CURTAILS_COMPILATION' unless you wish to add additional |
| options which affect the generation of an executable. Any |
| redefinition should call `DEFAULT_SWITCH_CURTAILS_COMPILATION' and |
| then check for additional options. |
| |
| -- Macro: SWITCHES_NEED_SPACES |
| A string-valued C expression which enumerates the options for which |
| the linker needs a space between the option and its argument. |
| |
| If this macro is not defined, the default value is `""'. |
| |
| -- Macro: TARGET_OPTION_TRANSLATE_TABLE |
| If defined, a list of pairs of strings, the first of which is a |
| potential command line target to the `gcc' driver program, and the |
| second of which is a space-separated (tabs and other whitespace |
| are not supported) list of options with which to replace the first |
| option. The target defining this list is responsible for assuring |
| that the results are valid. Replacement options may not be the |
| `--opt' style, they must be the `-opt' style. It is the intention |
| of this macro to provide a mechanism for substitution that affects |
| the multilibs chosen, such as one option that enables many |
| options, some of which select multilibs. Example nonsensical |
| definition, where `-malt-abi', `-EB', and `-mspoo' cause different |
| multilibs to be chosen: |
| |
| #define TARGET_OPTION_TRANSLATE_TABLE \ |
| { "-fast", "-march=fast-foo -malt-abi -I/usr/fast-foo" }, \ |
| { "-compat", "-EB -malign=4 -mspoo" } |
| |
| -- 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 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. |
| |
| -- Macro: LINK_ELIMINATE_DUPLICATE_LDIRECTORIES |
| A nonzero value causes `collect2' to remove duplicate |
| `-LDIRECTORY' search directories from linking commands. Do not |
| give it a nonzero value if removing duplicate search directories |
| changes the linker's semantics. |
| |
| -- 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 |
| `-b' option is used, or 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 |
| `-b' option is used, or 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 `-b' option is |
| used, or 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 `SYSTEM_INCLUDE_DIR' in the search order. |
| |
| Cross compilers do not search either `/usr/local/include' or its |
| replacement. |
| |
| -- Macro: MODIFY_TARGET_NAME |
| Define this macro if you wish to define command-line switches that |
| modify the default target name. |
| |
| For each switch, you can include a string to be appended to the |
| first part of the configuration name or a string to be deleted |
| from the configuration name, if present. The definition should be |
| an initializer for an array of structures. Each array element |
| should have three elements: the switch name (a string constant, |
| including the initial dash), one of the enumeration codes `ADD' or |
| `DELETE' to indicate whether the string should be inserted or |
| deleted, and the string to be inserted or deleted (a string |
| constant). |
| |
| For example, on a machine where `64' at the end of the |
| configuration name denotes a 64-bit target and you want the `-32' |
| and `-64' switches to select between 32- and 64-bit targets, you |
| would code |
| |
| #define MODIFY_TARGET_NAME \ |
| { { "-32", DELETE, "64"}, \ |
| {"-64", ADD, "64"}} |
| |
| -- Macro: SYSTEM_INCLUDE_DIR |
| Define this macro as a C string constant if you wish to specify a |
| system-specific directory to search for header files before the |
| standard directory. `SYSTEM_INCLUDE_DIR' comes before |
| `STANDARD_INCLUDE_DIR' in the search order. |
| |
| Cross compilers do not use this macro and do not search the |
| directory specified. |
| |
| -- Macro: STANDARD_INCLUDE_DIR |
| Define this macro as a C string constant if you wish to override |
| the standard choice of `/usr/include' as the default prefix to try |
| when searching for header files. |
| |
| Cross compilers ignore this macro and do not search either |
| `/usr/include' or its replacement. |
| |
| -- Macro: STANDARD_INCLUDE_COMPONENT |
| The "component" corresponding to `STANDARD_INCLUDE_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', `SYSTEM_INCLUDE_DIR', |
| `GPLUSPLUS_INCLUDE_DIR', and `STANDARD_INCLUDE_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. |
| |
| -- Target Hook: int TARGET_DEFAULT_TARGET_FLAGS |
| This variable specifies the initial value of `target_flags'. Its |
| default setting is 0. |
| |
| -- Target Hook: bool TARGET_HANDLE_OPTION (size_t CODE, const char |
| *ARG, int VALUE) |
| 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. |
| |
| CODE specifies the `OPT_NAME' enumeration value associated with |
| the selected option; NAME is just a rendering of the option name |
| in which non-alphanumeric characters are replaced by underscores. |
| ARG specifies the string argument and is null if no argument was |
| given. If the option is flagged as a `UInteger' (*note Option |
| properties::), VALUE is the numeric value of the argument. |
| Otherwise VALUE is 1 if the positive form of the option was used |
| and 0 if the "no-" form was. |
| |
| -- 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. |
| |
| -- Macro: TARGET_VERSION |
| This macro is a C statement to print on `stderr' a string |
| describing the particular machine description choice. Every |
| machine description should define `TARGET_VERSION'. For example: |
| |
| #ifdef MOTOROLA |
| #define TARGET_VERSION \ |
| fprintf (stderr, " (68k, Motorola syntax)"); |
| #else |
| #define TARGET_VERSION \ |
| fprintf (stderr, " (68k, MIT syntax)"); |
| #endif |
| |
| -- Macro: OVERRIDE_OPTIONS |
| Sometimes certain combinations of command options do not make |
| sense on a particular target machine. You can define a macro |
| `OVERRIDE_OPTIONS' to take account of this. This macro, if |
| defined, is executed once just after all the command options have |
| been parsed. |
| |
| Don't use this macro to turn on various extra optimizations for |
| `-O'. That is what `OPTIMIZATION_OPTIONS' 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: void TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE (void) |
| This target function is similar to the macro `OVERRIDE_OPTIONS' |
| 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 `OVERRIDE_OPTIONS' is called so if you want to |
| perform these actions then, you should have `OVERRIDE_OPTIONS' call |
| `TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE'. |
| |
| -- Macro: C_COMMON_OVERRIDE_OPTIONS |
| This is similar to `OVERRIDE_OPTIONS' 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. |
| |
| -- Macro: OPTIMIZATION_OPTIONS (LEVEL, SIZE) |
| Some machines may desire to change what optimizations are |
| performed for various optimization levels. This macro, if |
| defined, is executed once just after the optimization level is |
| determined and before the remainder of the command options have |
| been parsed. Values set in this macro are used as the default |
| values for the other command line options. |
| |
| LEVEL is the optimization level specified; 2 if `-O2' is |
| specified, 1 if `-O' is specified, and 0 if neither is specified. |
| |
| SIZE is nonzero if `-Os' is specified and zero otherwise. |
| |
| This macro is run once at program startup and when the optimization |
| options are changed via `#pragma GCC optimize' or by using the |
| `optimize' attribute. |
| |
| *Do not examine `write_symbols' in this macro!* The debugging |
| options are not supposed to alter the generated code. |
| |
| -- Target Hook: void TARGET_HELP (void) |
| This hook is called in response to the user invoking |
| `--target-help' on the command line. It gives the target a chance |
| to display extra information on the target specific command line |
| options found in its `.opt' file. |
| |
| -- Macro: CAN_DEBUG_WITHOUT_FP |
| Define this macro if debugging can be performed even without a |
| frame pointer. If this macro is defined, GCC will turn on the |
| `-fomit-frame-pointer' option whenever `-O' is specified. |
| |
| |
| 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 `ggc_alloc', 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; GCC fundamentally assumes |
| that the order of words in memory is the same as the order in |
| registers. This macro need not be a constant. |
| |
| -- Macro: LIBGCC2_WORDS_BIG_ENDIAN |
| Define this macro if `WORDS_BIG_ENDIAN' is not constant. This |
| must be a constant value with the same meaning as |
| `WORDS_BIG_ENDIAN', which will be used only when compiling |
| `libgcc2.c'. Typically the value will be set based on |
| preprocessor defines. |
| |
| -- 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_UNIT |
| Define this macro to be the number of bits in an addressable |
| storage unit (byte). If you do not define this macro the default |
| is 8. |
| |
| -- 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: UNITS_PER_SIMD_WORD (MODE) |
| Number of units in the vectors that the vectorizer can produce for |
| scalar mode MODE. The default is equal to `UNITS_PER_WORD', |
| because the vectorizer can do some transformations even in absence |
| of specialized SIMD hardware. |
| |
| -- 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. |
| |
| 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: 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. |
| |
| -- 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. |
| |
| -- 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. |
| |
| -- 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 `!TARGET_STRICT_ALIGN'. |
| |
| -- Macro: MEMBER_TYPE_FORCES_BLK (FIELD, MODE) |
| Return 1 if a structure 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 `LIBGCC2_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 `LIBGCC2_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: 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 `LIBGCC2_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 |
| `init_decl_processing' in the file `c-decl.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: 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. |
| |
| -- Macro: CONDITIONAL_REGISTER_USAGE |
| Zero or more C statements that 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. |
| |
| You need not define this macro if it has no work to do. |
| |
| 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: ORDER_REGS_FOR_LOCAL_ALLOC |
| 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: 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 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. |
| |
| 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, OUTER_CODE, INDEX_CODE) |
| A C expression whose value is the register class to which a valid |
| base register 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. Like |
| `TARGET_LEGITIMATE_ADDRESS_P', this macro should also define a |
| strict and a non-strict variant. Both variants behave the same |
| for hard register; for pseudos, the strict variant will pass only |
| those that have been allocated to a valid hard registers, while |
| the non-strict variant will pass all pseudos. |
| |
| Compiler source files that want to use the strict variant of this |
| and other macros 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. |
| |
| -- 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'. |
| |
| This macro also has strict and non-strict variants. |
| |
| -- 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'. |
| |
| This macro also has strict and non-strict variants. |
| |
| -- Macro: REGNO_MODE_CODE_OK_FOR_BASE_P (NUM, MODE, OUTER_CODE, |
| INDEX_CODE) |
| A C expression that is just like `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'. |
| |
| This macro also has strict and non-strict variants. |
| |
| -- 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. |
| |
| This macro also has strict and non-strict variants. |
| |
| -- 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 |
| `LEGITIMATE_CONSTANT_P' makes the constant illegitimate instead of |
| using `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). |
| |
| -- Macro: PREFERRED_OUTPUT_RELOAD_CLASS (X, CLASS) |
| Like `PREFERRED_RELOAD_CLASS', but for output reloads instead of |
| input reloads. If you don't define this macro, the default is to |
| use CLASS, unchanged. |
| |
| You can also use `PREFERRED_OUTPUT_RELOAD_CLASS' to discourage |
| reload from using some alternatives, like `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: enum reg_class TARGET_SECONDARY_RELOAD (bool IN_P, rtx |
| X, enum reg_class 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. |
| |
| -- Macro: SMALL_REGISTER_CLASSES |
| 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. |
| |
| Define `SMALL_REGISTER_CLASSES' to be an expression with a nonzero |
| value on these machines. When this macro has a nonzero value, the |
| compiler will try to minimize the lifetime of hard registers. |
| |
| It is always safe to define this macro 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 macro with a nonzero value when it is required, the |
| compiler will run out of spill registers and print a fatal error |
| message. For most machines, you should not define this macro at |
| all. |
| |
| -- Macro: CLASS_LIKELY_SPILLED_P (CLASS) |
| A C expression whose value is nonzero if pseudos that have been |
| assigned to registers of class CLASS would likely be spilled |
| because registers of CLASS are needed for spill registers. |
| |
| The default value of this macro returns 1 if CLASS has exactly one |
| register and zero otherwise. On most machines, this default |
| should be used. Only define this macro to some other expression |
| if pseudos allocated by `local-alloc.c' end up in memory because |
| their hard registers were needed for spill registers. If this |
| macro returns nonzero for those classes, those pseudos will only |
| be allocated by `global.c', which knows how to reallocate the |
| pseudo to another register. If there would not be another |
| register available for reallocation, you should not change the |
| definition of this macro since the only effect of such a |
| definition would be to slow down register allocation. |
| |
| -- 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: const enum reg_class * TARGET_IRA_COVER_CLASSES (void) |
| Return an array of cover classes for the Integrated Register |
| Allocator (IRA). Cover classes are a set of non-intersecting |
| register classes covering all hard registers used for register |
| allocation purposes. If a move between two registers in the same |
| cover class is possible, it should be cheaper than a load or store |
| of the registers. The array is terminated by a `LIM_REG_CLASSES' |
| element. |
| |
| The order of cover classes in the array is important. If two |
| classes have the same cost of usage for a pseudo, the class |
| occurred first in the array is chosen for the pseudo. |
| |
| This hook is called once at compiler startup, after the |
| command-line options have been processed. It is then re-examined |
| by every call to `target_reinit'. |
| |
| The default implementation returns `IRA_COVER_CLASSES', if defined, |
| otherwise there is no default implementation. You must define |
| either this macro or `IRA_COVER_CLASSES' in order to use the |
| integrated register allocator with Chaitin-Briggs coloring. If the |
| macro is not defined, the only available coloring algorithm is |
| Chow's priority coloring. |
| |
| -- Macro: IRA_COVER_CLASSES |
| See the documentation for `TARGET_IRA_COVER_CLASSES'. |
| |
| |
| 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_UNWIND_SUPPORT |
| A string specifying a file to be #include'd in unwind-dw2.c. The |
| file so included typically defines `MD_FALLBACK_FRAME_STATE_FOR'. |
| |
| -- 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 `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: 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'. |
| |
| |
| |
| 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) |
| |
| -- Macro: ACCUMULATE_OUTGOING_ARGS |
| A C expression. If nonzero, the maximum amount of space required |
| for outgoing arguments will be computed and placed into the |
| variable `current_function_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 |
| `current_function_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. |
| |
| -- Macro: RETURN_POPS_ARGS (FUNDECL, FUNTYPE, STACK-SIZE) |
| A C expression that should indicate 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. |
| |
| STACK-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 STACK-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. |
| |
| -- Macro: FUNCTION_ARG (CUM, MODE, TYPE, NAMED) |
| A C expression that controls whether a function argument is passed |
| in a register, and which register. |
| |
| The arguments are CUM, 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 1 for an ordinary argument and 0 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 value of the expression 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. |
| |
| For machines like the VAX and 68000, where normally all arguments |
| are pushed, zero suffices as a definition. |
| |
| 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 macro 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 `FUNCTION_ARG' return 0 whenever NAMED is 0. |
| |
| 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 `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. |
| |
| -- Macro: FUNCTION_INCOMING_ARG (CUM, MODE, TYPE, NAMED) |
| Define this macro 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, `FUNCTION_ARG' computes the register in which |
| the caller passes the value, and `FUNCTION_INCOMING_ARG' should be |
| defined in a similar fashion to tell the function being called |
| where the arguments will arrive. |
| |
| If `FUNCTION_INCOMING_ARG' is not defined, `FUNCTION_ARG' serves |
| both purposes. |
| |
| -- Target Hook: int TARGET_ARG_PARTIAL_BYTES (CUMULATIVE_ARGS *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. |
| |
| `FUNCTION_ARG' for these arguments should return the first |
| register to be used by the caller for this argument; likewise |
| `FUNCTION_INCOMING_ARG', for the called function. |
| |
| -- Target Hook: bool TARGET_PASS_BY_REFERENCE (CUMULATIVE_ARGS *CUM, |
| enum machine_mode MODE, 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 *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 `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'. |
| |
| -- Macro: FUNCTION_ARG_ADVANCE (CUM, MODE, TYPE, NAMED) |
| A C statement (sans semicolon) to update the summarizer variable |
| CUM 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 `FUNCTION_ARG', etc. |
| |
| This macro 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 always just enough to reach the next |
| multiple of `FUNCTION_ARG_BOUNDARY'; this macro does not control |
| it. |
| |
| 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. |
| |
| -- Macro: FUNCTION_ARG_BOUNDARY (MODE, TYPE) |
| If defined, a C expression that gives the alignment boundary, in |
| bits, of an argument with the specified mode and type. If it is |
| not defined, `PARM_BOUNDARY' is used for all arguments. |
| |
| -- 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: 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_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. |
| |
| |
| 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 `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: FUNCTION_OUTGOING_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. |
| |
| -- Macro: TARGET_ENUM_VA_LIST (IDX, PNAME, PTYPE) |
| This target macro 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 PTYPE a pointer to a `tree' typed variable. |
| The arguments PNAME and PTYPE 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. |
| |
| -- 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. |
| |
| |
| 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 `current_function_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 |
| `current_function_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. |
| |
| -- Macro: DELAY_SLOTS_FOR_EPILOGUE |
| Define this macro if the function epilogue contains delay slots to |
| which instructions from the rest of the function can be "moved". |
| The definition should be a C expression whose value is an integer |
| representing the number of delay slots there. |
| |
| -- Macro: ELIGIBLE_FOR_EPILOGUE_DELAY (INSN, N) |
| A C expression that returns 1 if INSN can be placed in delay slot |
| number N of the epilogue. |
| |
| The argument N is an integer which identifies the delay slot now |
| being considered (since different slots may have different rules of |
| eligibility). It is never negative and is always less than the |
| number of epilogue delay slots (what `DELAY_SLOTS_FOR_EPILOGUE' |
| returns). If you reject a particular insn for a given delay slot, |
| in principle, it may be reconsidered for a subsequent delay slot. |
| Also, other insns may (at least in principle) be considered for |
| the so far unfilled delay slot. |
| |
| The insns accepted to fill the epilogue delay slots are put in an |
| RTL list made with `insn_list' objects, stored in the variable |
| `current_function_epilogue_delay_list'. The insn for the first |
| delay slot comes first in the list. Your definition of the macro |
| `TARGET_ASM_FUNCTION_EPILOGUE' should fill the delay slots by |
| outputting the insns in this list, usually by calling |
| `final_scan_insn'. |
| |
| You need not define this macro if you did not define |
| `DELAY_SLOTS_FOR_EPILOGUE'. |
| |
| -- 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. |
| |
| |
| 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 tree expression 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'. |
| |
| |
| 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_args_info (CATEGORY) |
| Use this built-in function to find the first anonymous arguments in |
| registers. |
| |
| In general, a machine may have several categories of registers |
| used for arguments, each for a particular category of data types. |
| (For example, on some machines, floating-point registers are used |
| for floating-point arguments while other arguments are passed in |
| the general registers.) To make non-varargs functions use the |
| proper calling convention, you have defined the `CUMULATIVE_ARGS' |
| data type to record how many registers in each category have been |
| used so far |
| |
| `__builtin_args_info' accesses the same data structure of type |
| `CUMULATIVE_ARGS' after the ordinary argument layout is finished |
| with it, with CATEGORY specifying which word to access. Thus, the |
| value indicates the first unused register in a given category. |
| |
| Normally, you would use `__builtin_args_info' in the implementation |
| of `va_start', accessing each category just once and storing the |
| value in the `va_list' object. This is because `va_list' will |
| have to update the values, and there is no way to alter the values |
| accessed by `__builtin_args_info'. |
| |
| -- Macro: __builtin_next_arg (LASTARG) |
| This is the equivalent of `__builtin_args_info', for stack |
| arguments. It 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 |
| *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 |
| *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 `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 *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. |
| |
| The operating system may also require the stack to be made executable |
| before calling the trampoline. To implement this requirement, define |
| the following macro. |
| |
| -- Macro: ENABLE_EXECUTE_STACK |
| Define this macro if certain operations must be performed before |
| executing code located on the stack. The macro should expand to a |
| series of C file-scope constructs (e.g. functions) and provide a |
| unique entry point named `__enable_execute_stack'. The target is |
| responsible for emitting calls to the entry point in the code, for |
| example from the `TARGET_TRAMPOLINE_INIT' hook. |
| |
| 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. |
| |
| -- 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: US_SOFTWARE_GOFAST |
| Define this macro if your system C library uses the US Software |
| GOFAST library to provide floating point emulation. |
| |
| In addition to defining this macro, your architecture must set |
| `TARGET_INIT_LIBFUNCS' to `gofast_maybe_init_libfuncs', or else |
| call that function from its version of that hook. It is defined |
| in `config/gofast.h', which must be included by your |
| architecture's `CPU.c' file. See `sparc/sparc.c' for an example. |
| |
| If this macro is defined, the |
| `TARGET_FLOAT_LIB_COMPARE_RETURNS_BOOL' target hook must return |
| false for `SFmode' and `DFmode' comparisons. |
| |
| -- 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. |
| |
| -- Macro: TARGET_C99_FUNCTIONS |
| When this macro is nonzero, GCC will implicitly optimize `sin' |
| calls into `sinf' and similarly for other functions defined by C99 |
| standard. The default is zero because a number of existing |
| systems lack support for these functions in their runtime so this |
| macro needs to be redefined to one on systems that do support the |
| C99 runtime. |
| |
| -- Macro: TARGET_HAS_SINCOS |
| When this macro is nonzero, GCC will implicitly optimize calls to |
| `sin' and `cos' with the same argument to a call to `sincos'. The |
| default is zero. The target has to provide the following |
| functions: |
| void sincos(double x, double *sin, double *cos); |
| void sincosf(float x, float *sin, float *cos); |
| void sincosl(long double x, long double *sin, long double *cos); |
| |
| -- Macro: NEXT_OBJC_RUNTIME |
| Define this macro to generate code for Objective-C message sending |
| using the calling convention of the NeXT system. This calling |
| convention involves passing the object, the selector and the |
| method arguments all at once to the method-lookup library function. |
| |
| The default calling convention passes just the object and the |
| selector to the lookup function, which returns a pointer to the |
| method. |
| |
| |
| 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. Whether the |
| strict or non-strict variants are desired is defined by the |
| `REG_OK_STRICT' macro introduced earlier in this section. 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. The compiler has standard ways of doing so in all cases. |
| In fact, 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. |
| |
| -- Macro: GO_IF_MODE_DEPENDENT_ADDRESS (ADDR, LABEL) |
| A C statement or compound statement with a conditional `goto |
| LABEL;' executed if memory address X (an RTX) 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. |
| |
| -- Macro: LEGITIMATE_CONSTANT_P (X) |
| A C expression that is nonzero if X is a legitimate constant for |
| an immediate operand on the target machine. You can assume that X |
| satisfies `CONSTANT_P', so you need not check this. In fact, `1' |
| is a suitable definition for this macro on machines where anything |
| `CONSTANT_P' is valid. |
| |
| -- 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_CANNOT_FORCE_CONST_MEM (rtx X) |
| This hook should return true if X is of a form that cannot (or |
| should not) be spilled to the constant pool. 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: 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: tree TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN (tree X) |
| This hook should return the DECL of a function F that implements |
| widening multiplication of the even elements of two input vectors |
| of type X. |
| |
| If this hook is defined, the autovectorizer will use it along with |
| the `TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD' target hook when |
| vectorizing widening multiplication in cases that the order of the |
| results does not have to be preserved (e.g. used only by a |
| reduction computation). Otherwise, the `widen_mult_hi/lo' idioms |
| will be used. |
| |
| -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD (tree X) |
| This hook should return the DECL of a function F that implements |
| widening multiplication of the odd elements of two input vectors |
| of type X. |
| |
| If this hook is defined, the autovectorizer will use it along with |
| the `TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN' target hook when |
| vectorizing widening multiplication in cases that the order of the |
| results does not have to be preserved (e.g. used only by a |
| reduction computation). Otherwise, the `widen_mult_hi/lo' idioms |
| will be used. |
| |
| -- Target Hook: int TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST (bool |
| RUNTIME_TEST) |
| Returns the cost to be added to the overhead involved with |
| executing the vectorized version of a loop. |
| |
| -- 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: tree TARGET_VECTORIZE_BUILTIN_VEC_PERM (tree TYPE, |
| tree *MASK_ELEMENT_TYPE) |
| Target builtin that implements vector permute. |
| |
| -- Target Hook: bool TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK (tree |
| VEC_TYPE, tree MASK) |
| Return true if a vector created for `builtin_vec_perm' is valid. |
| |
| -- Target Hook: tree TARGET_VECTORIZE_BUILTIN_CONVERSION (unsigned |
| CODE, tree TYPE) |
| This hook should return the DECL of a function that implements |
| conversion of the input vector of type TYPE. If TYPE is an |
| integral type, the result of the conversion is a vector of |
| floating-point type of the same size. If TYPE is a floating-point |
| type, the result of the conversion is a vector of integral type of |
| the same size. 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_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. |
| |
| |
| 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, which need to be in |
| adjacent insns for machines using `(cc0)'. This 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. |
| * Cond. Exec. Macros:: Macros to control conditional execution. |
| |
| |
| 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, Next: Cond. Exec. Macros, 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'. |
| |
| -- Macro: CANONICALIZE_COMPARISON (CODE, OP0, OP1) |
| 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, define this macro to be a C statement 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. You should modify CODE, OP0, and OP1 as required. |
| |
| 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 define this macro 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: Cond. Exec. Macros, Prev: MODE_CC Condition Codes, Up: Condition Code |
| |
| 17.16.3 Macros to control conditional execution |
| ----------------------------------------------- |
| |
| There is one macro that may need to be defined for targets supporting |
| conditional execution, independent of how they represent conditional |
| branches. |
| |
| -- Macro: REVERSE_CONDEXEC_PREDICATES_P (OP1, OP2) |
| A C expression that returns true if the conditional execution |
| predicate OP1, a comparison operation, is the inverse of OP2 and |
| vice versa. Define this to return 0 if the target has conditional |
| execution predicates that cannot be reversed safely. There is no |
| need to validate that the arguments of op1 and op2 are the same, |
| this is done separately. If no expansion is specified, this macro |
| is defined as follows: |
| |
| #define REVERSE_CONDEXEC_PREDICATES_P (x, y) \ |
| (GET_CODE ((x)) == reversed_comparison_code ((y), NULL)) |
| |
| |
| 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. |
| |
| -- 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. |
| |
| -- 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 be |
| returning value optimal for code size rather then performance |
| considerations. PREDICTABLE_P is true for well predictable |
| 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: RANGE_TEST_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 *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 rtx code of the expression |
| in which it is contained, found in OUTER_CODE. CODE is the |
| 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, 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: 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: 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, int |
| REQUEST, 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 (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, |
| int MUTATE_P) |
| 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. |
| |
| |
| 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 |
| neither `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are 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: 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_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 |
| Define this macro if the register defined by |
| `PIC_OFFSET_TABLE_REGNUM' is clobbered by calls. 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. |
| |
| -- 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. |
| |
| -- Macro: ASM_OUTPUT_IDENT (STREAM, STRING) |
| A C statement to output something to the assembler file to handle a |
| `#ident' directive containing the text STRING. If this macro is |
| not defined, nothing is output for a `#ident' directive. |
| |
| -- 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: bool TARGET_HAVE_NAMED_SECTIONS |
| This flag is true if the target supports |
| `TARGET_ASM_NAMED_SECTION'. |
| |
| -- 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'. |
| |
| -- Macro: OUTPUT_ADDR_CONST_EXTRA (STREAM, X, FAIL) |
| A C statement to recognize RTX patterns that `output_addr_const' |
| can't deal with, and output assembly code to STREAM corresponding |
| to the pattern X. This may be used to allow machine-dependent |
| `UNSPEC's to appear within constants. |
| |
| If `OUTPUT_ADDR_CONST_EXTRA' fails to recognize a pattern, it must |
| `goto fail', 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 complete normally. |
| |
| -- 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_BSS (STREAM, DECL, NAME, SIZE, ROUNDED) |
| 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 ROUNDED is the size |
| rounded up to whatever alignment the caller wants. |
| |
| Try to use function `asm_output_bss' defined in `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 either |
| this macro or its aligned counterpart, `ASM_OUTPUT_ALIGNED_BSS'. |
| 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_ALIGNED_BSS (STREAM, DECL, NAME, SIZE, ALIGNMENT) |
| Like `ASM_OUTPUT_BSS' except takes the required alignment as a |
| separate, explicit argument. If you define this macro, it is used |
| in place of `ASM_OUTPUT_BSS', and gives you more flexibility in |
| handling the required alignment of the variable. The alignment is |
| specified as the number of bits. |
| |
| Try to use function `asm_output_aligned_bss' defined in file |
| `varasm.c' when defining this macro. |
| |
| -- 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_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: 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_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_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. |
| |
| -- Macro: ASM_DECLARE_CONSTANT_NAME (STREAM, NAME, EXP, SIZE) |
| A C statement (sans semicolon) to output to the stdio stream |
| STREAM any text necessary for declaring the name NAME of a |
| constant which is being defined. This macro is responsible for |
| outputting the label definition (perhaps using |
| `ASM_OUTPUT_LABEL'). The argument EXP is the value of the |
| constant, and SIZE is the size of the constant in bytes. NAME |
| will be an internal label. |
| |
| If this macro is not defined, then the 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' in the definition |
| of this macro. |
| |
| -- 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 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. If either `ASM_WEAKEN_LABEL' or `ASM_WEAKEN_DECL' is |
| defined, the default definition is `1'; otherwise, it is `0'. |
| 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'. |
| |
| -- 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. |
| |
| -- Macro: ASM_DECLARE_CLASS_REFERENCE (STREAM, NAME) |
| A C statement (sans semicolon) to output to the stdio stream |
| STREAM commands to declare that the label NAME is an Objective-C |
| class reference. This is only needed for targets whose linkers |
| have special support for NeXT-style runtimes. |
| |
| -- Macro: ASM_DECLARE_UNRESOLVED_REFERENCE (STREAM, NAME) |
| A C statement (sans semicolon) to output to the stdio stream |
| STREAM commands to declare that the label NAME is an unresolved |
| Objective-C class reference. This is only needed for targets |
| whose linkers have special support for NeXT-style runtimes. |
| |
| |
| 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'. |
| |
| 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: 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 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_insn' 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_UNWIND_EMIT (FILE *STREAM, rtx INSN) |
| This target hook emits assembly directives required to unwind the |
| given instruction. This is only used when TARGET_UNWIND_INFO is |
| set. |
| |
| |
| 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 either `UNALIGNED_INT_ASM_OP' or |
| `OBJECT_FORMAT_ELF'), GCC will provide a default definition of 1. |
| |
| If `TARGET_UNWIND_INFO' is defined, the target specific unwinder |
| will be used in all cases. Defining this macro will enable the |
| generation of DWARF 2 frame debugging information. |
| |
| If `TARGET_UNWIND_INFO' is not defined, and this macro is defined |
| to 1, the DWARF 2 unwinder will be the default exception handling |
| mechanism; otherwise, the `setjmp'/`longjmp'-based scheme will be |
| used by default. |
| |
| -- Macro: TARGET_UNWIND_INFO |
| Define this macro if your target has ABI specified unwind tables. |
| Usually these will be output by `TARGET_UNWIND_EMIT'. |
| |
| -- 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. |
| |
| -- Macro: MUST_USE_SJLJ_EXCEPTIONS |
| This macro need only be defined if `DWARF2_UNWIND_INFO' is |
| runtime-variable. In that case, `except.h' cannot correctly |
| determine the corresponding definition of |
| `MUST_USE_SJLJ_EXCEPTIONS', so the target must provide it directly. |
| |
| -- 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: 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 |
| `OVERRIDE_OPTIONS'. Otherwise, you should try to honor the user's |
| selection in ALIGN_JUMPS in a `JUMP_ALIGN' implementation. |
| |
| -- 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. |
| |
| -- Macro: LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP |
| The maximum number of bytes to skip 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, which follows |
| a `NOTE_INSN_LOOP_BEG' note. |
| |
| 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 |
| `OVERRIDE_OPTIONS'. Otherwise, you should try to honor the user's |
| selection in `align_loops' in a `LOOP_ALIGN' implementation. |
| |
| -- Macro: LOOP_ALIGN_MAX_SKIP |
| The maximum number of bytes to skip when applying `LOOP_ALIGN'. |
| 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 |
| `OVERRIDE_OPTIONS'. Otherwise, you should try to honor the user's |
| selection in `align_labels' in a `LABEL_ALIGN' implementation. |
| |
| -- Macro: LABEL_ALIGN_MAX_SKIP |
| The maximum number of bytes to skip when applying `LABEL_ALIGN'. |
| 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_LBRAC (STREAM, NAME) |
| Define this macro to say how to output to STREAM the debugging |
| information for the start of a scope level for variable names. The |
| argument NAME is the name of an assembler symbol (for use with |
| `assemble_name') whose value is the address where the scope begins. |
| |
| -- Macro: DBX_OUTPUT_RBRAC (STREAM, NAME) |
| Like `DBX_OUTPUT_LBRAC', but for the end of a scope level. |
| |
| -- Macro: DBX_OUTPUT_NFUN (STREAM, LSCOPE_LABEL, DECL) |
| Define this macro if the target machine requires special handling |
| to output an `N_FUN' entry for the function DECL. |
| |
| -- 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 `DWARF2_UNWIND_INFO' (*note |
| Exception Region Output:: is nonzero, GCC will output this |
| information not matter how you define `DWARF2_FRAME_INFO'. |
| |
| -- 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. |
| |
| -- 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_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 `OPTIMIZATION_OPTIONS' and `OVERRIDE_OPTIONS'. |
| |
| |
| 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: REAL_VALUE_TYPE REAL_VALUE_TRUNCATE (REAL_VALUE_TYPE MODE, |
| enum machine_mode X) |
| Truncates the floating point value X to fit in MODE. The return |
| value is still a full-size `REAL_VALUE_TYPE', but it has an |
| appropriate bit pattern to be output as a floating constant whose |
| precision accords with mode MODE. |
| |
| -- 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 (MODE, INSN) |
| 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: 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 the `attribute(option("..."))', and |
| it allows the function to set different target machine compile time |
| options for the current function that might be different than 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) |
| This hook is called to save any additional target specific |
| information in the STRUCT CL_TARGET_OPTION structure for function |
| specific options. *Note Option file format::. |
| |
| -- Target Hook: void TARGET_OPTION_RESTORE (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. |
| |
| -- 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 (target ARGS) |
| This target hook parses the options for `#pragma GCC option' to |
| set the machine specific options for functions that occur later in |
| the input stream. The options should be the same as handled by the |
| `TARGET_VALID_OPTION_ATTRIBUTE_P' hook. |
| |
| -- 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. |
| |
| -- Macro: ALL_COP_ADDITIONAL_REGISTER_NAMES |
| A comma-separated list (with leading comma) of pairs describing the |
| alternate names of coprocessor registers. The format of each |
| entry should be |
| { ALTERNATENAME, REGISTER_NUMBER} |
| Default: empty. |
| |
| |
| 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'. |
| |
| |
| 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). |
| |
| |
| 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. |
| |
| -- Macro: TARGET_ADDR_SPACE_KEYWORDS |
| A list of `ADDR_SPACE_KEYWORD' macros to define each named address |
| keyword. The `ADDR_SPACE_KEYWORD' macro takes two arguments, the |
| keyword string and the number of the named address space. For |
| example, the SPU port uses the following to declare `__ea' as the |
| keyword for named address space #1: |
| #define ADDR_SPACE_EA 1 |
| #define TARGET_ADDR_SPACE_KEYWORDS ADDR_SPACE_KEYWORD ("__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 |
| SUPERSET, addr_space_t SUBSET) |
| 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: CASE_USE_BIT_TESTS |
| Define this macro to be a C expression to indicate whether C switch |
| statements may be implemented by a sequence of bit tests. This is |
| advantageous on processors that can efficiently implement left |
| shift of 1 by the number of bits held in a register, but |
| inappropriate on targets that would require a loop. By default, |
| this macro returns `true' if the target defines an `ashlsi3' |
| pattern, and `false' otherwise. |
| |
| -- 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. |
| |
| -- Macro: FIXUNS_TRUNC_LIKE_FIX_TRUNC |
| Define this macro if the same instructions that convert a floating |
| point number to a signed fixed point number also convert validly |
| to an unsigned one. |
| |
| -- 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 (`sCOND') when the condition is true. This |
| description must apply to _all_ the `sCOND' 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 `sCOND' 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 |
| `sCOND' 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 Superoptizer 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. |
| |
| -- 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_SYSV_PRAGMA |
| Define this macro (to a value of 1) if you want the System V style |
| pragmas `#pragma pack(<n>)' and `#pragma weak <name> [=<value>]' |
| to be supported by gcc. |
| |
| The pack pragma specifies the maximum alignment (in bytes) of |
| fields within a structure, in much the same way as the |
| `__aligned__' and `__packed__' `__attribute__'s do. A pack value |
| of zero resets the behavior to the default. |
| |
| A subtlety for Microsoft Visual C/C++ style bit-field packing |
| (e.g. -mms-bitfields) for targets that support it: 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). |
| |
| 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. |
| |
| The weak pragma only works if `SUPPORTS_WEAK' and |
| `ASM_WEAKEN_LABEL' are defined. If enabled it allows the creation |
| of specifically named weak labels, optionally with a value. |
| |
| -- Macro: HANDLE_PRAGMA_PACK_PUSH_POP |
| Define this macro (to a value of 1) if you want to support the |
| Win32 style pragmas `#pragma pack(push[,N])' and `#pragma |
| pack(pop)'. The `pack(push,[N])' pragma specifies the maximum |
| alignment (in bytes) of fields within a structure, in much the |
| same way as the `__aligned__' and `__packed__' `__attribute__'s |
| do. A pack value of zero resets the behavior to the default. |
| Successive invocations of this pragma cause the previous values to |
| be stacked, so that invocations of `#pragma pack(pop)' will return |
| to the previous value. |
| |
| -- Macro: HANDLE_PRAGMA_PACK_WITH_EXPANSION |
| Define this macro, as well as `HANDLE_SYSV_PRAGMA', if macros |
| should be expanded in the arguments of `#pragma pack'. |
| |
| -- Target Hook: bool TARGET_HANDLE_PRAGMA_EXTERN_PREFIX |
| True if `#pragma extern_prefix' is to be supported. |
| |
| -- 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: 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: 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, or `""' if the target does not |
| have a separate math library. |
| |
| You need only define this macro if the default of `"-lm"' 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_INIT_EXTRA_FIELDS (CE_INFO) |
| A C expression to initialize any extra fields in a `struct |
| ce_if_block' structure, which are defined by the |
| `IFCVT_EXTRA_FIELDS' macro. |
| |
| -- Macro: IFCVT_EXTRA_FIELDS |
| If defined, it should expand to a set of field declarations that |
| will be added to the `struct ce_if_block' structure. These should |
| be initialized by the `IFCVT_INIT_EXTRA_FIELDS' macro. |
| |
| -- 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' and `build_common_tree_nodes_2'; 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, tree ARGLIST, |
| 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. ARGLIST is the list of arguments passed to the |
| built-in function. The result is another tree containing a |
| simplified expression for the call's result. If IGNORE is true |
| the value will be ignored. |
| |
| -- 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. |
| |
| -- 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_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_leaf_function' in |
| the hook, functions that use `REG_N_SETS', 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: enum reg_class 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. |
| |
| -- 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. |
| |
| |
| 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'. |
| |
| `Floating Point Emulation' |
| To have GCC include software floating point libraries in `libgcc.a' |
| define `FPBIT' and `DPBIT' along with a few rules as follows: |
| # We want fine grained libraries, so use the new code |
| # to build the floating point emulation libraries. |
| FPBIT = fp-bit.c |
| DPBIT = dp-bit.c |
| |
| |
| fp-bit.c: $(srcdir)/config/fp-bit.c |
| echo '#define FLOAT' > fp-bit.c |
| cat $(srcdir)/config/fp-bit.c >> fp-bit.c |
| |
| dp-bit.c: $(srcdir)/config/fp-bit.c |
| cat $(srcdir)/config/fp-bit.c > dp-bit.c |
| |
| You may need to provide additional #defines at the beginning of |
| `fp-bit.c' and `dp-bit.c' to control target endianness and other |
| options. |
| |
| `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. |
| |
| 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_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. |
| |
| `NATIVE_SYSTEM_HEADER_DIR' |
| If the default location for system headers is not `/usr/include', |
| you must set this to the directory containing the headers. This |
| value should match the value of the `SYSTEM_INCLUDE_DIR' macro. |
| |
| `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' and `union' |
| 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. |
| |
| * Menu: |
| |
| * GTY Options:: What goes inside a `GTY(())'. |
| * GGC Roots:: Making global variables GGC roots. |
| * Files:: How the generated files work. |
| * Invoking the garbage collector:: How to invoke the garbage collector. |
| |
| |
| File: gccint.info, Node: GTY Options, Next: GGC Roots, 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. 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: |
| tree * |
| GTY ((length ("%h.regno_pointer_align_length"))) regno_decl; |
| In this case, `regno_decl' has been allocated by writing something |
| like |
| x->regno_decl = |
| ggc_alloc (x->regno_pointer_align_length * sizeof (tree)); |
| and the `length' provides the length of the field. |
| |
| This second use of `length' also works on global variables, like: |
| static GTY((length ("reg_base_value_size"))) |
| rtx *reg_base_value; |
| |
| `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. |
| |
| `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. |
| |
| `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. |
| |
| |
| File: gccint.info, Node: GGC Roots, Next: Files, Prev: GTY Options, Up: Type Information |
| |
| 22.2 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.3 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'. For C, the file is `c-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, Prev: Files, Up: Type Information |
| |
| 22.4 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 it 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. |
| |
| |
| File: gccint.info, Node: Plugins, Next: Funding, Prev: Type Information, Up: Top |
| |
| 23 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. |
| |
| 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 type of the symbol is irrelevant. The compiler merely asserts that |
| it 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_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, |
| |
| 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 using functions |
| like `c_register_pragma' or `c_register_pragma_with_expansion'. |
| |
| 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); |
| |
| ... |
| } |
| |
| 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 thru 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'. |
| |
| 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. |
| |
| 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 }; |
| |
| /* 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 during pragmas registration. |
| Use the `c_register_pragma' or `c_register_pragma_with_expansion' |
| functions to register custom pragmas. |
| |
| /* 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. |
| |
| 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. |
| |
| 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. |
| |
| 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. |
| |
| 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). |
| |
| The following GNU Makefile excerpt shows how to build a simple plugin: |
| |
| GCC=gcc |
| PLUGIN_SOURCE_FILES= plugin1.c plugin2.c |
| PLUGIN_OBJECT_FILES= $(patsubst %.c,%.o,$(PLUGIN_SOURCE_FILES)) |
| GCCPLUGINS_DIR:= $(shell $(GCC) -print-file-name=plugin) |
| CFLAGS+= -I$(GCCPLUGINS_DIR)/include -fPIC -O2 |
| |
| plugin.so: $(PLUGIN_OBJECT_FILES) |
| $(GCC) -shared $^ -o $@ |
| |
| A single source file plugin may be built with `gcc -I`gcc |
| -print-file-name=plugin`/include -fPIC -shared -O2 plugin.c -o |
| plugin.so', using backquote shell syntax to query the `plugin' |
| directory. |
| |
| Plugins needing to use `gengtype' require a GCC build directory for |
| the same version of GCC that they will be linked against. |
| |
| |
| File: gccint.info, Node: Funding, Next: GNU Project, Prev: Plugins, 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.2, November 2002 |
| |
| Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
| |
| 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. |
| |
| 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 for under this License. Any other |
| attempt to copy, modify, sublicense or distribute the Document is |
| void, and will automatically terminate your rights under this |
| License. However, parties who have received copies, or rights, |
| from you under this License will not have their licenses |
| terminated so long as such parties remain in full compliance. |
| |
| 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. |
| |
| 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.2 |
| 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. |
| |
| * 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, 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 and MeP 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. |
| |
| * Zdenek Dvorak for a new loop unroller and various fixes. |
| |
| * 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 |
| continuously 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 |
| since the late 1980s. |
| |
| * 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 Guenther 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. |
| |
| * 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. |
| |
| * 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. |
| |
| * 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 for GCC 3.x. |
| |
| * 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. |
| |
| * 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 as well a serving as release manager for |
| GCC 2.95.3. |
| |
| * 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. |
| |
| * 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. |
| |
| * 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'. |
| |
| * 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 his mips16 work, 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. |
| |
| * 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. |
| |
| * 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. |
| |
| [index] |
| * Menu: |
| |
| * msoft-float: Soft float library routines. |
| (line 6) |
| |
| |
| File: gccint.info, Node: Concept Index, Prev: Option Index, Up: Top |
| |
| Concept Index |
| ************* |
| |
| [index] |
| * Menu: |
| |
| * ! in constraint: Multi-Alternative. (line 47) |
| * # in constraint: Modifiers. (line 67) |
| * # in template: Output Template. (line 66) |
| * #pragma: Misc. (line 381) |
| * % in constraint: Modifiers. (line 45) |
| * % in GTY option: GTY Options. (line 18) |
| * % in template: Output Template. (line 6) |
| * & in constraint: Modifiers. (line 25) |
| * ( <1>: GIMPLE_CALL. (line 63) |
| * ( <2>: GIMPLE_ASM. (line 21) |
| * (: Logical Operators. (line 107) |
| * (nil): RTL Objects. (line 73) |
| * *: Host Common. (line 17) |
| * * in constraint: Modifiers. (line 72) |
| * * in template: Output Statement. (line 29) |
| * *gimple_assign_lhs_ptr: GIMPLE_ASSIGN. (line 54) |
| * *gimple_assign_rhs1_ptr: GIMPLE_ASSIGN. (line 60) |
| * *gimple_assign_rhs2_ptr: GIMPLE_ASSIGN. (line 67) |
| * *gimple_call_arg_ptr: GIMPLE_CALL. (line 71) |
| * *gimple_call_lhs_ptr: GIMPLE_CALL. (line 32) |
| * *gimple_catch_types_ptr: GIMPLE_CATCH. (line 16) |
| * *gimple_debug_bind_get_value_ptr: GIMPLE_DEBUG. (line 52) |
| * *gimple_eh_filter_types_ptr: GIMPLE_EH_FILTER. (line 15) |
| * *gimple_omp_critical_name_ptr: GIMPLE_OMP_CRITICAL. |
| (line 16) |
| * *gimple_omp_for_clauses_ptr: GIMPLE_OMP_FOR. (line 23) |
| * *gimple_omp_for_final_ptr: GIMPLE_OMP_FOR. (line 54) |
| * *gimple_omp_for_incr_ptr: GIMPLE_OMP_FOR. (line 64) |
| * *gimple_omp_for_index_ptr: GIMPLE_OMP_FOR. (line 34) |
| * *gimple_omp_for_initial_ptr: GIMPLE_OMP_FOR. (line 44) |
| * *gimple_omp_parallel_child_fn_ptr: GIMPLE_OMP_PARALLEL. |
| (line 46) |
| * *gimple_omp_parallel_clauses_ptr: GIMPLE_OMP_PARALLEL. |
| (line 34) |
| * *gimple_omp_parallel_data_arg_ptr: GIMPLE_OMP_PARALLEL. |
| (line 58) |
| * *gimple_omp_sections_clauses_ptr: GIMPLE_OMP_SECTIONS. |
| (line 33) |
| * *gimple_omp_sections_control_ptr: GIMPLE_OMP_SECTIONS. |
| (line 21) |
| * *gimple_omp_single_clauses_ptr: GIMPLE_OMP_SINGLE. (line 17) |
| * *gimple_op_ptr: Manipulating GIMPLE statements. |
| (line 84) |
| * *gimple_ops <1>: Manipulating GIMPLE statements. |
| (line 78) |
| * *gimple_ops: Logical Operators. (line 82) |
| * *gimple_phi_result_ptr: GIMPLE_PHI. (line 22) |
| * *gsi_stmt_ptr: Sequence iterators. (line 80) |
| * + in constraint: Modifiers. (line 12) |
| * -fsection-anchors <1>: Anchored Addresses. (line 6) |
| * -fsection-anchors: Special Accessors. (line 110) |
| * /c in RTL dump: Flags. (line 239) |
| * /f in RTL dump: Flags. (line 247) |
| * /i in RTL dump: Flags. (line 299) |
| * /j in RTL dump: Flags. (line 314) |
| * /s in RTL dump: Flags. (line 263) |
| * /u in RTL dump: Flags. (line 324) |
| * /v in RTL dump: Flags. (line 356) |
| * 0 in constraint: Simple Constraints. (line 120) |
| * < in constraint: Simple Constraints. (line 48) |
| * = in constraint: Modifiers. (line 8) |
| * > in constraint: Simple Constraints. (line 52) |
| * ? in constraint: Multi-Alternative. (line 41) |
| * \: Output Template. (line 46) |
| * __absvdi2: Integer library routines. |
| (line 107) |
| * __absvsi2: Integer library routines. |
| (line 106) |
| * __addda3: Fixed-point fractional library routines. |
| (line 45) |
| * __adddf3: Soft float library routines. |
| (line 23) |
| * __adddq3: Fixed-point fractional library routines. |
| (line 33) |
| * __addha3: Fixed-point fractional library routines. |
| (line 43) |
| * __addhq3: Fixed-point fractional library routines. |
| (line 30) |
| * __addqq3: Fixed-point fractional library routines. |
| (line 29) |
| * __addsa3: Fixed-point fractional library routines. |
| (line 44) |
| * __addsf3: Soft float library routines. |
| (line 22) |
| * __addsq3: Fixed-point fractional library routines. |
| (line 31) |
| * __addta3: Fixed-point fractional library routines. |
| (line 47) |
| * __addtf3: Soft float library routines. |
| (line 25) |
| * __adduda3: Fixed-point fractional library routines. |
| (line 53) |
| * __addudq3: Fixed-point fractional library routines. |
| (line 41) |
| * __adduha3: Fixed-point fractional library routines. |
| (line 49) |
| * __adduhq3: Fixed-point fractional library routines. |
| (line 37) |
| * __adduqq3: Fixed-point fractional library routines. |
| (line 35) |
| * __addusa3: Fixed-point fractional library routines. |
| (line 51) |
| * __addusq3: Fixed-point fractional library routines. |
| (line 39) |
| * __adduta3: Fixed-point fractional library routines. |
| (line 55) |
| * __addvdi3: Integer library routines. |
| (line 111) |
| * __addvsi3: Integer library routines. |
| (line 110) |
| * __addxf3: Soft float library routines. |
| (line 27) |
| * __ashlda3: Fixed-point fractional library routines. |
| (line 351) |
| * __ashldi3: Integer library routines. |
| (line 14) |
| * __ashldq3: Fixed-point fractional library routines. |
| (line 340) |
| * __ashlha3: Fixed-point fractional library routines. |
| (line 349) |
| * __ashlhq3: Fixed-point fractional library routines. |
| (line 337) |
| * __ashlqq3: Fixed-point fractional library routines. |
| (line 336) |
| * __ashlsa3: Fixed-point fractional library routines. |
| (line 350) |
| * __ashlsi3: Integer library routines. |
| (line 13) |
| * __ashlsq3: Fixed-point fractional library routines. |
| (line 338) |
| * __ashlta3: Fixed-point fractional library routines. |
| (line 353) |
| * __ashlti3: Integer library routines. |
| (line 15) |
| * __ashluda3: Fixed-point fractional library routines. |
| (line 359) |
| * __ashludq3: Fixed-point fractional library routines. |
| (line 348) |
| * __ashluha3: Fixed-point fractional library routines. |
| (line 355) |
| * __ashluhq3: Fixed-point fractional library routines. |
| (line 344) |
| * __ashluqq3: Fixed-point fractional library routines. |
| (line 342) |
| * __ashlusa3: Fixed-point fractional library routines. |
| (line 357) |
| * __ashlusq3: Fixed-point fractional library routines. |
| (line 346) |
| * __ashluta3: Fixed-point fractional library routines. |
| (line 361) |
| * __ashrda3: Fixed-point fractional library routines. |
| (line 371) |
| * __ashrdi3: Integer library routines. |
| (line 19) |
| * __ashrdq3: Fixed-point fractional library routines. |
| (line 368) |
| * __ashrha3: Fixed-point fractional library routines. |
| (line 369) |
| * __ashrhq3: Fixed-point fractional library routines. |
| (line 365) |
| * __ashrqq3: Fixed-point fractional library routines. |
| (line 364) |
| * __ashrsa3: Fixed-point fractional library routines. |
| (line 370) |
| * __ashrsi3: Integer library routines. |
| (line 18) |
| * __ashrsq3: Fixed-point fractional library routines. |
| (line 366) |
| * __ashrta3: Fixed-point fractional library routines. |
| (line 373) |
| * __ashrti3: Integer library routines. |
| (line 20) |
| * __bid_adddd3: Decimal float library routines. |
| (line 25) |
| * __bid_addsd3: Decimal float library routines. |
| (line 21) |
| * __bid_addtd3: Decimal float library routines. |
| (line 29) |
| * __bid_divdd3: Decimal float library routines. |
| (line 68) |
| * __bid_divsd3: Decimal float library routines. |
| (line 64) |
| * __bid_divtd3: Decimal float library routines. |
| (line 72) |
| * __bid_eqdd2: Decimal float library routines. |
| (line 259) |
| * __bid_eqsd2: Decimal float library routines. |
| (line 257) |
| * __bid_eqtd2: Decimal float library routines. |
| (line 261) |
| * __bid_extendddtd2: Decimal float library routines. |
| (line 92) |
| * __bid_extendddtf: Decimal float library routines. |
| (line 140) |
| * __bid_extendddxf: Decimal float library routines. |
| (line 134) |
| * __bid_extenddfdd: Decimal float library routines. |
| (line 147) |
| * __bid_extenddftd: Decimal float library routines. |
| (line 107) |
| * __bid_extendsddd2: Decimal float library routines. |
| (line 88) |
| * __bid_extendsddf: Decimal float library routines. |
| (line 128) |
| * __bid_extendsdtd2: Decimal float library routines. |
| (line 90) |
| * __bid_extendsdtf: Decimal float library routines. |
| (line 138) |
| * __bid_extendsdxf: Decimal float library routines. |
| (line 132) |
| * __bid_extendsfdd: Decimal float library routines. |
| (line 103) |
| * __bid_extendsfsd: Decimal float library routines. |
| (line 145) |
| * __bid_extendsftd: Decimal float library routines. |
| (line 105) |
| * __bid_extendtftd: Decimal float library routines. |
| (line 149) |
| * __bid_extendxftd: Decimal float library routines. |
| (line 109) |
| * __bid_fixdddi: Decimal float library routines. |
| (line 170) |
| * __bid_fixddsi: Decimal float library routines. |
| (line 162) |
| * __bid_fixsddi: Decimal float library routines. |
| (line 168) |
| * __bid_fixsdsi: Decimal float library routines. |
| (line 160) |
| * __bid_fixtddi: Decimal float library routines. |
| (line 172) |
| * __bid_fixtdsi: Decimal float library routines. |
| (line 164) |
| * __bid_fixunsdddi: Decimal float library routines. |
| (line 187) |
| * __bid_fixunsddsi: Decimal float library routines. |
| (line 178) |
| * __bid_fixunssddi: Decimal float library routines. |
| (line 185) |
| * __bid_fixunssdsi: Decimal float library routines. |
| (line 176) |
| * __bid_fixunstddi: Decimal float library routines. |
| (line 189) |
| * __bid_fixunstdsi: Decimal float library routines. |
| (line 180) |
| * __bid_floatdidd: Decimal float library routines. |
| (line 205) |
| * __bid_floatdisd: Decimal float library routines. |
| (line 203) |
| * __bid_floatditd: Decimal float library routines. |
| (line 207) |
| * __bid_floatsidd: Decimal float library routines. |
| (line 196) |
| * __bid_floatsisd: Decimal float library routines. |
| (line 194) |
| * __bid_floatsitd: Decimal float library routines. |
| (line 198) |
| * __bid_floatunsdidd: Decimal float library routines. |
| (line 223) |
| * __bid_floatunsdisd: Decimal float library routines. |
| (line 221) |
| * __bid_floatunsditd: Decimal float library routines. |
| (line 225) |
| * __bid_floatunssidd: Decimal float library routines. |
| (line 214) |
| * __bid_floatunssisd: Decimal float library routines. |
| (line 212) |
| * __bid_floatunssitd: Decimal float library routines. |
| (line 216) |
| * __bid_gedd2: Decimal float library routines. |
| (line 277) |
| * __bid_gesd2: Decimal float library routines. |
| (line 275) |
| * __bid_getd2: Decimal float library routines. |
| (line 279) |
| * __bid_gtdd2: Decimal float library routines. |
| (line 304) |
| * __bid_gtsd2: Decimal float library routines. |
| (line 302) |
| * __bid_gttd2: Decimal float library routines. |
| (line 306) |
| * __bid_ledd2: Decimal float library routines. |
| (line 295) |
| * __bid_lesd2: Decimal float library routines. |
| (line 293) |
| * __bid_letd2: Decimal float library routines. |
| (line 297) |
| * __bid_ltdd2: Decimal float library routines. |
| (line 286) |
| * __bid_ltsd2: Decimal float library routines. |
| (line 284) |
| * __bid_lttd2: Decimal float library routines. |
| (line 288) |
| * __bid_muldd3: Decimal float library routines. |
| (line 54) |
| * __bid_mulsd3: Decimal float library routines. |
| (line 50) |
| * __bid_multd3: Decimal float library routines. |
| (line 58) |
| * __bid_nedd2: Decimal float library routines. |
| (line 268) |
| * __bid_negdd2: Decimal float library routines. |
| (line 78) |
| * __bid_negsd2: Decimal float library routines. |
| (line 76) |
| * __bid_negtd2: Decimal float library routines. |
| (line 80) |
| * __bid_nesd2: Decimal float library routines. |
| (line 266) |
| * __bid_netd2: Decimal float library routines. |
| (line 270) |
| * __bid_subdd3: Decimal float library routines. |
| (line 39) |
| * __bid_subsd3: Decimal float library routines. |
| (line 35) |
| * __bid_subtd3: Decimal float library routines. |
| (line 43) |
| * __bid_truncdddf: Decimal float library routines. |
| (line 153) |
| * __bid_truncddsd2: Decimal float library routines. |
| (line 94) |
| * __bid_truncddsf: Decimal float library routines. |
| (line 124) |
| * __bid_truncdfsd: Decimal float library routines. |
| (line 111) |
| * __bid_truncsdsf: Decimal float library routines. |
| (line 151) |
| * __bid_trunctddd2: Decimal float library routines. |
| (line 98) |
| * __bid_trunctddf: Decimal float library routines. |
| (line 130) |
| * __bid_trunctdsd2: Decimal float library routines. |
| (line 96) |
| * __bid_trunctdsf: Decimal float library routines. |
| (line 126) |
| * __bid_trunctdtf: Decimal float library routines. |
| (line 155) |
| * __bid_trunctdxf: Decimal float library routines. |
| (line 136) |
| * __bid_trunctfdd: Decimal float library routines. |
| (line 119) |
| * __bid_trunctfsd: Decimal float library routines. |
| (line 115) |
| * __bid_truncxfdd: Decimal float library routines. |
| (line 117) |
| * __bid_truncxfsd: Decimal float library routines. |
| (line 113) |
| * __bid_unorddd2: Decimal float library routines. |
| (line 235) |
| * __bid_unordsd2: Decimal float library routines. |
| (line 233) |
| * __bid_unordtd2: Decimal float library routines. |
| (line 237) |
| * __bswapdi2: Integer library routines. |
| (line 162) |
| * __bswapsi2: Integer library routines. |
| (line 161) |
| * __builtin_args_info: Varargs. (line 42) |
| * __builtin_classify_type: Varargs. (line 76) |
| * __builtin_next_arg: Varargs. (line 66) |
| * __builtin_saveregs: Varargs. (line 24) |
| * __clear_cache: Miscellaneous routines. |
| (line 10) |
| * __clzdi2: Integer library routines. |
| (line 131) |
| * __clzsi2: Integer library routines. |
| (line 130) |
| * __clzti2: Integer library routines. |
| (line 132) |
| * __cmpda2: Fixed-point fractional library routines. |
| (line 451) |
| * __cmpdf2: Soft float library routines. |
| (line 164) |
| * __cmpdi2: Integer library routines. |
| (line 87) |
| * __cmpdq2: Fixed-point fractional library routines. |
| (line 441) |
| * __cmpha2: Fixed-point fractional library routines. |
| (line 449) |
| * __cmphq2: Fixed-point fractional library routines. |
| (line 438) |
| * __cmpqq2: Fixed-point fractional library routines. |
| (line 437) |
| * __cmpsa2: Fixed-point fractional library routines. |
| (line 450) |
| * __cmpsf2: Soft float library routines. |
| (line 163) |
| * __cmpsq2: Fixed-point fractional library routines. |
| (line 439) |
| * __cmpta2: Fixed-point fractional library routines. |
| (line 453) |
| * __cmptf2: Soft float library routines. |
| (line 165) |
| * __cmpti2: Integer library routines. |
| (line 88) |
| * __cmpuda2: Fixed-point fractional library routines. |
| (line 458) |
| * __cmpudq2: Fixed-point fractional library routines. |
| (line 448) |
| * __cmpuha2: Fixed-point fractional library routines. |
| (line 455) |
| * __cmpuhq2: Fixed-point fractional library routines. |
| (line 444) |
| * __cmpuqq2: Fixed-point fractional library routines. |
| (line 443) |
| * __cmpusa2: Fixed-point fractional library routines. |
| (line 456) |
| * __cmpusq2: Fixed-point fractional library routines. |
| (line 446) |
| * __cmputa2: Fixed-point fractional library routines. |
| (line 460) |
| * __CTOR_LIST__: Initialization. (line 25) |
| * __ctzdi2: Integer library routines. |
| (line 138) |
| * __ctzsi2: Integer library routines. |
| (line 137) |
| * __ctzti2: Integer library routines. |
| (line 139) |
| * __divda3: Fixed-point fractional library routines. |
| (line 227) |
| * __divdc3: Soft float library routines. |
| (line 252) |
| * __divdf3: Soft float library routines. |
| (line 48) |
| * __divdi3: Integer library routines. |
| (line 25) |
| * __divdq3: Fixed-point fractional library routines. |
| (line 223) |
| * __divha3: Fixed-point fractional library routines. |
| (line 225) |
| * __divhq3: Fixed-point fractional library routines. |
| (line 220) |
| * __divqq3: Fixed-point fractional library routines. |
| (line 219) |
| * __divsa3: Fixed-point fractional library routines. |
| (line 226) |
| * __divsc3: Soft float library routines. |
| (line 250) |
| * __divsf3: Soft float library routines. |
| (line 47) |
| * __divsi3: Integer library routines. |
| (line 24) |
| * __divsq3: Fixed-point fractional library routines. |
| (line 221) |
| * __divta3: Fixed-point fractional library routines. |
| (line 229) |
| * __divtc3: Soft float library routines. |
| (line 254) |
| * __divtf3: Soft float library routines. |
| (line 50) |
| * __divti3: Integer library routines. |
| (line 26) |
| * __divxc3: Soft float library routines. |
| (line 256) |
| * __divxf3: Soft float library routines. |
| (line 52) |
| * __dpd_adddd3: Decimal float library routines. |
| (line 23) |
| * __dpd_addsd3: Decimal float library routines. |
| (line 19) |
| * __dpd_addtd3: Decimal float library routines. |
| (line 27) |
| * __dpd_divdd3: Decimal float library routines. |
| (line 66) |
| * __dpd_divsd3: Decimal float library routines. |
| (line 62) |
| * __dpd_divtd3: Decimal float library routines. |
| (line 70) |
| * __dpd_eqdd2: Decimal float library routines. |
| (line 258) |
| * __dpd_eqsd2: Decimal float library routines. |
| (line 256) |
| * __dpd_eqtd2: Decimal float library routines. |
| (line 260) |
| * __dpd_extendddtd2: Decimal float library routines. |
| (line 91) |
| * __dpd_extendddtf: Decimal float library routines. |
| (line 139) |
| * __dpd_extendddxf: Decimal float library routines. |
| (line 133) |
| * __dpd_extenddfdd: Decimal float library routines. |
| (line 146) |
| * __dpd_extenddftd: Decimal float library routines. |
| (line 106) |
| * __dpd_extendsddd2: Decimal float library routines. |
| (line 87) |
| * __dpd_extendsddf: Decimal float library routines. |
| (line 127) |
| * __dpd_extendsdtd2: Decimal float library routines. |
| (line 89) |
| * __dpd_extendsdtf: Decimal float library routines. |
| (line 137) |
| * __dpd_extendsdxf: Decimal float library routines. |
| (line 131) |
| * __dpd_extendsfdd: Decimal float library routines. |
| (line 102) |
| * __dpd_extendsfsd: Decimal float library routines. |
| (line 144) |
| * __dpd_extendsftd: Decimal float library routines. |
| (line 104) |
| * __dpd_extendtftd: Decimal float library routines. |
| (line 148) |
| * __dpd_extendxftd: Decimal float library routines. |
| (line 108) |
| * __dpd_fixdddi: Decimal float library routines. |
| (line 169) |
| * __dpd_fixddsi: Decimal float library routines. |
| (line 161) |
| * __dpd_fixsddi: Decimal float library routines. |
| (line 167) |
| * __dpd_fixsdsi: Decimal float library routines. |
| (line 159) |
| * __dpd_fixtddi: Decimal float library routines. |
| (line 171) |
| * __dpd_fixtdsi: Decimal float library routines. |
| (line 163) |
| * __dpd_fixunsdddi: Decimal float library routines. |
| (line 186) |
| * __dpd_fixunsddsi: Decimal float library routines. |
| (line 177) |
| * __dpd_fixunssddi: Decimal float library routines. |
| (line 184) |
| * __dpd_fixunssdsi: Decimal float library routines. |
| (line 175) |
| * __dpd_fixunstddi: Decimal float library routines. |
| (line 188) |
| * __dpd_fixunstdsi: Decimal float library routines. |
| (line 179) |
| * __dpd_floatdidd: Decimal float library routines. |
| (line 204) |
| * __dpd_floatdisd: Decimal float library routines. |
| (line 202) |
| * __dpd_floatditd: Decimal float library routines. |
| (line 206) |
| * __dpd_floatsidd: Decimal float library routines. |
| (line 195) |
| * __dpd_floatsisd: Decimal float library routines. |
| (line 193) |
| * __dpd_floatsitd: Decimal float library routines. |
| (line 197) |
| * __dpd_floatunsdidd: Decimal float library routines. |
| (line 222) |
| * __dpd_floatunsdisd: Decimal float library routines. |
| (line 220) |
| * __dpd_floatunsditd: Decimal float library routines. |
| (line 224) |
| * __dpd_floatunssidd: Decimal float library routines. |
| (line 213) |
| * __dpd_floatunssisd: Decimal float library routines. |
| (line 211) |
| * __dpd_floatunssitd: Decimal float library routines. |
| (line 215) |
| * __dpd_gedd2: Decimal float library routines. |
| (line 276) |
| * __dpd_gesd2: Decimal float library routines. |
| (line 274) |
| * __dpd_getd2: Decimal float library routines. |
| (line 278) |
| * __dpd_gtdd2: Decimal float library routines. |
| (line 303) |
| * __dpd_gtsd2: Decimal float library routines. |
| (line 301) |
| * __dpd_gttd2: Decimal float library routines. |
| (line 305) |
| * __dpd_ledd2: Decimal float library routines. |
| (line 294) |
| * __dpd_lesd2: Decimal float library routines. |
| (line 292) |
| * __dpd_letd2: Decimal float library routines. |
| (line 296) |
| * __dpd_ltdd2: Decimal float library routines. |
| (line 285) |
| * __dpd_ltsd2: Decimal float library routines. |
| (line 283) |
| * __dpd_lttd2: Decimal float library routines. |
| (line 287) |
| * __dpd_muldd3: Decimal float library routines. |
| (line 52) |
| * __dpd_mulsd3: Decimal float library routines. |
| (line 48) |
| * __dpd_multd3: Decimal float library routines. |
| (line 56) |
| * __dpd_nedd2: Decimal float library routines. |
| (line 267) |
| * __dpd_negdd2: Decimal float library routines. |
| (line 77) |
| * __dpd_negsd2: Decimal float library routines. |
| (line 75) |
| * __dpd_negtd2: Decimal float library routines. |
| (line 79) |
| * __dpd_nesd2: Decimal float library routines. |
| (line 265) |
| * __dpd_netd2: Decimal float library routines. |
| (line 269) |
| * __dpd_subdd3: Decimal float library routines. |
| (line 37) |
| * __dpd_subsd3: Decimal float library routines. |
| (line 33) |
| * __dpd_subtd3: Decimal float library routines. |
| (line 41) |
| * __dpd_truncdddf: Decimal float library routines. |
| (line 152) |
| * __dpd_truncddsd2: Decimal float library routines. |
| (line 93) |
| * __dpd_truncddsf: Decimal float library routines. |
| (line 123) |
| * __dpd_truncdfsd: Decimal float library routines. |
| (line 110) |
| * __dpd_truncsdsf: Decimal float library routines. |
| (line 150) |
| * __dpd_trunctddd2: Decimal float library routines. |
| (line 97) |
| * __dpd_trunctddf: Decimal float library routines. |
| (line 129) |
| * __dpd_trunctdsd2: Decimal float library routines. |
| (line 95) |
| * __dpd_trunctdsf: Decimal float library routines. |
| (line 125) |
| * __dpd_trunctdtf: Decimal float library routines. |
| (line 154) |
| * __dpd_trunctdxf: Decimal float library routines. |
| (line 135) |
| * __dpd_trunctfdd: Decimal float library routines. |
| (line 118) |
| * __dpd_trunctfsd: Decimal float library routines. |
| (line 114) |
| * __dpd_truncxfdd: Decimal float library routines. |
| (line 116) |
| * __dpd_truncxfsd: Decimal float library routines. |
| (line 112) |
| * __dpd_unorddd2: Decimal float library routines. |
| (line 234) |
| * __dpd_unordsd2: Decimal float library routines. |
| (line 232) |
| * __dpd_unordtd2: Decimal float library routines. |
| (line 236) |
| * __DTOR_LIST__: Initialization. (line 25) |
| * __eqdf2: Soft float library routines. |
| (line 194) |
| * __eqsf2: Soft float library routines. |
| (line 193) |
| * __eqtf2: Soft float library routines. |
| (line 195) |
| * __extenddftf2: Soft float library routines. |
| (line 68) |
| * __extenddfxf2: Soft float library routines. |
| (line 69) |
| * __extendsfdf2: Soft float library routines. |
| (line 65) |
| * __extendsftf2: Soft float library routines. |
| (line 66) |
| * __extendsfxf2: Soft float library routines. |
| (line 67) |
| * __ffsdi2: Integer library routines. |
| (line 144) |
| * __ffsti2: Integer library routines. |
| (line 145) |
| * __fixdfdi: Soft float library routines. |
| (line 88) |
| * __fixdfsi: Soft float library routines. |
| (line 81) |
| * __fixdfti: Soft float library routines. |
| (line 94) |
| * __fixsfdi: Soft float library routines. |
| (line 87) |
| * __fixsfsi: Soft float library routines. |
| (line 80) |
| * __fixsfti: Soft float library routines. |
| (line 93) |
| * __fixtfdi: Soft float library routines. |
| (line 89) |
| * __fixtfsi: Soft float library routines. |
| (line 82) |
| * __fixtfti: Soft float library routines. |
| (line 95) |
| * __fixunsdfdi: Soft float library routines. |
| (line 108) |
| * __fixunsdfsi: Soft float library routines. |
| (line 101) |
| * __fixunsdfti: Soft float library routines. |
| (line 115) |
| * __fixunssfdi: Soft float library routines. |
| (line 107) |
| * __fixunssfsi: Soft float library routines. |
| (line 100) |
| * __fixunssfti: Soft float library routines. |
| (line 114) |
| * __fixunstfdi: Soft float library routines. |
| (line 109) |
| * __fixunstfsi: Soft float library routines. |
| (line 102) |
| * __fixunstfti: Soft float library routines. |
| (line 116) |
| * __fixunsxfdi: Soft float library routines. |
| (line 110) |
| * __fixunsxfsi: Soft float library routines. |
| (line 103) |
| * __fixunsxfti: Soft float library routines. |
| (line 117) |
| * __fixxfdi: Soft float library routines. |
| (line 90) |
| * __fixxfsi: Soft float library routines. |
| (line 83) |
| * __fixxfti: Soft float library routines. |
| (line 96) |
| * __floatdidf: Soft float library routines. |
| (line 128) |
| * __floatdisf: Soft float library routines. |
| (line 127) |
| * __floatditf: Soft float library routines. |
| (line 129) |
| * __floatdixf: Soft float library routines. |
| (line 130) |
| * __floatsidf: Soft float library routines. |
| (line 122) |
| * __floatsisf: Soft float library routines. |
| (line 121) |
| * __floatsitf: Soft float library routines. |
| (line 123) |
| * __floatsixf: Soft float library routines. |
| (line 124) |
| * __floattidf: Soft float library routines. |
| (line 134) |
| * __floattisf: Soft float library routines. |
| (line 133) |
| * __floattitf: Soft float library routines. |
| (line 135) |
| * __floattixf: Soft float library routines. |
| (line 136) |
| * __floatundidf: Soft float library routines. |
| (line 146) |
| * __floatundisf: Soft float library routines. |
| (line 145) |
| * __floatunditf: Soft float library routines. |
| (line 147) |
| * __floatundixf: Soft float library routines. |
| (line 148) |
| * __floatunsidf: Soft float library routines. |
| (line 140) |
| * __floatunsisf: Soft float library routines. |
| (line 139) |
| * __floatunsitf: Soft float library routines. |
| (line 141) |
| * __floatunsixf: Soft float library routines. |
| (line 142) |
| * __floatuntidf: Soft float library routines. |
| (line 152) |
| * __floatuntisf: Soft float library routines. |
| (line 151) |
| * __floatuntitf: Soft float library routines. |
| (line 153) |
| * __floatuntixf: Soft float library routines. |
| (line 154) |
| * __fractdadf: Fixed-point fractional library routines. |
| (line 636) |
| * __fractdadi: Fixed-point fractional library routines. |
| (line 633) |
| * __fractdadq: Fixed-point fractional library routines. |
| (line 616) |
| * __fractdaha2: Fixed-point fractional library routines. |
| (line 617) |
| * __fractdahi: Fixed-point fractional library routines. |
| (line 631) |
| * __fractdahq: Fixed-point fractional library routines. |
| (line 614) |
| * __fractdaqi: Fixed-point fractional library routines. |
| (line 630) |
| * __fractdaqq: Fixed-point fractional library routines. |
| (line 613) |
| * __fractdasa2: Fixed-point fractional library routines. |
| (line 618) |
| * __fractdasf: Fixed-point fractional library routines. |
| (line 635) |
| * __fractdasi: Fixed-point fractional library routines. |
| (line 632) |
| * __fractdasq: Fixed-point fractional library routines. |
| (line 615) |
| * __fractdata2: Fixed-point fractional library routines. |
| (line 619) |
| * __fractdati: Fixed-point fractional library routines. |
| (line 634) |
| * __fractdauda: Fixed-point fractional library routines. |
| (line 627) |
| * __fractdaudq: Fixed-point fractional library routines. |
| (line 624) |
| * __fractdauha: Fixed-point fractional library routines. |
| (line 625) |
| * __fractdauhq: Fixed-point fractional library routines. |
| (line 621) |
| * __fractdauqq: Fixed-point fractional library routines. |
| (line 620) |
| * __fractdausa: Fixed-point fractional library routines. |
| (line 626) |
| * __fractdausq: Fixed-point fractional library routines. |
| (line 622) |
| * __fractdauta: Fixed-point fractional library routines. |
| (line 629) |
| * __fractdfda: Fixed-point fractional library routines. |
| (line 1025) |
| * __fractdfdq: Fixed-point fractional library routines. |
| (line 1022) |
| * __fractdfha: Fixed-point fractional library routines. |
| (line 1023) |
| * __fractdfhq: Fixed-point fractional library routines. |
| (line 1020) |
| * __fractdfqq: Fixed-point fractional library routines. |
| (line 1019) |
| * __fractdfsa: Fixed-point fractional library routines. |
| (line 1024) |
| * __fractdfsq: Fixed-point fractional library routines. |
| (line 1021) |
| * __fractdfta: Fixed-point fractional library routines. |
| (line 1026) |
| * __fractdfuda: Fixed-point fractional library routines. |
| (line 1033) |
| * __fractdfudq: Fixed-point fractional library routines. |
| (line 1030) |
| * __fractdfuha: Fixed-point fractional library routines. |
| (line 1031) |
| * __fractdfuhq: Fixed-point fractional library routines. |
| (line 1028) |
| * __fractdfuqq: Fixed-point fractional library routines. |
| (line 1027) |
| * __fractdfusa: Fixed-point fractional library routines. |
| (line 1032) |
| * __fractdfusq: Fixed-point fractional library routines. |
| (line 1029) |
| * __fractdfuta: Fixed-point fractional library routines. |
| (line 1034) |
| * __fractdida: Fixed-point fractional library routines. |
| (line 975) |
| * __fractdidq: Fixed-point fractional library routines. |
| (line 972) |
| * __fractdiha: Fixed-point fractional library routines. |
| (line 973) |
| * __fractdihq: Fixed-point fractional library routines. |
| (line 970) |
| * __fractdiqq: Fixed-point fractional library routines. |
| (line 969) |
| * __fractdisa: Fixed-point fractional library routines. |
| (line 974) |
| * __fractdisq: Fixed-point fractional library routines. |
| (line 971) |
| * __fractdita: Fixed-point fractional library routines. |
| (line 976) |
| * __fractdiuda: Fixed-point fractional library routines. |
| (line 983) |
| * __fractdiudq: Fixed-point fractional library routines. |
| (line 980) |
| * __fractdiuha: Fixed-point fractional library routines. |
| (line 981) |
| * __fractdiuhq: Fixed-point fractional library routines. |
| (line 978) |
| * __fractdiuqq: Fixed-point fractional library routines. |
| (line 977) |
| * __fractdiusa: Fixed-point fractional library routines. |
| (line 982) |
| * __fractdiusq: Fixed-point fractional library routines. |
| (line 979) |
| * __fractdiuta: Fixed-point fractional library routines. |
| (line 984) |
| * __fractdqda: Fixed-point fractional library routines. |
| (line 544) |
| * __fractdqdf: Fixed-point fractional library routines. |
| (line 566) |
| * __fractdqdi: Fixed-point fractional library routines. |
| (line 563) |
| * __fractdqha: Fixed-point fractional library routines. |
| (line 542) |
| * __fractdqhi: Fixed-point fractional library routines. |
| (line 561) |
| * __fractdqhq2: Fixed-point fractional library routines. |
| (line 540) |
| * __fractdqqi: Fixed-point fractional library routines. |
| (line 560) |
| * __fractdqqq2: Fixed-point fractional library routines. |
| (line 539) |
| * __fractdqsa: Fixed-point fractional library routines. |
| (line 543) |
| * __fractdqsf: Fixed-point fractional library routines. |
| (line 565) |
| * __fractdqsi: Fixed-point fractional library routines. |
| (line 562) |
| * __fractdqsq2: Fixed-point fractional library routines. |
| (line 541) |
| * __fractdqta: Fixed-point fractional library routines. |
| (line 545) |
| * __fractdqti: Fixed-point fractional library routines. |
| (line 564) |
| * __fractdquda: Fixed-point fractional library routines. |
| (line 557) |
| * __fractdqudq: Fixed-point fractional library routines. |
| (line 552) |
| * __fractdquha: Fixed-point fractional library routines. |
| (line 554) |
| * __fractdquhq: Fixed-point fractional library routines. |
| (line 548) |
| * __fractdquqq: Fixed-point fractional library routines. |
| (line 547) |
| * __fractdqusa: Fixed-point fractional library routines. |
| (line 555) |
| * __fractdqusq: Fixed-point fractional library routines. |
| (line 550) |
| * __fractdquta: Fixed-point fractional library routines. |
| (line 559) |
| * __fracthada2: Fixed-point fractional library routines. |
| (line 572) |
| * __fracthadf: Fixed-point fractional library routines. |
| (line 590) |
| * __fracthadi: Fixed-point fractional library routines. |
| (line 587) |
| * __fracthadq: Fixed-point fractional library routines. |
| (line 570) |
| * __fracthahi: Fixed-point fractional library routines. |
| (line 585) |
| * __fracthahq: Fixed-point fractional library routines. |
| (line 568) |
| * __fracthaqi: Fixed-point fractional library routines. |
| (line 584) |
| * __fracthaqq: Fixed-point fractional library routines. |
| (line 567) |
| * __fracthasa2: Fixed-point fractional library routines. |
| (line 571) |
| * __fracthasf: Fixed-point fractional library routines. |
| (line 589) |
| * __fracthasi: Fixed-point fractional library routines. |
| (line 586) |
| * __fracthasq: Fixed-point fractional library routines. |
| (line 569) |
| * __fracthata2: Fixed-point fractional library routines. |
| (line 573) |
| * __fracthati: Fixed-point fractional library routines. |
| (line 588) |
| * __fracthauda: Fixed-point fractional library routines. |
| (line 581) |
| * __fracthaudq: Fixed-point fractional library routines. |
| (line 578) |
| * __fracthauha: Fixed-point fractional library routines. |
| (line 579) |
| * __fracthauhq: Fixed-point fractional library routines. |
| (line 575) |
| * __fracthauqq: Fixed-point fractional library routines. |
| (line 574) |
| * __fracthausa: Fixed-point fractional library routines. |
| (line 580) |
| * __fracthausq: Fixed-point fractional library routines. |
| (line 576) |
| * __fracthauta: Fixed-point fractional library routines. |
| (line 583) |
| * __fracthida: Fixed-point fractional library routines. |
| (line 943) |
| * __fracthidq: Fixed-point fractional library routines. |
| (line 940) |
| * __fracthiha: Fixed-point fractional library routines. |
| (line 941) |
| * __fracthihq: Fixed-point fractional library routines. |
| (line 938) |
| * __fracthiqq: Fixed-point fractional library routines. |
| (line 937) |
| * __fracthisa: Fixed-point fractional library routines. |
| (line 942) |
| * __fracthisq: Fixed-point fractional library routines. |
| (line 939) |
| * __fracthita: Fixed-point fractional library routines. |
| (line 944) |
| * __fracthiuda: Fixed-point fractional library routines. |
| (line 951) |
| * __fracthiudq: Fixed-point fractional library routines. |
| (line 948) |
| * __fracthiuha: Fixed-point fractional library routines. |
| (line 949) |
| * __fracthiuhq: Fixed-point fractional library routines. |
| (line 946) |
| * __fracthiuqq: Fixed-point fractional library routines. |
| (line 945) |
| * __fracthiusa: Fixed-point fractional library routines. |
| (line 950) |
| * __fracthiusq: Fixed-point fractional library routines. |
| (line 947) |
| * __fracthiuta: Fixed-point fractional library routines. |
| (line 952) |
| * __fracthqda: Fixed-point fractional library routines. |
| (line 498) |
| * __fracthqdf: Fixed-point fractional library routines. |
| (line 514) |
| * __fracthqdi: Fixed-point fractional library routines. |
| (line 511) |
| * __fracthqdq2: Fixed-point fractional library routines. |
| (line 495) |
| * __fracthqha: Fixed-point fractional library routines. |
| (line 496) |
| * __fracthqhi: Fixed-point fractional library routines. |
| (line 509) |
| * __fracthqqi: Fixed-point fractional library routines. |
| (line 508) |
| * __fracthqqq2: Fixed-point fractional library routines. |
| (line 493) |
| * __fracthqsa: Fixed-point fractional library routines. |
| (line 497) |
| * __fracthqsf: Fixed-point fractional library routines. |
| (line 513) |
| * __fracthqsi: Fixed-point fractional library routines. |
| (line 510) |
| * __fracthqsq2: Fixed-point fractional library routines. |
| (line 494) |
| * __fracthqta: Fixed-point fractional library routines. |
| (line 499) |
| * __fracthqti: Fixed-point fractional library routines. |
| (line 512) |
| * __fracthquda: Fixed-point fractional library routines. |
| (line 506) |
| * __fracthqudq: Fixed-point fractional library routines. |
| (line 503) |
| * __fracthquha: Fixed-point fractional library routines. |
| (line 504) |
| * __fracthquhq: Fixed-point fractional library routines. |
| (line 501) |
| * __fracthquqq: Fixed-point fractional library routines. |
| (line 500) |
| * __fracthqusa: Fixed-point fractional library routines. |
| (line 505) |
| * __fracthqusq: Fixed-point fractional library routines. |
| (line 502) |
| * __fracthquta: Fixed-point fractional library routines. |
| (line 507) |
| * __fractqida: Fixed-point fractional library routines. |
| (line 925) |
| * __fractqidq: Fixed-point fractional library routines. |
| (line 922) |
| * __fractqiha: Fixed-point fractional library routines. |
| (line 923) |
| * __fractqihq: Fixed-point fractional library routines. |
| (line 920) |
| * __fractqiqq: Fixed-point fractional library routines. |
| (line 919) |
| * __fractqisa: Fixed-point fractional library routines. |
| (line 924) |
| * __fractqisq: Fixed-point fractional library routines. |
| (line 921) |
| * __fractqita: Fixed-point fractional library routines. |
| (line 926) |
| * __fractqiuda: Fixed-point fractional library routines. |
| (line 934) |
| * __fractqiudq: Fixed-point fractional library routines. |
| (line 931) |
| * __fractqiuha: Fixed-point fractional library routines. |
| (line 932) |
| * __fractqiuhq: Fixed-point fractional library routines. |
| (line 928) |
| * __fractqiuqq: Fixed-point fractional library routines. |
| (line 927) |
| * __fractqiusa: Fixed-point fractional library routines. |
| (line 933) |
| * __fractqiusq: Fixed-point fractional library routines. |
| (line 929) |
| * __fractqiuta: Fixed-point fractional library routines. |
| (line 936) |
| * __fractqqda: Fixed-point fractional library routines. |
| (line 474) |
| * __fractqqdf: Fixed-point fractional library routines. |
| (line 492) |
| * __fractqqdi: Fixed-point fractional library routines. |
| (line 489) |
| * __fractqqdq2: Fixed-point fractional library routines. |
| (line 471) |
| * __fractqqha: Fixed-point fractional library routines. |
| (line 472) |
| * __fractqqhi: Fixed-point fractional library routines. |
| (line 487) |
| * __fractqqhq2: Fixed-point fractional library routines. |
| (line 469) |
| * __fractqqqi: Fixed-point fractional library routines. |
| (line 486) |
| * __fractqqsa: Fixed-point fractional library routines. |
| (line 473) |
| * __fractqqsf: Fixed-point fractional library routines. |
| (line 491) |
| * __fractqqsi: Fixed-point fractional library routines. |
| (line 488) |
| * __fractqqsq2: Fixed-point fractional library routines. |
| (line 470) |
| * __fractqqta: Fixed-point fractional library routines. |
| (line 475) |
| * __fractqqti: Fixed-point fractional library routines. |
| (line 490) |
| * __fractqquda: Fixed-point fractional library routines. |
| (line 483) |
| * __fractqqudq: Fixed-point fractional library routines. |
| (line 480) |
| * __fractqquha: Fixed-point fractional library routines. |
| (line 481) |
| * __fractqquhq: Fixed-point fractional library routines. |
| (line 477) |
| * __fractqquqq: Fixed-point fractional library routines. |
| (line 476) |
| * __fractqqusa: Fixed-point fractional library routines. |
| (line 482) |
| * __fractqqusq: Fixed-point fractional library routines. |
| (line 478) |
| * __fractqquta: Fixed-point fractional library routines. |
| (line 485) |
| * __fractsada2: Fixed-point fractional library routines. |
| (line 596) |
| * __fractsadf: Fixed-point fractional library routines. |
| (line 612) |
| * __fractsadi: Fixed-point fractional library routines. |
| (line 609) |
| * __fractsadq: Fixed-point fractional library routines. |
| (line 594) |
| * __fractsaha2: Fixed-point fractional library routines. |
| (line 595) |
| * __fractsahi: Fixed-point fractional library routines. |
| (line 607) |
| * __fractsahq: Fixed-point fractional library routines. |
| (line 592) |
| * __fractsaqi: Fixed-point fractional library routines. |
| (line 606) |
| * __fractsaqq: Fixed-point fractional library routines. |
| (line 591) |
| * __fractsasf: Fixed-point fractional library routines. |
| (line 611) |
| * __fractsasi: Fixed-point fractional library routines. |
| (line 608) |
| * __fractsasq: Fixed-point fractional library routines. |
| (line 593) |
| * __fractsata2: Fixed-point fractional library routines. |
| (line 597) |
| * __fractsati: Fixed-point fractional library routines. |
| (line 610) |
| * __fractsauda: Fixed-point fractional library routines. |
| (line 604) |
| * __fractsaudq: Fixed-point fractional library routines. |
| (line 601) |
| * __fractsauha: Fixed-point fractional library routines. |
| (line 602) |
| * __fractsauhq: Fixed-point fractional library routines. |
| (line 599) |
| * __fractsauqq: Fixed-point fractional library routines. |
| (line 598) |
| * __fractsausa: Fixed-point fractional library routines. |
| (line 603) |
| * __fractsausq: Fixed-point fractional library routines. |
| (line 600) |
| * __fractsauta: Fixed-point fractional library routines. |
| (line 605) |
| * __fractsfda: Fixed-point fractional library routines. |
| (line 1009) |
| * __fractsfdq: Fixed-point fractional library routines. |
| (line 1006) |
| * __fractsfha: Fixed-point fractional library routines. |
| (line 1007) |
| * __fractsfhq: Fixed-point fractional library routines. |
| (line 1004) |
| * __fractsfqq: Fixed-point fractional library routines. |
| (line 1003) |
| * __fractsfsa: Fixed-point fractional library routines. |
| (line 1008) |
| * __fractsfsq: Fixed-point fractional library routines. |
| (line 1005) |
| * __fractsfta: Fixed-point fractional library routines. |
| (line 1010) |
| * __fractsfuda: Fixed-point fractional library routines. |
| (line 1017) |
| * __fractsfudq: Fixed-point fractional library routines. |
| (line 1014) |
| * __fractsfuha: Fixed-point fractional library routines. |
| (line 1015) |
| * __fractsfuhq: Fixed-point fractional library routines. |
| (line 1012) |
| * __fractsfuqq: Fixed-point fractional library routines. |
| (line 1011) |
| * __fractsfusa: Fixed-point fractional library routines. |
| (line 1016) |
| * __fractsfusq: Fixed-point fractional library routines. |
| (line 1013) |
| * __fractsfuta: Fixed-point fractional library routines. |
| (line 1018) |
| * __fractsida: Fixed-point fractional library routines. |
| (line 959) |
| * __fractsidq: Fixed-point fractional library routines. |
| (line 956) |
| * __fractsiha: Fixed-point fractional library routines. |
| (line 957) |
| * __fractsihq: Fixed-point fractional library routines. |
| (line 954) |
| * __fractsiqq: Fixed-point fractional library routines. |
| (line 953) |
| * __fractsisa: Fixed-point fractional library routines. |
| (line 958) |
| * __fractsisq: Fixed-point fractional library routines. |
| (line 955) |
| * __fractsita: Fixed-point fractional library routines. |
| (line 960) |
| * __fractsiuda: Fixed-point fractional library routines. |
| (line 967) |
| * __fractsiudq: Fixed-point fractional library routines. |
| (line 964) |
| * __fractsiuha: Fixed-point fractional library routines. |
| (line 965) |
| * __fractsiuhq: Fixed-point fractional library routines. |
| (line 962) |
| * __fractsiuqq: Fixed-point fractional library routines. |
| (line 961) |
| * __fractsiusa: Fixed-point fractional library routines. |
| (line 966) |
| * __fractsiusq: Fixed-point fractional library routines. |
| (line 963) |
| * __fractsiuta: Fixed-point fractional library routines. |
| (line 968) |
| * __fractsqda: Fixed-point fractional library routines. |
| (line 520) |
| * __fractsqdf: Fixed-point fractional library routines. |
| (line 538) |
| * __fractsqdi: Fixed-point fractional library routines. |
| (line 535) |
| * __fractsqdq2: Fixed-point fractional library routines. |
| (line 517) |
| * __fractsqha: Fixed-point fractional library routines. |
| (line 518) |
| * __fractsqhi: Fixed-point fractional library routines. |
| (line 533) |
| * __fractsqhq2: Fixed-point fractional library routines. |
| (line 516) |
| * __fractsqqi: Fixed-point fractional library routines. |
| (line 532) |
| * __fractsqqq2: Fixed-point fractional library routines. |
| (line 515) |
| * __fractsqsa: Fixed-point fractional library routines. |
| (line 519) |
| * __fractsqsf: Fixed-point fractional library routines. |
| (line 537) |
| * __fractsqsi: Fixed-point fractional library routines. |
| (line 534) |
| * __fractsqta: Fixed-point fractional library routines. |
| (line 521) |
| * __fractsqti: Fixed-point fractional library routines. |
| (line 536) |
| * __fractsquda: Fixed-point fractional library routines. |
| (line 529) |
| * __fractsqudq: Fixed-point fractional library routines. |
| (line 526) |
| * __fractsquha: Fixed-point fractional library routines. |
| (line 527) |
| * __fractsquhq: Fixed-point fractional library routines. |
| (line 523) |
| * __fractsquqq: Fixed-point fractional library routines. |
| (line 522) |
| * __fractsqusa: Fixed-point fractional library routines. |
| (line 528) |
| * __fractsqusq: Fixed-point fractional library routines. |
| (line 524) |
| * __fractsquta: Fixed-point fractional library routines. |
| (line 531) |
| * __fracttada2: Fixed-point fractional library routines. |
| (line 643) |
| * __fracttadf: Fixed-point fractional library routines. |
| (line 664) |
| * __fracttadi: Fixed-point fractional library routines. |
| (line 661) |
| * __fracttadq: Fixed-point fractional library routines. |
| (line 640) |
| * __fracttaha2: Fixed-point fractional library routines. |
| (line 641) |
| * __fracttahi: Fixed-point fractional library routines. |
| (line 659) |
| * __fracttahq: Fixed-point fractional library routines. |
| (line 638) |
| * __fracttaqi: Fixed-point fractional library routines. |
| (line 658) |
| * __fracttaqq: Fixed-point fractional library routines. |
| (line 637) |
| * __fracttasa2: Fixed-point fractional library routines. |
| (line 642) |
| * __fracttasf: Fixed-point fractional library routines. |
| (line 663) |
| * __fracttasi: Fixed-point fractional library routines. |
| (line 660) |
| * __fracttasq: Fixed-point fractional library routines. |
| (line 639) |
| * __fracttati: Fixed-point fractional library routines. |
| (line 662) |
| * __fracttauda: Fixed-point fractional library routines. |
| (line 655) |
| * __fracttaudq: Fixed-point fractional library routines. |
| (line 650) |
| * __fracttauha: Fixed-point fractional library routines. |
| (line 652) |
| * __fracttauhq: Fixed-point fractional library routines. |
| (line 646) |
| * __fracttauqq: Fixed-point fractional library routines. |
| (line 645) |
| * __fracttausa: Fixed-point fractional library routines. |
| (line 653) |
| * __fracttausq: Fixed-point fractional library routines. |
| (line 648) |
| * __fracttauta: Fixed-point fractional library routines. |
| (line 657) |
| * __fracttida: Fixed-point fractional library routines. |
| (line 991) |
| * __fracttidq: Fixed-point fractional library routines. |
| (line 988) |
| * __fracttiha: Fixed-point fractional library routines. |
| (line 989) |
| * __fracttihq: Fixed-point fractional library routines. |
| (line 986) |
| * __fracttiqq: Fixed-point fractional library routines. |
| (line 985) |
| * __fracttisa: Fixed-point fractional library routines. |
| (line 990) |
| * __fracttisq: Fixed-point fractional library routines. |
| (line 987) |
| * __fracttita: Fixed-point fractional library routines. |
| (line 992) |
| * __fracttiuda: Fixed-point fractional library routines. |
| (line 1000) |
| * __fracttiudq: Fixed-point fractional library routines. |
| (line 997) |
| * __fracttiuha: Fixed-point fractional library routines. |
| (line 998) |
| * __fracttiuhq: Fixed-point fractional library routines. |
| (line 994) |
| * __fracttiuqq: Fixed-point fractional library routines. |
| (line 993) |
| * __fracttiusa: Fixed-point fractional library routines. |
| (line 999) |
| * __fracttiusq: Fixed-point fractional library routines. |
| (line 995) |
| * __fracttiuta: Fixed-point fractional library routines. |
| (line 1002) |
| * __fractudada: Fixed-point fractional library routines. |
| (line 858) |
| * __fractudadf: Fixed-point fractional library routines. |
| (line 881) |
| * __fractudadi: Fixed-point fractional library routines. |
| (line 878) |
| * __fractudadq: Fixed-point fractional library routines. |
| (line 855) |
| * __fractudaha: Fixed-point fractional library routines. |
| (line 856) |
| * __fractudahi: Fixed-point fractional library routines. |
| (line 876) |
| * __fractudahq: Fixed-point fractional library routines. |
| (line 852) |
| * __fractudaqi: Fixed-point fractional library routines. |
| (line 875) |
| * __fractudaqq: Fixed-point fractional library routines. |
| (line 851) |
| * __fractudasa: Fixed-point fractional library routines. |
| (line 857) |
| * __fractudasf: Fixed-point fractional library routines. |
| (line 880) |
| * __fractudasi: Fixed-point fractional library routines. |
| (line 877) |
| * __fractudasq: Fixed-point fractional library routines. |
| (line 853) |
| * __fractudata: Fixed-point fractional library routines. |
| (line 860) |
| * __fractudati: Fixed-point fractional library routines. |
| (line 879) |
| * __fractudaudq: Fixed-point fractional library routines. |
| (line 868) |
| * __fractudauha2: Fixed-point fractional library routines. |
| (line 870) |
| * __fractudauhq: Fixed-point fractional library routines. |
| (line 864) |
| * __fractudauqq: Fixed-point fractional library routines. |
| (line 862) |
| * __fractudausa2: Fixed-point fractional library routines. |
| (line 872) |
| * __fractudausq: Fixed-point fractional library routines. |
| (line 866) |
| * __fractudauta2: Fixed-point fractional library routines. |
| (line 874) |
| * __fractudqda: Fixed-point fractional library routines. |
| (line 766) |
| * __fractudqdf: Fixed-point fractional library routines. |
| (line 791) |
| * __fractudqdi: Fixed-point fractional library routines. |
| (line 787) |
| * __fractudqdq: Fixed-point fractional library routines. |
| (line 761) |
| * __fractudqha: Fixed-point fractional library routines. |
| (line 763) |
| * __fractudqhi: Fixed-point fractional library routines. |
| (line 785) |
| * __fractudqhq: Fixed-point fractional library routines. |
| (line 757) |
| * __fractudqqi: Fixed-point fractional library routines. |
| (line 784) |
| * __fractudqqq: Fixed-point fractional library routines. |
| (line 756) |
| * __fractudqsa: Fixed-point fractional library routines. |
| (line 764) |
| * __fractudqsf: Fixed-point fractional library routines. |
| (line 790) |
| * __fractudqsi: Fixed-point fractional library routines. |
| (line 786) |
| * __fractudqsq: Fixed-point fractional library routines. |
| (line 759) |
| * __fractudqta: Fixed-point fractional library routines. |
| (line 768) |
| * __fractudqti: Fixed-point fractional library routines. |
| (line 789) |
| * __fractudquda: Fixed-point fractional library routines. |
| (line 780) |
| * __fractudquha: Fixed-point fractional library routines. |
| (line 776) |
| * __fractudquhq2: Fixed-point fractional library routines. |
| (line 772) |
| * __fractudquqq2: Fixed-point fractional library routines. |
| (line 770) |
| * __fractudqusa: Fixed-point fractional library routines. |
| (line 778) |
| * __fractudqusq2: Fixed-point fractional library routines. |
| (line 774) |
| * __fractudquta: Fixed-point fractional library routines. |
| (line 782) |
| * __fractuhada: Fixed-point fractional library routines. |
| (line 799) |
| * __fractuhadf: Fixed-point fractional library routines. |
| (line 822) |
| * __fractuhadi: Fixed-point fractional library routines. |
| (line 819) |
| * __fractuhadq: Fixed-point fractional library routines. |
| (line 796) |
| * __fractuhaha: Fixed-point fractional library routines. |
| (line 797) |
| * __fractuhahi: Fixed-point fractional library routines. |
| (line 817) |
| * __fractuhahq: Fixed-point fractional library routines. |
| (line 793) |
| * __fractuhaqi: Fixed-point fractional library routines. |
| (line 816) |
| * __fractuhaqq: Fixed-point fractional library routines. |
| (line 792) |
| * __fractuhasa: Fixed-point fractional library routines. |
| (line 798) |
| * __fractuhasf: Fixed-point fractional library routines. |
| (line 821) |
| * __fractuhasi: Fixed-point fractional library routines. |
| (line 818) |
| * __fractuhasq: Fixed-point fractional library routines. |
| (line 794) |
| * __fractuhata: Fixed-point fractional library routines. |
| (line 801) |
| * __fractuhati: Fixed-point fractional library routines. |
| (line 820) |
| * __fractuhauda2: Fixed-point fractional library routines. |
| (line 813) |
| * __fractuhaudq: Fixed-point fractional library routines. |
| (line 809) |
| * __fractuhauhq: Fixed-point fractional library routines. |
| (line 805) |
| * __fractuhauqq: Fixed-point fractional library routines. |
| (line 803) |
| * __fractuhausa2: Fixed-point fractional library routines. |
| (line 811) |
| * __fractuhausq: Fixed-point fractional library routines. |
| (line 807) |
| * __fractuhauta2: Fixed-point fractional library routines. |
| (line 815) |
| * __fractuhqda: Fixed-point fractional library routines. |
| (line 702) |
| * __fractuhqdf: Fixed-point fractional library routines. |
| (line 723) |
| * __fractuhqdi: Fixed-point fractional library routines. |
| (line 720) |
| * __fractuhqdq: Fixed-point fractional library routines. |
| (line 699) |
| * __fractuhqha: Fixed-point fractional library routines. |
| (line 700) |
| * __fractuhqhi: Fixed-point fractional library routines. |
| (line 718) |
| * __fractuhqhq: Fixed-point fractional library routines. |
| (line 697) |
| * __fractuhqqi: Fixed-point fractional library routines. |
| (line 717) |
| * __fractuhqqq: Fixed-point fractional library routines. |
| (line 696) |
| * __fractuhqsa: Fixed-point fractional library routines. |
| (line 701) |
| * __fractuhqsf: Fixed-point fractional library routines. |
| (line 722) |
| * __fractuhqsi: Fixed-point fractional library routines. |
| (line 719) |
| * __fractuhqsq: Fixed-point fractional library routines. |
| (line 698) |
| * __fractuhqta: Fixed-point fractional library routines. |
| (line 703) |
| * __fractuhqti: Fixed-point fractional library routines. |
| (line 721) |
| * __fractuhquda: Fixed-point fractional library routines. |
| (line 714) |
| * __fractuhqudq2: Fixed-point fractional library routines. |
| (line 709) |
| * __fractuhquha: Fixed-point fractional library routines. |
| (line 711) |
| * __fractuhquqq2: Fixed-point fractional library routines. |
| (line 705) |
| * __fractuhqusa: Fixed-point fractional library routines. |
| (line 712) |
| * __fractuhqusq2: Fixed-point fractional library routines. |
| (line 707) |
| * __fractuhquta: Fixed-point fractional library routines. |
| (line 716) |
| * __fractunsdadi: Fixed-point fractional library routines. |
| (line 1555) |
| * __fractunsdahi: Fixed-point fractional library routines. |
| (line 1553) |
| * __fractunsdaqi: Fixed-point fractional library routines. |
| (line 1552) |
| * __fractunsdasi: Fixed-point fractional library routines. |
| (line 1554) |
| * __fractunsdati: Fixed-point fractional library routines. |
| (line 1556) |
| * __fractunsdida: Fixed-point fractional library routines. |
| (line 1707) |
| * __fractunsdidq: Fixed-point fractional library routines. |
| (line 1704) |
| * __fractunsdiha: Fixed-point fractional library routines. |
| (line 1705) |
| * __fractunsdihq: Fixed-point fractional library routines. |
| (line 1702) |
| * __fractunsdiqq: Fixed-point fractional library routines. |
| (line 1701) |
| * __fractunsdisa: Fixed-point fractional library routines. |
| (line 1706) |
| * __fractunsdisq: Fixed-point fractional library routines. |
| (line 1703) |
| * __fractunsdita: Fixed-point fractional library routines. |
| (line 1708) |
| * __fractunsdiuda: Fixed-point fractional library routines. |
| (line 1720) |
| * __fractunsdiudq: Fixed-point fractional library routines. |
| (line 1715) |
| * __fractunsdiuha: Fixed-point fractional library routines. |
| (line 1717) |
| * __fractunsdiuhq: Fixed-point fractional library routines. |
| (line 1711) |
| * __fractunsdiuqq: Fixed-point fractional library routines. |
| (line 1710) |
| * __fractunsdiusa: Fixed-point fractional library routines. |
| (line 1718) |
| * __fractunsdiusq: Fixed-point fractional library routines. |
| (line 1713) |
| * __fractunsdiuta: Fixed-point fractional library routines. |
| (line 1722) |
| * __fractunsdqdi: Fixed-point fractional library routines. |
| (line 1539) |
| * __fractunsdqhi: Fixed-point fractional library routines. |
| (line 1537) |
| * __fractunsdqqi: Fixed-point fractional library routines. |
| (line 1536) |
| * __fractunsdqsi: Fixed-point fractional library routines. |
| (line 1538) |
| * __fractunsdqti: Fixed-point fractional library routines. |
| (line 1541) |
| * __fractunshadi: Fixed-point fractional library routines. |
| (line 1545) |
| * __fractunshahi: Fixed-point fractional library routines. |
| (line 1543) |
| * __fractunshaqi: Fixed-point fractional library routines. |
| (line 1542) |
| * __fractunshasi: Fixed-point fractional library routines. |
| (line 1544) |
| * __fractunshati: Fixed-point fractional library routines. |
| (line 1546) |
| * __fractunshida: Fixed-point fractional library routines. |
| (line 1663) |
| * __fractunshidq: Fixed-point fractional library routines. |
| (line 1660) |
| * __fractunshiha: Fixed-point fractional library routines. |
| (line 1661) |
| * __fractunshihq: Fixed-point fractional library routines. |
| (line 1658) |
| * __fractunshiqq: Fixed-point fractional library routines. |
| (line 1657) |
| * __fractunshisa: Fixed-point fractional library routines. |
| (line 1662) |
| * __fractunshisq: Fixed-point fractional library routines. |
| (line 1659) |
| * __fractunshita: Fixed-point fractional library routines. |
| (line 1664) |
| * __fractunshiuda: Fixed-point fractional library routines. |
| (line 1676) |
| * __fractunshiudq: Fixed-point fractional library routines. |
| (line 1671) |
| * __fractunshiuha: Fixed-point fractional library routines. |
| (line 1673) |
| * __fractunshiuhq: Fixed-point fractional library routines. |
| (line 1667) |
| * __fractunshiuqq: Fixed-point fractional library routines. |
| (line 1666) |
| * __fractunshiusa: Fixed-point fractional library routines. |
| (line 1674) |
| * __fractunshiusq: Fixed-point fractional library routines. |
| (line 1669) |
| * __fractunshiuta: Fixed-point fractional library routines. |
| (line 1678) |
| * __fractunshqdi: Fixed-point fractional library routines. |
| (line 1529) |
| * __fractunshqhi: Fixed-point fractional library routines. |
| (line 1527) |
| * __fractunshqqi: Fixed-point fractional library routines. |
| (line 1526) |
| * __fractunshqsi: Fixed-point fractional library routines. |
| (line 1528) |
| * __fractunshqti: Fixed-point fractional library routines. |
| (line 1530) |
| * __fractunsqida: Fixed-point fractional library routines. |
| (line 1641) |
| * __fractunsqidq: Fixed-point fractional library routines. |
| (line 1638) |
| * __fractunsqiha: Fixed-point fractional library routines. |
| (line 1639) |
| * __fractunsqihq: Fixed-point fractional library routines. |
| (line 1636) |
| * __fractunsqiqq: Fixed-point fractional library routines. |
| (line 1635) |
| * __fractunsqisa: Fixed-point fractional library routines. |
| (line 1640) |
| * __fractunsqisq: Fixed-point fractional library routines. |
| (line 1637) |
| * __fractunsqita: Fixed-point fractional library routines. |
| (line 1642) |
| * __fractunsqiuda: Fixed-point fractional library routines. |
| (line 1654) |
| * __fractunsqiudq: Fixed-point fractional library routines. |
| (line 1649) |
| * __fractunsqiuha: Fixed-point fractional library routines. |
| (line 1651) |
| * __fractunsqiuhq: Fixed-point fractional library routines. |
| (line 1645) |
| * __fractunsqiuqq: Fixed-point fractional library routines. |
| (line 1644) |
| * __fractunsqiusa: Fixed-point fractional library routines. |
| (line 1652) |
| * __fractunsqiusq: Fixed-point fractional library routines. |
| (line 1647) |
| * __fractunsqiuta: Fixed-point fractional library routines. |
| (line 1656) |
| * __fractunsqqdi: Fixed-point fractional library routines. |
| (line 1524) |
| * __fractunsqqhi: Fixed-point fractional library routines. |
| (line 1522) |
| * __fractunsqqqi: Fixed-point fractional library routines. |
| (line 1521) |
| * __fractunsqqsi: Fixed-point fractional library routines. |
| (line 1523) |
| * __fractunsqqti: Fixed-point fractional library routines. |
| (line 1525) |
| * __fractunssadi: Fixed-point fractional library routines. |
| (line 1550) |
| * __fractunssahi: Fixed-point fractional library routines. |
| (line 1548) |
| * __fractunssaqi: Fixed-point fractional library routines. |
| (line 1547) |
| * __fractunssasi: Fixed-point fractional library routines. |
| (line 1549) |
| * __fractunssati: Fixed-point fractional library routines. |
| (line 1551) |
| * __fractunssida: Fixed-point fractional library routines. |
| (line 1685) |
| * __fractunssidq: Fixed-point fractional library routines. |
| (line 1682) |
| * __fractunssiha: Fixed-point fractional library routines. |
| (line 1683) |
| * __fractunssihq: Fixed-point fractional library routines. |
| (line 1680) |
| * __fractunssiqq: Fixed-point fractional library routines. |
| (line 1679) |
| * __fractunssisa: Fixed-point fractional library routines. |
| (line 1684) |
| * __fractunssisq: Fixed-point fractional library routines. |
| (line 1681) |
| * __fractunssita: Fixed-point fractional library routines. |
| (line 1686) |
| * __fractunssiuda: Fixed-point fractional library routines. |
| (line 1698) |
| * __fractunssiudq: Fixed-point fractional library routines. |
| (line 1693) |
| * __fractunssiuha: Fixed-point fractional library routines. |
| (line 1695) |
| * __fractunssiuhq: Fixed-point fractional library routines. |
| (line 1689) |
| * __fractunssiuqq: Fixed-point fractional library routines. |
| (line 1688) |
| * __fractunssiusa: Fixed-point fractional library routines. |
| (line 1696) |
| * __fractunssiusq: Fixed-point fractional library routines. |
| (line 1691) |
| * __fractunssiuta: Fixed-point fractional library routines. |
| (line 1700) |
| * __fractunssqdi: Fixed-point fractional library routines. |
| (line 1534) |
| * __fractunssqhi: Fixed-point fractional library routines. |
| (line 1532) |
| * __fractunssqqi: Fixed-point fractional library routines. |
| (line 1531) |
| * __fractunssqsi: Fixed-point fractional library routines. |
| (line 1533) |
| * __fractunssqti: Fixed-point fractional library routines. |
| (line 1535) |
| * __fractunstadi: Fixed-point fractional library routines. |
| (line 1560) |
| * __fractunstahi: Fixed-point fractional library routines. |
| (line 1558) |
| * __fractunstaqi: Fixed-point fractional library routines. |
| (line 1557) |
| * __fractunstasi: Fixed-point fractional library routines. |
| (line 1559) |
| * __fractunstati: Fixed-point fractional library routines. |
| (line 1562) |
| * __fractunstida: Fixed-point fractional library routines. |
| (line 1730) |
| * __fractunstidq: Fixed-point fractional library routines. |
| (line 1727) |
| * __fractunstiha: Fixed-point fractional library routines. |
| (line 1728) |
| * __fractunstihq: Fixed-point fractional library routines. |
| (line 1724) |
| * __fractunstiqq: Fixed-point fractional library routines. |
| (line 1723) |
| * __fractunstisa: Fixed-point fractional library routines. |
| (line 1729) |
| * __fractunstisq: Fixed-point fractional library routines. |
| (line 1725) |
| * __fractunstita: Fixed-point fractional library routines. |
| (line 1732) |
| * __fractunstiuda: Fixed-point fractional library routines. |
| (line 1746) |
| * __fractunstiudq: Fixed-point fractional library routines. |
| (line 1740) |
| * __fractunstiuha: Fixed-point fractional library routines. |
| (line 1742) |
| * __fractunstiuhq: Fixed-point fractional library routines. |
| (line 1736) |
| * __fractunstiuqq: Fixed-point fractional library routines. |
| (line 1734) |
| * __fractunstiusa: Fixed-point fractional library routines. |
| (line 1744) |
| * __fractunstiusq: Fixed-point fractional library routines. |
| (line 1738) |
| * __fractunstiuta: Fixed-point fractional library routines. |
| (line 1748) |
| * __fractunsudadi: Fixed-point fractional library routines. |
| (line 1622) |
| * __fractunsudahi: Fixed-point fractional library routines. |
| (line 1618) |
| * __fractunsudaqi: Fixed-point fractional library routines. |
| (line 1616) |
| * __fractunsudasi: Fixed-point fractional library routines. |
| (line 1620) |
| * __fractunsudati: Fixed-point fractional library routines. |
| (line 1624) |
| * __fractunsudqdi: Fixed-point fractional library routines. |
| (line 1596) |
| * __fractunsudqhi: Fixed-point fractional library routines. |
| (line 1592) |
| * __fractunsudqqi: Fixed-point fractional library routines. |
| (line 1590) |
| * __fractunsudqsi: Fixed-point fractional library routines. |
| (line 1594) |
| * __fractunsudqti: Fixed-point fractional library routines. |
| (line 1598) |
| * __fractunsuhadi: Fixed-point fractional library routines. |
| (line 1606) |
| * __fractunsuhahi: Fixed-point fractional library routines. |
| (line 1602) |
| * __fractunsuhaqi: Fixed-point fractional library routines. |
| (line 1600) |
| * __fractunsuhasi: Fixed-point fractional library routines. |
| (line 1604) |
| * __fractunsuhati: Fixed-point fractional library routines. |
| (line 1608) |
| * __fractunsuhqdi: Fixed-point fractional library routines. |
| (line 1576) |
| * __fractunsuhqhi: Fixed-point fractional library routines. |
| (line 1574) |
| * __fractunsuhqqi: Fixed-point fractional library routines. |
| (line 1573) |
| * __fractunsuhqsi: Fixed-point fractional library routines. |
| (line 1575) |
| * __fractunsuhqti: Fixed-point fractional library routines. |
| (line 1578) |
| * __fractunsuqqdi: Fixed-point fractional library routines. |
| (line 1570) |
| * __fractunsuqqhi: Fixed-point fractional library routines. |
| (line 1566) |
| * __fractunsuqqqi: Fixed-point fractional library routines. |
| (line 1564) |
| * __fractunsuqqsi: Fixed-point fractional library routines. |
| (line 1568) |
| * __fractunsuqqti: Fixed-point fractional library routines. |
| (line 1572) |
| * __fractunsusadi: Fixed-point fractional library routines. |
| (line 1612) |
| * __fractunsusahi: Fixed-point fractional library routines. |
| (line 1610) |
| * __fractunsusaqi: Fixed-point fractional library routines. |
| (line 1609) |
| * __fractunsusasi: Fixed-point fractional library routines. |
| (line 1611) |
| * __fractunsusati: Fixed-point fractional library routines. |
| (line 1614) |
| * __fractunsusqdi: Fixed-point fractional library routines. |
| (line 1586) |
| * __fractunsusqhi: Fixed-point fractional library routines. |
| (line 1582) |
| * __fractunsusqqi: Fixed-point fractional library routines. |
| (line 1580) |
| * __fractunsusqsi: Fixed-point fractional library routines. |
| (line 1584) |
| * __fractunsusqti: Fixed-point fractional library routines. |
| (line 1588) |
| * __fractunsutadi: Fixed-point fractional library routines. |
| (line 1632) |
| * __fractunsutahi: Fixed-point fractional library routines. |
| (line 1628) |
| * __fractunsutaqi: Fixed-point fractional library routines. |
| (line 1626) |
| * __fractunsutasi: Fixed-point fractional library routines. |
| (line 1630) |
| * __fractunsutati: Fixed-point fractional library routines. |
| (line 1634) |
| * __fractuqqda: Fixed-point fractional library routines. |
| (line 672) |
| * __fractuqqdf: Fixed-point fractional library routines. |
| (line 695) |
| * __fractuqqdi: Fixed-point fractional library routines. |
| (line 692) |
| * __fractuqqdq: Fixed-point fractional library routines. |
| (line 669) |
| * __fractuqqha: Fixed-point fractional library routines. |
| (line 670) |
| * __fractuqqhi: Fixed-point fractional library routines. |
| (line 690) |
| * __fractuqqhq: Fixed-point fractional library routines. |
| (line 666) |
| * __fractuqqqi: Fixed-point fractional library routines. |
| (line 689) |
| * __fractuqqqq: Fixed-point fractional library routines. |
| (line 665) |
| * __fractuqqsa: Fixed-point fractional library routines. |
| (line 671) |
| * __fractuqqsf: Fixed-point fractional library routines. |
| (line 694) |
| * __fractuqqsi: Fixed-point fractional library routines. |
| (line 691) |
| * __fractuqqsq: Fixed-point fractional library routines. |
| (line 667) |
| * __fractuqqta: Fixed-point fractional library routines. |
| (line 674) |
| * __fractuqqti: Fixed-point fractional library routines. |
| (line 693) |
| * __fractuqquda: Fixed-point fractional library routines. |
| (line 686) |
| * __fractuqqudq2: Fixed-point fractional library routines. |
| (line 680) |
| * __fractuqquha: Fixed-point fractional library routines. |
| (line 682) |
| * __fractuqquhq2: Fixed-point fractional library routines. |
| (line 676) |
| * __fractuqqusa: Fixed-point fractional library routines. |
| (line 684) |
| * __fractuqqusq2: Fixed-point fractional library routines. |
| (line 678) |
| * __fractuqquta: Fixed-point fractional library routines. |
| (line 688) |
| * __fractusada: Fixed-point fractional library routines. |
| (line 829) |
| * __fractusadf: Fixed-point fractional library routines. |
| (line 850) |
| * __fractusadi: Fixed-point fractional library routines. |
| (line 847) |
| * __fractusadq: Fixed-point fractional library routines. |
| (line 826) |
| * __fractusaha: Fixed-point fractional library routines. |
| (line 827) |
| * __fractusahi: Fixed-point fractional library routines. |
| (line 845) |
| * __fractusahq: Fixed-point fractional library routines. |
| (line 824) |
| * __fractusaqi: Fixed-point fractional library routines. |
| (line 844) |
| * __fractusaqq: Fixed-point fractional library routines. |
| (line 823) |
| * __fractusasa: Fixed-point fractional library routines. |
| (line 828) |
| * __fractusasf: Fixed-point fractional library routines. |
| (line 849) |
| * __fractusasi: Fixed-point fractional library routines. |
| (line 846) |
| * __fractusasq: Fixed-point fractional library routines. |
| (line 825) |
| * __fractusata: Fixed-point fractional library routines. |
| (line 830) |
| * __fractusati: Fixed-point fractional library routines. |
| (line 848) |
| * __fractusauda2: Fixed-point fractional library routines. |
| (line 841) |
| * __fractusaudq: Fixed-point fractional library routines. |
| (line 837) |
| * __fractusauha2: Fixed-point fractional library routines. |
| (line 839) |
| * __fractusauhq: Fixed-point fractional library routines. |
| (line 833) |
| * __fractusauqq: Fixed-point fractional library routines. |
| (line 832) |
| * __fractusausq: Fixed-point fractional library routines. |
| (line 835) |
| * __fractusauta2: Fixed-point fractional library routines. |
| (line 843) |
| * __fractusqda: Fixed-point fractional library routines. |
| (line 731) |
| * __fractusqdf: Fixed-point fractional library routines. |
| (line 754) |
| * __fractusqdi: Fixed-point fractional library routines. |
| (line 751) |
| * __fractusqdq: Fixed-point fractional library routines. |
| (line 728) |
| * __fractusqha: Fixed-point fractional library routines. |
| (line 729) |
| * __fractusqhi: Fixed-point fractional library routines. |
| (line 749) |
| * __fractusqhq: Fixed-point fractional library routines. |
| (line 725) |
| * __fractusqqi: Fixed-point fractional library routines. |
| (line 748) |
| * __fractusqqq: Fixed-point fractional library routines. |
| (line 724) |
| * __fractusqsa: Fixed-point fractional library routines. |
| (line 730) |
| * __fractusqsf: Fixed-point fractional library routines. |
| (line 753) |
| * __fractusqsi: Fixed-point fractional library routines. |
| (line 750) |
| * __fractusqsq: Fixed-point fractional library routines. |
| (line 726) |
| * __fractusqta: Fixed-point fractional library routines. |
| (line 733) |
| * __fractusqti: Fixed-point fractional library routines. |
| (line 752) |
| * __fractusquda: Fixed-point fractional library routines. |
| (line 745) |
| * __fractusqudq2: Fixed-point fractional library routines. |
| (line 739) |
| * __fractusquha: Fixed-point fractional library routines. |
| (line 741) |
| * __fractusquhq2: Fixed-point fractional library routines. |
| (line 737) |
| * __fractusquqq2: Fixed-point fractional library routines. |
| (line 735) |
| * __fractusqusa: Fixed-point fractional library routines. |
| (line 743) |
| * __fractusquta: Fixed-point fractional library routines. |
| (line 747) |
| * __fractutada: Fixed-point fractional library routines. |
| (line 893) |
| * __fractutadf: Fixed-point fractional library routines. |
| (line 918) |
| * __fractutadi: Fixed-point fractional library routines. |
| (line 914) |
| * __fractutadq: Fixed-point fractional library routines. |
| (line 888) |
| * __fractutaha: Fixed-point fractional library routines. |
| (line 890) |
| * __fractutahi: Fixed-point fractional library routines. |
| (line 912) |
| * __fractutahq: Fixed-point fractional library routines. |
| (line 884) |
| * __fractutaqi: Fixed-point fractional library routines. |
| (line 911) |
| * __fractutaqq: Fixed-point fractional library routines. |
| (line 883) |
| * __fractutasa: Fixed-point fractional library routines. |
| (line 891) |
| * __fractutasf: Fixed-point fractional library routines. |
| (line 917) |
| * __fractutasi: Fixed-point fractional library routines. |
| (line 913) |
| * __fractutasq: Fixed-point fractional library routines. |
| (line 886) |
| * __fractutata: Fixed-point fractional library routines. |
| (line 895) |
| * __fractutati: Fixed-point fractional library routines. |
| (line 916) |
| * __fractutauda2: Fixed-point fractional library routines. |
| (line 909) |
| * __fractutaudq: Fixed-point fractional library routines. |
| (line 903) |
| * __fractutauha2: Fixed-point fractional library routines. |
| (line 905) |
| * __fractutauhq: Fixed-point fractional library routines. |
| (line 899) |
| * __fractutauqq: Fixed-point fractional library routines. |
| (line 897) |
| * __fractutausa2: Fixed-point fractional library routines. |
| (line 907) |
| * __fractutausq: Fixed-point fractional library routines. |
| (line 901) |
| * __gedf2: Soft float library routines. |
| (line 206) |
| * __gesf2: Soft float library routines. |
| (line 205) |
| * __getf2: Soft float library routines. |
| (line 207) |
| * __gtdf2: Soft float library routines. |
| (line 224) |
| * __gtsf2: Soft float library routines. |
| (line 223) |
| * __gttf2: Soft float library routines. |
| (line 225) |
| * __ledf2: Soft float library routines. |
| (line 218) |
| * __lesf2: Soft float library routines. |
| (line 217) |
| * __letf2: Soft float library routines. |
| (line 219) |
| * __lshrdi3: Integer library routines. |
| (line 31) |
| * __lshrsi3: Integer library routines. |
| (line 30) |
| * __lshrti3: Integer library routines. |
| (line 32) |
| * __lshruda3: Fixed-point fractional library routines. |
| (line 390) |
| * __lshrudq3: Fixed-point fractional library routines. |
| (line 384) |
| * __lshruha3: Fixed-point fractional library routines. |
| (line 386) |
| * __lshruhq3: Fixed-point fractional library routines. |
| (line 380) |
| * __lshruqq3: Fixed-point fractional library routines. |
| (line 378) |
| * __lshrusa3: Fixed-point fractional library routines. |
| (line 388) |
| * __lshrusq3: Fixed-point fractional library routines. |
| (line 382) |
| * __lshruta3: Fixed-point fractional library routines. |
| (line 392) |
| * __ltdf2: Soft float library routines. |
| (line 212) |
| * __ltsf2: Soft float library routines. |
| (line 211) |
| * __lttf2: Soft float library routines. |
| (line 213) |
| * __main: Collect2. (line 15) |
| * __moddi3: Integer library routines. |
| (line 37) |
| * __modsi3: Integer library routines. |
| (line 36) |
| * __modti3: Integer library routines. |
| (line 38) |
| * __mulda3: Fixed-point fractional library routines. |
| (line 171) |
| * __muldc3: Soft float library routines. |
| (line 241) |
| * __muldf3: Soft float library routines. |
| (line 40) |
| * __muldi3: Integer library routines. |
| (line 43) |
| * __muldq3: Fixed-point fractional library routines. |
| (line 159) |
| * __mulha3: Fixed-point fractional library routines. |
| (line 169) |
| * __mulhq3: Fixed-point fractional library routines. |
| (line 156) |
| * __mulqq3: Fixed-point fractional library routines. |
| (line 155) |
| * __mulsa3: Fixed-point fractional library routines. |
| (line 170) |
| * __mulsc3: Soft float library routines. |
| (line 239) |
| * __mulsf3: Soft float library routines. |
| (line 39) |
| * __mulsi3: Integer library routines. |
| (line 42) |
| * __mulsq3: Fixed-point fractional library routines. |
| (line 157) |
| * __multa3: Fixed-point fractional library routines. |
| (line 173) |
| * __multc3: Soft float library routines. |
| (line 243) |
| * __multf3: Soft float library routines. |
| (line 42) |
| * __multi3: Integer library routines. |
| (line 44) |
| * __muluda3: Fixed-point fractional library routines. |
| (line 179) |
| * __muludq3: Fixed-point fractional library routines. |
| (line 167) |
| * __muluha3: Fixed-point fractional library routines. |
| (line 175) |
| * __muluhq3: Fixed-point fractional library routines. |
| (line 163) |
| * __muluqq3: Fixed-point fractional library routines. |
| (line 161) |
| * __mulusa3: Fixed-point fractional library routines. |
| (line 177) |
| * __mulusq3: Fixed-point fractional library routines. |
| (line 165) |
| * __muluta3: Fixed-point fractional library routines. |
| (line 181) |
| * __mulvdi3: Integer library routines. |
| (line 115) |
| * __mulvsi3: Integer library routines. |
| (line 114) |
| * __mulxc3: Soft float library routines. |
| (line 245) |
| * __mulxf3: Soft float library routines. |
| (line 44) |
| * __nedf2: Soft float library routines. |
| (line 200) |
| * __negda2: Fixed-point fractional library routines. |
| (line 299) |
| * __negdf2: Soft float library routines. |
| (line 56) |
| * __negdi2: Integer library routines. |
| (line 47) |
| * __negdq2: Fixed-point fractional library routines. |
| (line 289) |
| * __negha2: Fixed-point fractional library routines. |
| (line 297) |
| * __neghq2: Fixed-point fractional library routines. |
| (line 287) |
| * __negqq2: Fixed-point fractional library routines. |
| (line 286) |
| * __negsa2: Fixed-point fractional library routines. |
| (line 298) |
| * __negsf2: Soft float library routines. |
| (line 55) |
| * __negsq2: Fixed-point fractional library routines. |
| (line 288) |
| * __negta2: Fixed-point fractional library routines. |
| (line 300) |
| * __negtf2: Soft float library routines. |
| (line 57) |
| * __negti2: Integer library routines. |
| (line 48) |
| * __neguda2: Fixed-point fractional library routines. |
| (line 305) |
| * __negudq2: Fixed-point fractional library routines. |
| (line 296) |
| * __neguha2: Fixed-point fractional library routines. |
| (line 302) |
| * __neguhq2: Fixed-point fractional library routines. |
| (line 292) |
| * __neguqq2: Fixed-point fractional library routines. |
| (line 291) |
| * __negusa2: Fixed-point fractional library routines. |
| (line 303) |
| * __negusq2: Fixed-point fractional library routines. |
| (line 294) |
| * __neguta2: Fixed-point fractional library routines. |
| (line 307) |
| * __negvdi2: Integer library routines. |
| (line 119) |
| * __negvsi2: Integer library routines. |
| (line 118) |
| * __negxf2: Soft float library routines. |
| (line 58) |
| * __nesf2: Soft float library routines. |
| (line 199) |
| * __netf2: Soft float library routines. |
| (line 201) |
| * __paritydi2: Integer library routines. |
| (line 151) |
| * __paritysi2: Integer library routines. |
| (line 150) |
| * __parityti2: Integer library routines. |
| (line 152) |
| * __popcountdi2: Integer library routines. |
| (line 157) |
| * __popcountsi2: Integer library routines. |
| (line 156) |
| * __popcountti2: Integer library routines. |
| (line 158) |
| * __powidf2: Soft float library routines. |
| (line 233) |
| * __powisf2: Soft float library routines. |
| (line 232) |
| * __powitf2: Soft float library routines. |
| (line 234) |
| * __powixf2: Soft float library routines. |
| (line 235) |
| * __satfractdadq: Fixed-point fractional library routines. |
| (line 1153) |
| * __satfractdaha2: Fixed-point fractional library routines. |
| (line 1154) |
| * __satfractdahq: Fixed-point fractional library routines. |
| (line 1151) |
| * __satfractdaqq: Fixed-point fractional library routines. |
| (line 1150) |
| * __satfractdasa2: Fixed-point fractional library routines. |
| (line 1155) |
| * __satfractdasq: Fixed-point fractional library routines. |
| (line 1152) |
| * __satfractdata2: Fixed-point fractional library routines. |
| (line 1156) |
| * __satfractdauda: Fixed-point fractional library routines. |
| (line 1166) |
| * __satfractdaudq: Fixed-point fractional library routines. |
| (line 1162) |
| * __satfractdauha: Fixed-point fractional library routines. |
| (line 1164) |
| * __satfractdauhq: Fixed-point fractional library routines. |
| (line 1159) |
| * __satfractdauqq: Fixed-point fractional library routines. |
| (line 1158) |
| * __satfractdausa: Fixed-point fractional library routines. |
| (line 1165) |
| * __satfractdausq: Fixed-point fractional library routines. |
| (line 1160) |
| * __satfractdauta: Fixed-point fractional library routines. |
| (line 1168) |
| * __satfractdfda: Fixed-point fractional library routines. |
| (line 1506) |
| * __satfractdfdq: Fixed-point fractional library routines. |
| (line 1503) |
| * __satfractdfha: Fixed-point fractional library routines. |
| (line 1504) |
| * __satfractdfhq: Fixed-point fractional library routines. |
| (line 1501) |
| * __satfractdfqq: Fixed-point fractional library routines. |
| (line 1500) |
| * __satfractdfsa: Fixed-point fractional library routines. |
| (line 1505) |
| * __satfractdfsq: Fixed-point fractional library routines. |
| (line 1502) |
| * __satfractdfta: Fixed-point fractional library routines. |
| (line 1507) |
| * __satfractdfuda: Fixed-point fractional library routines. |
| (line 1515) |
| * __satfractdfudq: Fixed-point fractional library routines. |
| (line 1512) |
| * __satfractdfuha: Fixed-point fractional library routines. |
| (line 1513) |
| * __satfractdfuhq: Fixed-point fractional library routines. |
| (line 1509) |
| * __satfractdfuqq: Fixed-point fractional library routines. |
| (line 1508) |
| * __satfractdfusa: Fixed-point fractional library routines. |
| (line 1514) |
| * __satfractdfusq: Fixed-point fractional library routines. |
| (line 1510) |
| * __satfractdfuta: Fixed-point fractional library routines. |
| (line 1517) |
| * __satfractdida: Fixed-point fractional library routines. |
| (line 1456) |
| * __satfractdidq: Fixed-point fractional library routines. |
| (line 1453) |
| * __satfractdiha: Fixed-point fractional library routines. |
| (line 1454) |
| * __satfractdihq: Fixed-point fractional library routines. |
| (line 1451) |
| * __satfractdiqq: Fixed-point fractional library routines. |
| (line 1450) |
| * __satfractdisa: Fixed-point fractional library routines. |
| (line 1455) |
| * __satfractdisq: Fixed-point fractional library routines. |
| (line 1452) |
| * __satfractdita: Fixed-point fractional library routines. |
| (line 1457) |
| * __satfractdiuda: Fixed-point fractional library routines. |
| (line 1464) |
| * __satfractdiudq: Fixed-point fractional library routines. |
| (line 1461) |
| * __satfractdiuha: Fixed-point fractional library routines. |
| (line 1462) |
| * __satfractdiuhq: Fixed-point fractional library routines. |
| (line 1459) |
| * __satfractdiuqq: Fixed-point fractional library routines. |
| (line 1458) |
| * __satfractdiusa: Fixed-point fractional library routines. |
| (line 1463) |
| * __satfractdiusq: Fixed-point fractional library routines. |
| (line 1460) |
| * __satfractdiuta: Fixed-point fractional library routines. |
| (line 1465) |
| * __satfractdqda: Fixed-point fractional library routines. |
| (line 1098) |
| * __satfractdqha: Fixed-point fractional library routines. |
| (line 1096) |
| * __satfractdqhq2: Fixed-point fractional library routines. |
| (line 1094) |
| * __satfractdqqq2: Fixed-point fractional library routines. |
| (line 1093) |
| * __satfractdqsa: Fixed-point fractional library routines. |
| (line 1097) |
| * __satfractdqsq2: Fixed-point fractional library routines. |
| (line 1095) |
| * __satfractdqta: Fixed-point fractional library routines. |
| (line 1099) |
| * __satfractdquda: Fixed-point fractional library routines. |
| (line 1111) |
| * __satfractdqudq: Fixed-point fractional library routines. |
| (line 1106) |
| * __satfractdquha: Fixed-point fractional library routines. |
| (line 1108) |
| * __satfractdquhq: Fixed-point fractional library routines. |
| (line 1102) |
| * __satfractdquqq: Fixed-point fractional library routines. |
| (line 1101) |
| * __satfractdqusa: Fixed-point fractional library routines. |
| (line 1109) |
| * __satfractdqusq: Fixed-point fractional library routines. |
| (line 1104) |
| * __satfractdquta: Fixed-point fractional library routines. |
| (line 1113) |
| * __satfracthada2: Fixed-point fractional library routines. |
| (line 1119) |
| * __satfracthadq: Fixed-point fractional library routines. |
| (line 1117) |
| * __satfracthahq: Fixed-point fractional library routines. |
| (line 1115) |
| * __satfracthaqq: Fixed-point fractional library routines. |
| (line 1114) |
| * __satfracthasa2: Fixed-point fractional library routines. |
| (line 1118) |
| * __satfracthasq: Fixed-point fractional library routines. |
| (line 1116) |
| * __satfracthata2: Fixed-point fractional library routines. |
| (line 1120) |
| * __satfracthauda: Fixed-point fractional library routines. |
| (line 1132) |
| * __satfracthaudq: Fixed-point fractional library routines. |
| (line 1127) |
| * __satfracthauha: Fixed-point fractional library routines. |
| (line 1129) |
| * __satfracthauhq: Fixed-point fractional library routines. |
| (line 1123) |
| * __satfracthauqq: Fixed-point fractional library routines. |
| (line 1122) |
| * __satfracthausa: Fixed-point fractional library routines. |
| (line 1130) |
| * __satfracthausq: Fixed-point fractional library routines. |
| (line 1125) |
| * __satfracthauta: Fixed-point fractional library routines. |
| (line 1134) |
| * __satfracthida: Fixed-point fractional library routines. |
| (line 1424) |
| * __satfracthidq: Fixed-point fractional library routines. |
| (line 1421) |
| * __satfracthiha: Fixed-point fractional library routines. |
| (line 1422) |
| * __satfracthihq: Fixed-point fractional library routines. |
| (line 1419) |
| * __satfracthiqq: Fixed-point fractional library routines. |
| (line 1418) |
| * __satfracthisa: Fixed-point fractional library routines. |
| (line 1423) |
| * __satfracthisq: Fixed-point fractional library routines. |
| (line 1420) |
| * __satfracthita: Fixed-point fractional library routines. |
| (line 1425) |
| * __satfracthiuda: Fixed-point fractional library routines. |
| (line 1432) |
| * __satfracthiudq: Fixed-point fractional library routines. |
| (line 1429) |
| * __satfracthiuha: Fixed-point fractional library routines. |
| (line 1430) |
| * __satfracthiuhq: Fixed-point fractional library routines. |
| (line 1427) |
| * __satfracthiuqq: Fixed-point fractional library routines. |
| (line 1426) |
| * __satfracthiusa: Fixed-point fractional library routines. |
| (line 1431) |
| * __satfracthiusq: Fixed-point fractional library routines. |
| (line 1428) |
| * __satfracthiuta: Fixed-point fractional library routines. |
| (line 1433) |
| * __satfracthqda: Fixed-point fractional library routines. |
| (line 1064) |
| * __satfracthqdq2: Fixed-point fractional library routines. |
| (line 1061) |
| * __satfracthqha: Fixed-point fractional library routines. |
| (line 1062) |
| * __satfracthqqq2: Fixed-point fractional library routines. |
| (line 1059) |
| * __satfracthqsa: Fixed-point fractional library routines. |
| (line 1063) |
| * __satfracthqsq2: Fixed-point fractional library routines. |
| (line 1060) |
| * __satfracthqta: Fixed-point fractional library routines. |
| (line 1065) |
| * __satfracthquda: Fixed-point fractional library routines. |
| (line 1072) |
| * __satfracthqudq: Fixed-point fractional library routines. |
| (line 1069) |
| * __satfracthquha: Fixed-point fractional library routines. |
| (line 1070) |
| * __satfracthquhq: Fixed-point fractional library routines. |
| (line 1067) |
| * __satfracthquqq: Fixed-point fractional library routines. |
| (line 1066) |
| * __satfracthqusa: Fixed-point fractional library routines. |
| (line 1071) |
| * __satfracthqusq: Fixed-point fractional library routines. |
| (line 1068) |
| * __satfracthquta: Fixed-point fractional library routines. |
| (line 1073) |
| * __satfractqida: Fixed-point fractional library routines. |
| (line 1402) |
| * __satfractqidq: Fixed-point fractional library routines. |
| (line 1399) |
| * __satfractqiha: Fixed-point fractional library routines. |
| (line 1400) |
| * __satfractqihq: Fixed-point fractional library routines. |
| (line 1397) |
| * __satfractqiqq: Fixed-point fractional library routines. |
| (line 1396) |
| * __satfractqisa: Fixed-point fractional library routines. |
| (line 1401) |
| * __satfractqisq: Fixed-point fractional library routines. |
| (line 1398) |
| * __satfractqita: Fixed-point fractional library routines. |
| (line 1403) |
| * __satfractqiuda: Fixed-point fractional library routines. |
| (line 1415) |
| * __satfractqiudq: Fixed-point fractional library routines. |
| (line 1410) |
| * __satfractqiuha: Fixed-point fractional library routines. |
| (line 1412) |
| * __satfractqiuhq: Fixed-point fractional library routines. |
| (line 1406) |
| * __satfractqiuqq: Fixed-point fractional library routines. |
| (line 1405) |
| * __satfractqiusa: Fixed-point fractional library routines. |
| (line 1413) |
| * __satfractqiusq: Fixed-point fractional library routines. |
| (line 1408) |
| * __satfractqiuta: Fixed-point fractional library routines. |
| (line 1417) |
| * __satfractqqda: Fixed-point fractional library routines. |
| (line 1043) |
| * __satfractqqdq2: Fixed-point fractional library routines. |
| (line 1040) |
| * __satfractqqha: Fixed-point fractional library routines. |
| (line 1041) |
| * __satfractqqhq2: Fixed-point fractional library routines. |
| (line 1038) |
| * __satfractqqsa: Fixed-point fractional library routines. |
| (line 1042) |
| * __satfractqqsq2: Fixed-point fractional library routines. |
| (line 1039) |
| * __satfractqqta: Fixed-point fractional library routines. |
| (line 1044) |
| * __satfractqquda: Fixed-point fractional library routines. |
| (line 1056) |
| * __satfractqqudq: Fixed-point fractional library routines. |
| (line 1051) |
| * __satfractqquha: Fixed-point fractional library routines. |
| (line 1053) |
| * __satfractqquhq: Fixed-point fractional library routines. |
| (line 1047) |
| * __satfractqquqq: Fixed-point fractional library routines. |
| (line 1046) |
| * __satfractqqusa: Fixed-point fractional library routines. |
| (line 1054) |
| * __satfractqqusq: Fixed-point fractional library routines. |
| (line 1049) |
| * __satfractqquta: Fixed-point fractional library routines. |
| (line 1058) |
| * __satfractsada2: Fixed-point fractional library routines. |
| (line 1140) |
| * __satfractsadq: Fixed-point fractional library routines. |
| (line 1138) |
| * __satfractsaha2: Fixed-point fractional library routines. |
| (line 1139) |
| * __satfractsahq: Fixed-point fractional library routines. |
| (line 1136) |
| * __satfractsaqq: Fixed-point fractional library routines. |
| (line 1135) |
| * __satfractsasq: Fixed-point fractional library routines. |
| (line 1137) |
| * __satfractsata2: Fixed-point fractional library routines. |
| (line 1141) |
| * __satfractsauda: Fixed-point fractional library routines. |
| (line 1148) |
| * __satfractsaudq: Fixed-point fractional library routines. |
| (line 1145) |
| * __satfractsauha: Fixed-point fractional library routines. |
| (line 1146) |
| * __satfractsauhq: Fixed-point fractional library routines. |
| (line 1143) |
| * __satfractsauqq: Fixed-point fractional library routines. |
| (line 1142) |
| * __satfractsausa: Fixed-point fractional library routines. |
| (line 1147) |
| * __satfractsausq: Fixed-point fractional library routines. |
| (line 1144) |
| * __satfractsauta: Fixed-point fractional library routines. |
| (line 1149) |
| * __satfractsfda: Fixed-point fractional library routines. |
| (line 1490) |
| * __satfractsfdq: Fixed-point fractional library routines. |
| (line 1487) |
| * __satfractsfha: Fixed-point fractional library routines. |
| (line 1488) |
| * __satfractsfhq: Fixed-point fractional library routines. |
| (line 1485) |
| * __satfractsfqq: Fixed-point fractional library routines. |
| (line 1484) |
| * __satfractsfsa: Fixed-point fractional library routines. |
| (line 1489) |
| * __satfractsfsq: Fixed-point fractional library routines. |
| (line 1486) |
| * __satfractsfta: Fixed-point fractional library routines. |
| (line 1491) |
| * __satfractsfuda: Fixed-point fractional library routines. |
| (line 1498) |
| * __satfractsfudq: Fixed-point fractional library routines. |
| (line 1495) |
| * __satfractsfuha: Fixed-point fractional library routines. |
| (line 1496) |
| * __satfractsfuhq: Fixed-point fractional library routines. |
| (line 1493) |
| * __satfractsfuqq: Fixed-point fractional library routines. |
| (line 1492) |
| * __satfractsfusa: Fixed-point fractional library routines. |
| (line 1497) |
| * __satfractsfusq: Fixed-point fractional library routines. |
| (line 1494) |
| * __satfractsfuta: Fixed-point fractional library routines. |
| (line 1499) |
| * __satfractsida: Fixed-point fractional library routines. |
| (line 1440) |
| * __satfractsidq: Fixed-point fractional library routines. |
| (line 1437) |
| * __satfractsiha: Fixed-point fractional library routines. |
| (line 1438) |
| * __satfractsihq: Fixed-point fractional library routines. |
| (line 1435) |
| * __satfractsiqq: Fixed-point fractional library routines. |
| (line 1434) |
| * __satfractsisa: Fixed-point fractional library routines. |
| (line 1439) |
| * __satfractsisq: Fixed-point fractional library routines. |
| (line 1436) |
| * __satfractsita: Fixed-point fractional library routines. |
| (line 1441) |
| * __satfractsiuda: Fixed-point fractional library routines. |
| (line 1448) |
| * __satfractsiudq: Fixed-point fractional library routines. |
| (line 1445) |
| * __satfractsiuha: Fixed-point fractional library routines. |
| (line 1446) |
| * __satfractsiuhq: Fixed-point fractional library routines. |
| (line 1443) |
| * __satfractsiuqq: Fixed-point fractional library routines. |
| (line 1442) |
| * __satfractsiusa: Fixed-point fractional library routines. |
| (line 1447) |
| * __satfractsiusq: Fixed-point fractional library routines. |
| (line 1444) |
| * __satfractsiuta: Fixed-point fractional library routines. |
| (line 1449) |
| * __satfractsqda: Fixed-point fractional library routines. |
| (line 1079) |
| * __satfractsqdq2: Fixed-point fractional library routines. |
| (line 1076) |
| * __satfractsqha: Fixed-point fractional library routines. |
| (line 1077) |
| * __satfractsqhq2: Fixed-point fractional library routines. |
| (line 1075) |
| * __satfractsqqq2: Fixed-point fractional library routines. |
| (line 1074) |
| * __satfractsqsa: Fixed-point fractional library routines. |
| (line 1078) |
| * __satfractsqta: Fixed-point fractional library routines. |
| (line 1080) |
| * __satfractsquda: Fixed-point fractional library routines. |
| (line 1090) |
| * __satfractsqudq: Fixed-point fractional library routines. |
| (line 1086) |
| * __satfractsquha: Fixed-point fractional library routines. |
| (line 1088) |
| * __satfractsquhq: Fixed-point fractional library routines. |
| (line 1083) |
| * __satfractsquqq: Fixed-point fractional library routines. |
| (line 1082) |
| * __satfractsqusa: Fixed-point fractional library routines. |
| (line 1089) |
| * __satfractsqusq: Fixed-point fractional library routines. |
| (line 1084) |
| * __satfractsquta: Fixed-point fractional library routines. |
| (line 1092) |
| * __satfracttada2: Fixed-point fractional library routines. |
| (line 1175) |
| * __satfracttadq: Fixed-point fractional library routines. |
| (line 1172) |
| * __satfracttaha2: Fixed-point fractional library routines. |
| (line 1173) |
| * __satfracttahq: Fixed-point fractional library routines. |
| (line 1170) |
| * __satfracttaqq: Fixed-point fractional library routines. |
| (line 1169) |
| * __satfracttasa2: Fixed-point fractional library routines. |
| (line 1174) |
| * __satfracttasq: Fixed-point fractional library routines. |
| (line 1171) |
| * __satfracttauda: Fixed-point fractional library routines. |
| (line 1187) |
| * __satfracttaudq: Fixed-point fractional library routines. |
| (line 1182) |
| * __satfracttauha: Fixed-point fractional library routines. |
| (line 1184) |
| * __satfracttauhq: Fixed-point fractional library routines. |
| (line 1178) |
| * __satfracttauqq: Fixed-point fractional library routines. |
| (line 1177) |
| * __satfracttausa: Fixed-point fractional library routines. |
| (line 1185) |
| * __satfracttausq: Fixed-point fractional library routines. |
| (line 1180) |
| * __satfracttauta: Fixed-point fractional library routines. |
| (line 1189) |
| * __satfracttida: Fixed-point fractional library routines. |
| (line 1472) |
| * __satfracttidq: Fixed-point fractional library routines. |
| (line 1469) |
| * __satfracttiha: Fixed-point fractional library routines. |
| (line 1470) |
| * __satfracttihq: Fixed-point fractional library routines. |
| (line 1467) |
| * __satfracttiqq: Fixed-point fractional library routines. |
| (line 1466) |
| * __satfracttisa: Fixed-point fractional library routines. |
| (line 1471) |
| * __satfracttisq: Fixed-point fractional library routines. |
| (line 1468) |
| * __satfracttita: Fixed-point fractional library routines. |
| (line 1473) |
| * __satfracttiuda: Fixed-point fractional library routines. |
| (line 1481) |
| * __satfracttiudq: Fixed-point fractional library routines. |
| (line 1478) |
| * __satfracttiuha: Fixed-point fractional library routines. |
| (line 1479) |
| * __satfracttiuhq: Fixed-point fractional library routines. |
| (line 1475) |
| * __satfracttiuqq: Fixed-point fractional library routines. |
| (line 1474) |
| * __satfracttiusa: Fixed-point fractional library routines. |
| (line 1480) |
| * __satfracttiusq: Fixed-point fractional library routines. |
| (line 1476) |
| * __satfracttiuta: Fixed-point fractional library routines. |
| (line 1483) |
| * __satfractudada: Fixed-point fractional library routines. |
| (line 1351) |
| * __satfractudadq: Fixed-point fractional library routines. |
| (line 1347) |
| * __satfractudaha: Fixed-point fractional library routines. |
| (line 1349) |
| * __satfractudahq: Fixed-point fractional library routines. |
| (line 1344) |
| * __satfractudaqq: Fixed-point fractional library routines. |
| (line 1343) |
| * __satfractudasa: Fixed-point fractional library routines. |
| (line 1350) |
| * __satfractudasq: Fixed-point fractional library routines. |
| (line 1345) |
| * __satfractudata: Fixed-point fractional library routines. |
| (line 1353) |
| * __satfractudaudq: Fixed-point fractional library routines. |
| (line 1361) |
| * __satfractudauha2: Fixed-point fractional library routines. |
| (line 1363) |
| * __satfractudauhq: Fixed-point fractional library routines. |
| (line 1357) |
| * __satfractudauqq: Fixed-point fractional library routines. |
| (line 1355) |
| * __satfractudausa2: Fixed-point fractional library routines. |
| (line 1365) |
| * __satfractudausq: Fixed-point fractional library routines. |
| (line 1359) |
| * __satfractudauta2: Fixed-point fractional library routines. |
| (line 1367) |
| * __satfractudqda: Fixed-point fractional library routines. |
| (line 1276) |
| * __satfractudqdq: Fixed-point fractional library routines. |
| (line 1271) |
| * __satfractudqha: Fixed-point fractional library routines. |
| (line 1273) |
| * __satfractudqhq: Fixed-point fractional library routines. |
| (line 1267) |
| * __satfractudqqq: Fixed-point fractional library routines. |
| (line 1266) |
| * __satfractudqsa: Fixed-point fractional library routines. |
| (line 1274) |
| * __satfractudqsq: Fixed-point fractional library routines. |
| (line 1269) |
| * __satfractudqta: Fixed-point fractional library routines. |
| (line 1278) |
| * __satfractudquda: Fixed-point fractional library routines. |
| (line 1290) |
| * __satfractudquha: Fixed-point fractional library routines. |
| (line 1286) |
| * __satfractudquhq2: Fixed-point fractional library routines. |
| (line 1282) |
| * __satfractudquqq2: Fixed-point fractional library routines. |
| (line 1280) |
| * __satfractudqusa: Fixed-point fractional library routines. |
| (line 1288) |
| * __satfractudqusq2: Fixed-point fractional library routines. |
| (line 1284) |
| * __satfractudquta: Fixed-point fractional library routines. |
| (line 1292) |
| * __satfractuhada: Fixed-point fractional library routines. |
| (line 1304) |
| * __satfractuhadq: Fixed-point fractional library routines. |
| (line 1299) |
| * __satfractuhaha: Fixed-point fractional library routines. |
| (line 1301) |
| * __satfractuhahq: Fixed-point fractional library routines. |
| (line 1295) |
| * __satfractuhaqq: Fixed-point fractional library routines. |
| (line 1294) |
| * __satfractuhasa: Fixed-point fractional library routines. |
| (line 1302) |
| * __satfractuhasq: Fixed-point fractional library routines. |
| (line 1297) |
| * __satfractuhata: Fixed-point fractional library routines. |
| (line 1306) |
| * __satfractuhauda2: Fixed-point fractional library routines. |
| (line 1318) |
| * __satfractuhaudq: Fixed-point fractional library routines. |
| (line 1314) |
| * __satfractuhauhq: Fixed-point fractional library routines. |
| (line 1310) |
| * __satfractuhauqq: Fixed-point fractional library routines. |
| (line 1308) |
| * __satfractuhausa2: Fixed-point fractional library routines. |
| (line 1316) |
| * __satfractuhausq: Fixed-point fractional library routines. |
| (line 1312) |
| * __satfractuhauta2: Fixed-point fractional library routines. |
| (line 1320) |
| * __satfractuhqda: Fixed-point fractional library routines. |
| (line 1224) |
| * __satfractuhqdq: Fixed-point fractional library routines. |
| (line 1221) |
| * __satfractuhqha: Fixed-point fractional library routines. |
| (line 1222) |
| * __satfractuhqhq: Fixed-point fractional library routines. |
| (line 1219) |
| * __satfractuhqqq: Fixed-point fractional library routines. |
| (line 1218) |
| * __satfractuhqsa: Fixed-point fractional library routines. |
| (line 1223) |
| * __satfractuhqsq: Fixed-point fractional library routines. |
| (line 1220) |
| * __satfractuhqta: Fixed-point fractional library routines. |
| (line 1225) |
| * __satfractuhquda: Fixed-point fractional library routines. |
| (line 1236) |
| * __satfractuhqudq2: Fixed-point fractional library routines. |
| (line 1231) |
| * __satfractuhquha: Fixed-point fractional library routines. |
| (line 1233) |
| * __satfractuhquqq2: Fixed-point fractional library routines. |
| (line 1227) |
| * __satfractuhqusa: Fixed-point fractional library routines. |
| (line 1234) |
| * __satfractuhqusq2: Fixed-point fractional library routines. |
| (line 1229) |
| * __satfractuhquta: Fixed-point fractional library routines. |
| (line 1238) |
| * __satfractunsdida: Fixed-point fractional library routines. |
| (line 1834) |
| * __satfractunsdidq: Fixed-point fractional library routines. |
| (line 1831) |
| * __satfractunsdiha: Fixed-point fractional library routines. |
| (line 1832) |
| * __satfractunsdihq: Fixed-point fractional library routines. |
| (line 1828) |
| * __satfractunsdiqq: Fixed-point fractional library routines. |
| (line 1827) |
| * __satfractunsdisa: Fixed-point fractional library routines. |
| (line 1833) |
| * __satfractunsdisq: Fixed-point fractional library routines. |
| (line 1829) |
| * __satfractunsdita: Fixed-point fractional library routines. |
| (line 1836) |
| * __satfractunsdiuda: Fixed-point fractional library routines. |
| (line 1850) |
| * __satfractunsdiudq: Fixed-point fractional library routines. |
| (line 1844) |
| * __satfractunsdiuha: Fixed-point fractional library routines. |
| (line 1846) |
| * __satfractunsdiuhq: Fixed-point fractional library routines. |
| (line 1840) |
| * __satfractunsdiuqq: Fixed-point fractional library routines. |
| (line 1838) |
| * __satfractunsdiusa: Fixed-point fractional library routines. |
| (line 1848) |
| * __satfractunsdiusq: Fixed-point fractional library routines. |
| (line 1842) |
| * __satfractunsdiuta: Fixed-point fractional library routines. |
| (line 1852) |
| * __satfractunshida: Fixed-point fractional library routines. |
| (line 1786) |
| * __satfractunshidq: Fixed-point fractional library routines. |
| (line 1783) |
| * __satfractunshiha: Fixed-point fractional library routines. |
| (line 1784) |
| * __satfractunshihq: Fixed-point fractional library routines. |
| (line 1780) |
| * __satfractunshiqq: Fixed-point fractional library routines. |
| (line 1779) |
| * __satfractunshisa: Fixed-point fractional library routines. |
| (line 1785) |
| * __satfractunshisq: Fixed-point fractional library routines. |
| (line 1781) |
| * __satfractunshita: Fixed-point fractional library routines. |
| (line 1788) |
| * __satfractunshiuda: Fixed-point fractional library routines. |
| (line 1802) |
| * __satfractunshiudq: Fixed-point fractional library routines. |
| (line 1796) |
| * __satfractunshiuha: Fixed-point fractional library routines. |
| (line 1798) |
| * __satfractunshiuhq: Fixed-point fractional library routines. |
| (line 1792) |
| * __satfractunshiuqq: Fixed-point fractional library routines. |
| (line 1790) |
| * __satfractunshiusa: Fixed-point fractional library routines. |
| (line 1800) |
| * __satfractunshiusq: Fixed-point fractional library routines. |
| (line 1794) |
| * __satfractunshiuta: Fixed-point fractional library routines. |
| (line 1804) |
| * __satfractunsqida: Fixed-point fractional library routines. |
| (line 1760) |
| * __satfractunsqidq: Fixed-point fractional library routines. |
| (line 1757) |
| * __satfractunsqiha: Fixed-point fractional library routines. |
| (line 1758) |
| * __satfractunsqihq: Fixed-point fractional library routines. |
| (line 1754) |
| * __satfractunsqiqq: Fixed-point fractional library routines. |
| (line 1753) |
| * __satfractunsqisa: Fixed-point fractional library routines. |
| (line 1759) |
| * __satfractunsqisq: Fixed-point fractional library routines. |
| (line 1755) |
| * __satfractunsqita: Fixed-point fractional library routines. |
| (line 1762) |
| * __satfractunsqiuda: Fixed-point fractional library routines. |
| (line 1776) |
| * __satfractunsqiudq: Fixed-point fractional library routines. |
| (line 1770) |
| * __satfractunsqiuha: Fixed-point fractional library routines. |
| (line 1772) |
| * __satfractunsqiuhq: Fixed-point fractional library routines. |
| (line 1766) |
| * __satfractunsqiuqq: Fixed-point fractional library routines. |
| (line 1764) |
| * __satfractunsqiusa: Fixed-point fractional library routines. |
| (line 1774) |
| * __satfractunsqiusq: Fixed-point fractional library routines. |
| (line 1768) |
| * __satfractunsqiuta: Fixed-point fractional library routines. |
| (line 1778) |
| * __satfractunssida: Fixed-point fractional library routines. |
| (line 1811) |
| * __satfractunssidq: Fixed-point fractional library routines. |
| (line 1808) |
| * __satfractunssiha: Fixed-point fractional library routines. |
| (line 1809) |
| * __satfractunssihq: Fixed-point fractional library routines. |
| (line 1806) |
| * __satfractunssiqq: Fixed-point fractional library routines. |
| (line 1805) |
| * __satfractunssisa: Fixed-point fractional library routines. |
| (line 1810) |
| * __satfractunssisq: Fixed-point fractional library routines. |
| (line 1807) |
| * __satfractunssita: Fixed-point fractional library routines. |
| (line 1812) |
| * __satfractunssiuda: Fixed-point fractional library routines. |
| (line 1824) |
| * __satfractunssiudq: Fixed-point fractional library routines. |
| (line 1819) |
| * __satfractunssiuha: Fixed-point fractional library routines. |
| (line 1821) |
| * __satfractunssiuhq: Fixed-point fractional library routines. |
| (line 1815) |
| * __satfractunssiuqq: Fixed-point fractional library routines. |
| (line 1814) |
| * __satfractunssiusa: Fixed-point fractional library routines. |
| (line 1822) |
| * __satfractunssiusq: Fixed-point fractional library routines. |
| (line 1817) |
| * __satfractunssiuta: Fixed-point fractional library routines. |
| (line 1826) |
| * __satfractunstida: Fixed-point fractional library routines. |
| (line 1864) |
| * __satfractunstidq: Fixed-point fractional library routines. |
| (line 1859) |
| * __satfractunstiha: Fixed-point fractional library routines. |
| (line 1861) |
| * __satfractunstihq: Fixed-point fractional library routines. |
| (line 1855) |
| * __satfractunstiqq: Fixed-point fractional library routines. |
| (line 1854) |
| * __satfractunstisa: Fixed-point fractional library routines. |
| (line 1862) |
| * __satfractunstisq: Fixed-point fractional library routines. |
| (line 1857) |
| * __satfractunstita: Fixed-point fractional library routines. |
| (line 1866) |
| * __satfractunstiuda: Fixed-point fractional library routines. |
| (line 1880) |
| * __satfractunstiudq: Fixed-point fractional library routines. |
| (line 1874) |
| * __satfractunstiuha: Fixed-point fractional library routines. |
| (line 1876) |
| * __satfractunstiuhq: Fixed-point fractional library routines. |
| (line 1870) |
| * __satfractunstiuqq: Fixed-point fractional library routines. |
| (line 1868) |
| * __satfractunstiusa: Fixed-point fractional library routines. |
| (line 1878) |
| * __satfractunstiusq: Fixed-point fractional library routines. |
| (line 1872) |
| * __satfractunstiuta: Fixed-point fractional library routines. |
| (line 1882) |
| * __satfractuqqda: Fixed-point fractional library routines. |
| (line 1201) |
| * __satfractuqqdq: Fixed-point fractional library routines. |
| (line 1196) |
| * __satfractuqqha: Fixed-point fractional library routines. |
| (line 1198) |
| * __satfractuqqhq: Fixed-point fractional library routines. |
| (line 1192) |
| * __satfractuqqqq: Fixed-point fractional library routines. |
| (line 1191) |
| * __satfractuqqsa: Fixed-point fractional library routines. |
| (line 1199) |
| * __satfractuqqsq: Fixed-point fractional library routines. |
| (line 1194) |
| * __satfractuqqta: Fixed-point fractional library routines. |
| (line 1203) |
| * __satfractuqquda: Fixed-point fractional library routines. |
| (line 1215) |
| * __satfractuqqudq2: Fixed-point fractional library routines. |
| (line 1209) |
| * __satfractuqquha: Fixed-point fractional library routines. |
| (line 1211) |
| * __satfractuqquhq2: Fixed-point fractional library routines. |
| (line 1205) |
| * __satfractuqqusa: Fixed-point fractional library routines. |
| (line 1213) |
| * __satfractuqqusq2: Fixed-point fractional library routines. |
| (line 1207) |
| * __satfractuqquta: Fixed-point fractional library routines. |
| (line 1217) |
| * __satfractusada: Fixed-point fractional library routines. |
| (line 1327) |
| * __satfractusadq: Fixed-point fractional library routines. |
| (line 1324) |
| * __satfractusaha: Fixed-point fractional library routines. |
| (line 1325) |
| * __satfractusahq: Fixed-point fractional library routines. |
| (line 1322) |
| * __satfractusaqq: Fixed-point fractional library routines. |
| (line 1321) |
| * __satfractusasa: Fixed-point fractional library routines. |
| (line 1326) |
| * __satfractusasq: Fixed-point fractional library routines. |
| (line 1323) |
| * __satfractusata: Fixed-point fractional library routines. |
| (line 1328) |
| * __satfractusauda2: Fixed-point fractional library routines. |
| (line 1339) |
| * __satfractusaudq: Fixed-point fractional library routines. |
| (line 1335) |
| * __satfractusauha2: Fixed-point fractional library routines. |
| (line 1337) |
| * __satfractusauhq: Fixed-point fractional library routines. |
| (line 1331) |
| * __satfractusauqq: Fixed-point fractional library routines. |
| (line 1330) |
| * __satfractusausq: Fixed-point fractional library routines. |
| (line 1333) |
| * __satfractusauta2: Fixed-point fractional library routines. |
| (line 1341) |
| * __satfractusqda: Fixed-point fractional library routines. |
| (line 1248) |
| * __satfractusqdq: Fixed-point fractional library routines. |
| (line 1244) |
| * __satfractusqha: Fixed-point fractional library routines. |
| (line 1246) |
| * __satfractusqhq: Fixed-point fractional library routines. |
| (line 1241) |
| * __satfractusqqq: Fixed-point fractional library routines. |
| (line 1240) |
| * __satfractusqsa: Fixed-point fractional library routines. |
| (line 1247) |
| * __satfractusqsq: Fixed-point fractional library routines. |
| (line 1242) |
| * __satfractusqta: Fixed-point fractional library routines. |
| (line 1250) |
| * __satfractusquda: Fixed-point fractional library routines. |
| (line 1262) |
| * __satfractusqudq2: Fixed-point fractional library routines. |
| (line 1256) |
| * __satfractusquha: Fixed-point fractional library routines. |
| (line 1258) |
| * __satfractusquhq2: Fixed-point fractional library routines. |
| (line 1254) |
| * __satfractusquqq2: Fixed-point fractional library routines. |
| (line 1252) |
| * __satfractusqusa: Fixed-point fractional library routines. |
| (line 1260) |
| * __satfractusquta: Fixed-point fractional library routines. |
| (line 1264) |
| * __satfractutada: Fixed-point fractional library routines. |
| (line 1379) |
| * __satfractutadq: Fixed-point fractional library routines. |
| (line 1374) |
| * __satfractutaha: Fixed-point fractional library routines. |
| (line 1376) |
| * __satfractutahq: Fixed-point fractional library routines. |
| (line 1370) |
| * __satfractutaqq: Fixed-point fractional library routines. |
| (line 1369) |
| * __satfractutasa: Fixed-point fractional library routines. |
| (line 1377) |
| * __satfractutasq: Fixed-point fractional library routines. |
| (line 1372) |
| * __satfractutata: Fixed-point fractional library routines. |
| (line 1381) |
| * __satfractutauda2: Fixed-point fractional library routines. |
| (line 1395) |
| * __satfractutaudq: Fixed-point fractional library routines. |
| (line 1389) |
| * __satfractutauha2: Fixed-point fractional library routines. |
| (line 1391) |
| * __satfractutauhq: Fixed-point fractional library routines. |
| (line 1385) |
| * __satfractutauqq: Fixed-point fractional library routines. |
| (line 1383) |
| * __satfractutausa2: Fixed-point fractional library routines. |
| (line 1393) |
| * __satfractutausq: Fixed-point fractional library routines. |
| (line 1387) |
| * __ssaddda3: Fixed-point fractional library routines. |
| (line 67) |
| * __ssadddq3: Fixed-point fractional library routines. |
| (line 63) |
| * __ssaddha3: Fixed-point fractional library routines. |
| (line 65) |
| * __ssaddhq3: Fixed-point fractional library routines. |
| (line 60) |
| * __ssaddqq3: Fixed-point fractional library routines. |
| (line 59) |
| * __ssaddsa3: Fixed-point fractional library routines. |
| (line 66) |
| * __ssaddsq3: Fixed-point fractional library routines. |
| (line 61) |
| * __ssaddta3: Fixed-point fractional library routines. |
| (line 69) |
| * __ssashlda3: Fixed-point fractional library routines. |
| (line 402) |
| * __ssashldq3: Fixed-point fractional library routines. |
| (line 399) |
| * __ssashlha3: Fixed-point fractional library routines. |
| (line 400) |
| * __ssashlhq3: Fixed-point fractional library routines. |
| (line 396) |
| * __ssashlsa3: Fixed-point fractional library routines. |
| (line 401) |
| * __ssashlsq3: Fixed-point fractional library routines. |
| (line 397) |
| * __ssashlta3: Fixed-point fractional library routines. |
| (line 404) |
| * __ssdivda3: Fixed-point fractional library routines. |
| (line 261) |
| * __ssdivdq3: Fixed-point fractional library routines. |
| (line 257) |
| * __ssdivha3: Fixed-point fractional library routines. |
| (line 259) |
| * __ssdivhq3: Fixed-point fractional library routines. |
| (line 254) |
| * __ssdivqq3: Fixed-point fractional library routines. |
| (line 253) |
| * __ssdivsa3: Fixed-point fractional library routines. |
| (line 260) |
| * __ssdivsq3: Fixed-point fractional library routines. |
| (line 255) |
| * __ssdivta3: Fixed-point fractional library routines. |
| (line 263) |
| * __ssmulda3: Fixed-point fractional library routines. |
| (line 193) |
| * __ssmuldq3: Fixed-point fractional library routines. |
| (line 189) |
| * __ssmulha3: Fixed-point fractional library routines. |
| (line 191) |
| * __ssmulhq3: Fixed-point fractional library routines. |
| (line 186) |
| * __ssmulqq3: Fixed-point fractional library routines. |
| (line 185) |
| * __ssmulsa3: Fixed-point fractional library routines. |
| (line 192) |
| * __ssmulsq3: Fixed-point fractional library routines. |
| (line 187) |
| * __ssmulta3: Fixed-point fractional library routines. |
| (line 195) |
| * __ssnegda2: Fixed-point fractional library routines. |
| (line 316) |
| * __ssnegdq2: Fixed-point fractional library routines. |
| (line 313) |
| * __ssnegha2: Fixed-point fractional library routines. |
| (line 314) |
| * __ssneghq2: Fixed-point fractional library routines. |
| (line 311) |
| * __ssnegqq2: Fixed-point fractional library routines. |
| (line 310) |
| * __ssnegsa2: Fixed-point fractional library routines. |
| (line 315) |
| * __ssnegsq2: Fixed-point fractional library routines. |
| (line 312) |
| * __ssnegta2: Fixed-point fractional library routines. |
| (line 317) |
| * __sssubda3: Fixed-point fractional library routines. |
| (line 129) |
| * __sssubdq3: Fixed-point fractional library routines. |
| (line 125) |
| * __sssubha3: Fixed-point fractional library routines. |
| (line 127) |
| * __sssubhq3: Fixed-point fractional library routines. |
| (line 122) |
| * __sssubqq3: Fixed-point fractional library routines. |
| (line 121) |
| * __sssubsa3: Fixed-point fractional library routines. |
| (line 128) |
| * __sssubsq3: Fixed-point fractional library routines. |
| (line 123) |
| * __sssubta3: Fixed-point fractional library routines. |
| (line 131) |
| * __subda3: Fixed-point fractional library routines. |
| (line 107) |
| * __subdf3: Soft float library routines. |
| (line 31) |
| * __subdq3: Fixed-point fractional library routines. |
| (line 95) |
| * __subha3: Fixed-point fractional library routines. |
| (line 105) |
| * __subhq3: Fixed-point fractional library routines. |
| (line 92) |
| * __subqq3: Fixed-point fractional library routines. |
| (line 91) |
| * __subsa3: Fixed-point fractional library routines. |
| (line 106) |
| * __subsf3: Soft float library routines. |
| (line 30) |
| * __subsq3: Fixed-point fractional library routines. |
| (line 93) |
| * __subta3: Fixed-point fractional library routines. |
| (line 109) |
| * __subtf3: Soft float library routines. |
| (line 33) |
| * __subuda3: Fixed-point fractional library routines. |
| (line 115) |
| * __subudq3: Fixed-point fractional library routines. |
| (line 103) |
| * __subuha3: Fixed-point fractional library routines. |
| (line 111) |
| * __subuhq3: Fixed-point fractional library routines. |
| (line 99) |
| * __subuqq3: Fixed-point fractional library routines. |
| (line 97) |
| * __subusa3: Fixed-point fractional library routines. |
| (line 113) |
| * __subusq3: Fixed-point fractional library routines. |
| (line 101) |
| * __subuta3: Fixed-point fractional library routines. |
| (line 117) |
| * __subvdi3: Integer library routines. |
| (line 123) |
| * __subvsi3: Integer library routines. |
| (line 122) |
| * __subxf3: Soft float library routines. |
| (line 35) |
| * __truncdfsf2: Soft float library routines. |
| (line 76) |
| * __trunctfdf2: Soft float library routines. |
| (line 73) |
| * __trunctfsf2: Soft float library routines. |
| (line 75) |
| * __truncxfdf2: Soft float library routines. |
| (line 72) |
| * __truncxfsf2: Soft float library routines. |
| (line 74) |
| * __ucmpdi2: Integer library routines. |
| (line 93) |
| * __ucmpti2: Integer library routines. |
| (line 95) |
| * __udivdi3: Integer library routines. |
| (line 54) |
| * __udivmoddi3: Integer library routines. |
| (line 61) |
| * __udivsi3: Integer library routines. |
| (line 52) |
| * __udivti3: Integer library routines. |
| (line 56) |
| * __udivuda3: Fixed-point fractional library routines. |
| (line 246) |
| * __udivudq3: Fixed-point fractional library routines. |
| (line 240) |
| * __udivuha3: Fixed-point fractional library routines. |
| (line 242) |
| * __udivuhq3: Fixed-point fractional library routines. |
| (line 236) |
| * __udivuqq3: Fixed-point fractional library routines. |
| (line 234) |
| * __udivusa3: Fixed-point fractional library routines. |
| (line 244) |
| * __udivusq3: Fixed-point fractional library routines. |
| (line 238) |
| * __udivuta3: Fixed-point fractional library routines. |
| (line 248) |
| * __umoddi3: Integer library routines. |
| (line 71) |
| * __umodsi3: Integer library routines. |
| (line 69) |
| * __umodti3: Integer library routines. |
| (line 73) |
| * __unorddf2: Soft float library routines. |
| (line 173) |
| * __unordsf2: Soft float library routines. |
| (line 172) |
| * __unordtf2: Soft float library routines. |
| (line 174) |
| * __usadduda3: Fixed-point fractional library routines. |
| (line 85) |
| * __usaddudq3: Fixed-point fractional library routines. |
| (line 79) |
| * __usadduha3: Fixed-point fractional library routines. |
| (line 81) |
| * __usadduhq3: Fixed-point fractional library routines. |
| (line 75) |
| * __usadduqq3: Fixed-point fractional library routines. |
| (line 73) |
| * __usaddusa3: Fixed-point fractional library routines. |
| (line 83) |
| * __usaddusq3: Fixed-point fractional library routines. |
| (line 77) |
| * __usadduta3: Fixed-point fractional library routines. |
| (line 87) |
| * __usashluda3: Fixed-point fractional library routines. |
| (line 421) |
| * __usashludq3: Fixed-point fractional library routines. |
| (line 415) |
| * __usashluha3: Fixed-point fractional library routines. |
| (line 417) |
| * __usashluhq3: Fixed-point fractional library routines. |
| (line 411) |
| * __usashluqq3: Fixed-point fractional library routines. |
| (line 409) |
| * __usashlusa3: Fixed-point fractional library routines. |
| (line 419) |
| * __usashlusq3: Fixed-point fractional library routines. |
| (line 413) |
| * __usashluta3: Fixed-point fractional library routines. |
| (line 423) |
| * __usdivuda3: Fixed-point fractional library routines. |
| (line 280) |
| * __usdivudq3: Fixed-point fractional library routines. |
| (line 274) |
| * __usdivuha3: Fixed-point fractional library routines. |
| (line 276) |
| * __usdivuhq3: Fixed-point fractional library routines. |
| (line 270) |
| * __usdivuqq3: Fixed-point fractional library routines. |
| (line 268) |
| * __usdivusa3: Fixed-point fractional library routines. |
| (line 278) |
| * __usdivusq3: Fixed-point fractional library routines. |
| (line 272) |
| * __usdivuta3: Fixed-point fractional library routines. |
| (line 282) |
| * __usmuluda3: Fixed-point fractional library routines. |
| (line 212) |
| * __usmuludq3: Fixed-point fractional library routines. |
| (line 206) |
| * __usmuluha3: Fixed-point fractional library routines. |
| (line 208) |
| * __usmuluhq3: Fixed-point fractional library routines. |
| (line 202) |
| * __usmuluqq3: Fixed-point fractional library routines. |
| (line 200) |
| * __usmulusa3: Fixed-point fractional library routines. |
| (line 210) |
| * __usmulusq3: Fixed-point fractional library routines. |
| (line 204) |
| * __usmuluta3: Fixed-point fractional library routines. |
| (line 214) |
| * __usneguda2: Fixed-point fractional library routines. |
| (line 331) |
| * __usnegudq2: Fixed-point fractional library routines. |
| (line 326) |
| * __usneguha2: Fixed-point fractional library routines. |
| (line 328) |
| * __usneguhq2: Fixed-point fractional library routines. |
| (line 322) |
| * __usneguqq2: Fixed-point fractional library routines. |
| (line 321) |
| * __usnegusa2: Fixed-point fractional library routines. |
| (line 329) |
| * __usnegusq2: Fixed-point fractional library routines. |
| (line 324) |
| * __usneguta2: Fixed-point fractional library routines. |
| (line 333) |
| * __ussubuda3: Fixed-point fractional library routines. |
| (line 148) |
| * __ussubudq3: Fixed-point fractional library routines. |
| (line 142) |
| * __ussubuha3: Fixed-point fractional library routines. |
| (line 144) |
| * __ussubuhq3: Fixed-point fractional library routines. |
| (line 138) |
| * __ussubuqq3: Fixed-point fractional library routines. |
| (line 136) |
| * __ussubusa3: Fixed-point fractional library routines. |
| (line 146) |
| * __ussubusq3: Fixed-point fractional library routines. |
| (line 140) |
| * __ussubuta3: Fixed-point fractional library routines. |
| (line 150) |
| * abort: Portability. (line 21) |
| * abs: Arithmetic. (line 195) |
| * abs and attributes: Expressions. (line 64) |
| * ABS_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * absence_set: Processor pipeline description. |
| (line 220) |
| * absM2 instruction pattern: Standard Names. (line 452) |
| * absolute value: Arithmetic. (line 195) |
| * access to operands: Accessors. (line 6) |
| * access to special operands: Special Accessors. (line 6) |
| * accessors: Accessors. (line 6) |
| * ACCUM_TYPE_SIZE: Type Layout. (line 88) |
| * ACCUMULATE_OUTGOING_ARGS: Stack Arguments. (line 46) |
| * ACCUMULATE_OUTGOING_ARGS and stack frames: Function Entry. (line 135) |
| * ADA_LONG_TYPE_SIZE: Type Layout. (line 26) |
| * Adding a new GIMPLE statement code: Adding a new GIMPLE statement code. |
| (line 6) |
| * ADDITIONAL_REGISTER_NAMES: Instruction Output. (line 15) |
| * addM3 instruction pattern: Standard Names. (line 216) |
| * addMODEcc instruction pattern: Standard Names. (line 886) |
| * addr_diff_vec: Side Effects. (line 302) |
| * addr_diff_vec, length of: Insn Lengths. (line 26) |
| * ADDR_EXPR: Storage References. (line 6) |
| * addr_vec: Side Effects. (line 297) |
| * addr_vec, length of: Insn Lengths. (line 26) |
| * address constraints: Simple Constraints. (line 154) |
| * address_operand <1>: Simple Constraints. (line 158) |
| * address_operand: Machine-Independent Predicates. |
| (line 63) |
| * addressing modes: Addressing Modes. (line 6) |
| * ADJUST_FIELD_ALIGN: Storage Layout. (line 202) |
| * ADJUST_INSN_LENGTH: Insn Lengths. (line 35) |
| * aggregates as return values: Aggregate Return. (line 6) |
| * alias: Alias analysis. (line 6) |
| * ALL_COP_ADDITIONAL_REGISTER_NAMES: MIPS Coprocessors. (line 32) |
| * ALL_REGS: Register Classes. (line 17) |
| * allocate_stack instruction pattern: Standard Names. (line 1186) |
| * alternate entry points: Insns. (line 140) |
| * anchored addresses: Anchored Addresses. (line 6) |
| * and: Arithmetic. (line 153) |
| * and and attributes: Expressions. (line 50) |
| * and, canonicalization of: Insn Canonicalizations. |
| (line 52) |
| * andM3 instruction pattern: Standard Names. (line 222) |
| * annotations: Annotations. (line 6) |
| * APPLY_RESULT_SIZE: Scalar Return. (line 107) |
| * ARG_POINTER_CFA_OFFSET: Frame Layout. (line 194) |
| * ARG_POINTER_REGNUM: Frame Registers. (line 41) |
| * ARG_POINTER_REGNUM and virtual registers: Regs and Memory. (line 65) |
| * arg_pointer_rtx: Frame Registers. (line 90) |
| * ARGS_GROW_DOWNWARD: Frame Layout. (line 35) |
| * argument passing: Interface. (line 36) |
| * arguments in registers: Register Arguments. (line 6) |
| * arguments on stack: Stack Arguments. (line 6) |
| * arithmetic library: Soft float library routines. |
| (line 6) |
| * arithmetic shift: Arithmetic. (line 168) |
| * arithmetic shift with signed saturation: Arithmetic. (line 168) |
| * arithmetic shift with unsigned saturation: Arithmetic. (line 168) |
| * arithmetic, in RTL: Arithmetic. (line 6) |
| * ARITHMETIC_TYPE_P: Types for C++. (line 61) |
| * array: Types. (line 6) |
| * ARRAY_RANGE_REF: Storage References. (line 6) |
| * ARRAY_REF: Storage References. (line 6) |
| * ARRAY_TYPE: Types. (line 6) |
| * AS_NEEDS_DASH_FOR_PIPED_INPUT: Driver. (line 151) |
| * ashift: Arithmetic. (line 168) |
| * ashift and attributes: Expressions. (line 64) |
| * ashiftrt: Arithmetic. (line 185) |
| * ashiftrt and attributes: Expressions. (line 64) |
| * ashlM3 instruction pattern: Standard Names. (line 431) |
| * ashrM3 instruction pattern: Standard Names. (line 441) |
| * ASM_APP_OFF: File Framework. (line 78) |
| * ASM_APP_ON: File Framework. (line 71) |
| * ASM_COMMENT_START: File Framework. (line 66) |
| * ASM_DECLARE_CLASS_REFERENCE: Label Output. (line 437) |
| * ASM_DECLARE_CONSTANT_NAME: Label Output. (line 128) |
| * ASM_DECLARE_FUNCTION_NAME: Label Output. (line 87) |
| * ASM_DECLARE_FUNCTION_SIZE: Label Output. (line 101) |
| * ASM_DECLARE_OBJECT_NAME: Label Output. (line 114) |
| * ASM_DECLARE_REGISTER_GLOBAL: Label Output. (line 143) |
| * ASM_DECLARE_UNRESOLVED_REFERENCE: Label Output. (line 443) |
| * ASM_FINAL_SPEC: Driver. (line 144) |
| * ASM_FINISH_DECLARE_OBJECT: Label Output. (line 151) |
| * ASM_FORMAT_PRIVATE_NAME: Label Output. (line 355) |
| * asm_fprintf: Instruction Output. (line 136) |
| * ASM_FPRINTF_EXTENSIONS: Instruction Output. (line 147) |
| * ASM_GENERATE_INTERNAL_LABEL: Label Output. (line 339) |
| * asm_input: Side Effects. (line 284) |
| * asm_input and /v: Flags. (line 94) |
| * ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX: Exception Handling. (line 82) |
| * ASM_NO_SKIP_IN_TEXT: Alignment Output. (line 72) |
| * asm_noperands: Insns. (line 307) |
| * asm_operands and /v: Flags. (line 94) |
| * asm_operands, RTL sharing: Sharing. (line 45) |
| * asm_operands, usage: Assembler. (line 6) |
| * ASM_OUTPUT_ADDR_DIFF_ELT: Dispatch Tables. (line 9) |
| * ASM_OUTPUT_ADDR_VEC_ELT: Dispatch Tables. (line 26) |
| * ASM_OUTPUT_ALIGN: Alignment Output. (line 79) |
| * ASM_OUTPUT_ALIGN_WITH_NOP: Alignment Output. (line 84) |
| * ASM_OUTPUT_ALIGNED_BSS: Uninitialized Data. (line 71) |
| * ASM_OUTPUT_ALIGNED_COMMON: Uninitialized Data. (line 30) |
| * ASM_OUTPUT_ALIGNED_DECL_COMMON: Uninitialized Data. (line 38) |
| * ASM_OUTPUT_ALIGNED_DECL_LOCAL: Uninitialized Data. (line 102) |
| * ASM_OUTPUT_ALIGNED_LOCAL: Uninitialized Data. (line 94) |
| * ASM_OUTPUT_ASCII: Data Output. (line 50) |
| * ASM_OUTPUT_BSS: Uninitialized Data. (line 46) |
| * ASM_OUTPUT_CASE_END: Dispatch Tables. (line 51) |
| * ASM_OUTPUT_CASE_LABEL: Dispatch Tables. (line 38) |
| * ASM_OUTPUT_COMMON: Uninitialized Data. (line 10) |
| * ASM_OUTPUT_DEBUG_LABEL: Label Output. (line 327) |
| * ASM_OUTPUT_DEF: Label Output. (line 376) |
| * ASM_OUTPUT_DEF_FROM_DECLS: Label Output. (line 384) |
| * ASM_OUTPUT_DWARF_DELTA: SDB and DWARF. (line 42) |
| * ASM_OUTPUT_DWARF_OFFSET: SDB and DWARF. (line 46) |
| * ASM_OUTPUT_DWARF_PCREL: SDB and DWARF. (line 52) |
| * ASM_OUTPUT_DWARF_TABLE_REF: SDB and DWARF. (line 57) |
| * ASM_OUTPUT_EXTERNAL: Label Output. (line 264) |
| * ASM_OUTPUT_FDESC: Data Output. (line 59) |
| * ASM_OUTPUT_IDENT: File Framework. (line 100) |
| * ASM_OUTPUT_INTERNAL_LABEL: Label Output. (line 17) |
| * ASM_OUTPUT_LABEL: Label Output. (line 9) |
| * ASM_OUTPUT_LABEL_REF: Label Output. (line 300) |
| * ASM_OUTPUT_LABELREF: Label Output. (line 286) |
| * ASM_OUTPUT_LOCAL: Uninitialized Data. (line 81) |
| * ASM_OUTPUT_MAX_SKIP_ALIGN: Alignment Output. (line 88) |
| * ASM_OUTPUT_MEASURED_SIZE: Label Output. (line 41) |
| * ASM_OUTPUT_OPCODE: Instruction Output. (line 21) |
| * ASM_OUTPUT_POOL_EPILOGUE: Data Output. (line 109) |
| * ASM_OUTPUT_POOL_PROLOGUE: Data Output. (line 72) |
| * ASM_OUTPUT_REG_POP: Instruction Output. (line 191) |
| * ASM_OUTPUT_REG_PUSH: Instruction Output. (line 186) |
| * ASM_OUTPUT_SIZE_DIRECTIVE: Label Output. (line 35) |
| * ASM_OUTPUT_SKIP: Alignment Output. (line 66) |
| * ASM_OUTPUT_SOURCE_FILENAME: File Framework. (line 85) |
| * ASM_OUTPUT_SPECIAL_POOL_ENTRY: Data Output. (line 84) |
| * ASM_OUTPUT_SYMBOL_REF: Label Output. (line 293) |
| * ASM_OUTPUT_TYPE_DIRECTIVE: Label Output. (line 77) |
| * ASM_OUTPUT_WEAK_ALIAS: Label Output. (line 402) |
| * ASM_OUTPUT_WEAKREF: Label Output. (line 203) |
| * ASM_PREFERRED_EH_DATA_FORMAT: Exception Handling. (line 67) |
| * ASM_SPEC: Driver. (line 136) |
| * ASM_STABD_OP: DBX Options. (line 36) |
| * ASM_STABN_OP: DBX Options. (line 43) |
| * ASM_STABS_OP: DBX Options. (line 29) |
| * ASM_WEAKEN_DECL: Label Output. (line 195) |
| * ASM_WEAKEN_LABEL: Label Output. (line 182) |
| * assemble_name: Label Output. (line 8) |
| * assemble_name_raw: Label Output. (line 16) |
| * assembler format: File Framework. (line 6) |
| * assembler instructions in RTL: Assembler. (line 6) |
| * ASSEMBLER_DIALECT: Instruction Output. (line 159) |
| * assigning attribute values to insns: Tagging Insns. (line 6) |
| * asterisk in template: Output Statement. (line 29) |
| * atan2M3 instruction pattern: Standard Names. (line 522) |
| * attr <1>: Tagging Insns. (line 54) |
| * attr: Expressions. (line 154) |
| * attr_flag: Expressions. (line 119) |
| * attribute expressions: Expressions. (line 6) |
| * attribute specifications: Attr Example. (line 6) |
| * attribute specifications example: Attr Example. (line 6) |
| * ATTRIBUTE_ALIGNED_VALUE: Storage Layout. (line 184) |
| * attributes: Attributes. (line 6) |
| * attributes, defining: Defining Attributes. |
| (line 6) |
| * attributes, target-specific: Target Attributes. (line 6) |
| * autoincrement addressing, availability: Portability. (line 21) |
| * autoincrement/decrement addressing: Simple Constraints. (line 30) |
| * automata_option: Processor pipeline description. |
| (line 301) |
| * automaton based pipeline description: Processor pipeline description. |
| (line 6) |
| * automaton based scheduler: Processor pipeline description. |
| (line 6) |
| * AVOID_CCMODE_COPIES: Values in Registers. |
| (line 153) |
| * backslash: Output Template. (line 46) |
| * barrier: Insns. (line 160) |
| * barrier and /f: Flags. (line 125) |
| * barrier and /v: Flags. (line 44) |
| * BASE_REG_CLASS: Register Classes. (line 107) |
| * basic block: Basic Blocks. (line 6) |
| * Basic Statements: Basic Statements. (line 6) |
| * basic-block.h: Control Flow. (line 6) |
| * BASIC_BLOCK: Basic Blocks. (line 19) |
| * basic_block: Basic Blocks. (line 6) |
| * BB_HEAD, BB_END: Maintaining the CFG. |
| (line 88) |
| * bb_seq: GIMPLE sequences. (line 73) |
| * BIGGEST_ALIGNMENT: Storage Layout. (line 174) |
| * BIGGEST_FIELD_ALIGNMENT: Storage Layout. (line 195) |
| * BImode: Machine Modes. (line 22) |
| * BIND_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * BINFO_TYPE: Classes. (line 6) |
| * bit-fields: Bit-Fields. (line 6) |
| * 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) |
| * BITFIELD_NBYTES_LIMITED: Storage Layout. (line 383) |
| * BITS_BIG_ENDIAN: Storage Layout. (line 12) |
| * BITS_BIG_ENDIAN, effect on sign_extract: Bit-Fields. (line 8) |
| * BITS_PER_UNIT: Storage Layout. (line 52) |
| * BITS_PER_WORD: Storage Layout. (line 57) |
| * bitwise complement: Arithmetic. (line 149) |
| * bitwise exclusive-or: Arithmetic. (line 163) |
| * bitwise inclusive-or: Arithmetic. (line 158) |
| * bitwise logical-and: Arithmetic. (line 153) |
| * BLKmode: Machine Modes. (line 183) |
| * BLKmode, and function return values: Calls. (line 23) |
| * block statement iterators <1>: Maintaining the CFG. |
| (line 45) |
| * block statement iterators: Basic Blocks. (line 68) |
| * BLOCK_FOR_INSN, bb_for_stmt: Maintaining the CFG. |
| (line 40) |
| * BLOCK_REG_PADDING: Register Arguments. (line 229) |
| * blockage instruction pattern: Standard Names. (line 1376) |
| * Blocks: Blocks. (line 6) |
| * bool: Misc. (line 876) |
| * BOOL_TYPE_SIZE: Type Layout. (line 44) |
| * BOOLEAN_TYPE: Types. (line 6) |
| * branch prediction: Profile information. |
| (line 24) |
| * BRANCH_COST: Costs. (line 52) |
| * break_out_memory_refs: Addressing Modes. (line 131) |
| * BREAK_STMT: Statements for C++. (line 6) |
| * bsi_commit_edge_inserts: Maintaining the CFG. |
| (line 118) |
| * bsi_end_p: Maintaining the CFG. |
| (line 60) |
| * bsi_insert_after: Maintaining the CFG. |
| (line 72) |
| * bsi_insert_before: Maintaining the CFG. |
| (line 78) |
| * bsi_insert_on_edge: Maintaining the CFG. |
| (line 118) |
| * bsi_last: Maintaining the CFG. |
| (line 56) |
| * bsi_next: Maintaining the CFG. |
| (line 64) |
| * bsi_prev: Maintaining the CFG. |
| (line 68) |
| * bsi_remove: Maintaining the CFG. |
| (line 84) |
| * bsi_start: Maintaining the CFG. |
| (line 52) |
| * BSS_SECTION_ASM_OP: Sections. (line 68) |
| * bswap: Arithmetic. (line 236) |
| * btruncM2 instruction pattern: Standard Names. (line 540) |
| * 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 1279) |
| * builtin_setjmp_receiver instruction pattern: Standard Names. |
| (line 1269) |
| * builtin_setjmp_setup instruction pattern: Standard Names. (line 1258) |
| * byte_mode: Machine Modes. (line 336) |
| * BYTES_BIG_ENDIAN: Storage Layout. (line 24) |
| * BYTES_BIG_ENDIAN, effect on subreg: Regs and Memory. (line 221) |
| * C statements for assembler output: Output Statement. (line 6) |
| * C99 math functions, implicit usage: Library Calls. (line 76) |
| * C_COMMON_OVERRIDE_OPTIONS: Run-time Target. (line 128) |
| * c_register_pragma: Misc. (line 404) |
| * c_register_pragma_with_expansion: Misc. (line 406) |
| * call <1>: Side Effects. (line 86) |
| * call: Flags. (line 239) |
| * call instruction pattern: Standard Names. (line 933) |
| * call usage: Calls. (line 10) |
| * call, in call_insn: Flags. (line 33) |
| * call, in mem: Flags. (line 99) |
| * call-clobbered register: Register Basics. (line 35) |
| * call-saved register: Register Basics. (line 35) |
| * call-used register: Register Basics. (line 35) |
| * 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 125) |
| * call_insn and /i: Flags. (line 24) |
| * call_insn and /j: Flags. (line 179) |
| * call_insn and /s: Flags. (line 49) |
| * call_insn and /u: Flags. (line 19) |
| * 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 961) |
| * CALL_POPS_ARGS: Stack Arguments. (line 130) |
| * CALL_REALLY_USED_REGISTERS: Register Basics. (line 46) |
| * CALL_USED_REGISTERS: Register Basics. (line 35) |
| * call_used_regs: Register Basics. (line 59) |
| * call_value instruction pattern: Standard Names. (line 953) |
| * call_value_pop instruction pattern: Standard Names. (line 961) |
| * CALLER_SAVE_PROFITABLE: Caller Saves. (line 11) |
| * calling conventions: Stack and Calling. (line 6) |
| * calling functions in RTL: Calls. (line 6) |
| * can_create_pseudo_p: Standard Names. (line 75) |
| * CAN_DEBUG_WITHOUT_FP: Run-time Target. (line 160) |
| * can_fallthru: Basic Blocks. (line 57) |
| * canadian: Configure Terms. (line 6) |
| * CANNOT_CHANGE_MODE_CLASS: Register Classes. (line 496) |
| * CANNOT_CHANGE_MODE_CLASS and subreg semantics: Regs and Memory. |
| (line 280) |
| * canonicalization of instructions: Insn Canonicalizations. |
| (line 6) |
| * CANONICALIZE_COMPARISON: MODE_CC Condition Codes. |
| (line 55) |
| * canonicalize_funcptr_for_compare instruction pattern: Standard Names. |
| (line 1117) |
| * CASE_USE_BIT_TESTS: Misc. (line 54) |
| * CASE_VECTOR_MODE: Misc. (line 27) |
| * CASE_VECTOR_PC_RELATIVE: Misc. (line 40) |
| * CASE_VECTOR_SHORTEN_MODE: Misc. (line 31) |
| * casesi instruction pattern: Standard Names. (line 1041) |
| * cbranchMODE4 instruction pattern: Standard Names. (line 922) |
| * cc0 <1>: CC0 Condition Codes. |
| (line 6) |
| * cc0: Regs and Memory. (line 307) |
| * cc0, RTL sharing: Sharing. (line 27) |
| * cc0_rtx: Regs and Memory. (line 333) |
| * CC1_SPEC: Driver. (line 118) |
| * CC1PLUS_SPEC: Driver. (line 126) |
| * cc_status: CC0 Condition Codes. |
| (line 6) |
| * CC_STATUS_MDEP: CC0 Condition Codes. |
| (line 17) |
| * CC_STATUS_MDEP_INIT: CC0 Condition Codes. |
| (line 23) |
| * CCmode <1>: MODE_CC Condition Codes. |
| (line 6) |
| * CCmode: Machine Modes. (line 176) |
| * CDImode: Machine Modes. (line 202) |
| * CEIL_DIV_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * CEIL_MOD_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * ceilM2 instruction pattern: Standard Names. (line 556) |
| * CFA_FRAME_BASE_OFFSET: Frame Layout. (line 226) |
| * CFG, Control Flow Graph: Control Flow. (line 6) |
| * cfghooks.h: Maintaining the CFG. |
| (line 6) |
| * cgraph_finalize_function: Parsing pass. (line 52) |
| * chain_circular: GTY Options. (line 196) |
| * chain_next: GTY Options. (line 196) |
| * chain_prev: GTY Options. (line 196) |
| * change_address: Standard Names. (line 47) |
| * char: GIMPLE_ASM. (line 53) |
| * CHAR_TYPE_SIZE: Type Layout. (line 39) |
| * check_stack instruction pattern: Standard Names. (line 1204) |
| * CHImode: Machine Modes. (line 202) |
| * class definitions, register: Register Classes. (line 6) |
| * class preference constraints: Class Preferences. (line 6) |
| * class, scope: Classes. (line 6) |
| * CLASS_LIKELY_SPILLED_P: Register Classes. (line 467) |
| * CLASS_MAX_NREGS: Register Classes. (line 484) |
| * CLASS_TYPE_P: Types for C++. (line 65) |
| * 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) |
| * 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) |
| * Cleanups: Cleanups. (line 6) |
| * CLEAR_BY_PIECES_P: Costs. (line 136) |
| * clear_cache instruction pattern: Standard Names. (line 1520) |
| * CLEAR_INSN_CACHE: Trampolines. (line 99) |
| * CLEAR_RATIO: Costs. (line 124) |
| * clobber: Side Effects. (line 100) |
| * clz: Arithmetic. (line 212) |
| * CLZ_DEFINED_VALUE_AT_ZERO: Misc. (line 319) |
| * clzM2 instruction pattern: Standard Names. (line 621) |
| * cmpmemM instruction pattern: Standard Names. (line 751) |
| * cmpstrM instruction pattern: Standard Names. (line 732) |
| * cmpstrnM instruction pattern: Standard Names. (line 720) |
| * code generation RTL sequences: Expander Definitions. |
| (line 6) |
| * code iterators in .md files: Code Iterators. (line 6) |
| * code_label: Insns. (line 119) |
| * code_label and /i: Flags. (line 59) |
| * code_label and /v: Flags. (line 44) |
| * CODE_LABEL_NUMBER: Insns. (line 119) |
| * codes, RTL expression: RTL Objects. (line 47) |
| * COImode: Machine Modes. (line 202) |
| * COLLECT2_HOST_INITIALIZATION: Host Misc. (line 32) |
| * COLLECT_EXPORT_LIST: Misc. (line 783) |
| * COLLECT_SHARED_FINI_FUNC: Macros for Initialization. |
| (line 44) |
| * COLLECT_SHARED_INIT_FUNC: Macros for Initialization. |
| (line 33) |
| * commit_edge_insertions: Maintaining the CFG. |
| (line 118) |
| * compare: Arithmetic. (line 43) |
| * compare, canonicalization of: Insn Canonicalizations. |
| (line 37) |
| * comparison_operator: Machine-Independent Predicates. |
| (line 111) |
| * compiler passes and files: Passes. (line 6) |
| * complement, bitwise: Arithmetic. (line 149) |
| * 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 367) |
| * COMPOUND_LITERAL_EXPR_DECL_EXPR: Unary and Binary Expressions. |
| (line 367) |
| * computed jump: Edges. (line 128) |
| * computing the length of an insn: Insn Lengths. (line 6) |
| * concat: Regs and Memory. (line 385) |
| * concatn: Regs and Memory. (line 391) |
| * cond: Comparisons. (line 90) |
| * cond and attributes: Expressions. (line 37) |
| * cond_exec: Side Effects. (line 248) |
| * COND_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * condition code register: Regs and Memory. (line 307) |
| * condition code status: Condition Code. (line 6) |
| * condition codes: Comparisons. (line 20) |
| * conditional execution <1>: Cond. Exec. Macros. (line 6) |
| * conditional execution: Conditional Execution. |
| (line 6) |
| * Conditional Expressions: Conditional Expressions. |
| (line 6) |
| * CONDITIONAL_REGISTER_USAGE: Register Basics. (line 60) |
| * conditions, in patterns: Patterns. (line 43) |
| * configuration file <1>: Host Misc. (line 6) |
| * configuration file: Filesystem. (line 6) |
| * configure terms: Configure Terms. (line 6) |
| * CONJ_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * const: Constants. (line 99) |
| * CONST0_RTX: Constants. (line 119) |
| * const0_rtx: Constants. (line 16) |
| * CONST1_RTX: Constants. (line 119) |
| * const1_rtx: Constants. (line 16) |
| * CONST2_RTX: Constants. (line 119) |
| * const2_rtx: Constants. (line 16) |
| * CONST_DECL: Declarations. (line 6) |
| * const_double: Constants. (line 32) |
| * const_double, RTL sharing: Sharing. (line 29) |
| * CONST_DOUBLE_LOW: Constants. (line 39) |
| * CONST_DOUBLE_OK_FOR_CONSTRAINT_P: Old Constraints. (line 69) |
| * CONST_DOUBLE_OK_FOR_LETTER_P: Old Constraints. (line 54) |
| * const_double_operand: Machine-Independent Predicates. |
| (line 21) |
| * const_fixed: Constants. (line 52) |
| * 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 16) |
| * CONST_OK_FOR_CONSTRAINT_P: Old Constraints. (line 49) |
| * CONST_OK_FOR_LETTER_P: Old Constraints. (line 40) |
| * const_string: Constants. (line 71) |
| * const_string and attributes: Expressions. (line 20) |
| * const_true_rtx: Constants. (line 26) |
| * const_vector: Constants. (line 59) |
| * const_vector, RTL sharing: Sharing. (line 32) |
| * constant attributes: Constant Attributes. |
| (line 6) |
| * constant definitions: Constant Definitions. |
| (line 6) |
| * CONSTANT_ADDRESS_P: Addressing Modes. (line 29) |
| * CONSTANT_ALIGNMENT: Storage Layout. (line 242) |
| * CONSTANT_P: Addressing Modes. (line 36) |
| * CONSTANT_POOL_ADDRESS_P: Flags. (line 10) |
| * CONSTANT_POOL_BEFORE_FUNCTION: Data Output. (line 64) |
| * constants in constraints: Simple Constraints. (line 60) |
| * constm1_rtx: Constants. (line 16) |
| * constraint modifier characters: Modifiers. (line 6) |
| * constraint, matching: Simple Constraints. (line 132) |
| * CONSTRAINT_LEN: Old Constraints. (line 12) |
| * constraint_num: C Constraint Interface. |
| (line 38) |
| * constraint_satisfied_p: C Constraint Interface. |
| (line 54) |
| * 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) |
| * CONSTRUCTOR: Unary and Binary Expressions. |
| (line 6) |
| * constructors, automatic calls: Collect2. (line 15) |
| * constructors, output of: Initialization. (line 6) |
| * container: Containers. (line 6) |
| * CONTINUE_STMT: Statements for C++. (line 6) |
| * contributors: Contributors. (line 6) |
| * controlling register usage: Register Basics. (line 76) |
| * 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) |
| * copy_rtx: Addressing Modes. (line 184) |
| * copy_rtx_if_shared: Sharing. (line 64) |
| * copysignM3 instruction pattern: Standard Names. (line 602) |
| * cosM2 instruction pattern: Standard Names. (line 481) |
| * costs of instructions: Costs. (line 6) |
| * CP_INTEGRAL_TYPE: Types for C++. (line 57) |
| * 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_RESTRICT_P: Types for C++. (line 30) |
| * CP_TYPE_VOLATILE_P: Types for C++. (line 27) |
| * CPLUSPLUS_CPP_SPEC: Driver. (line 113) |
| * CPP_SPEC: Driver. (line 106) |
| * CQImode: Machine Modes. (line 202) |
| * cross compilation and floating point: Floating Point. (line 6) |
| * CRT_CALL_STATIC_FUNCTION: Sections. (line 122) |
| * CRTSTUFF_T_CFLAGS: Target Fragment. (line 35) |
| * CRTSTUFF_T_CFLAGS_S: Target Fragment. (line 39) |
| * CSImode: Machine Modes. (line 202) |
| * cstoreMODE4 instruction pattern: Standard Names. (line 893) |
| * CTImode: Machine Modes. (line 202) |
| * ctrapMM4 instruction pattern: Standard Names. (line 1345) |
| * ctz: Arithmetic. (line 220) |
| * CTZ_DEFINED_VALUE_AT_ZERO: Misc. (line 320) |
| * ctzM2 instruction pattern: Standard Names. (line 630) |
| * CUMULATIVE_ARGS: Register Arguments. (line 127) |
| * current_function_epilogue_delay_list: Function Entry. (line 181) |
| * current_function_is_leaf: Leaf Functions. (line 51) |
| * current_function_outgoing_args_size: Stack Arguments. (line 45) |
| * current_function_pops_args: Function Entry. (line 106) |
| * current_function_pretend_args_size: Function Entry. (line 112) |
| * current_function_uses_only_leaf_regs: Leaf Functions. (line 51) |
| * current_insn_predicate: Conditional Execution. |
| (line 26) |
| * DAmode: Machine Modes. (line 152) |
| * data bypass: Processor pipeline description. |
| (line 106) |
| * data dependence delays: Processor pipeline description. |
| (line 6) |
| * Data Dependency Analysis: Dependency analysis. |
| (line 6) |
| * data structures: Per-Function Data. (line 6) |
| * DATA_ALIGNMENT: Storage Layout. (line 229) |
| * DATA_SECTION_ASM_OP: Sections. (line 53) |
| * DBR_OUTPUT_SEQEND: Instruction Output. (line 120) |
| * dbr_sequence_length: Instruction Output. (line 119) |
| * DBX_BLOCKS_FUNCTION_RELATIVE: DBX Options. (line 103) |
| * DBX_CONTIN_CHAR: DBX Options. (line 66) |
| * DBX_CONTIN_LENGTH: DBX Options. (line 56) |
| * DBX_DEBUGGING_INFO: DBX Options. (line 9) |
| * DBX_FUNCTION_FIRST: DBX Options. (line 97) |
| * DBX_LINES_FUNCTION_RELATIVE: DBX Options. (line 109) |
| * DBX_NO_XREFS: DBX Options. (line 50) |
| * DBX_OUTPUT_LBRAC: DBX Hooks. (line 9) |
| * DBX_OUTPUT_MAIN_SOURCE_FILE_END: File Names and DBX. (line 34) |
| * DBX_OUTPUT_MAIN_SOURCE_FILENAME: File Names and DBX. (line 9) |
| * DBX_OUTPUT_NFUN: DBX Hooks. (line 18) |
| * DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END: File Names and DBX. |
| (line 42) |
| * DBX_OUTPUT_RBRAC: DBX Hooks. (line 15) |
| * DBX_OUTPUT_SOURCE_LINE: DBX Hooks. (line 22) |
| * DBX_REGISTER_NUMBER: All Debuggers. (line 9) |
| * DBX_REGPARM_STABS_CODE: DBX Options. (line 87) |
| * DBX_REGPARM_STABS_LETTER: DBX Options. (line 92) |
| * DBX_STATIC_CONST_VAR_CODE: DBX Options. (line 82) |
| * DBX_STATIC_STAB_DATA_SECTION: DBX Options. (line 73) |
| * DBX_TYPE_DECL_STABS_CODE: DBX Options. (line 78) |
| * DBX_USE_BINCL: DBX Options. (line 115) |
| * DCmode: Machine Modes. (line 197) |
| * DDmode: Machine Modes. (line 90) |
| * De Morgan's law: Insn Canonicalizations. |
| (line 52) |
| * dead_or_set_p: define_peephole. (line 65) |
| * debug_expr: Debug Information. (line 22) |
| * DEBUG_EXPR_DECL: Declarations. (line 6) |
| * debug_insn: Insns. (line 239) |
| * DEBUG_SYMS_TEXT: DBX Options. (line 25) |
| * DEBUGGER_ARG_OFFSET: All Debuggers. (line 37) |
| * DEBUGGER_AUTO_OFFSET: All Debuggers. (line 28) |
| * decimal float library: Decimal float library routines. |
| (line 6) |
| * 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 <1>: Function Properties. |
| (line 47) |
| * DECL_ARTIFICIAL <2>: Function Basics. (line 6) |
| * DECL_ARTIFICIAL: Working with declarations. |
| (line 24) |
| * DECL_ASSEMBLER_NAME: Function Basics. (line 6) |
| * DECL_ATTRIBUTES: Attributes. (line 22) |
| * 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_CONST_MEMFUNC_P: Functions for C++. (line 71) |
| * DECL_CONSTRUCTOR_P: Functions for C++. (line 77) |
| * 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_EXTERN_C_FUNCTION_P: Functions for C++. (line 46) |
| * DECL_EXTERNAL <1>: Function Properties. |
| (line 25) |
| * DECL_EXTERNAL: Declarations. (line 6) |
| * DECL_FUNCTION_MEMBER_P: Functions for C++. (line 61) |
| * DECL_FUNCTION_SPECIFIC_OPTIMIZATION <1>: Function Properties. |
| (line 61) |
| * DECL_FUNCTION_SPECIFIC_OPTIMIZATION: Function Basics. (line 6) |
| * DECL_FUNCTION_SPECIFIC_TARGET <1>: Function Properties. |
| (line 55) |
| * DECL_FUNCTION_SPECIFIC_TARGET: Function Basics. (line 6) |
| * DECL_GLOBAL_CTOR_P: Functions for C++. (line 108) |
| * DECL_GLOBAL_DTOR_P: Functions for C++. (line 112) |
| * DECL_INITIAL <1>: Function Basics. (line 51) |
| * DECL_INITIAL: Declarations. (line 6) |
| * 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 <1>: Namespaces. (line 20) |
| * DECL_NAME <2>: Function Basics. (line 6) |
| * DECL_NAME: Working with declarations. |
| (line 7) |
| * DECL_NAMESPACE_ALIAS: Namespaces. (line 35) |
| * DECL_NAMESPACE_STD_P: Namespaces. (line 45) |
| * DECL_NON_THUNK_FUNCTION_P: Functions for C++. (line 138) |
| * DECL_NONCONVERTING_P: Functions for C++. (line 80) |
| * DECL_NONSTATIC_MEMBER_FUNCTION_P: Functions for C++. (line 68) |
| * 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) |
| * declaration: Declarations. (line 6) |
| * declarations, RTL: RTL Declarations. (line 6) |
| * DECLARE_LIBRARY_RENAMES: Library Calls. (line 9) |
| * decrement_and_branch_until_zero instruction pattern: Standard Names. |
| (line 1079) |
| * def_optype_d: Manipulating GIMPLE statements. |
| (line 94) |
| * default: GTY Options. (line 82) |
| * default_file_start: File Framework. (line 8) |
| * DEFAULT_GDB_EXTENSIONS: DBX Options. (line 18) |
| * DEFAULT_PCC_STRUCT_RETURN: Aggregate Return. (line 35) |
| * DEFAULT_SIGNED_CHAR: Type Layout. (line 154) |
| * define_address_constraint: Define Constraints. (line 107) |
| * 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 197) |
| * 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 48) |
| * define_cpu_unit: Processor pipeline description. |
| (line 68) |
| * define_delay: Delay Slots. (line 25) |
| * 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 106) |
| * define_memory_constraint: Define Constraints. (line 88) |
| * 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 28) |
| * define_reservation: Processor pipeline description. |
| (line 186) |
| * define_special_predicate: Defining Predicates. |
| (line 6) |
| * define_split: Insn Splitting. (line 32) |
| * 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) |
| * DELAY_SLOTS_FOR_EPILOGUE: Function Entry. (line 163) |
| * deletable: GTY Options. (line 150) |
| * 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) |
| * DF_SIZE: Type Layout. (line 130) |
| * DFmode: Machine Modes. (line 73) |
| * digits in constraint: Simple Constraints. (line 120) |
| * DImode: Machine Modes. (line 45) |
| * DIR_SEPARATOR: Filesystem. (line 18) |
| * DIR_SEPARATOR_2: Filesystem. (line 19) |
| * directory options .md: Including Patterns. (line 44) |
| * disabling certain registers: Register Basics. (line 76) |
| * dispatch table: Dispatch Tables. (line 8) |
| * div: Arithmetic. (line 111) |
| * div and attributes: Expressions. (line 64) |
| * division: Arithmetic. (line 111) |
| * divM3 instruction pattern: Standard Names. (line 222) |
| * divmodM4 instruction pattern: Standard Names. (line 411) |
| * DO_BODY: Statements for C++. (line 6) |
| * DO_COND: Statements for C++. (line 6) |
| * DO_STMT: Statements for C++. (line 6) |
| * DOLLARS_IN_IDENTIFIERS: Misc. (line 491) |
| * doloop_begin instruction pattern: Standard Names. (line 1110) |
| * doloop_end instruction pattern: Standard Names. (line 1089) |
| * DONE: Expander Definitions. |
| (line 74) |
| * DONT_USE_BUILTIN_SETJMP: Exception Region Output. |
| (line 70) |
| * DOUBLE_TYPE_SIZE: Type Layout. (line 53) |
| * DQmode: Machine Modes. (line 115) |
| * driver: Driver. (line 6) |
| * DRIVER_SELF_SPECS: Driver. (line 71) |
| * DUMPFILE_FORMAT: Filesystem. (line 67) |
| * DWARF2_ASM_LINE_DEBUG_INFO: SDB and DWARF. (line 36) |
| * DWARF2_DEBUGGING_INFO: SDB and DWARF. (line 13) |
| * DWARF2_FRAME_INFO: SDB and DWARF. (line 30) |
| * DWARF2_FRAME_REG_OUT: Frame Registers. (line 136) |
| * DWARF2_UNWIND_INFO: Exception Region Output. |
| (line 40) |
| * DWARF_ALT_FRAME_RETURN_COLUMN: Frame Layout. (line 152) |
| * DWARF_CIE_DATA_ALIGNMENT: Exception Region Output. |
| (line 75) |
| * DWARF_FRAME_REGISTERS: Frame Registers. (line 96) |
| * DWARF_FRAME_REGNUM: Frame Registers. (line 128) |
| * DWARF_REG_TO_UNWIND_COLUMN: Frame Registers. (line 120) |
| * DWARF_ZERO_REG: Frame Layout. (line 163) |
| * DYNAMIC_CHAIN_ADDRESS: Frame Layout. (line 92) |
| * E in constraint: Simple Constraints. (line 79) |
| * 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 118) |
| * EDGE_ABNORMAL: Edges. (line 128) |
| * EDGE_ABNORMAL, EDGE_ABNORMAL_CALL: Edges. (line 171) |
| * EDGE_ABNORMAL, EDGE_EH: Edges. (line 96) |
| * EDGE_ABNORMAL, EDGE_SIBCALL: Edges. (line 122) |
| * EDGE_FALLTHRU, force_nonfallthru: Edges. (line 86) |
| * EDOM, implicit usage: Library Calls. (line 58) |
| * EH_FRAME_IN_DATA_SECTION: Exception Region Output. |
| (line 20) |
| * EH_FRAME_SECTION_NAME: Exception Region Output. |
| (line 10) |
| * eh_return instruction pattern: Standard Names. (line 1285) |
| * EH_RETURN_DATA_REGNO: Exception Handling. (line 7) |
| * EH_RETURN_HANDLER_RTX: Exception Handling. (line 39) |
| * EH_RETURN_STACKADJ_RTX: Exception Handling. (line 22) |
| * EH_TABLES_CAN_BE_READ_ONLY: Exception Region Output. |
| (line 29) |
| * EH_USES: Function Entry. (line 158) |
| * 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) |
| * ELIGIBLE_FOR_EPILOGUE_DELAY: Function Entry. (line 169) |
| * ELIMINABLE_REGS: Elimination. (line 47) |
| * 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 296) |
| * Emulated TLS: Emulated TLS. (line 6) |
| * ENABLE_EXECUTE_STACK: Trampolines. (line 109) |
| * enabled: Disable Insn Alternatives. |
| (line 6) |
| * ENDFILE_SPEC: Driver. (line 218) |
| * endianness: Portability. (line 21) |
| * ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR: Basic Blocks. (line 28) |
| * enum machine_mode: Machine Modes. (line 6) |
| * enum reg_class: Register Classes. (line 65) |
| * ENUMERAL_TYPE: Types. (line 6) |
| * epilogue: Function Entry. (line 6) |
| * epilogue instruction pattern: Standard Names. (line 1317) |
| * EPILOGUE_USES: Function Entry. (line 152) |
| * eq: Comparisons. (line 52) |
| * eq and attributes: Expressions. (line 64) |
| * eq_attr: Expressions. (line 85) |
| * EQ_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * equal: Comparisons. (line 52) |
| * errno, implicit usage: Library Calls. (line 70) |
| * EXACT_DIV_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * examining SSA_NAMEs: SSA. (line 218) |
| * exception handling <1>: Exception Handling. (line 6) |
| * exception handling: Edges. (line 96) |
| * exception_receiver instruction pattern: Standard Names. (line 1249) |
| * exclamation point: Multi-Alternative. (line 47) |
| * exclusion_set: Processor pipeline description. |
| (line 220) |
| * exclusive-or, bitwise: Arithmetic. (line 163) |
| * EXIT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * EXIT_IGNORE_STACK: Function Entry. (line 140) |
| * expander definitions: Expander Definitions. |
| (line 6) |
| * expM2 instruction pattern: Standard Names. (line 497) |
| * EXPR_FILENAME: Working with declarations. |
| (line 14) |
| * EXPR_LINENO: Working with declarations. |
| (line 20) |
| * expr_list: Insns. (line 545) |
| * EXPR_STMT: Statements for C++. (line 6) |
| * EXPR_STMT_EXPR: Statements for C++. (line 6) |
| * expression: Expression trees. (line 6) |
| * expression codes: RTL Objects. (line 47) |
| * extendMN2 instruction pattern: Standard Names. (line 808) |
| * extensible constraints: Simple Constraints. (line 163) |
| * EXTRA_ADDRESS_CONSTRAINT: Old Constraints. (line 123) |
| * EXTRA_CONSTRAINT: Old Constraints. (line 74) |
| * EXTRA_CONSTRAINT_STR: Old Constraints. (line 95) |
| * EXTRA_MEMORY_CONSTRAINT: Old Constraints. (line 100) |
| * EXTRA_SPECS: Driver. (line 245) |
| * extv instruction pattern: Standard Names. (line 844) |
| * extzv instruction pattern: Standard Names. (line 859) |
| * F in constraint: Simple Constraints. (line 84) |
| * FAIL: Expander Definitions. |
| (line 80) |
| * fall-thru: Edges. (line 69) |
| * 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 206) |
| * ffsM2 instruction pattern: Standard Names. (line 611) |
| * FIELD_DECL: Declarations. (line 6) |
| * file_end_indicate_exec_stack: File Framework. (line 41) |
| * files and passes of the compiler: Passes. (line 6) |
| * files, generated: Files. (line 6) |
| * final_absence_set: Processor pipeline description. |
| (line 220) |
| * FINAL_PRESCAN_INSN: Instruction Output. (line 46) |
| * final_presence_set: Processor pipeline description. |
| (line 220) |
| * final_scan_insn: Function Entry. (line 181) |
| * final_sequence: Instruction Output. (line 130) |
| * FIND_BASE_TERM: Addressing Modes. (line 115) |
| * FINI_ARRAY_SECTION_ASM_OP: Sections. (line 115) |
| * FINI_SECTION_ASM_OP: Sections. (line 100) |
| * finite state automaton minimization: Processor pipeline description. |
| (line 301) |
| * FIRST_PARM_OFFSET: Frame Layout. (line 67) |
| * FIRST_PARM_OFFSET and virtual registers: Regs and Memory. (line 65) |
| * FIRST_PSEUDO_REGISTER: Register Basics. (line 9) |
| * FIRST_STACK_REG: Stack Registers. (line 27) |
| * FIRST_VIRTUAL_REGISTER: Regs and Memory. (line 51) |
| * fix: Conversions. (line 66) |
| * FIX_TRUNC_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * fix_truncMN2 instruction pattern: Standard Names. (line 795) |
| * 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 15) |
| * fixed_regs: Register Basics. (line 59) |
| * fixMN2 instruction pattern: Standard Names. (line 775) |
| * FIXUNS_TRUNC_LIKE_FIX_TRUNC: Misc. (line 100) |
| * fixuns_truncMN2 instruction pattern: Standard Names. (line 799) |
| * fixunsMN2 instruction pattern: Standard Names. (line 784) |
| * flags in RTL expression: Flags. (line 6) |
| * float: Conversions. (line 58) |
| * FLOAT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * float_extend: Conversions. (line 33) |
| * FLOAT_LIB_COMPARE_RETURNS_BOOL: Library Calls. (line 25) |
| * FLOAT_STORE_FLAG_VALUE: Misc. (line 301) |
| * float_truncate: Conversions. (line 53) |
| * FLOAT_TYPE_SIZE: Type Layout. (line 49) |
| * FLOAT_WORDS_BIG_ENDIAN: Storage Layout. (line 43) |
| * FLOAT_WORDS_BIG_ENDIAN, (lack of) effect on subreg: Regs and Memory. |
| (line 226) |
| * floating point and cross compilation: Floating Point. (line 6) |
| * Floating Point Emulation: Target Fragment. (line 15) |
| * floating point emulation library, US Software GOFAST: Library Calls. |
| (line 44) |
| * floatMN2 instruction pattern: Standard Names. (line 767) |
| * floatunsMN2 instruction pattern: Standard Names. (line 771) |
| * FLOOR_DIV_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * FLOOR_MOD_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * floorM2 instruction pattern: Standard Names. (line 532) |
| * flow-insensitive alias analysis: Alias analysis. (line 6) |
| * flow-sensitive alias analysis: Alias analysis. (line 6) |
| * fmodM3 instruction pattern: Standard Names. (line 463) |
| * 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) |
| * FORCE_CODE_SECTION_ALIGN: Sections. (line 146) |
| * force_reg: Standard Names. (line 36) |
| * fract_convert: Conversions. (line 82) |
| * FRACT_TYPE_SIZE: Type Layout. (line 68) |
| * fractional types: Fixed-point fractional library routines. |
| (line 6) |
| * fractMN2 instruction pattern: Standard Names. (line 817) |
| * fractunsMN2 instruction pattern: Standard Names. (line 832) |
| * frame layout: Frame Layout. (line 6) |
| * FRAME_ADDR_RTX: Frame Layout. (line 116) |
| * FRAME_GROWS_DOWNWARD: Frame Layout. (line 31) |
| * FRAME_GROWS_DOWNWARD and virtual registers: Regs and Memory. |
| (line 69) |
| * FRAME_POINTER_CFA_OFFSET: Frame Layout. (line 212) |
| * frame_pointer_needed: Function Entry. (line 34) |
| * FRAME_POINTER_REGNUM: Frame Registers. (line 14) |
| * FRAME_POINTER_REGNUM and virtual registers: Regs and Memory. |
| (line 74) |
| * frame_pointer_rtx: Frame Registers. (line 90) |
| * frame_related: Flags. (line 247) |
| * frame_related, in insn, call_insn, jump_insn, barrier, and set: Flags. |
| (line 125) |
| * frame_related, in mem: Flags. (line 103) |
| * frame_related, in reg: Flags. (line 112) |
| * frame_related, in symbol_ref: Flags. (line 183) |
| * frequency, count, BB_FREQ_BASE: Profile information. |
| (line 30) |
| * ftruncM2 instruction pattern: Standard Names. (line 790) |
| * function <1>: Functions for C++. (line 6) |
| * function: Functions. (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) |
| * FUNCTION_ARG: Register Arguments. (line 11) |
| * FUNCTION_ARG_ADVANCE: Register Arguments. (line 186) |
| * FUNCTION_ARG_BOUNDARY: Register Arguments. (line 239) |
| * FUNCTION_ARG_OFFSET: Register Arguments. (line 197) |
| * FUNCTION_ARG_PADDING: Register Arguments. (line 204) |
| * FUNCTION_ARG_REGNO_P: Register Arguments. (line 244) |
| * FUNCTION_BOUNDARY: Storage Layout. (line 171) |
| * FUNCTION_DECL <1>: Functions for C++. (line 6) |
| * FUNCTION_DECL: Functions. (line 6) |
| * FUNCTION_INCOMING_ARG: Register Arguments. (line 68) |
| * FUNCTION_MODE: Misc. (line 356) |
| * FUNCTION_OUTGOING_VALUE: Scalar Return. (line 56) |
| * FUNCTION_PROFILER: Profiling. (line 9) |
| * FUNCTION_TYPE: Types. (line 6) |
| * FUNCTION_VALUE: Scalar Return. (line 52) |
| * FUNCTION_VALUE_REGNO_P: Scalar Return. (line 81) |
| * functions, leaf: Leaf Functions. (line 6) |
| * fundamental type: Types. (line 6) |
| * g in constraint: Simple Constraints. (line 110) |
| * G in constraint: Simple Constraints. (line 88) |
| * garbage collector, invocation: Invoking the garbage collector. |
| (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 64) |
| * GE_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * GEN_ERRNO_RTX: Library Calls. (line 71) |
| * gencodes: RTL passes. (line 18) |
| * general_operand: Machine-Independent Predicates. |
| (line 105) |
| * GENERAL_REGS: Register Classes. (line 23) |
| * generated files: Files. (line 6) |
| * generating assembler output: Output Statement. (line 6) |
| * generating insns: RTL Template. (line 6) |
| * GENERIC <1>: GENERIC. (line 6) |
| * GENERIC <2>: Gimplification pass. |
| (line 12) |
| * GENERIC: Parsing pass. (line 6) |
| * generic predicates: Machine-Independent Predicates. |
| (line 6) |
| * genflags: RTL passes. (line 18) |
| * get_attr: Expressions. (line 80) |
| * get_attr_length: Insn Lengths. (line 46) |
| * GET_CLASS_NARROWEST_MODE: Machine Modes. (line 333) |
| * 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 280) |
| * GET_MODE_ALIGNMENT: Machine Modes. (line 320) |
| * GET_MODE_BITSIZE: Machine Modes. (line 304) |
| * GET_MODE_CLASS: Machine Modes. (line 294) |
| * GET_MODE_FBIT: Machine Modes. (line 311) |
| * GET_MODE_IBIT: Machine Modes. (line 307) |
| * GET_MODE_MASK: Machine Modes. (line 315) |
| * GET_MODE_NAME: Machine Modes. (line 291) |
| * GET_MODE_NUNITS: Machine Modes. (line 329) |
| * GET_MODE_SIZE: Machine Modes. (line 301) |
| * GET_MODE_UNIT_SIZE: Machine Modes. (line 323) |
| * GET_MODE_WIDER_MODE: Machine Modes. (line 297) |
| * GET_RTX_CLASS: RTL Classes. (line 6) |
| * GET_RTX_FORMAT: RTL Classes. (line 130) |
| * GET_RTX_LENGTH: RTL Classes. (line 127) |
| * geu: Comparisons. (line 72) |
| * geu and attributes: Expressions. (line 64) |
| * GGC: Type Information. (line 6) |
| * ggc_collect: Invoking the garbage collector. |
| (line 6) |
| * GIMPLE <1>: GIMPLE. (line 6) |
| * GIMPLE <2>: Gimplification pass. |
| (line 6) |
| * GIMPLE: Parsing pass. (line 14) |
| * GIMPLE Exception Handling: GIMPLE Exception Handling. |
| (line 6) |
| * GIMPLE instruction set: GIMPLE instruction set. |
| (line 6) |
| * GIMPLE sequences: GIMPLE sequences. (line 6) |
| * gimple_addresses_taken: Manipulating GIMPLE statements. |
| (line 90) |
| * GIMPLE_ASM: GIMPLE_ASM. (line 6) |
| * gimple_asm_clear_volatile: GIMPLE_ASM. (line 63) |
| * gimple_asm_clobber_op: GIMPLE_ASM. (line 46) |
| * gimple_asm_input_op: GIMPLE_ASM. (line 30) |
| * gimple_asm_output_op: GIMPLE_ASM. (line 38) |
| * gimple_asm_set_clobber_op: GIMPLE_ASM. (line 50) |
| * gimple_asm_set_input_op: GIMPLE_ASM. (line 34) |
| * gimple_asm_set_output_op: GIMPLE_ASM. (line 42) |
| * gimple_asm_set_volatile: GIMPLE_ASM. (line 60) |
| * gimple_asm_volatile_p: GIMPLE_ASM. (line 57) |
| * GIMPLE_ASSIGN: GIMPLE_ASSIGN. (line 6) |
| * gimple_assign_cast_p: GIMPLE_ASSIGN. (line 89) |
| * gimple_assign_lhs: GIMPLE_ASSIGN. (line 51) |
| * gimple_assign_rhs1: GIMPLE_ASSIGN. (line 57) |
| * gimple_assign_rhs2: GIMPLE_ASSIGN. (line 64) |
| * gimple_assign_set_lhs: GIMPLE_ASSIGN. (line 71) |
| * gimple_assign_set_rhs1: GIMPLE_ASSIGN. (line 74) |
| * gimple_assign_set_rhs2: GIMPLE_ASSIGN. (line 85) |
| * gimple_bb: Manipulating GIMPLE statements. |
| (line 18) |
| * GIMPLE_BIND: GIMPLE_BIND. (line 6) |
| * gimple_bind_add_seq: GIMPLE_BIND. (line 36) |
| * gimple_bind_add_stmt: GIMPLE_BIND. (line 32) |
| * gimple_bind_append_vars: GIMPLE_BIND. (line 19) |
| * gimple_bind_block: GIMPLE_BIND. (line 40) |
| * gimple_bind_body: GIMPLE_BIND. (line 23) |
| * gimple_bind_set_block: GIMPLE_BIND. (line 45) |
| * gimple_bind_set_body: GIMPLE_BIND. (line 28) |
| * gimple_bind_set_vars: GIMPLE_BIND. (line 15) |
| * gimple_bind_vars: GIMPLE_BIND. (line 12) |
| * gimple_block: Manipulating GIMPLE statements. |
| (line 21) |
| * gimple_build_asm: GIMPLE_ASM. (line 8) |
| * gimple_build_asm_vec: GIMPLE_ASM. (line 17) |
| * gimple_build_assign: GIMPLE_ASSIGN. (line 7) |
| * gimple_build_assign_with_ops: GIMPLE_ASSIGN. (line 30) |
| * gimple_build_bind: GIMPLE_BIND. (line 8) |
| * gimple_build_call: GIMPLE_CALL. (line 8) |
| * gimple_build_call_from_tree: GIMPLE_CALL. (line 16) |
| * gimple_build_call_vec: GIMPLE_CALL. (line 25) |
| * gimple_build_catch: GIMPLE_CATCH. (line 8) |
| * gimple_build_cond: GIMPLE_COND. (line 8) |
| * gimple_build_cond_from_tree: GIMPLE_COND. (line 16) |
| * gimple_build_debug_bind: GIMPLE_DEBUG. (line 8) |
| * gimple_build_eh_filter: GIMPLE_EH_FILTER. (line 8) |
| * gimple_build_goto: GIMPLE_LABEL. (line 18) |
| * gimple_build_label: GIMPLE_LABEL. (line 7) |
| * gimple_build_nop: GIMPLE_NOP. (line 7) |
| * gimple_build_omp_atomic_load: GIMPLE_OMP_ATOMIC_LOAD. |
| (line 8) |
| * gimple_build_omp_atomic_store: GIMPLE_OMP_ATOMIC_STORE. |
| (line 7) |
| * gimple_build_omp_continue: GIMPLE_OMP_CONTINUE. |
| (line 8) |
| * gimple_build_omp_critical: GIMPLE_OMP_CRITICAL. |
| (line 8) |
| * gimple_build_omp_for: GIMPLE_OMP_FOR. (line 9) |
| * gimple_build_omp_master: GIMPLE_OMP_MASTER. (line 7) |
| * gimple_build_omp_ordered: GIMPLE_OMP_ORDERED. (line 7) |
| * gimple_build_omp_parallel: GIMPLE_OMP_PARALLEL. |
| (line 8) |
| * gimple_build_omp_return: GIMPLE_OMP_RETURN. (line 7) |
| * gimple_build_omp_section: GIMPLE_OMP_SECTION. (line 7) |
| * gimple_build_omp_sections: GIMPLE_OMP_SECTIONS. |
| (line 8) |
| * gimple_build_omp_sections_switch: GIMPLE_OMP_SECTIONS. |
| (line 14) |
| * gimple_build_omp_single: GIMPLE_OMP_SINGLE. (line 8) |
| * gimple_build_resx: GIMPLE_RESX. (line 7) |
| * gimple_build_return: GIMPLE_RETURN. (line 7) |
| * gimple_build_switch: GIMPLE_SWITCH. (line 8) |
| * gimple_build_switch_vec: GIMPLE_SWITCH. (line 16) |
| * gimple_build_try: GIMPLE_TRY. (line 8) |
| * gimple_build_wce: GIMPLE_WITH_CLEANUP_EXPR. |
| (line 7) |
| * GIMPLE_CALL: GIMPLE_CALL. (line 6) |
| * gimple_call_arg: GIMPLE_CALL. (line 66) |
| * gimple_call_cannot_inline_p: GIMPLE_CALL. (line 91) |
| * gimple_call_chain: GIMPLE_CALL. (line 57) |
| * gimple_call_copy_skip_args: GIMPLE_CALL. (line 98) |
| * gimple_call_fn: GIMPLE_CALL. (line 38) |
| * gimple_call_fndecl: GIMPLE_CALL. (line 46) |
| * gimple_call_lhs: GIMPLE_CALL. (line 29) |
| * gimple_call_mark_uninlinable: GIMPLE_CALL. (line 88) |
| * gimple_call_noreturn_p: GIMPLE_CALL. (line 94) |
| * gimple_call_return_type: GIMPLE_CALL. (line 54) |
| * gimple_call_set_arg: GIMPLE_CALL. (line 76) |
| * gimple_call_set_chain: GIMPLE_CALL. (line 60) |
| * gimple_call_set_fn: GIMPLE_CALL. (line 42) |
| * gimple_call_set_fndecl: GIMPLE_CALL. (line 51) |
| * gimple_call_set_lhs: GIMPLE_CALL. (line 35) |
| * gimple_call_set_tail: GIMPLE_CALL. (line 80) |
| * gimple_call_tail_p: GIMPLE_CALL. (line 85) |
| * GIMPLE_CATCH: GIMPLE_CATCH. (line 6) |
| * gimple_catch_handler: GIMPLE_CATCH. (line 20) |
| * gimple_catch_set_handler: GIMPLE_CATCH. (line 28) |
| * gimple_catch_set_types: GIMPLE_CATCH. (line 24) |
| * gimple_catch_types: GIMPLE_CATCH. (line 13) |
| * gimple_code: Manipulating GIMPLE statements. |
| (line 15) |
| * GIMPLE_COND: GIMPLE_COND. (line 6) |
| * gimple_cond_false_label: GIMPLE_COND. (line 60) |
| * gimple_cond_lhs: GIMPLE_COND. (line 30) |
| * gimple_cond_make_false: GIMPLE_COND. (line 64) |
| * gimple_cond_make_true: GIMPLE_COND. (line 67) |
| * gimple_cond_rhs: GIMPLE_COND. (line 38) |
| * gimple_cond_set_code: GIMPLE_COND. (line 26) |
| * gimple_cond_set_false_label: GIMPLE_COND. (line 56) |
| * gimple_cond_set_lhs: GIMPLE_COND. (line 34) |
| * gimple_cond_set_rhs: GIMPLE_COND. (line 42) |
| * gimple_cond_set_true_label: GIMPLE_COND. (line 51) |
| * gimple_cond_true_label: GIMPLE_COND. (line 46) |
| * gimple_copy: Manipulating GIMPLE statements. |
| (line 147) |
| * GIMPLE_DEBUG: GIMPLE_DEBUG. (line 6) |
| * GIMPLE_DEBUG_BIND: GIMPLE_DEBUG. (line 6) |
| * gimple_debug_bind_get_value: GIMPLE_DEBUG. (line 48) |
| * gimple_debug_bind_get_var: GIMPLE_DEBUG. (line 45) |
| * gimple_debug_bind_has_value_p: GIMPLE_DEBUG. (line 69) |
| * gimple_debug_bind_reset_value: GIMPLE_DEBUG. (line 65) |
| * gimple_debug_bind_set_value: GIMPLE_DEBUG. (line 61) |
| * gimple_debug_bind_set_var: GIMPLE_DEBUG. (line 57) |
| * GIMPLE_EH_FILTER: GIMPLE_EH_FILTER. (line 6) |
| * gimple_eh_filter_failure: GIMPLE_EH_FILTER. (line 19) |
| * gimple_eh_filter_must_not_throw: GIMPLE_EH_FILTER. (line 33) |
| * gimple_eh_filter_set_failure: GIMPLE_EH_FILTER. (line 29) |
| * gimple_eh_filter_set_must_not_throw: GIMPLE_EH_FILTER. (line 37) |
| * gimple_eh_filter_set_types: GIMPLE_EH_FILTER. (line 24) |
| * gimple_eh_filter_types: GIMPLE_EH_FILTER. (line 12) |
| * gimple_expr_type: Manipulating GIMPLE statements. |
| (line 24) |
| * gimple_goto_dest: GIMPLE_LABEL. (line 21) |
| * gimple_goto_set_dest: GIMPLE_LABEL. (line 24) |
| * gimple_has_mem_ops: Manipulating GIMPLE statements. |
| (line 72) |
| * gimple_has_ops: Manipulating GIMPLE statements. |
| (line 69) |
| * gimple_has_volatile_ops: Manipulating GIMPLE statements. |
| (line 134) |
| * GIMPLE_LABEL: GIMPLE_LABEL. (line 6) |
| * gimple_label_label: GIMPLE_LABEL. (line 11) |
| * gimple_label_set_label: GIMPLE_LABEL. (line 14) |
| * gimple_loaded_syms: Manipulating GIMPLE statements. |
| (line 122) |
| * gimple_locus: Manipulating GIMPLE statements. |
| (line 42) |
| * gimple_locus_empty_p: Manipulating GIMPLE statements. |
| (line 48) |
| * gimple_modified_p: Manipulating GIMPLE statements. |
| (line 130) |
| * gimple_no_warning_p: Manipulating GIMPLE statements. |
| (line 51) |
| * GIMPLE_NOP: GIMPLE_NOP. (line 6) |
| * gimple_nop_p: GIMPLE_NOP. (line 10) |
| * gimple_num_ops <1>: Manipulating GIMPLE statements. |
| (line 75) |
| * gimple_num_ops: Logical Operators. (line 76) |
| * GIMPLE_OMP_ATOMIC_LOAD: GIMPLE_OMP_ATOMIC_LOAD. |
| (line 6) |
| * gimple_omp_atomic_load_lhs: GIMPLE_OMP_ATOMIC_LOAD. |
| (line 17) |
| * gimple_omp_atomic_load_rhs: GIMPLE_OMP_ATOMIC_LOAD. |
| (line 24) |
| * gimple_omp_atomic_load_set_lhs: GIMPLE_OMP_ATOMIC_LOAD. |
| (line 14) |
| * gimple_omp_atomic_load_set_rhs: GIMPLE_OMP_ATOMIC_LOAD. |
| (line 21) |
| * GIMPLE_OMP_ATOMIC_STORE: GIMPLE_OMP_ATOMIC_STORE. |
| (line 6) |
| * gimple_omp_atomic_store_set_val: GIMPLE_OMP_ATOMIC_STORE. |
| (line 12) |
| * gimple_omp_atomic_store_val: GIMPLE_OMP_ATOMIC_STORE. |
| (line 15) |
| * gimple_omp_body: GIMPLE_OMP_PARALLEL. |
| (line 24) |
| * GIMPLE_OMP_CONTINUE: GIMPLE_OMP_CONTINUE. |
| (line 6) |
| * gimple_omp_continue_control_def: GIMPLE_OMP_CONTINUE. |
| (line 13) |
| * gimple_omp_continue_control_def_ptr: GIMPLE_OMP_CONTINUE. |
| (line 17) |
| * gimple_omp_continue_control_use: GIMPLE_OMP_CONTINUE. |
| (line 24) |
| * gimple_omp_continue_control_use_ptr: GIMPLE_OMP_CONTINUE. |
| (line 28) |
| * gimple_omp_continue_set_control_def: GIMPLE_OMP_CONTINUE. |
| (line 20) |
| * gimple_omp_continue_set_control_use: GIMPLE_OMP_CONTINUE. |
| (line 31) |
| * GIMPLE_OMP_CRITICAL: GIMPLE_OMP_CRITICAL. |
| (line 6) |
| * gimple_omp_critical_name: GIMPLE_OMP_CRITICAL. |
| (line 13) |
| * gimple_omp_critical_set_name: GIMPLE_OMP_CRITICAL. |
| (line 21) |
| * GIMPLE_OMP_FOR: GIMPLE_OMP_FOR. (line 6) |
| * gimple_omp_for_clauses: GIMPLE_OMP_FOR. (line 20) |
| * gimple_omp_for_final: GIMPLE_OMP_FOR. (line 51) |
| * gimple_omp_for_incr: GIMPLE_OMP_FOR. (line 61) |
| * gimple_omp_for_index: GIMPLE_OMP_FOR. (line 31) |
| * gimple_omp_for_initial: GIMPLE_OMP_FOR. (line 41) |
| * gimple_omp_for_pre_body: GIMPLE_OMP_FOR. (line 70) |
| * gimple_omp_for_set_clauses: GIMPLE_OMP_FOR. (line 27) |
| * gimple_omp_for_set_cond: GIMPLE_OMP_FOR. (line 80) |
| * gimple_omp_for_set_final: GIMPLE_OMP_FOR. (line 58) |
| * gimple_omp_for_set_incr: GIMPLE_OMP_FOR. (line 67) |
| * gimple_omp_for_set_index: GIMPLE_OMP_FOR. (line 38) |
| * gimple_omp_for_set_initial: GIMPLE_OMP_FOR. (line 48) |
| * gimple_omp_for_set_pre_body: GIMPLE_OMP_FOR. (line 75) |
| * 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 42) |
| * gimple_omp_parallel_clauses: GIMPLE_OMP_PARALLEL. |
| (line 31) |
| * gimple_omp_parallel_combined_p: GIMPLE_OMP_PARALLEL. |
| (line 16) |
| * gimple_omp_parallel_data_arg: GIMPLE_OMP_PARALLEL. |
| (line 54) |
| * gimple_omp_parallel_set_child_fn: GIMPLE_OMP_PARALLEL. |
| (line 51) |
| * gimple_omp_parallel_set_clauses: GIMPLE_OMP_PARALLEL. |
| (line 38) |
| * gimple_omp_parallel_set_combined_p: GIMPLE_OMP_PARALLEL. |
| (line 20) |
| * gimple_omp_parallel_set_data_arg: GIMPLE_OMP_PARALLEL. |
| (line 62) |
| * GIMPLE_OMP_RETURN: GIMPLE_OMP_RETURN. (line 6) |
| * gimple_omp_return_nowait_p: GIMPLE_OMP_RETURN. (line 14) |
| * gimple_omp_return_set_nowait: GIMPLE_OMP_RETURN. (line 11) |
| * GIMPLE_OMP_SECTION: GIMPLE_OMP_SECTION. (line 6) |
| * gimple_omp_section_last_p: GIMPLE_OMP_SECTION. (line 12) |
| * gimple_omp_section_set_last: GIMPLE_OMP_SECTION. (line 16) |
| * GIMPLE_OMP_SECTIONS: GIMPLE_OMP_SECTIONS. |
| (line 6) |
| * gimple_omp_sections_clauses: GIMPLE_OMP_SECTIONS. |
| (line 30) |
| * gimple_omp_sections_control: GIMPLE_OMP_SECTIONS. |
| (line 17) |
| * gimple_omp_sections_set_clauses: GIMPLE_OMP_SECTIONS. |
| (line 37) |
| * gimple_omp_sections_set_control: GIMPLE_OMP_SECTIONS. |
| (line 26) |
| * gimple_omp_set_body: GIMPLE_OMP_PARALLEL. |
| (line 28) |
| * GIMPLE_OMP_SINGLE: GIMPLE_OMP_SINGLE. (line 6) |
| * gimple_omp_single_clauses: GIMPLE_OMP_SINGLE. (line 14) |
| * gimple_omp_single_set_clauses: GIMPLE_OMP_SINGLE. (line 21) |
| * gimple_op <1>: Manipulating GIMPLE statements. |
| (line 81) |
| * gimple_op: Logical Operators. (line 79) |
| * GIMPLE_PHI: GIMPLE_PHI. (line 6) |
| * gimple_phi_capacity: GIMPLE_PHI. (line 10) |
| * gimple_phi_num_args: GIMPLE_PHI. (line 14) |
| * gimple_phi_result: GIMPLE_PHI. (line 19) |
| * gimple_phi_set_arg: GIMPLE_PHI. (line 33) |
| * gimple_phi_set_result: GIMPLE_PHI. (line 25) |
| * GIMPLE_RESX: GIMPLE_RESX. (line 6) |
| * gimple_resx_region: GIMPLE_RESX. (line 13) |
| * gimple_resx_set_region: GIMPLE_RESX. (line 16) |
| * GIMPLE_RETURN: GIMPLE_RETURN. (line 6) |
| * gimple_return_retval: GIMPLE_RETURN. (line 10) |
| * gimple_return_set_retval: GIMPLE_RETURN. (line 14) |
| * gimple_rhs_class: GIMPLE_ASSIGN. (line 46) |
| * gimple_seq_add_seq: GIMPLE sequences. (line 32) |
| * gimple_seq_add_stmt: GIMPLE sequences. (line 26) |
| * gimple_seq_alloc: GIMPLE sequences. (line 62) |
| * gimple_seq_copy: GIMPLE sequences. (line 67) |
| * gimple_seq_deep_copy: GIMPLE sequences. (line 37) |
| * gimple_seq_empty_p: GIMPLE sequences. (line 70) |
| * gimple_seq_first: GIMPLE sequences. (line 44) |
| * gimple_seq_init: GIMPLE sequences. (line 59) |
| * gimple_seq_last: GIMPLE sequences. (line 47) |
| * gimple_seq_reverse: GIMPLE sequences. (line 40) |
| * gimple_seq_set_first: GIMPLE sequences. (line 55) |
| * gimple_seq_set_last: GIMPLE sequences. (line 51) |
| * gimple_seq_singleton_p: GIMPLE sequences. (line 79) |
| * gimple_set_block: Manipulating GIMPLE statements. |
| (line 39) |
| * gimple_set_def_ops: Manipulating GIMPLE statements. |
| (line 98) |
| * gimple_set_has_volatile_ops: Manipulating GIMPLE statements. |
| (line 138) |
| * gimple_set_locus: Manipulating GIMPLE statements. |
| (line 45) |
| * gimple_set_op: Manipulating GIMPLE statements. |
| (line 87) |
| * gimple_set_plf: Manipulating GIMPLE statements. |
| (line 62) |
| * gimple_set_use_ops: Manipulating GIMPLE statements. |
| (line 105) |
| * gimple_set_vdef_ops: Manipulating GIMPLE statements. |
| (line 119) |
| * gimple_set_visited: Manipulating GIMPLE statements. |
| (line 55) |
| * gimple_set_vuse_ops: Manipulating GIMPLE statements. |
| (line 112) |
| * gimple_statement_base: Tuple representation. |
| (line 14) |
| * gimple_statement_with_ops: Tuple representation. |
| (line 96) |
| * gimple_stored_syms: Manipulating GIMPLE statements. |
| (line 126) |
| * GIMPLE_SWITCH: GIMPLE_SWITCH. (line 6) |
| * gimple_switch_default_label: GIMPLE_SWITCH. (line 46) |
| * gimple_switch_index: GIMPLE_SWITCH. (line 31) |
| * gimple_switch_label: GIMPLE_SWITCH. (line 37) |
| * gimple_switch_num_labels: GIMPLE_SWITCH. (line 22) |
| * gimple_switch_set_default_label: GIMPLE_SWITCH. (line 50) |
| * gimple_switch_set_index: GIMPLE_SWITCH. (line 34) |
| * gimple_switch_set_label: GIMPLE_SWITCH. (line 42) |
| * gimple_switch_set_num_labels: GIMPLE_SWITCH. (line 27) |
| * GIMPLE_TRY: GIMPLE_TRY. (line 6) |
| * gimple_try_catch_is_cleanup: GIMPLE_TRY. (line 20) |
| * gimple_try_cleanup: GIMPLE_TRY. (line 27) |
| * gimple_try_eval: GIMPLE_TRY. (line 23) |
| * gimple_try_flags: GIMPLE_TRY. (line 16) |
| * gimple_try_set_catch_is_cleanup: GIMPLE_TRY. (line 32) |
| * gimple_try_set_cleanup: GIMPLE_TRY. (line 41) |
| * gimple_try_set_eval: GIMPLE_TRY. (line 36) |
| * gimple_visited_p: Manipulating GIMPLE statements. |
| (line 58) |
| * gimple_wce_cleanup: GIMPLE_WITH_CLEANUP_EXPR. |
| (line 11) |
| * gimple_wce_cleanup_eh_only: GIMPLE_WITH_CLEANUP_EXPR. |
| (line 18) |
| * gimple_wce_set_cleanup: GIMPLE_WITH_CLEANUP_EXPR. |
| (line 15) |
| * gimple_wce_set_cleanup_eh_only: GIMPLE_WITH_CLEANUP_EXPR. |
| (line 22) |
| * GIMPLE_WITH_CLEANUP_EXPR: GIMPLE_WITH_CLEANUP_EXPR. |
| (line 6) |
| * gimplification <1>: Gimplification pass. |
| (line 6) |
| * gimplification: Parsing pass. (line 14) |
| * gimplifier: Parsing pass. (line 14) |
| * gimplify_assign: GIMPLE_ASSIGN. (line 19) |
| * 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 91) |
| * GO_IF_MODE_DEPENDENT_ADDRESS: Addressing Modes. (line 192) |
| * GOFAST, floating point emulation library: Library Calls. (line 44) |
| * gofast_maybe_init_libfuncs: Library Calls. (line 44) |
| * greater than: Comparisons. (line 60) |
| * gsi_after_labels: Sequence iterators. (line 76) |
| * gsi_bb: Sequence iterators. (line 83) |
| * gsi_commit_edge_inserts: Sequence iterators. (line 194) |
| * gsi_commit_one_edge_insert: Sequence iterators. (line 190) |
| * gsi_end_p: Sequence iterators. (line 60) |
| * gsi_for_stmt: Sequence iterators. (line 157) |
| * gsi_insert_after: Sequence iterators. (line 147) |
| * gsi_insert_before: Sequence iterators. (line 136) |
| * gsi_insert_on_edge: Sequence iterators. (line 174) |
| * gsi_insert_on_edge_immediate: Sequence iterators. (line 185) |
| * gsi_insert_seq_after: Sequence iterators. (line 154) |
| * gsi_insert_seq_before: Sequence iterators. (line 143) |
| * gsi_insert_seq_on_edge: Sequence iterators. (line 179) |
| * gsi_last: Sequence iterators. (line 50) |
| * gsi_last_bb: Sequence iterators. (line 56) |
| * gsi_link_after: Sequence iterators. (line 115) |
| * gsi_link_before: Sequence iterators. (line 105) |
| * gsi_link_seq_after: Sequence iterators. (line 110) |
| * gsi_link_seq_before: Sequence iterators. (line 99) |
| * gsi_move_after: Sequence iterators. (line 161) |
| * gsi_move_before: Sequence iterators. (line 166) |
| * gsi_move_to_bb_end: Sequence iterators. (line 171) |
| * gsi_next: Sequence iterators. (line 66) |
| * gsi_one_before_end_p: Sequence iterators. (line 63) |
| * gsi_prev: Sequence iterators. (line 69) |
| * gsi_remove: Sequence iterators. (line 90) |
| * gsi_replace: Sequence iterators. (line 130) |
| * gsi_seq: Sequence iterators. (line 86) |
| * gsi_split_seq_after: Sequence iterators. (line 120) |
| * gsi_split_seq_before: Sequence iterators. (line 125) |
| * gsi_start: Sequence iterators. (line 40) |
| * gsi_start_bb: Sequence iterators. (line 46) |
| * gsi_stmt: Sequence iterators. (line 72) |
| * gt: Comparisons. (line 60) |
| * gt and attributes: Expressions. (line 64) |
| * GT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * gtu: Comparisons. (line 64) |
| * gtu and attributes: Expressions. (line 64) |
| * GTY: Type Information. (line 6) |
| * H in constraint: Simple Constraints. (line 88) |
| * HAmode: Machine Modes. (line 144) |
| * HANDLE_PRAGMA_PACK_PUSH_POP: Misc. (line 467) |
| * HANDLE_PRAGMA_PACK_WITH_EXPANSION: Misc. (line 478) |
| * HANDLE_SYSV_PRAGMA: Misc. (line 438) |
| * HANDLER: Statements for C++. (line 6) |
| * HANDLER_BODY: Statements for C++. (line 6) |
| * HANDLER_PARMS: Statements for C++. (line 6) |
| * hard registers: Regs and Memory. (line 9) |
| * HARD_FRAME_POINTER_REGNUM: Frame Registers. (line 20) |
| * HARD_REGNO_CALL_PART_CLOBBERED: Register Basics. (line 53) |
| * HARD_REGNO_CALLER_SAVE_MODE: Caller Saves. (line 20) |
| * HARD_REGNO_MODE_OK: Values in Registers. |
| (line 58) |
| * HARD_REGNO_NREGS: Values in Registers. |
| (line 11) |
| * HARD_REGNO_NREGS_HAS_PADDING: Values in Registers. |
| (line 25) |
| * HARD_REGNO_NREGS_WITH_PADDING: Values in Registers. |
| (line 43) |
| * HARD_REGNO_RENAME_OK: Values in Registers. |
| (line 119) |
| * HAS_INIT_SECTION: Macros for Initialization. |
| (line 19) |
| * HAS_LONG_COND_BRANCH: Misc. (line 9) |
| * HAS_LONG_UNCOND_BRANCH: Misc. (line 18) |
| * HAVE_DOS_BASED_FILE_SYSTEM: Filesystem. (line 11) |
| * HAVE_POST_DECREMENT: Addressing Modes. (line 12) |
| * HAVE_POST_INCREMENT: Addressing Modes. (line 11) |
| * HAVE_POST_MODIFY_DISP: Addressing Modes. (line 18) |
| * HAVE_POST_MODIFY_REG: Addressing Modes. (line 24) |
| * HAVE_PRE_DECREMENT: Addressing Modes. (line 10) |
| * HAVE_PRE_INCREMENT: Addressing Modes. (line 9) |
| * HAVE_PRE_MODIFY_DISP: Addressing Modes. (line 17) |
| * HAVE_PRE_MODIFY_REG: Addressing Modes. (line 23) |
| * HCmode: Machine Modes. (line 197) |
| * HFmode: Machine Modes. (line 58) |
| * high: Constants. (line 109) |
| * HImode: Machine Modes. (line 29) |
| * HImode, in insn: Insns. (line 272) |
| * 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 12) |
| * HOST_HOOKS_GT_PCH_ALLOC_GRANULARITY: Host Common. (line 45) |
| * HOST_HOOKS_GT_PCH_USE_ADDRESS: Host Common. (line 26) |
| * 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 43) |
| * HQmode: Machine Modes. (line 107) |
| * I in constraint: Simple Constraints. (line 71) |
| * i in constraint: Simple Constraints. (line 60) |
| * 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) |
| * IF_COND: Statements for C++. (line 6) |
| * if_marked: GTY Options. (line 156) |
| * 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) |
| * IFCVT_EXTRA_FIELDS: Misc. (line 622) |
| * IFCVT_INIT_EXTRA_FIELDS: Misc. (line 617) |
| * IFCVT_MODIFY_CANCEL: Misc. (line 611) |
| * IFCVT_MODIFY_FINAL: Misc. (line 605) |
| * IFCVT_MODIFY_INSN: Misc. (line 599) |
| * IFCVT_MODIFY_MULTIPLE_TESTS: Misc. (line 592) |
| * IFCVT_MODIFY_TESTS: Misc. (line 581) |
| * IMAGPART_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * Immediate Uses: SSA Operands. (line 274) |
| * immediate_operand: Machine-Independent Predicates. |
| (line 11) |
| * IMMEDIATE_PREFIX: Instruction Output. (line 140) |
| * in_struct: Flags. (line 263) |
| * 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, jump_insn and call_insn: Flags. (line 166) |
| * in_struct, in mem: Flags. (line 70) |
| * in_struct, in subreg: Flags. (line 205) |
| * include: Including Patterns. (line 6) |
| * INCLUDE_DEFAULTS: Driver. (line 430) |
| * inclusive-or, bitwise: Arithmetic. (line 158) |
| * INCOMING_FRAME_SP_OFFSET: Frame Layout. (line 183) |
| * INCOMING_REGNO: Register Basics. (line 91) |
| * INCOMING_RETURN_ADDR_RTX: Frame Layout. (line 139) |
| * INCOMING_STACK_BOUNDARY: Storage Layout. (line 166) |
| * INDEX_REG_CLASS: Register Classes. (line 134) |
| * indirect_jump instruction pattern: Standard Names. (line 1037) |
| * indirect_operand: Machine-Independent Predicates. |
| (line 71) |
| * INDIRECT_REF: Storage References. (line 6) |
| * INIT_ARRAY_SECTION_ASM_OP: Sections. (line 108) |
| * INIT_CUMULATIVE_ARGS: Register Arguments. (line 149) |
| * INIT_CUMULATIVE_INCOMING_ARGS: Register Arguments. (line 177) |
| * INIT_CUMULATIVE_LIBCALL_ARGS: Register Arguments. (line 170) |
| * INIT_ENVIRONMENT: Driver. (line 369) |
| * INIT_EXPANDERS: Per-Function Data. (line 39) |
| * INIT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * init_machine_status: Per-Function Data. (line 45) |
| * init_one_libfunc: Library Calls. (line 15) |
| * INIT_SECTION_ASM_OP <1>: Macros for Initialization. |
| (line 10) |
| * INIT_SECTION_ASM_OP: Sections. (line 92) |
| * INITIAL_ELIMINATION_OFFSET: Elimination. (line 85) |
| * INITIAL_FRAME_ADDRESS_RTX: Frame Layout. (line 83) |
| * INITIAL_FRAME_POINTER_OFFSET: Elimination. (line 35) |
| * initialization routines: Initialization. (line 6) |
| * inlining: Target Attributes. (line 87) |
| * insert_insn_on_edge: Maintaining the CFG. |
| (line 118) |
| * insn: Insns. (line 63) |
| * insn and /f: Flags. (line 125) |
| * insn and /j: Flags. (line 175) |
| * insn and /s: Flags. (line 49) |
| * 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 splitting: Insn Splitting. (line 6) |
| * insn-attr.h: Defining Attributes. |
| (line 24) |
| * INSN_ANNULLED_BRANCH_P: Flags. (line 39) |
| * INSN_CODE: Insns. (line 298) |
| * INSN_DELETED_P: Flags. (line 44) |
| * INSN_FROM_TARGET_P: Flags. (line 49) |
| * insn_list: Insns. (line 545) |
| * INSN_REFERENCES_ARE_DELAYED: Misc. (line 520) |
| * INSN_SETS_ARE_DELAYED: Misc. (line 509) |
| * INSN_UID: Insns. (line 23) |
| * INSN_VAR_LOCATION: Insns. (line 239) |
| * insns: Insns. (line 6) |
| * insns, generating: RTL Template. (line 6) |
| * insns, recognizing: RTL Template. (line 6) |
| * instruction attributes: Insn Attributes. (line 6) |
| * instruction latency time: Processor pipeline description. |
| (line 6) |
| * instruction patterns: Patterns. (line 6) |
| * instruction splitting: Insn Splitting. (line 6) |
| * insv instruction pattern: Standard Names. (line 862) |
| * int: Manipulating GIMPLE statements. |
| (line 66) |
| * INT16_TYPE: Type Layout. (line 237) |
| * INT32_TYPE: Type Layout. (line 238) |
| * INT64_TYPE: Type Layout. (line 239) |
| * INT8_TYPE: Type Layout. (line 236) |
| * INT_FAST16_TYPE: Type Layout. (line 253) |
| * INT_FAST32_TYPE: Type Layout. (line 254) |
| * INT_FAST64_TYPE: Type Layout. (line 255) |
| * INT_FAST8_TYPE: Type Layout. (line 252) |
| * INT_LEAST16_TYPE: Type Layout. (line 245) |
| * INT_LEAST32_TYPE: Type Layout. (line 246) |
| * INT_LEAST64_TYPE: Type Layout. (line 247) |
| * INT_LEAST8_TYPE: Type Layout. (line 244) |
| * INT_TYPE_SIZE: Type Layout. (line 12) |
| * 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 14) |
| * INTMAX_TYPE: Type Layout. (line 213) |
| * INTPTR_TYPE: Type Layout. (line 260) |
| * introduction: Top. (line 6) |
| * INVOKE__main: Macros for Initialization. |
| (line 51) |
| * ior: Arithmetic. (line 158) |
| * ior and attributes: Expressions. (line 50) |
| * ior, canonicalization of: Insn Canonicalizations. |
| (line 52) |
| * iorM3 instruction pattern: Standard Names. (line 222) |
| * IRA_COVER_CLASSES: Register Classes. (line 535) |
| * IRA_HARD_REGNO_ADD_COST_MULTIPLIER: Allocation Order. (line 37) |
| * IS_ASM_LOGICAL_LINE_SEPARATOR: Data Output. (line 120) |
| * is_gimple_omp: GIMPLE_OMP_PARALLEL. |
| (line 65) |
| * iterators in .md files: Iterators. (line 6) |
| * IV analysis on GIMPLE: Scalar evolutions. (line 6) |
| * IV analysis on RTL: loop-iv. (line 6) |
| * jump: Flags. (line 314) |
| * jump instruction pattern: Standard Names. (line 928) |
| * jump instruction patterns: Jump Patterns. (line 6) |
| * jump instructions and set: Side Effects. (line 56) |
| * jump, in call_insn: Flags. (line 179) |
| * jump, in insn: Flags. (line 175) |
| * jump, in mem: Flags. (line 79) |
| * JUMP_ALIGN: Alignment Output. (line 9) |
| * jump_insn: Insns. (line 73) |
| * jump_insn and /f: Flags. (line 125) |
| * jump_insn and /s: Flags. (line 49) |
| * 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 152) |
| * Jumps: Jumps. (line 6) |
| * LABEL_ALIGN: Alignment Output. (line 52) |
| * LABEL_ALIGN_AFTER_BARRIER: Alignment Output. (line 22) |
| * LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP: Alignment Output. (line 30) |
| * LABEL_ALIGN_MAX_SKIP: Alignment Output. (line 62) |
| * LABEL_ALT_ENTRY_P: Insns. (line 140) |
| * LABEL_ALTERNATE_NAME: Edges. (line 180) |
| * LABEL_DECL: Declarations. (line 6) |
| * LABEL_KIND: Insns. (line 140) |
| * LABEL_NUSES: Insns. (line 136) |
| * LABEL_PRESERVE_P: Flags. (line 59) |
| * label_ref: Constants. (line 86) |
| * label_ref and /v: Flags. (line 65) |
| * label_ref, RTL sharing: Sharing. (line 35) |
| * LABEL_REF_NONLOCAL_P: Flags. (line 65) |
| * lang_hooks.gimplify_expr: Gimplification pass. |
| (line 18) |
| * lang_hooks.parse_file: Parsing pass. (line 6) |
| * language-dependent trees: Language-dependent trees. |
| (line 6) |
| * language-independent intermediate representation: Parsing pass. |
| (line 14) |
| * large return values: Aggregate Return. (line 6) |
| * LARGEST_EXPONENT_IS_NORMAL: Storage Layout. (line 474) |
| * LAST_STACK_REG: Stack Registers. (line 31) |
| * LAST_VIRTUAL_REGISTER: Regs and Memory. (line 51) |
| * lceilMN2: Standard Names. (line 597) |
| * LCSSA: LCSSA. (line 6) |
| * LD_FINI_SWITCH: Macros for Initialization. |
| (line 29) |
| * LD_INIT_SWITCH: Macros for Initialization. |
| (line 25) |
| * LDD_SUFFIX: Macros for Initialization. |
| (line 116) |
| * le: Comparisons. (line 76) |
| * le and attributes: Expressions. (line 64) |
| * LE_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * leaf functions: Leaf Functions. (line 6) |
| * leaf_function_p: Standard Names. (line 999) |
| * LEAF_REG_REMAP: Leaf Functions. (line 39) |
| * LEAF_REGISTERS: Leaf Functions. (line 25) |
| * left rotate: Arithmetic. (line 190) |
| * left shift: Arithmetic. (line 168) |
| * LEGITIMATE_CONSTANT_P: Addressing Modes. (line 207) |
| * LEGITIMATE_PIC_OPERAND_P: PIC. (line 31) |
| * LEGITIMIZE_RELOAD_ADDRESS: Addressing Modes. (line 147) |
| * length: GTY Options. (line 50) |
| * less than: Comparisons. (line 68) |
| * less than or equal: Comparisons. (line 76) |
| * leu: Comparisons. (line 76) |
| * leu and attributes: Expressions. (line 64) |
| * lfloorMN2: Standard Names. (line 592) |
| * LIB2FUNCS_EXTRA: Target Fragment. (line 11) |
| * LIB_SPEC: Driver. (line 170) |
| * LIBCALL_VALUE: Scalar Return. (line 60) |
| * libgcc.a: Library Calls. (line 6) |
| * LIBGCC2_CFLAGS: Target Fragment. (line 8) |
| * LIBGCC2_HAS_DF_MODE: Type Layout. (line 109) |
| * LIBGCC2_HAS_TF_MODE: Type Layout. (line 123) |
| * LIBGCC2_HAS_XF_MODE: Type Layout. (line 117) |
| * LIBGCC2_LONG_DOUBLE_TYPE_SIZE: Type Layout. (line 103) |
| * LIBGCC2_UNWIND_ATTRIBUTE: Misc. (line 982) |
| * LIBGCC2_WORDS_BIG_ENDIAN: Storage Layout. (line 36) |
| * LIBGCC_SPEC: Driver. (line 178) |
| * library subroutine names: Library Calls. (line 6) |
| * LIBRARY_PATH_ENV: Misc. (line 560) |
| * LIMIT_RELOAD_CLASS: Register Classes. (line 254) |
| * Linear loop transformations framework: Lambda. (line 6) |
| * LINK_COMMAND_SPEC: Driver. (line 299) |
| * LINK_EH_SPEC: Driver. (line 205) |
| * LINK_ELIMINATE_DUPLICATE_LDIRECTORIES: Driver. (line 309) |
| * LINK_GCC_C_SEQUENCE_SPEC: Driver. (line 295) |
| * LINK_LIBGCC_SPECIAL_1: Driver. (line 290) |
| * LINK_SPEC: Driver. (line 163) |
| * list: Containers. (line 6) |
| * Liveness representation: Liveness information. |
| (line 6) |
| * lo_sum: Arithmetic. (line 24) |
| * load address instruction: Simple Constraints. (line 154) |
| * LOAD_EXTEND_OP: Misc. (line 69) |
| * load_multiple instruction pattern: Standard Names. (line 137) |
| * LOCAL_ALIGNMENT: Storage Layout. (line 255) |
| * LOCAL_CLASS_P: Classes. (line 73) |
| * LOCAL_DECL_ALIGNMENT: Storage Layout. (line 279) |
| * LOCAL_INCLUDE_DIR: Driver. (line 376) |
| * LOCAL_LABEL_PREFIX: Instruction Output. (line 138) |
| * LOCAL_REGNO: Register Basics. (line 105) |
| * LOG_LINKS: Insns. (line 317) |
| * Logical Operators: Logical Operators. (line 6) |
| * logical-and, bitwise: Arithmetic. (line 153) |
| * logM2 instruction pattern: Standard Names. (line 505) |
| * LONG_ACCUM_TYPE_SIZE: Type Layout. (line 93) |
| * LONG_DOUBLE_TYPE_SIZE: Type Layout. (line 58) |
| * LONG_FRACT_TYPE_SIZE: Type Layout. (line 73) |
| * LONG_LONG_ACCUM_TYPE_SIZE: Type Layout. (line 98) |
| * LONG_LONG_FRACT_TYPE_SIZE: Type Layout. (line 78) |
| * LONG_LONG_TYPE_SIZE: Type Layout. (line 33) |
| * LONG_TYPE_SIZE: Type Layout. (line 22) |
| * longjmp and automatic variables: Interface. (line 52) |
| * 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) |
| * LOOP_ALIGN: Alignment Output. (line 35) |
| * LOOP_ALIGN_MAX_SKIP: Alignment Output. (line 48) |
| * LOOP_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * looping instruction patterns: Looping Patterns. (line 6) |
| * lowering, language-dependent intermediate representation: Parsing pass. |
| (line 14) |
| * lrintMN2: Standard Names. (line 582) |
| * lroundMN2: Standard Names. (line 587) |
| * LSHIFT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * lshiftrt: Arithmetic. (line 185) |
| * lshiftrt and attributes: Expressions. (line 64) |
| * lshrM3 instruction pattern: Standard Names. (line 441) |
| * lt: Comparisons. (line 68) |
| * lt and attributes: Expressions. (line 64) |
| * LT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * LTGT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * ltu: Comparisons. (line 68) |
| * 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 364) |
| * MAKE_DECL_ONE_ONLY: Label Output. (line 218) |
| * make_phi_node: GIMPLE_PHI. (line 7) |
| * make_safe_from: Expander Definitions. |
| (line 148) |
| * makefile fragment: Fragments. (line 6) |
| * makefile targets: Makefile. (line 6) |
| * MALLOC_ABI_ALIGNMENT: Storage Layout. (line 180) |
| * Manipulating GIMPLE statements: Manipulating GIMPLE statements. |
| (line 6) |
| * mark_hook: GTY Options. (line 171) |
| * marking roots: GGC Roots. (line 6) |
| * MASK_RETURN_ADDR: Exception Region Output. |
| (line 35) |
| * match_dup <1>: define_peephole2. (line 28) |
| * match_dup: RTL Template. (line 73) |
| * match_dup and attributes: Insn Lengths. (line 16) |
| * match_op_dup: RTL Template. (line 163) |
| * match_operand: RTL Template. (line 16) |
| * match_operand and attributes: Expressions. (line 55) |
| * match_operator: RTL Template. (line 95) |
| * match_par_dup: RTL Template. (line 219) |
| * match_parallel: RTL Template. (line 172) |
| * match_scratch <1>: define_peephole2. (line 28) |
| * match_scratch: RTL Template. (line 58) |
| * matching constraint: Simple Constraints. (line 132) |
| * matching operands: Output Template. (line 49) |
| * math library: Soft float library routines. |
| (line 6) |
| * math, in RTL: Arithmetic. (line 6) |
| * MATH_LIBRARY: Misc. (line 553) |
| * matherr: Library Calls. (line 58) |
| * MAX_BITS_PER_WORD: Storage Layout. (line 61) |
| * MAX_CONDITIONAL_EXECUTE: Misc. (line 575) |
| * MAX_FIXED_MODE_SIZE: Storage Layout. (line 421) |
| * MAX_MOVE_MAX: Misc. (line 120) |
| * MAX_OFILE_ALIGNMENT: Storage Layout. (line 217) |
| * MAX_REGS_PER_ADDRESS: Addressing Modes. (line 43) |
| * MAX_STACK_ALIGNMENT: Storage Layout. (line 210) |
| * maxM3 instruction pattern: Standard Names. (line 234) |
| * may_trap_p, tree_could_trap_p: Edges. (line 115) |
| * maybe_undef: GTY Options. (line 179) |
| * mcount: Profiling. (line 12) |
| * MD_CAN_REDIRECT_BRANCH: Misc. (line 712) |
| * MD_EXEC_PREFIX: Driver. (line 330) |
| * MD_FALLBACK_FRAME_STATE_FOR: Exception Handling. (line 98) |
| * MD_HANDLE_UNWABI: Exception Handling. (line 118) |
| * MD_STARTFILE_PREFIX: Driver. (line 358) |
| * MD_STARTFILE_PREFIX_1: Driver. (line 364) |
| * MD_UNWIND_SUPPORT: Exception Handling. (line 94) |
| * mem: Regs and Memory. (line 374) |
| * mem and /c: Flags. (line 99) |
| * mem and /f: Flags. (line 103) |
| * mem and /i: Flags. (line 85) |
| * mem and /j: Flags. (line 79) |
| * mem and /s: Flags. (line 70) |
| * mem and /u: Flags. (line 152) |
| * mem and /v: Flags. (line 94) |
| * mem, RTL sharing: Sharing. (line 40) |
| * MEM_ADDR_SPACE: Special Accessors. (line 39) |
| * MEM_ALIAS_SET: Special Accessors. (line 9) |
| * MEM_ALIGN: Special Accessors. (line 36) |
| * MEM_EXPR: Special Accessors. (line 20) |
| * MEM_IN_STRUCT_P: Flags. (line 70) |
| * MEM_KEEP_ALIAS_SET_P: Flags. (line 79) |
| * MEM_NOTRAP_P: Flags. (line 99) |
| * MEM_OFFSET: Special Accessors. (line 28) |
| * MEM_POINTER: Flags. (line 103) |
| * MEM_READONLY_P: Flags. (line 152) |
| * MEM_SCALAR_P: Flags. (line 85) |
| * MEM_SIZE: Special Accessors. (line 31) |
| * MEM_VOLATILE_P: Flags. (line 94) |
| * MEMBER_TYPE_FORCES_BLK: Storage Layout. (line 401) |
| * memory model: Memory model. (line 6) |
| * memory reference, nonoffsettable: Simple Constraints. (line 246) |
| * memory references in constraints: Simple Constraints. (line 17) |
| * memory_barrier instruction pattern: Standard Names. (line 1381) |
| * MEMORY_MOVE_COST: Costs. (line 29) |
| * memory_operand: Machine-Independent Predicates. |
| (line 58) |
| * METHOD_TYPE: Types. (line 6) |
| * MIN_UNITS_PER_WORD: Storage Layout. (line 71) |
| * MINIMUM_ALIGNMENT: Storage Layout. (line 289) |
| * MINIMUM_ATOMIC_ALIGNMENT: Storage Layout. (line 188) |
| * minM3 instruction pattern: Standard Names. (line 234) |
| * minus: Arithmetic. (line 36) |
| * minus and attributes: Expressions. (line 64) |
| * minus, canonicalization of: Insn Canonicalizations. |
| (line 27) |
| * MINUS_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * MIPS coprocessor-definition macros: MIPS Coprocessors. (line 6) |
| * mod: Arithmetic. (line 131) |
| * mod and attributes: Expressions. (line 64) |
| * mode classes: Machine Modes. (line 219) |
| * mode iterators in .md files: Mode Iterators. (line 6) |
| * mode switching: Mode Switching. (line 6) |
| * MODE_ACCUM: Machine Modes. (line 249) |
| * MODE_AFTER: Mode Switching. (line 49) |
| * MODE_BASE_REG_CLASS: Register Classes. (line 112) |
| * MODE_BASE_REG_REG_CLASS: Register Classes. (line 118) |
| * MODE_CC <1>: MODE_CC Condition Codes. |
| (line 6) |
| * MODE_CC: Machine Modes. (line 268) |
| * MODE_CODE_BASE_REG_CLASS: Register Classes. (line 125) |
| * MODE_COMPLEX_FLOAT: Machine Modes. (line 260) |
| * MODE_COMPLEX_INT: Machine Modes. (line 257) |
| * MODE_DECIMAL_FLOAT: Machine Modes. (line 237) |
| * MODE_ENTRY: Mode Switching. (line 54) |
| * MODE_EXIT: Mode Switching. (line 60) |
| * MODE_FLOAT: Machine Modes. (line 233) |
| * MODE_FRACT: Machine Modes. (line 241) |
| * MODE_FUNCTION: Machine Modes. (line 264) |
| * MODE_INT: Machine Modes. (line 225) |
| * MODE_NEEDED: Mode Switching. (line 42) |
| * MODE_PARTIAL_INT: Machine Modes. (line 229) |
| * MODE_PRIORITY_TO_MODE: Mode Switching. (line 66) |
| * MODE_RANDOM: Machine Modes. (line 273) |
| * MODE_UACCUM: Machine Modes. (line 253) |
| * MODE_UFRACT: Machine Modes. (line 245) |
| * MODES_TIEABLE_P: Values in Registers. |
| (line 129) |
| * modifiers in constraints: Modifiers. (line 6) |
| * MODIFY_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * MODIFY_JNI_METHOD_CALL: Misc. (line 790) |
| * MODIFY_TARGET_NAME: Driver. (line 385) |
| * modM3 instruction pattern: Standard Names. (line 222) |
| * modulo scheduling: RTL passes. (line 131) |
| * MOVE_BY_PIECES_P: Costs. (line 113) |
| * MOVE_MAX: Misc. (line 115) |
| * MOVE_MAX_PIECES: Costs. (line 119) |
| * MOVE_RATIO: Costs. (line 97) |
| * movM instruction pattern: Standard Names. (line 11) |
| * movmemM instruction pattern: Standard Names. (line 654) |
| * movmisalignM instruction pattern: Standard Names. (line 126) |
| * movMODEcc instruction pattern: Standard Names. (line 873) |
| * movstr instruction pattern: Standard Names. (line 689) |
| * movstrictM instruction pattern: Standard Names. (line 120) |
| * msubMN4 instruction pattern: Standard Names. (line 387) |
| * mulhisi3 instruction pattern: Standard Names. (line 340) |
| * mulM3 instruction pattern: Standard Names. (line 222) |
| * mulqihi3 instruction pattern: Standard Names. (line 344) |
| * mulsidi3 instruction pattern: Standard Names. (line 344) |
| * mult: Arithmetic. (line 92) |
| * mult and attributes: Expressions. (line 64) |
| * mult, canonicalization of: Insn Canonicalizations. |
| (line 27) |
| * MULT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * MULTILIB_DEFAULTS: Driver. (line 315) |
| * MULTILIB_DIRNAMES: Target Fragment. (line 64) |
| * MULTILIB_EXCEPTIONS: Target Fragment. (line 84) |
| * MULTILIB_EXTRA_OPTS: Target Fragment. (line 96) |
| * MULTILIB_MATCHES: Target Fragment. (line 77) |
| * MULTILIB_OPTIONS: Target Fragment. (line 44) |
| * multiple alternative constraints: Multi-Alternative. (line 6) |
| * MULTIPLE_SYMBOL_SPACES: Misc. (line 533) |
| * multiplication: Arithmetic. (line 92) |
| * multiplication with signed saturation: Arithmetic. (line 92) |
| * multiplication with unsigned saturation: Arithmetic. (line 92) |
| * MUST_USE_SJLJ_EXCEPTIONS: Exception Region Output. |
| (line 64) |
| * n in constraint: Simple Constraints. (line 65) |
| * N_REG_CLASSES: Register Classes. (line 76) |
| * 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 <1>: Namespaces. (line 6) |
| * NAMESPACE_DECL: Declarations. (line 6) |
| * NATIVE_SYSTEM_HEADER_DIR: Target Fragment. (line 103) |
| * ne: Comparisons. (line 56) |
| * ne and attributes: Expressions. (line 64) |
| * NE_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * nearbyintM2 instruction pattern: Standard Names. (line 564) |
| * neg: Arithmetic. (line 81) |
| * neg and attributes: Expressions. (line 64) |
| * neg, canonicalization of: Insn Canonicalizations. |
| (line 27) |
| * NEGATE_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * negation: Arithmetic. (line 81) |
| * negation with signed saturation: Arithmetic. (line 81) |
| * negation with unsigned saturation: Arithmetic. (line 81) |
| * negM2 instruction pattern: Standard Names. (line 449) |
| * nested functions, trampolines for: Trampolines. (line 6) |
| * nested_ptr: GTY Options. (line 186) |
| * next_bb, prev_bb, FOR_EACH_BB: Basic Blocks. (line 10) |
| * NEXT_INSN: Insns. (line 30) |
| * NEXT_OBJC_RUNTIME: Library Calls. (line 94) |
| * nil: RTL Objects. (line 73) |
| * NO_DBX_BNSYM_ENSYM: DBX Hooks. (line 39) |
| * NO_DBX_FUNCTION_END: DBX Hooks. (line 33) |
| * NO_DBX_GCC_MARKER: File Names and DBX. (line 28) |
| * NO_DBX_MAIN_SOURCE_DIRECTORY: File Names and DBX. (line 23) |
| * NO_DOLLAR_IN_LABEL: Misc. (line 497) |
| * NO_DOT_IN_LABEL: Misc. (line 503) |
| * NO_FUNCTION_CSE: Costs. (line 209) |
| * NO_IMPLICIT_EXTERN_C: Misc. (line 376) |
| * NO_PROFILE_COUNTERS: Profiling. (line 28) |
| * NO_REGS: Register Classes. (line 17) |
| * NON_LVALUE_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * nondeterministic finite state automaton: Processor pipeline description. |
| (line 301) |
| * nonimmediate_operand: Machine-Independent Predicates. |
| (line 101) |
| * nonlocal goto handler: Edges. (line 171) |
| * nonlocal_goto instruction pattern: Standard Names. (line 1221) |
| * nonlocal_goto_receiver instruction pattern: Standard Names. |
| (line 1238) |
| * nonmemory_operand: Machine-Independent Predicates. |
| (line 97) |
| * nonoffsettable memory reference: Simple Constraints. (line 246) |
| * nop instruction pattern: Standard Names. (line 1032) |
| * NOP_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * normal predicates: Predicates. (line 31) |
| * not: Arithmetic. (line 149) |
| * not and attributes: Expressions. (line 50) |
| * not equal: Comparisons. (line 56) |
| * not, canonicalization of: Insn Canonicalizations. |
| (line 27) |
| * note: Insns. (line 168) |
| * note and /i: Flags. (line 59) |
| * note and /v: Flags. (line 44) |
| * NOTE_INSN_BASIC_BLOCK, CODE_LABEL, notes: Basic Blocks. (line 41) |
| * NOTE_INSN_BLOCK_BEG: Insns. (line 193) |
| * NOTE_INSN_BLOCK_END: Insns. (line 193) |
| * NOTE_INSN_DELETED: Insns. (line 183) |
| * NOTE_INSN_DELETED_LABEL: Insns. (line 188) |
| * NOTE_INSN_EH_REGION_BEG: Insns. (line 199) |
| * NOTE_INSN_EH_REGION_END: Insns. (line 199) |
| * NOTE_INSN_FUNCTION_BEG: Insns. (line 223) |
| * NOTE_INSN_LOOP_BEG: Insns. (line 207) |
| * NOTE_INSN_LOOP_CONT: Insns. (line 213) |
| * NOTE_INSN_LOOP_END: Insns. (line 207) |
| * NOTE_INSN_LOOP_VTOP: Insns. (line 217) |
| * NOTE_INSN_VAR_LOCATION: Insns. (line 227) |
| * NOTE_LINE_NUMBER: Insns. (line 168) |
| * NOTE_SOURCE_FILE: Insns. (line 168) |
| * NOTE_VAR_LOCATION: Insns. (line 227) |
| * NOTICE_UPDATE_CC: CC0 Condition Codes. |
| (line 31) |
| * NUM_MACHINE_MODES: Machine Modes. (line 286) |
| * NUM_MODES_FOR_MODE_SWITCHING: Mode Switching. (line 30) |
| * Number of iterations analysis: Number of iterations. |
| (line 6) |
| * o in constraint: Simple Constraints. (line 23) |
| * OBJC_GEN_METHOD_LABEL: Label Output. (line 412) |
| * OBJC_JBLEN: Misc. (line 977) |
| * OBJECT_FORMAT_COFF: Macros for Initialization. |
| (line 97) |
| * OFFSET_TYPE: Types. (line 6) |
| * offsettable address: Simple Constraints. (line 23) |
| * 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 651) |
| * operand access: Accessors. (line 6) |
| * Operand Access Routines: SSA Operands. (line 119) |
| * operand constraints: Constraints. (line 6) |
| * Operand Iterators: SSA Operands. (line 119) |
| * operand predicates: Predicates. (line 6) |
| * operand substitution: Output Template. (line 6) |
| * operands <1>: Patterns. (line 53) |
| * operands: SSA Operands. (line 6) |
| * Operands: Operands. (line 6) |
| * operator predicates: Predicates. (line 6) |
| * optc-gen.awk: Options. (line 6) |
| * Optimization infrastructure for GIMPLE: Tree SSA. (line 6) |
| * OPTIMIZATION_OPTIONS: Run-time Target. (line 134) |
| * OPTIMIZE_MODE_SWITCHING: Mode Switching. (line 9) |
| * option specification files: Options. (line 6) |
| * OPTION_DEFAULT_SPECS: Driver. (line 88) |
| * optional hardware or system features: Run-time Target. (line 59) |
| * options, directory search: Including Patterns. (line 44) |
| * order of register allocation: Allocation Order. (line 6) |
| * ORDER_REGS_FOR_LOCAL_ALLOC: Allocation Order. (line 23) |
| * ordered_comparison_operator: Machine-Independent Predicates. |
| (line 116) |
| * ORDERED_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * Ordering of Patterns: Pattern Ordering. (line 6) |
| * ORIGINAL_REGNO: Special Accessors. (line 44) |
| * other register constraints: Simple Constraints. (line 163) |
| * OUTGOING_REG_PARM_STACK_SPACE: Stack Arguments. (line 71) |
| * OUTGOING_REGNO: Register Basics. (line 98) |
| * output of assembler code: File Framework. (line 6) |
| * output statements: Output Statement. (line 6) |
| * output templates: Output Template. (line 6) |
| * OUTPUT_ADDR_CONST_EXTRA: Data Output. (line 39) |
| * output_asm_insn: Output Statement. (line 53) |
| * OUTPUT_QUOTED_STRING: File Framework. (line 93) |
| * OVERLOAD: Functions for C++. (line 6) |
| * OVERRIDE_ABI_FORMAT: Register Arguments. (line 140) |
| * OVERRIDE_OPTIONS: Run-time Target. (line 105) |
| * OVL_CURRENT: Functions for C++. (line 6) |
| * OVL_NEXT: Functions for C++. (line 6) |
| * p in constraint: Simple Constraints. (line 154) |
| * PAD_VARARGS_DOWN: Register Arguments. (line 221) |
| * parallel: Side Effects. (line 204) |
| * param_is: GTY Options. (line 114) |
| * parameters, c++ abi: C++ ABI. (line 6) |
| * parameters, miscellaneous: Misc. (line 6) |
| * parameters, precompiled headers: PCH Target. (line 6) |
| * paramN_is: GTY Options. (line 132) |
| * parity: Arithmetic. (line 232) |
| * parityM2 instruction pattern: Standard Names. (line 645) |
| * PARM_BOUNDARY: Storage Layout. (line 145) |
| * PARM_DECL: Declarations. (line 6) |
| * PARSE_LDD_OUTPUT: Macros for Initialization. |
| (line 121) |
| * passes and files of the compiler: Passes. (line 6) |
| * passing arguments: Interface. (line 36) |
| * PATH_SEPARATOR: Filesystem. (line 31) |
| * PATTERN: Insns. (line 288) |
| * 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 361) |
| * pc and attributes: Insn Lengths. (line 20) |
| * pc, RTL sharing: Sharing. (line 25) |
| * PC_REGNUM: Register Basics. (line 112) |
| * pc_rtx: Regs and Memory. (line 366) |
| * PCC_BITFIELD_TYPE_MATTERS: Storage Layout. (line 315) |
| * PCC_STATIC_STRUCT_RETURN: Aggregate Return. (line 65) |
| * PDImode: Machine Modes. (line 40) |
| * peephole optimization, RTL representation: Side Effects. (line 238) |
| * 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) |
| * phi_arg_d: GIMPLE_PHI. (line 28) |
| * PHI_ARG_DEF: SSA. (line 71) |
| * PHI_ARG_EDGE: SSA. (line 68) |
| * PHI_ARG_ELT: SSA. (line 63) |
| * PHI_NUM_ARGS: SSA. (line 59) |
| * PHI_RESULT: SSA. (line 56) |
| * PIC: PIC. (line 6) |
| * PIC_OFFSET_TABLE_REG_CALL_CLOBBERED: PIC. (line 26) |
| * PIC_OFFSET_TABLE_REGNUM: PIC. (line 16) |
| * pipeline hazard recognizer: Processor pipeline description. |
| (line 6) |
| * Plugins: Plugins. (line 6) |
| * plus: Arithmetic. (line 14) |
| * plus and attributes: Expressions. (line 64) |
| * plus, canonicalization of: Insn Canonicalizations. |
| (line 27) |
| * PLUS_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * Pmode: Misc. (line 344) |
| * pmode_register_operand: Machine-Independent Predicates. |
| (line 35) |
| * pointer: Types. (line 6) |
| * POINTER_PLUS_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * POINTER_SIZE: Storage Layout. (line 83) |
| * POINTER_TYPE: Types. (line 6) |
| * POINTERS_EXTEND_UNSIGNED: Storage Layout. (line 89) |
| * pop_operand: Machine-Independent Predicates. |
| (line 88) |
| * popcount: Arithmetic. (line 228) |
| * popcountM2 instruction pattern: Standard Names. (line 639) |
| * portability: Portability. (line 6) |
| * position independent code: PIC. (line 6) |
| * post_dec: Incdec. (line 25) |
| * post_inc: Incdec. (line 30) |
| * post_modify: Incdec. (line 33) |
| * POSTDECREMENT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * POSTINCREMENT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * POWI_MAX_MULTS: Misc. (line 845) |
| * powM3 instruction pattern: Standard Names. (line 513) |
| * pragma: Misc. (line 381) |
| * pre_dec: Incdec. (line 8) |
| * PRE_GCC3_DWARF_FRAME_REGISTERS: Frame Registers. (line 113) |
| * pre_inc: Incdec. (line 22) |
| * pre_modify: Incdec. (line 51) |
| * 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 <1>: Cond. Exec. Macros. (line 6) |
| * predication: Conditional Execution. |
| (line 6) |
| * predict.def: Profile information. |
| (line 24) |
| * PREFERRED_DEBUGGING_TYPE: All Debuggers. (line 42) |
| * PREFERRED_OUTPUT_RELOAD_CLASS: Register Classes. (line 246) |
| * PREFERRED_RELOAD_CLASS: Register Classes. (line 211) |
| * PREFERRED_STACK_BOUNDARY: Storage Layout. (line 159) |
| * prefetch: Side Effects. (line 312) |
| * prefetch and /v: Flags. (line 232) |
| * prefetch instruction pattern: Standard Names. (line 1360) |
| * PREFETCH_SCHEDULE_BARRIER_P: Flags. (line 232) |
| * PREINCREMENT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * presence_set: Processor pipeline description. |
| (line 220) |
| * preserving SSA form: SSA. (line 76) |
| * preserving virtual SSA form: SSA. (line 186) |
| * prev_active_insn: define_peephole. (line 60) |
| * PREV_INSN: Insns. (line 26) |
| * PRINT_OPERAND: Instruction Output. (line 81) |
| * PRINT_OPERAND_ADDRESS: Instruction Output. (line 109) |
| * PRINT_OPERAND_PUNCT_VALID_P: Instruction Output. (line 102) |
| * probe_stack instruction pattern: Standard Names. (line 1213) |
| * processor functional units: Processor pipeline description. |
| (line 6) |
| * processor pipeline description: Processor pipeline description. |
| (line 6) |
| * product: Arithmetic. (line 92) |
| * profile feedback: Profile information. |
| (line 14) |
| * profile representation: Profile information. |
| (line 6) |
| * PROFILE_BEFORE_PROLOGUE: Profiling. (line 35) |
| * PROFILE_HOOK: Profiling. (line 23) |
| * profiling, code generation: Profiling. (line 6) |
| * program counter: Regs and Memory. (line 362) |
| * prologue: Function Entry. (line 6) |
| * prologue instruction pattern: Standard Names. (line 1304) |
| * PROMOTE_MODE: Storage Layout. (line 100) |
| * pseudo registers: Regs and Memory. (line 9) |
| * PSImode: Machine Modes. (line 32) |
| * PTRDIFF_TYPE: Type Layout. (line 184) |
| * purge_dead_edges <1>: Maintaining the CFG. |
| (line 93) |
| * purge_dead_edges: Edges. (line 104) |
| * push address instruction: Simple Constraints. (line 154) |
| * PUSH_ARGS: Stack Arguments. (line 18) |
| * PUSH_ARGS_REVERSED: Stack Arguments. (line 26) |
| * push_operand: Machine-Independent Predicates. |
| (line 81) |
| * push_reload: Addressing Modes. (line 171) |
| * PUSH_ROUNDING: Stack Arguments. (line 32) |
| * pushM1 instruction pattern: Standard Names. (line 209) |
| * PUT_CODE: RTL Objects. (line 47) |
| * PUT_MODE: Machine Modes. (line 283) |
| * PUT_REG_NOTE_KIND: Insns. (line 350) |
| * PUT_SDB_: SDB and DWARF. (line 69) |
| * QCmode: Machine Modes. (line 197) |
| * QFmode: Machine Modes. (line 54) |
| * QImode: Machine Modes. (line 25) |
| * QImode, in insn: Insns. (line 272) |
| * QQmode: Machine Modes. (line 103) |
| * qualified type <1>: Types for C++. (line 6) |
| * qualified type: Types. (line 6) |
| * querying function unit reservations: Processor pipeline description. |
| (line 90) |
| * question mark: Multi-Alternative. (line 41) |
| * quotient: Arithmetic. (line 111) |
| * r in constraint: Simple Constraints. (line 56) |
| * RANGE_TEST_NON_SHORT_CIRCUIT: Costs. (line 213) |
| * RDIV_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * READONLY_DATA_SECTION_ASM_OP: Sections. (line 63) |
| * real operands: SSA Operands. (line 6) |
| * REAL_ARITHMETIC: Floating Point. (line 66) |
| * REAL_CST: Constant expressions. |
| (line 6) |
| * REAL_LIBGCC_SPEC: Driver. (line 187) |
| * REAL_NM_FILE_NAME: Macros for Initialization. |
| (line 106) |
| * REAL_TYPE: Types. (line 6) |
| * REAL_VALUE_ABS: Floating Point. (line 82) |
| * REAL_VALUE_ATOF: Floating Point. (line 50) |
| * REAL_VALUE_FIX: Floating Point. (line 41) |
| * REAL_VALUE_FROM_INT: Floating Point. (line 99) |
| * REAL_VALUE_ISINF: Floating Point. (line 59) |
| * REAL_VALUE_ISNAN: Floating Point. (line 62) |
| * REAL_VALUE_NEGATE: Floating Point. (line 79) |
| * REAL_VALUE_NEGATIVE: Floating Point. (line 56) |
| * REAL_VALUE_TO_INT: Floating Point. (line 93) |
| * REAL_VALUE_TO_TARGET_DECIMAL128: Data Output. (line 144) |
| * REAL_VALUE_TO_TARGET_DECIMAL32: Data Output. (line 142) |
| * REAL_VALUE_TO_TARGET_DECIMAL64: Data Output. (line 143) |
| * REAL_VALUE_TO_TARGET_DOUBLE: Data Output. (line 140) |
| * REAL_VALUE_TO_TARGET_LONG_DOUBLE: Data Output. (line 141) |
| * REAL_VALUE_TO_TARGET_SINGLE: Data Output. (line 139) |
| * REAL_VALUE_TRUNCATE: Floating Point. (line 86) |
| * REAL_VALUE_TYPE: Floating Point. (line 26) |
| * REAL_VALUE_UNSIGNED_FIX: Floating Point. (line 45) |
| * REAL_VALUES_EQUAL: Floating Point. (line 32) |
| * REAL_VALUES_LESS: Floating Point. (line 38) |
| * REALPART_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * recog_data.operand: Instruction Output. (line 39) |
| * recognizing insns: RTL Template. (line 6) |
| * RECORD_TYPE <1>: Classes. (line 6) |
| * RECORD_TYPE: Types. (line 6) |
| * redirect_edge_and_branch: Profile information. |
| (line 71) |
| * redirect_edge_and_branch, redirect_jump: Maintaining the CFG. |
| (line 103) |
| * reduc_smax_M instruction pattern: Standard Names. (line 240) |
| * reduc_smin_M instruction pattern: Standard Names. (line 240) |
| * reduc_splus_M instruction pattern: Standard Names. (line 252) |
| * reduc_umax_M instruction pattern: Standard Names. (line 246) |
| * reduc_umin_M instruction pattern: Standard Names. (line 246) |
| * reduc_uplus_M instruction pattern: Standard Names. (line 258) |
| * reference: Types. (line 6) |
| * REFERENCE_TYPE: Types. (line 6) |
| * reg: Regs and Memory. (line 9) |
| * reg and /f: Flags. (line 112) |
| * reg and /i: Flags. (line 107) |
| * reg and /v: Flags. (line 116) |
| * reg, RTL sharing: Sharing. (line 17) |
| * REG_ALLOC_ORDER: Allocation Order. (line 9) |
| * REG_BR_PRED: Insns. (line 531) |
| * REG_BR_PROB: Insns. (line 525) |
| * 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 496) |
| * REG_CC_USER: Insns. (line 496) |
| * REG_CLASS_CONTENTS: Register Classes. (line 86) |
| * reg_class_contents: Register Basics. (line 59) |
| * REG_CLASS_FROM_CONSTRAINT: Old Constraints. (line 35) |
| * REG_CLASS_FROM_LETTER: Old Constraints. (line 27) |
| * REG_CLASS_NAMES: Register Classes. (line 81) |
| * REG_CROSSING_JUMP: Insns. (line 409) |
| * REG_DEAD: Insns. (line 361) |
| * REG_DEAD, REG_UNUSED: Liveness information. |
| (line 32) |
| * REG_DEP_ANTI: Insns. (line 518) |
| * REG_DEP_OUTPUT: Insns. (line 514) |
| * REG_DEP_TRUE: Insns. (line 511) |
| * REG_EH_REGION, EDGE_ABNORMAL_CALL: Edges. (line 110) |
| * REG_EQUAL: Insns. (line 424) |
| * REG_EQUIV: Insns. (line 424) |
| * REG_EXPR: Special Accessors. (line 50) |
| * REG_FRAME_RELATED_EXPR: Insns. (line 537) |
| * REG_FUNCTION_VALUE_P: Flags. (line 107) |
| * REG_INC: Insns. (line 377) |
| * reg_label and /v: Flags. (line 65) |
| * REG_LABEL_OPERAND: Insns. (line 391) |
| * REG_LABEL_TARGET: Insns. (line 400) |
| * reg_names <1>: Instruction Output. (line 93) |
| * reg_names: Register Basics. (line 59) |
| * REG_NONNEG: Insns. (line 383) |
| * REG_NOTE_KIND: Insns. (line 350) |
| * REG_NOTES: Insns. (line 324) |
| * REG_OFFSET: Special Accessors. (line 54) |
| * REG_OK_STRICT: Register Classes. (line 148) |
| * REG_PARM_STACK_SPACE: Stack Arguments. (line 56) |
| * REG_PARM_STACK_SPACE, and FUNCTION_ARG: Register Arguments. |
| (line 52) |
| * REG_POINTER: Flags. (line 112) |
| * REG_SETJMP: Insns. (line 418) |
| * REG_UNUSED: Insns. (line 370) |
| * REG_USERVAR_P: Flags. (line 116) |
| * regclass_for_constraint: C Constraint Interface. |
| (line 60) |
| * 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) |
| * REGISTER_MOVE_COST: Costs. (line 10) |
| * REGISTER_NAMES: Instruction Output. (line 9) |
| * register_operand: Machine-Independent Predicates. |
| (line 30) |
| * REGISTER_PREFIX: Instruction Output. (line 137) |
| * REGISTER_TARGET_PRAGMAS: Misc. (line 382) |
| * registers arguments: Register Arguments. (line 6) |
| * registers in constraints: Simple Constraints. (line 56) |
| * REGMODE_NATURAL_SIZE: Values in Registers. |
| (line 50) |
| * REGNO_MODE_CODE_OK_FOR_BASE_P: Register Classes. (line 181) |
| * REGNO_MODE_OK_FOR_BASE_P: Register Classes. (line 154) |
| * REGNO_MODE_OK_FOR_REG_BASE_P: Register Classes. (line 166) |
| * REGNO_OK_FOR_BASE_P: Register Classes. (line 140) |
| * REGNO_OK_FOR_INDEX_P: Register Classes. (line 194) |
| * REGNO_REG_CLASS: Register Classes. (line 101) |
| * regs_ever_live: Function Entry. (line 21) |
| * regular expressions: Processor pipeline description. |
| (line 6) |
| * relative costs: Costs. (line 6) |
| * RELATIVE_PREFIX_NOT_LINKDIR: Driver. (line 325) |
| * reload_completed: Standard Names. (line 999) |
| * reload_in instruction pattern: Standard Names. (line 99) |
| * reload_in_progress: Standard Names. (line 57) |
| * reload_out instruction pattern: Standard Names. (line 99) |
| * reloading: RTL passes. (line 182) |
| * remainder: Arithmetic. (line 131) |
| * remainderM3 instruction pattern: Standard Names. (line 472) |
| * reorder: GTY Options. (line 210) |
| * representation of RTL: RTL. (line 6) |
| * reservation delays: Processor pipeline description. |
| (line 6) |
| * rest_of_decl_compilation: Parsing pass. (line 52) |
| * rest_of_type_compilation: Parsing pass. (line 52) |
| * restore_stack_block instruction pattern: Standard Names. (line 1133) |
| * restore_stack_function instruction pattern: Standard Names. |
| (line 1133) |
| * restore_stack_nonlocal instruction pattern: Standard Names. |
| (line 1133) |
| * RESULT_DECL: Declarations. (line 6) |
| * return: Side Effects. (line 72) |
| * return instruction pattern: Standard Names. (line 986) |
| * return values in registers: Scalar Return. (line 6) |
| * RETURN_ADDR_IN_PREVIOUS_FRAME: Frame Layout. (line 135) |
| * RETURN_ADDR_OFFSET: Exception Handling. (line 60) |
| * RETURN_ADDR_RTX: Frame Layout. (line 124) |
| * RETURN_ADDRESS_POINTER_REGNUM: Frame Registers. (line 51) |
| * RETURN_EXPR: Statements for C++. (line 6) |
| * RETURN_POPS_ARGS: Stack Arguments. (line 90) |
| * RETURN_STMT: Statements for C++. (line 6) |
| * return_val: Flags. (line 299) |
| * return_val, in call_insn: Flags. (line 24) |
| * return_val, in mem: Flags. (line 85) |
| * return_val, in reg: Flags. (line 107) |
| * return_val, in symbol_ref: Flags. (line 220) |
| * returning aggregate values: Aggregate Return. (line 6) |
| * returning structures and unions: Interface. (line 10) |
| * reverse probability: Profile information. |
| (line 66) |
| * REVERSE_CONDEXEC_PREDICATES_P: Cond. Exec. Macros. (line 11) |
| * REVERSE_CONDITION: MODE_CC Condition Codes. |
| (line 87) |
| * REVERSIBLE_CC_MODE: MODE_CC Condition Codes. |
| (line 73) |
| * right rotate: Arithmetic. (line 190) |
| * right shift: Arithmetic. (line 185) |
| * rintM2 instruction pattern: Standard Names. (line 572) |
| * RISC: Processor pipeline description. |
| (line 6) |
| * roots, marking: GGC Roots. (line 6) |
| * rotate: Arithmetic. (line 190) |
| * rotatert: Arithmetic. (line 190) |
| * rotlM3 instruction pattern: Standard Names. (line 441) |
| * rotrM3 instruction pattern: Standard Names. (line 441) |
| * ROUND_DIV_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * ROUND_MOD_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * ROUND_TOWARDS_ZERO: Storage Layout. (line 465) |
| * ROUND_TYPE_ALIGN: Storage Layout. (line 412) |
| * roundM2 instruction pattern: Standard Names. (line 548) |
| * 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 43) |
| * 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 36) |
| * RTL expression: RTL Objects. (line 6) |
| * RTL expressions for arithmetic: Arithmetic. (line 6) |
| * RTL format: RTL Classes. (line 71) |
| * RTL format characters: RTL Classes. (line 76) |
| * 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 36) |
| * RTL subtraction with signed saturation: Arithmetic. (line 36) |
| * RTL subtraction with unsigned saturation: Arithmetic. (line 36) |
| * 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 125) |
| * run-time conventions: Interface. (line 6) |
| * run-time target specification: Run-time Target. (line 6) |
| * s in constraint: Simple Constraints. (line 92) |
| * same_type_p: Types. (line 88) |
| * SAmode: Machine Modes. (line 148) |
| * sat_fract: Conversions. (line 90) |
| * satfractMN2 instruction pattern: Standard Names. (line 825) |
| * satfractunsMN2 instruction pattern: Standard Names. (line 838) |
| * satisfies_constraint_: C Constraint Interface. |
| (line 47) |
| * SAVE_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * save_stack_block instruction pattern: Standard Names. (line 1133) |
| * save_stack_function instruction pattern: Standard Names. (line 1133) |
| * save_stack_nonlocal instruction pattern: Standard Names. (line 1133) |
| * SBSS_SECTION_ASM_OP: Sections. (line 77) |
| * Scalar evolutions: Scalar evolutions. (line 6) |
| * scalars, returned as values: Scalar Return. (line 6) |
| * SCHED_GROUP_P: Flags. (line 166) |
| * SCmode: Machine Modes. (line 197) |
| * scratch: Regs and Memory. (line 298) |
| * scratch operands: Regs and Memory. (line 298) |
| * scratch, RTL sharing: Sharing. (line 35) |
| * scratch_operand: Machine-Independent Predicates. |
| (line 50) |
| * SDATA_SECTION_ASM_OP: Sections. (line 58) |
| * SDB_ALLOW_FORWARD_REFERENCES: SDB and DWARF. (line 87) |
| * SDB_ALLOW_UNKNOWN_REFERENCES: SDB and DWARF. (line 82) |
| * SDB_DEBUGGING_INFO: SDB and DWARF. (line 9) |
| * SDB_DELIM: SDB and DWARF. (line 75) |
| * SDB_OUTPUT_SOURCE_LINE: SDB and DWARF. (line 92) |
| * SDmode: Machine Modes. (line 85) |
| * sdot_prodM instruction pattern: Standard Names. (line 264) |
| * search options: Including Patterns. (line 44) |
| * SECONDARY_INPUT_RELOAD_CLASS: Register Classes. (line 350) |
| * SECONDARY_MEMORY_NEEDED: Register Classes. (line 406) |
| * SECONDARY_MEMORY_NEEDED_MODE: Register Classes. (line 425) |
| * SECONDARY_MEMORY_NEEDED_RTX: Register Classes. (line 416) |
| * SECONDARY_OUTPUT_RELOAD_CLASS: Register Classes. (line 351) |
| * SECONDARY_RELOAD_CLASS: Register Classes. (line 349) |
| * SELECT_CC_MODE: MODE_CC Condition Codes. |
| (line 7) |
| * sequence: Side Effects. (line 254) |
| * Sequence iterators: Sequence iterators. (line 6) |
| * set: Side Effects. (line 15) |
| * set and /f: Flags. (line 125) |
| * SET_ASM_OP: Label Output. (line 379) |
| * set_attr: Tagging Insns. (line 31) |
| * set_attr_alternative: Tagging Insns. (line 49) |
| * set_bb_seq: GIMPLE sequences. (line 76) |
| * SET_BY_PIECES_P: Costs. (line 154) |
| * SET_DEST: Side Effects. (line 69) |
| * SET_IS_RETURN_P: Flags. (line 175) |
| * SET_LABEL_KIND: Insns. (line 140) |
| * set_optab_libfunc: Library Calls. (line 15) |
| * SET_RATIO: Costs. (line 142) |
| * SET_SRC: Side Effects. (line 69) |
| * SET_TYPE_STRUCTURAL_EQUALITY: Types. (line 6) |
| * setmemM instruction pattern: Standard Names. (line 697) |
| * SETUP_FRAME_ADDRESSES: Frame Layout. (line 102) |
| * SF_SIZE: Type Layout. (line 129) |
| * SFmode: Machine Modes. (line 66) |
| * sharing of RTL components: Sharing. (line 6) |
| * shift: Arithmetic. (line 168) |
| * SHIFT_COUNT_TRUNCATED: Misc. (line 127) |
| * SHLIB_SUFFIX: Macros for Initialization. |
| (line 129) |
| * SHORT_ACCUM_TYPE_SIZE: Type Layout. (line 83) |
| * SHORT_FRACT_TYPE_SIZE: Type Layout. (line 63) |
| * SHORT_IMMEDIATES_SIGN_EXTEND: Misc. (line 96) |
| * SHORT_TYPE_SIZE: Type Layout. (line 16) |
| * sibcall_epilogue instruction pattern: Standard Names. (line 1330) |
| * sibling call: Edges. (line 122) |
| * SIBLING_CALL_P: Flags. (line 179) |
| * SIG_ATOMIC_TYPE: Type Layout. (line 235) |
| * sign_extend: Conversions. (line 23) |
| * sign_extract: Bit-Fields. (line 8) |
| * sign_extract, canonicalization of: Insn Canonicalizations. |
| (line 88) |
| * signed division: Arithmetic. (line 111) |
| * signed division with signed saturation: Arithmetic. (line 111) |
| * signed maximum: Arithmetic. (line 136) |
| * signed minimum: Arithmetic. (line 136) |
| * SImode: Machine Modes. (line 37) |
| * simple constraints: Simple Constraints. (line 6) |
| * sincos math function, implicit usage: Library Calls. (line 84) |
| * sinM2 instruction pattern: Standard Names. (line 489) |
| * SIZE_ASM_OP: Label Output. (line 23) |
| * SIZE_TYPE: Type Layout. (line 168) |
| * skip: GTY Options. (line 77) |
| * SLOW_BYTE_ACCESS: Costs. (line 66) |
| * SLOW_UNALIGNED_ACCESS: Costs. (line 81) |
| * SMALL_REGISTER_CLASSES: Register Classes. (line 448) |
| * smax: Arithmetic. (line 136) |
| * smin: Arithmetic. (line 136) |
| * sms, swing, software pipelining: RTL passes. (line 131) |
| * smulM3_highpart instruction pattern: Standard Names. (line 356) |
| * soft float library: Soft float library routines. |
| (line 6) |
| * special: GTY Options. (line 230) |
| * special predicates: Predicates. (line 31) |
| * SPECS: Target Fragment. (line 108) |
| * speed of instructions: Costs. (line 6) |
| * split_block: Maintaining the CFG. |
| (line 110) |
| * splitting instructions: Insn Splitting. (line 6) |
| * SQmode: Machine Modes. (line 111) |
| * sqrt: Arithmetic. (line 202) |
| * sqrtM2 instruction pattern: Standard Names. (line 455) |
| * square root: Arithmetic. (line 202) |
| * ss_abs: Arithmetic. (line 195) |
| * ss_ashift: Arithmetic. (line 168) |
| * ss_div: Arithmetic. (line 111) |
| * ss_minus: Arithmetic. (line 36) |
| * ss_mult: Arithmetic. (line 92) |
| * ss_neg: Arithmetic. (line 81) |
| * ss_plus: Arithmetic. (line 14) |
| * ss_truncate: Conversions. (line 43) |
| * SSA: SSA. (line 6) |
| * SSA_NAME_DEF_STMT: SSA. (line 221) |
| * SSA_NAME_VERSION: SSA. (line 226) |
| * ssaddM3 instruction pattern: Standard Names. (line 222) |
| * ssashlM3 instruction pattern: Standard Names. (line 431) |
| * ssdivM3 instruction pattern: Standard Names. (line 222) |
| * ssmaddMN4 instruction pattern: Standard Names. (line 379) |
| * ssmsubMN4 instruction pattern: Standard Names. (line 403) |
| * ssmulM3 instruction pattern: Standard Names. (line 222) |
| * ssnegM2 instruction pattern: Standard Names. (line 449) |
| * sssubM3 instruction pattern: Standard Names. (line 222) |
| * ssum_widenM3 instruction pattern: Standard Names. (line 274) |
| * 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 48) |
| * STACK_BOUNDARY: Storage Layout. (line 151) |
| * STACK_CHECK_BUILTIN: Stack Checking. (line 32) |
| * STACK_CHECK_FIXED_FRAME_SIZE: Stack Checking. (line 83) |
| * STACK_CHECK_MAX_FRAME_SIZE: Stack Checking. (line 74) |
| * STACK_CHECK_MAX_VAR_SIZE: Stack Checking. (line 90) |
| * STACK_CHECK_MOVING_SP: Stack Checking. (line 54) |
| * STACK_CHECK_PROBE_INTERVAL_EXP: Stack Checking. (line 46) |
| * STACK_CHECK_PROTECT: Stack Checking. (line 63) |
| * STACK_CHECK_STATIC_BUILTIN: Stack Checking. (line 39) |
| * STACK_DYNAMIC_OFFSET: Frame Layout. (line 75) |
| * STACK_DYNAMIC_OFFSET and virtual registers: Regs and Memory. |
| (line 83) |
| * STACK_GROWS_DOWNWARD: Frame Layout. (line 9) |
| * STACK_PARMS_IN_REG_PARM_AREA: Stack Arguments. (line 81) |
| * STACK_POINTER_OFFSET: Frame Layout. (line 58) |
| * STACK_POINTER_OFFSET and virtual registers: Regs and Memory. |
| (line 93) |
| * STACK_POINTER_REGNUM: Frame Registers. (line 9) |
| * STACK_POINTER_REGNUM and virtual registers: Regs and Memory. |
| (line 83) |
| * stack_pointer_rtx: Frame Registers. (line 90) |
| * stack_protect_set instruction pattern: Standard Names. (line 1501) |
| * stack_protect_test instruction pattern: Standard Names. (line 1511) |
| * STACK_PUSH_CODE: Frame Layout. (line 17) |
| * STACK_REG_COVER_CLASS: Stack Registers. (line 23) |
| * STACK_REGS: Stack Registers. (line 20) |
| * STACK_SAVEAREA_MODE: Storage Layout. (line 428) |
| * STACK_SIZE_MODE: Storage Layout. (line 440) |
| * STACK_SLOT_ALIGNMENT: Storage Layout. (line 266) |
| * standard pattern names: Standard Names. (line 6) |
| * STANDARD_INCLUDE_COMPONENT: Driver. (line 425) |
| * STANDARD_INCLUDE_DIR: Driver. (line 417) |
| * STANDARD_STARTFILE_PREFIX: Driver. (line 337) |
| * STANDARD_STARTFILE_PREFIX_1: Driver. (line 344) |
| * STANDARD_STARTFILE_PREFIX_2: Driver. (line 351) |
| * STARTFILE_SPEC: Driver. (line 210) |
| * STARTING_FRAME_OFFSET: Frame Layout. (line 39) |
| * 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 <1>: Statements for C++. (line 6) |
| * statements: Function Properties. |
| (line 6) |
| * Statements: Statements. (line 6) |
| * Static profile estimation: Profile information. |
| (line 24) |
| * static single assignment: SSA. (line 6) |
| * STATIC_CHAIN_INCOMING_REGNUM: Frame Registers. (line 64) |
| * STATIC_CHAIN_REGNUM: Frame Registers. (line 63) |
| * stdarg.h and register arguments: Register Arguments. (line 47) |
| * STDC_0_IN_SYSTEM_HEADERS: Misc. (line 365) |
| * 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 161) |
| * STORE_FLAG_VALUE: Misc. (line 216) |
| * store_multiple instruction pattern: Standard Names. (line 160) |
| * strcpy: Storage Layout. (line 236) |
| * STRICT_ALIGNMENT: Storage Layout. (line 310) |
| * strict_low_part: RTL Declarations. (line 9) |
| * strict_memory_address_p: Addressing Modes. (line 181) |
| * STRING_CST: Constant expressions. |
| (line 6) |
| * STRING_POOL_ADDRESS_P: Flags. (line 183) |
| * strlenM instruction pattern: Standard Names. (line 760) |
| * structure value address: Aggregate Return. (line 6) |
| * STRUCTURE_SIZE_BOUNDARY: Storage Layout. (line 302) |
| * structures, returning: Interface. (line 10) |
| * subM3 instruction pattern: Standard Names. (line 222) |
| * SUBOBJECT: Statements for C++. (line 6) |
| * SUBOBJECT_CLEANUP: Statements for C++. (line 6) |
| * subreg: Regs and Memory. (line 97) |
| * subreg and /s: Flags. (line 205) |
| * subreg and /u: Flags. (line 198) |
| * subreg and /u and /v: Flags. (line 188) |
| * subreg, in strict_low_part: RTL Declarations. (line 9) |
| * SUBREG_BYTE: Regs and Memory. (line 289) |
| * SUBREG_PROMOTED_UNSIGNED_P: Flags. (line 188) |
| * SUBREG_PROMOTED_UNSIGNED_SET: Flags. (line 198) |
| * SUBREG_PROMOTED_VAR_P: Flags. (line 205) |
| * SUBREG_REG: Regs and Memory. (line 289) |
| * SUCCESS_EXIT_CODE: Host Misc. (line 12) |
| * SUPPORTS_INIT_PRIORITY: Macros for Initialization. |
| (line 58) |
| * SUPPORTS_ONE_ONLY: Label Output. (line 227) |
| * SUPPORTS_WEAK: Label Output. (line 208) |
| * SWITCH_BODY: Statements for C++. (line 6) |
| * SWITCH_COND: Statements for C++. (line 6) |
| * SWITCH_CURTAILS_COMPILATION: Driver. (line 33) |
| * SWITCH_STMT: Statements for C++. (line 6) |
| * SWITCH_TAKES_ARG: Driver. (line 9) |
| * SWITCHES_NEED_SPACES: Driver. (line 47) |
| * SYMBOL_FLAG_ANCHOR: Special Accessors. (line 110) |
| * SYMBOL_FLAG_EXTERNAL: Special Accessors. (line 92) |
| * SYMBOL_FLAG_FUNCTION: Special Accessors. (line 85) |
| * SYMBOL_FLAG_HAS_BLOCK_INFO: Special Accessors. (line 106) |
| * SYMBOL_FLAG_LOCAL: Special Accessors. (line 88) |
| * SYMBOL_FLAG_SMALL: Special Accessors. (line 97) |
| * SYMBOL_FLAG_TLS_SHIFT: Special Accessors. (line 101) |
| * symbol_ref: Constants. (line 76) |
| * symbol_ref and /f: Flags. (line 183) |
| * symbol_ref and /i: Flags. (line 220) |
| * symbol_ref and /u: Flags. (line 10) |
| * symbol_ref and /v: Flags. (line 224) |
| * symbol_ref, RTL sharing: Sharing. (line 20) |
| * SYMBOL_REF_ANCHOR_P: Special Accessors. (line 110) |
| * SYMBOL_REF_BLOCK: Special Accessors. (line 123) |
| * SYMBOL_REF_BLOCK_OFFSET: Special Accessors. (line 128) |
| * SYMBOL_REF_CONSTANT: Special Accessors. (line 71) |
| * SYMBOL_REF_DATA: Special Accessors. (line 75) |
| * SYMBOL_REF_DECL: Special Accessors. (line 59) |
| * SYMBOL_REF_EXTERNAL_P: Special Accessors. (line 92) |
| * SYMBOL_REF_FLAG: Flags. (line 224) |
| * SYMBOL_REF_FLAG, in TARGET_ENCODE_SECTION_INFO: Sections. (line 269) |
| * SYMBOL_REF_FLAGS: Special Accessors. (line 79) |
| * SYMBOL_REF_FUNCTION_P: Special Accessors. (line 85) |
| * SYMBOL_REF_HAS_BLOCK_INFO_P: Special Accessors. (line 106) |
| * SYMBOL_REF_LOCAL_P: Special Accessors. (line 88) |
| * SYMBOL_REF_SMALL_P: Special Accessors. (line 97) |
| * SYMBOL_REF_TLS_MODEL: Special Accessors. (line 101) |
| * SYMBOL_REF_USED: Flags. (line 215) |
| * SYMBOL_REF_WEAK: Flags. (line 220) |
| * symbolic label: Sharing. (line 20) |
| * sync_addMODE instruction pattern: Standard Names. (line 1417) |
| * sync_andMODE instruction pattern: Standard Names. (line 1417) |
| * sync_compare_and_swapMODE instruction pattern: Standard Names. |
| (line 1387) |
| * sync_iorMODE instruction pattern: Standard Names. (line 1417) |
| * sync_lock_releaseMODE instruction pattern: Standard Names. (line 1482) |
| * sync_lock_test_and_setMODE instruction pattern: Standard Names. |
| (line 1456) |
| * sync_nandMODE instruction pattern: Standard Names. (line 1417) |
| * sync_new_addMODE instruction pattern: Standard Names. (line 1449) |
| * sync_new_andMODE instruction pattern: Standard Names. (line 1449) |
| * sync_new_iorMODE instruction pattern: Standard Names. (line 1449) |
| * sync_new_nandMODE instruction pattern: Standard Names. (line 1449) |
| * sync_new_subMODE instruction pattern: Standard Names. (line 1449) |
| * sync_new_xorMODE instruction pattern: Standard Names. (line 1449) |
| * sync_old_addMODE instruction pattern: Standard Names. (line 1432) |
| * sync_old_andMODE instruction pattern: Standard Names. (line 1432) |
| * sync_old_iorMODE instruction pattern: Standard Names. (line 1432) |
| * sync_old_nandMODE instruction pattern: Standard Names. (line 1432) |
| * sync_old_subMODE instruction pattern: Standard Names. (line 1432) |
| * sync_old_xorMODE instruction pattern: Standard Names. (line 1432) |
| * sync_subMODE instruction pattern: Standard Names. (line 1417) |
| * sync_xorMODE instruction pattern: Standard Names. (line 1417) |
| * SYSROOT_HEADERS_SUFFIX_SPEC: Driver. (line 239) |
| * SYSROOT_SUFFIX_SPEC: Driver. (line 234) |
| * SYSTEM_INCLUDE_DIR: Driver. (line 408) |
| * t-TARGET: Target Fragment. (line 6) |
| * table jump: Basic Blocks. (line 57) |
| * tablejump instruction pattern: Standard Names. (line 1061) |
| * tag: GTY Options. (line 82) |
| * tagging insns: Tagging Insns. (line 6) |
| * tail calls: Tail Calls. (line 6) |
| * TAmode: Machine Modes. (line 156) |
| * 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) |
| * TARGET_ADDR_SPACE_ADDRESS_MODE: Named Address Spaces. |
| (line 47) |
| * TARGET_ADDR_SPACE_CONVERT: Named Address Spaces. |
| (line 90) |
| * TARGET_ADDR_SPACE_KEYWORDS: Named Address Spaces. |
| (line 30) |
| * TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P: Named Address Spaces. |
| (line 65) |
| * TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS: Named Address Spaces. |
| (line 74) |
| * TARGET_ADDR_SPACE_POINTER_MODE: Named Address Spaces. |
| (line 40) |
| * TARGET_ADDR_SPACE_SUBSET_P: Named Address Spaces. |
| (line 81) |
| * TARGET_ADDR_SPACE_VALID_POINTER_MODE: Named Address Spaces. |
| (line 54) |
| * TARGET_ADDRESS_COST: Costs. (line 245) |
| * TARGET_ALIGN_ANON_BITFIELD: Storage Layout. (line 387) |
| * TARGET_ALLOCATE_INITIAL_VALUE: Misc. (line 727) |
| * TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS: Misc. (line 999) |
| * TARGET_ARG_PARTIAL_BYTES: Register Arguments. (line 83) |
| * TARGET_ARM_EABI_UNWINDER: Exception Region Output. |
| (line 113) |
| * TARGET_ASM_ALIGNED_DI_OP: Data Output. (line 10) |
| * TARGET_ASM_ALIGNED_HI_OP: Data Output. (line 8) |
| * TARGET_ASM_ALIGNED_SI_OP: Data Output. (line 9) |
| * TARGET_ASM_ALIGNED_TI_OP: Data Output. (line 11) |
| * TARGET_ASM_ASSEMBLE_VISIBILITY: Label Output. (line 239) |
| * TARGET_ASM_BYTE_OP: Data Output. (line 7) |
| * TARGET_ASM_CAN_OUTPUT_MI_THUNK: Function Entry. (line 237) |
| * TARGET_ASM_CLOSE_PAREN: Data Output. (line 130) |
| * TARGET_ASM_CODE_END: File Framework. (line 59) |
| * TARGET_ASM_CONSTRUCTOR: Macros for Initialization. |
| (line 69) |
| * TARGET_ASM_DESTRUCTOR: Macros for Initialization. |
| (line 83) |
| * TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL: Dispatch Tables. (line 74) |
| * TARGET_ASM_EMIT_UNWIND_LABEL: Dispatch Tables. (line 63) |
| * TARGET_ASM_EXTERNAL_LIBCALL: Label Output. (line 274) |
| * TARGET_ASM_FILE_END: File Framework. (line 37) |
| * TARGET_ASM_FILE_START: File Framework. (line 9) |
| * TARGET_ASM_FILE_START_APP_OFF: File Framework. (line 17) |
| * TARGET_ASM_FILE_START_FILE_DIRECTIVE: File Framework. (line 31) |
| * TARGET_ASM_FINAL_POSTSCAN_INSN: Instruction Output. (line 69) |
| * TARGET_ASM_FUNCTION_BEGIN_EPILOGUE: Function Entry. (line 61) |
| * TARGET_ASM_FUNCTION_END_PROLOGUE: Function Entry. (line 55) |
| * TARGET_ASM_FUNCTION_EPILOGUE: Function Entry. (line 68) |
| * TARGET_ASM_FUNCTION_PROLOGUE: Function Entry. (line 11) |
| * TARGET_ASM_FUNCTION_RODATA_SECTION: Sections. (line 216) |
| * TARGET_ASM_GLOBALIZE_DECL_NAME: Label Output. (line 174) |
| * TARGET_ASM_GLOBALIZE_LABEL: Label Output. (line 165) |
| * TARGET_ASM_INIT_SECTIONS: Sections. (line 161) |
| * TARGET_ASM_INTEGER: Data Output. (line 27) |
| * TARGET_ASM_INTERNAL_LABEL: Label Output. (line 310) |
| * TARGET_ASM_LTO_END: File Framework. (line 54) |
| * TARGET_ASM_LTO_START: File Framework. (line 49) |
| * TARGET_ASM_MARK_DECL_PRESERVED: Label Output. (line 281) |
| * TARGET_ASM_NAMED_SECTION: File Framework. (line 106) |
| * TARGET_ASM_OPEN_PAREN: Data Output. (line 129) |
| * TARGET_ASM_OUTPUT_ANCHOR: Anchored Addresses. (line 44) |
| * TARGET_ASM_OUTPUT_DWARF_DTPREL: SDB and DWARF. (line 64) |
| * TARGET_ASM_OUTPUT_MI_THUNK: Function Entry. (line 195) |
| * TARGET_ASM_RECORD_GCC_SWITCHES: File Framework. (line 136) |
| * TARGET_ASM_RECORD_GCC_SWITCHES_SECTION: File Framework. (line 180) |
| * TARGET_ASM_RELOC_RW_MASK: Sections. (line 170) |
| * TARGET_ASM_SELECT_RTX_SECTION: Sections. (line 224) |
| * TARGET_ASM_SELECT_SECTION: Sections. (line 182) |
| * TARGET_ASM_TRAMPOLINE_TEMPLATE: Trampolines. (line 29) |
| * TARGET_ASM_TTYPE: Exception Region Output. |
| (line 107) |
| * TARGET_ASM_UNALIGNED_DI_OP: Data Output. (line 14) |
| * TARGET_ASM_UNALIGNED_HI_OP: Data Output. (line 12) |
| * TARGET_ASM_UNALIGNED_SI_OP: Data Output. (line 13) |
| * TARGET_ASM_UNALIGNED_TI_OP: Data Output. (line 15) |
| * TARGET_ASM_UNIQUE_SECTION: Sections. (line 203) |
| * TARGET_ATTRIBUTE_TABLE: Target Attributes. (line 11) |
| * TARGET_BINDS_LOCAL_P: Sections. (line 294) |
| * TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED: Misc. (line 825) |
| * TARGET_BRANCH_TARGET_REGISTER_CLASS: Misc. (line 817) |
| * TARGET_BUILD_BUILTIN_VA_LIST: Register Arguments. (line 264) |
| * TARGET_BUILTIN_DECL: Misc. (line 660) |
| * TARGET_BUILTIN_RECIPROCAL: Addressing Modes. (line 242) |
| * TARGET_BUILTIN_SETJMP_FRAME_VALUE: Frame Layout. (line 109) |
| * TARGET_C99_FUNCTIONS: Library Calls. (line 77) |
| * TARGET_CALLEE_COPIES: Register Arguments. (line 115) |
| * TARGET_CAN_ELIMINATE: Elimination. (line 75) |
| * TARGET_CAN_INLINE_P: Target Attributes. (line 128) |
| * TARGET_CANNOT_FORCE_CONST_MEM: Addressing Modes. (line 223) |
| * TARGET_CANNOT_MODIFY_JUMPS_P: Misc. (line 803) |
| * TARGET_CANONICAL_VA_LIST_TYPE: Register Arguments. (line 273) |
| * TARGET_CASE_VALUES_THRESHOLD: Misc. (line 47) |
| * TARGET_CC_MODES_COMPATIBLE: MODE_CC Condition Codes. |
| (line 116) |
| * TARGET_CHECK_PCH_TARGET_FLAGS: PCH Target. (line 28) |
| * TARGET_COMMUTATIVE_P: Misc. (line 720) |
| * TARGET_COMP_TYPE_ATTRIBUTES: Target Attributes. (line 19) |
| * TARGET_CONST_ANCHOR: Misc. (line 1010) |
| * TARGET_CONVERT_TO_TYPE: Misc. (line 963) |
| * TARGET_CPU_CPP_BUILTINS: Run-time Target. (line 9) |
| * TARGET_CXX_ADJUST_CLASS_AT_DEFINITION: C++ ABI. (line 87) |
| * TARGET_CXX_CDTOR_RETURNS_THIS: C++ ABI. (line 38) |
| * TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT: C++ ABI. (line 62) |
| * TARGET_CXX_COOKIE_HAS_SIZE: C++ ABI. (line 25) |
| * TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY: C++ ABI. (line 54) |
| * TARGET_CXX_GET_COOKIE_SIZE: C++ ABI. (line 18) |
| * TARGET_CXX_GUARD_MASK_BIT: C++ ABI. (line 12) |
| * TARGET_CXX_GUARD_TYPE: C++ ABI. (line 7) |
| * TARGET_CXX_IMPORT_EXPORT_CLASS: C++ ABI. (line 30) |
| * TARGET_CXX_KEY_METHOD_MAY_BE_INLINE: C++ ABI. (line 43) |
| * TARGET_CXX_LIBRARY_RTTI_COMDAT: C++ ABI. (line 69) |
| * TARGET_CXX_USE_AEABI_ATEXIT: C++ ABI. (line 74) |
| * TARGET_CXX_USE_ATEXIT_FOR_CXA_ATEXIT: C++ ABI. (line 80) |
| * TARGET_DECIMAL_FLOAT_SUPPORTED_P: Storage Layout. (line 512) |
| * TARGET_DECLSPEC: Target Attributes. (line 65) |
| * TARGET_DEFAULT_PACK_STRUCT: Misc. (line 485) |
| * TARGET_DEFAULT_SHORT_ENUMS: Type Layout. (line 160) |
| * TARGET_DEFAULT_TARGET_FLAGS: Run-time Target. (line 56) |
| * TARGET_DEFERRED_OUTPUT_DEFS: Label Output. (line 394) |
| * TARGET_DELEGITIMIZE_ADDRESS: Addressing Modes. (line 214) |
| * TARGET_DLLIMPORT_DECL_ATTRIBUTES: Target Attributes. (line 47) |
| * TARGET_DWARF_CALLING_CONVENTION: SDB and DWARF. (line 18) |
| * TARGET_DWARF_HANDLE_FRAME_UNSPEC: Frame Layout. (line 172) |
| * TARGET_DWARF_REGISTER_SPAN: Exception Region Output. |
| (line 90) |
| * TARGET_EDOM: Library Calls. (line 59) |
| * TARGET_EMUTLS_DEBUG_FORM_TLS_ADDRESS: Emulated TLS. (line 68) |
| * TARGET_EMUTLS_GET_ADDRESS: Emulated TLS. (line 19) |
| * TARGET_EMUTLS_REGISTER_COMMON: Emulated TLS. (line 24) |
| * TARGET_EMUTLS_TMPL_PREFIX: Emulated TLS. (line 45) |
| * TARGET_EMUTLS_TMPL_SECTION: Emulated TLS. (line 36) |
| * TARGET_EMUTLS_VAR_ALIGN_FIXED: Emulated TLS. (line 63) |
| * TARGET_EMUTLS_VAR_FIELDS: Emulated TLS. (line 49) |
| * TARGET_EMUTLS_VAR_INIT: Emulated TLS. (line 57) |
| * TARGET_EMUTLS_VAR_PREFIX: Emulated TLS. (line 41) |
| * TARGET_EMUTLS_VAR_SECTION: Emulated TLS. (line 31) |
| * TARGET_ENCODE_SECTION_INFO: Sections. (line 245) |
| * TARGET_ENCODE_SECTION_INFO and address validation: Addressing Modes. |
| (line 83) |
| * TARGET_ENCODE_SECTION_INFO usage: Instruction Output. (line 113) |
| * TARGET_ENUM_VA_LIST: Scalar Return. (line 96) |
| * TARGET_EXECUTABLE_SUFFIX: Misc. (line 777) |
| * TARGET_EXPAND_BUILTIN: Misc. (line 670) |
| * TARGET_EXPAND_BUILTIN_SAVEREGS: Varargs. (line 92) |
| * TARGET_EXPAND_TO_RTL_HOOK: Storage Layout. (line 518) |
| * TARGET_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * TARGET_EXTRA_INCLUDES: Misc. (line 856) |
| * TARGET_EXTRA_LIVE_ON_ENTRY: Tail Calls. (line 21) |
| * TARGET_EXTRA_PRE_INCLUDES: Misc. (line 863) |
| * TARGET_FIXED_CONDITION_CODE_REGS: MODE_CC Condition Codes. |
| (line 101) |
| * TARGET_FIXED_POINT_SUPPORTED_P: Storage Layout. (line 515) |
| * target_flags: Run-time Target. (line 52) |
| * TARGET_FLT_EVAL_METHOD: Type Layout. (line 141) |
| * TARGET_FN_ABI_VA_LIST: Register Arguments. (line 268) |
| * TARGET_FOLD_BUILTIN: Misc. (line 691) |
| * TARGET_FORMAT_TYPES: Misc. (line 883) |
| * TARGET_FRAME_POINTER_REQUIRED: Elimination. (line 9) |
| * TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P: Target Attributes. (line 87) |
| * TARGET_FUNCTION_OK_FOR_SIBCALL: Tail Calls. (line 8) |
| * TARGET_FUNCTION_VALUE: Scalar Return. (line 11) |
| * TARGET_GET_DRAP_RTX: Misc. (line 993) |
| * TARGET_GET_PCH_VALIDITY: PCH Target. (line 7) |
| * TARGET_GIMPLIFY_VA_ARG_EXPR: Register Arguments. (line 279) |
| * TARGET_HANDLE_C_OPTION: Run-time Target. (line 78) |
| * TARGET_HANDLE_OPTION: Run-time Target. (line 61) |
| * TARGET_HANDLE_PRAGMA_EXTERN_PREFIX: Misc. (line 482) |
| * TARGET_HARD_REGNO_SCRATCH_OK: Values in Registers. |
| (line 144) |
| * TARGET_HAS_SINCOS: Library Calls. (line 85) |
| * TARGET_HAVE_CONDITIONAL_EXECUTION: Misc. (line 839) |
| * TARGET_HAVE_CTORS_DTORS: Macros for Initialization. |
| (line 64) |
| * TARGET_HAVE_NAMED_SECTIONS: File Framework. (line 113) |
| * TARGET_HAVE_SRODATA_SECTION: Sections. (line 290) |
| * TARGET_HAVE_SWITCHABLE_BSS_SECTIONS: File Framework. (line 117) |
| * TARGET_HAVE_TLS: Sections. (line 303) |
| * TARGET_HELP: Run-time Target. (line 154) |
| * TARGET_IN_SMALL_DATA_P: Sections. (line 286) |
| * TARGET_INIT_BUILTINS: Misc. (line 642) |
| * TARGET_INIT_DWARF_REG_SIZES_EXTRA: Exception Region Output. |
| (line 99) |
| * TARGET_INIT_LIBFUNCS: Library Calls. (line 16) |
| * TARGET_INSERT_ATTRIBUTES: Target Attributes. (line 74) |
| * TARGET_INSTANTIATE_DECLS: Storage Layout. (line 526) |
| * TARGET_INVALID_ARG_FOR_UNPROTOTYPED_FN: Misc. (line 917) |
| * TARGET_INVALID_BINARY_OP: Misc. (line 936) |
| * TARGET_INVALID_CONVERSION: Misc. (line 923) |
| * TARGET_INVALID_PARAMETER_TYPE: Misc. (line 942) |
| * TARGET_INVALID_RETURN_TYPE: Misc. (line 949) |
| * TARGET_INVALID_UNARY_OP: Misc. (line 929) |
| * TARGET_INVALID_WITHIN_DOLOOP: Misc. (line 700) |
| * TARGET_IRA_COVER_CLASSES: Register Classes. (line 511) |
| * TARGET_LEGITIMATE_ADDRESS_P: Addressing Modes. (line 50) |
| * TARGET_LEGITIMIZE_ADDRESS: Addressing Modes. (line 128) |
| * TARGET_LIB_INT_CMP_BIASED: Library Calls. (line 35) |
| * TARGET_LIBCALL_VALUE: Scalar Return. (line 69) |
| * TARGET_LIBGCC_CMP_RETURN_MODE: Storage Layout. (line 449) |
| * TARGET_LIBGCC_SDATA_SECTION: Sections. (line 133) |
| * TARGET_LIBGCC_SHIFT_COUNT_MODE: Storage Layout. (line 455) |
| * TARGET_MACHINE_DEPENDENT_REORG: Misc. (line 627) |
| * TARGET_MANGLE_DECL_ASSEMBLER_NAME: Sections. (line 235) |
| * TARGET_MANGLE_TYPE: Storage Layout. (line 530) |
| * TARGET_MAX_ANCHOR_OFFSET: Anchored Addresses. (line 39) |
| * TARGET_MD_ASM_CLOBBERS: Misc. (line 543) |
| * TARGET_MEM_CONSTRAINT: Addressing Modes. (line 105) |
| * TARGET_MEM_REF: Storage References. (line 6) |
| * TARGET_MERGE_DECL_ATTRIBUTES: Target Attributes. (line 39) |
| * TARGET_MERGE_TYPE_ATTRIBUTES: Target Attributes. (line 31) |
| * TARGET_MIN_ANCHOR_OFFSET: Anchored Addresses. (line 33) |
| * TARGET_MIN_DIVISIONS_FOR_RECIP_MUL: Misc. (line 106) |
| * TARGET_MODE_REP_EXTENDED: Misc. (line 191) |
| * TARGET_MS_BITFIELD_LAYOUT_P: Storage Layout. (line 485) |
| * TARGET_MUST_PASS_IN_STACK: Register Arguments. (line 62) |
| * TARGET_MUST_PASS_IN_STACK, and FUNCTION_ARG: Register Arguments. |
| (line 52) |
| * TARGET_N_FORMAT_TYPES: Misc. (line 888) |
| * TARGET_NARROW_VOLATILE_BITFIELD: Storage Layout. (line 393) |
| * TARGET_OBJECT_SUFFIX: Misc. (line 772) |
| * TARGET_OBJFMT_CPP_BUILTINS: Run-time Target. (line 46) |
| * TARGET_OPTF: Misc. (line 870) |
| * TARGET_OPTION_PRAGMA_PARSE: Target Attributes. (line 122) |
| * TARGET_OPTION_PRINT: Target Attributes. (line 117) |
| * TARGET_OPTION_RESTORE: Target Attributes. (line 111) |
| * TARGET_OPTION_SAVE: Target Attributes. (line 105) |
| * TARGET_OPTION_TRANSLATE_TABLE: Driver. (line 53) |
| * TARGET_OPTION_VALID_ATTRIBUTE_P: Target Attributes. (line 94) |
| * TARGET_OS_CPP_BUILTINS: Run-time Target. (line 42) |
| * TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE: Run-time Target. (line 119) |
| * TARGET_OVERRIDES_FORMAT_ATTRIBUTES: Misc. (line 892) |
| * TARGET_OVERRIDES_FORMAT_ATTRIBUTES_COUNT: Misc. (line 898) |
| * TARGET_OVERRIDES_FORMAT_INIT: Misc. (line 902) |
| * TARGET_PASS_BY_REFERENCE: Register Arguments. (line 103) |
| * TARGET_PCH_VALID_P: PCH Target. (line 13) |
| * TARGET_POSIX_IO: Misc. (line 567) |
| * TARGET_PRETEND_OUTGOING_VARARGS_NAMED: Varargs. (line 153) |
| * TARGET_PROMOTE_FUNCTION_MODE: Storage Layout. (line 125) |
| * TARGET_PROMOTE_PROTOTYPES: Stack Arguments. (line 11) |
| * TARGET_PROMOTED_TYPE: Misc. (line 955) |
| * TARGET_PTRMEMFUNC_VBIT_LOCATION: Type Layout. (line 278) |
| * TARGET_RELAXED_ORDERING: Misc. (line 907) |
| * TARGET_RESOLVE_OVERLOADED_BUILTIN: Misc. (line 680) |
| * TARGET_RETURN_IN_MEMORY: Aggregate Return. (line 17) |
| * TARGET_RETURN_IN_MSB: Scalar Return. (line 112) |
| * TARGET_RTX_COSTS: Costs. (line 219) |
| * TARGET_SCALAR_MODE_SUPPORTED_P: Register Arguments. (line 291) |
| * TARGET_SCHED_ADJUST_COST: Scheduling. (line 37) |
| * TARGET_SCHED_ADJUST_PRIORITY: Scheduling. (line 52) |
| * TARGET_SCHED_ALLOC_SCHED_CONTEXT: Scheduling. (line 243) |
| * TARGET_SCHED_CLEAR_SCHED_CONTEXT: Scheduling. (line 258) |
| * TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK: Scheduling. (line 89) |
| * TARGET_SCHED_DFA_NEW_CYCLE: Scheduling. (line 204) |
| * TARGET_SCHED_DFA_POST_ADVANCE_CYCLE: Scheduling. (line 160) |
| * TARGET_SCHED_DFA_POST_CYCLE_INSN: Scheduling. (line 144) |
| * TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE: Scheduling. (line 153) |
| * TARGET_SCHED_DFA_PRE_CYCLE_INSN: Scheduling. (line 132) |
| * TARGET_SCHED_FINISH: Scheduling. (line 109) |
| * TARGET_SCHED_FINISH_GLOBAL: Scheduling. (line 126) |
| * TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD: Scheduling. |
| (line 168) |
| * TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD: Scheduling. |
| (line 196) |
| * TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD_SPEC: Scheduling. |
| (line 297) |
| * TARGET_SCHED_FREE_SCHED_CONTEXT: Scheduling. (line 262) |
| * TARGET_SCHED_GEN_SPEC_CHECK: Scheduling. (line 284) |
| * TARGET_SCHED_H_I_D_EXTENDED: Scheduling. (line 238) |
| * TARGET_SCHED_INIT: Scheduling. (line 99) |
| * TARGET_SCHED_INIT_DFA_POST_CYCLE_INSN: Scheduling. (line 149) |
| * TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN: Scheduling. (line 141) |
| * TARGET_SCHED_INIT_GLOBAL: Scheduling. (line 118) |
| * TARGET_SCHED_INIT_SCHED_CONTEXT: Scheduling. (line 248) |
| * TARGET_SCHED_IS_COSTLY_DEPENDENCE: Scheduling. (line 215) |
| * TARGET_SCHED_ISSUE_RATE: Scheduling. (line 12) |
| * TARGET_SCHED_NEEDS_BLOCK_P: Scheduling. (line 277) |
| * TARGET_SCHED_REORDER: Scheduling. (line 60) |
| * TARGET_SCHED_REORDER2: Scheduling. (line 77) |
| * TARGET_SCHED_SET_SCHED_CONTEXT: Scheduling. (line 254) |
| * TARGET_SCHED_SET_SCHED_FLAGS: Scheduling. (line 309) |
| * TARGET_SCHED_SMS_RES_MII: Scheduling. (line 315) |
| * TARGET_SCHED_SPECULATE_INSN: Scheduling. (line 266) |
| * TARGET_SCHED_VARIABLE_ISSUE: Scheduling. (line 24) |
| * TARGET_SECONDARY_RELOAD: Register Classes. (line 272) |
| * TARGET_SECTION_TYPE_FLAGS: File Framework. (line 123) |
| * TARGET_SET_CURRENT_FUNCTION: Misc. (line 754) |
| * TARGET_SET_DEFAULT_TYPE_ATTRIBUTES: Target Attributes. (line 26) |
| * TARGET_SETUP_INCOMING_VARARGS: Varargs. (line 101) |
| * TARGET_SHIFT_TRUNCATION_MASK: Misc. (line 154) |
| * TARGET_SPLIT_COMPLEX_ARG: Register Arguments. (line 252) |
| * TARGET_STACK_PROTECT_FAIL: Stack Smashing Protection. |
| (line 17) |
| * TARGET_STACK_PROTECT_GUARD: Stack Smashing Protection. |
| (line 7) |
| * TARGET_STATIC_CHAIN: Frame Registers. (line 78) |
| * TARGET_STRICT_ARGUMENT_NAMING: Varargs. (line 137) |
| * TARGET_STRIP_NAME_ENCODING: Sections. (line 282) |
| * TARGET_STRUCT_VALUE_RTX: Aggregate Return. (line 45) |
| * TARGET_SUPPORT_VECTOR_MISALIGNMENT: Addressing Modes. (line 345) |
| * TARGET_TERMINATE_DW2_EH_FRAME_INFO: Exception Region Output. |
| (line 84) |
| * TARGET_TRAMPOLINE_ADJUST_ADDRESS: Trampolines. (line 75) |
| * TARGET_TRAMPOLINE_INIT: Trampolines. (line 56) |
| * TARGET_UNSPEC_MAY_TRAP_P: Misc. (line 746) |
| * TARGET_UNWIND_EMIT: Dispatch Tables. (line 81) |
| * TARGET_UNWIND_INFO: Exception Region Output. |
| (line 56) |
| * TARGET_UNWIND_TABLES_DEFAULT: Exception Region Output. |
| (line 60) |
| * TARGET_UNWIND_WORD_MODE: Storage Layout. (line 461) |
| * TARGET_UPDATE_STACK_BOUNDARY: Misc. (line 989) |
| * TARGET_USE_ANCHORS_FOR_SYMBOL_P: Anchored Addresses. (line 55) |
| * TARGET_USE_BLOCKS_FOR_CONSTANT_P: Addressing Modes. (line 235) |
| * TARGET_USE_JCR_SECTION: Misc. (line 971) |
| * TARGET_USES_WEAK_UNWIND_INFO: Exception Handling. (line 129) |
| * TARGET_VALID_DLLIMPORT_ATTRIBUTE_P: Target Attributes. (line 60) |
| * TARGET_VALID_POINTER_MODE: Register Arguments. (line 285) |
| * TARGET_VECTOR_MODE_SUPPORTED_P: Register Arguments. (line 303) |
| * TARGET_VECTORIZE_BUILTIN_CONVERSION: Addressing Modes. (line 320) |
| * TARGET_VECTORIZE_BUILTIN_MASK_FOR_LOAD: Addressing Modes. (line 251) |
| * TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN: Addressing Modes. (line 277) |
| * TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD: Addressing Modes. (line 289) |
| * TARGET_VECTORIZE_BUILTIN_VEC_PERM: Addressing Modes. (line 312) |
| * TARGET_VECTORIZE_BUILTIN_VEC_PERM_OK: Addressing Modes. (line 316) |
| * TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST: Addressing Modes. |
| (line 302) |
| * TARGET_VECTORIZE_BUILTIN_VECTORIZED_FUNCTION: Addressing Modes. |
| (line 335) |
| * TARGET_VECTORIZE_VECTOR_ALIGNMENT_REACHABLE: Addressing Modes. |
| (line 307) |
| * TARGET_VERSION: Run-time Target. (line 92) |
| * TARGET_VTABLE_DATA_ENTRY_DISTANCE: Type Layout. (line 331) |
| * TARGET_VTABLE_ENTRY_ALIGN: Type Layout. (line 325) |
| * TARGET_VTABLE_USES_DESCRIPTORS: Type Layout. (line 314) |
| * TARGET_WEAK_NOT_IN_ARCHIVE_TOC: Label Output. (line 245) |
| * targetm: Target Structure. (line 7) |
| * targets, makefile: Makefile. (line 6) |
| * TCmode: Machine Modes. (line 197) |
| * TDmode: Machine Modes. (line 94) |
| * 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 38) |
| * TF_SIZE: Type Layout. (line 132) |
| * TFmode: Machine Modes. (line 98) |
| * THEN_CLAUSE: Statements for C++. (line 6) |
| * THREAD_MODEL_SPEC: Driver. (line 225) |
| * 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 272) |
| * TLS_COMMON_ASM_OP: Sections. (line 82) |
| * TLS_SECTION_ASM_FLAG: Sections. (line 87) |
| * tm.h macros: Target Macros. (line 6) |
| * TQFmode: Machine Modes. (line 62) |
| * TQmode: Machine Modes. (line 119) |
| * TRAMPOLINE_ALIGNMENT: Trampolines. (line 49) |
| * TRAMPOLINE_SECTION: Trampolines. (line 40) |
| * TRAMPOLINE_SIZE: Trampolines. (line 45) |
| * trampolines for nested functions: Trampolines. (line 6) |
| * TRANSFER_FROM_TRAMPOLINE: Trampolines. (line 123) |
| * trap instruction pattern: Standard Names. (line 1340) |
| * tree <1>: Macros and Functions. |
| (line 6) |
| * tree: Tree overview. (line 6) |
| * Tree SSA: Tree SSA. (line 6) |
| * TREE_CHAIN: Macros and Functions. |
| (line 6) |
| * tree_code <1>: GIMPLE_OMP_FOR. (line 83) |
| * tree_code <2>: GIMPLE_COND. (line 21) |
| * tree_code <3>: GIMPLE_ASSIGN. (line 41) |
| * tree_code: Manipulating GIMPLE statements. |
| (line 31) |
| * 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 <1>: Function Properties. |
| (line 28) |
| * TREE_PUBLIC: Function Basics. (line 6) |
| * 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 <1>: Types for C++. (line 6) |
| * TREE_TYPE <2>: Function Basics. (line 47) |
| * TREE_TYPE <3>: Expression trees. (line 6) |
| * TREE_TYPE <4>: Working with declarations. |
| (line 11) |
| * TREE_TYPE <5>: Types. (line 6) |
| * TREE_TYPE: Macros and Functions. |
| (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 177) |
| * TRUNC_DIV_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * TRUNC_MOD_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * truncate: Conversions. (line 38) |
| * truncMN2 instruction pattern: Standard Names. (line 803) |
| * TRUTH_AND_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * TRUTH_ANDIF_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * TRUTH_NOT_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * TRUTH_OR_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * TRUTH_ORIF_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) |
| * TYPE_ALIGN <1>: Types for C++. (line 6) |
| * TYPE_ALIGN: Types. (line 6) |
| * TYPE_ARG_TYPES <1>: Types for C++. (line 6) |
| * TYPE_ARG_TYPES: Types. (line 6) |
| * TYPE_ASM_OP: Label Output. (line 55) |
| * TYPE_ATTRIBUTES: Attributes. (line 25) |
| * TYPE_BINFO: Classes. (line 6) |
| * TYPE_BUILT_IN: Types for C++. (line 68) |
| * TYPE_CANONICAL: Types. (line 6) |
| * TYPE_CONTEXT <1>: Types for C++. (line 6) |
| * TYPE_CONTEXT: Types. (line 6) |
| * TYPE_DECL: Declarations. (line 6) |
| * TYPE_FIELDS <1>: Classes. (line 6) |
| * TYPE_FIELDS <2>: Types for C++. (line 6) |
| * TYPE_FIELDS: Types. (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 <1>: Types for C++. (line 6) |
| * TYPE_MAIN_VARIANT: Types. (line 6) |
| * TYPE_MAX_VALUE: Types. (line 6) |
| * TYPE_METHOD_BASETYPE <1>: Types for C++. (line 6) |
| * TYPE_METHOD_BASETYPE: Types. (line 6) |
| * TYPE_METHODS: Classes. (line 6) |
| * TYPE_MIN_VALUE: Types. (line 6) |
| * TYPE_NAME <1>: Types for C++. (line 6) |
| * TYPE_NAME: Types. (line 6) |
| * TYPE_NOTHROW_P: Functions for C++. (line 154) |
| * TYPE_OFFSET_BASETYPE <1>: Types for C++. (line 6) |
| * TYPE_OFFSET_BASETYPE: Types. (line 6) |
| * TYPE_OPERAND_FMT: Label Output. (line 66) |
| * 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 <1>: Types for C++. (line 6) |
| * TYPE_PRECISION: Types. (line 6) |
| * TYPE_PTR_P: Types for C++. (line 74) |
| * TYPE_PTRFN_P: Types for C++. (line 78) |
| * TYPE_PTRMEM_P: Types for C++. (line 6) |
| * TYPE_PTROB_P: Types for C++. (line 81) |
| * TYPE_PTROBV_P: Types for C++. (line 6) |
| * TYPE_QUAL_CONST <1>: Types for C++. (line 6) |
| * TYPE_QUAL_CONST: Types. (line 6) |
| * TYPE_QUAL_RESTRICT <1>: Types for C++. (line 6) |
| * TYPE_QUAL_RESTRICT: Types. (line 6) |
| * TYPE_QUAL_VOLATILE <1>: Types for C++. (line 6) |
| * TYPE_QUAL_VOLATILE: Types. (line 6) |
| * TYPE_RAISES_EXCEPTIONS: Functions for C++. (line 149) |
| * TYPE_SIZE <1>: Types for C++. (line 6) |
| * TYPE_SIZE: Types. (line 6) |
| * TYPE_STRUCTURAL_EQUALITY_P: Types. (line 6) |
| * TYPE_UNQUALIFIED <1>: Types for C++. (line 6) |
| * TYPE_UNQUALIFIED: Types. (line 6) |
| * TYPE_VFIELD: Classes. (line 6) |
| * TYPENAME_TYPE: Types for C++. (line 6) |
| * TYPENAME_TYPE_FULLNAME <1>: Types for C++. (line 6) |
| * TYPENAME_TYPE_FULLNAME: Types. (line 6) |
| * TYPEOF_TYPE: Types for C++. (line 6) |
| * UDAmode: Machine Modes. (line 168) |
| * udiv: Arithmetic. (line 125) |
| * udivM3 instruction pattern: Standard Names. (line 222) |
| * udivmodM4 instruction pattern: Standard Names. (line 428) |
| * udot_prodM instruction pattern: Standard Names. (line 265) |
| * UDQmode: Machine Modes. (line 136) |
| * UHAmode: Machine Modes. (line 160) |
| * UHQmode: Machine Modes. (line 128) |
| * UINT16_TYPE: Type Layout. (line 241) |
| * UINT32_TYPE: Type Layout. (line 242) |
| * UINT64_TYPE: Type Layout. (line 243) |
| * UINT8_TYPE: Type Layout. (line 240) |
| * UINT_FAST16_TYPE: Type Layout. (line 257) |
| * UINT_FAST32_TYPE: Type Layout. (line 258) |
| * UINT_FAST64_TYPE: Type Layout. (line 259) |
| * UINT_FAST8_TYPE: Type Layout. (line 256) |
| * UINT_LEAST16_TYPE: Type Layout. (line 249) |
| * UINT_LEAST32_TYPE: Type Layout. (line 250) |
| * UINT_LEAST64_TYPE: Type Layout. (line 251) |
| * UINT_LEAST8_TYPE: Type Layout. (line 248) |
| * UINTMAX_TYPE: Type Layout. (line 224) |
| * UINTPTR_TYPE: Type Layout. (line 261) |
| * umaddMN4 instruction pattern: Standard Names. (line 375) |
| * umax: Arithmetic. (line 144) |
| * umaxM3 instruction pattern: Standard Names. (line 222) |
| * umin: Arithmetic. (line 144) |
| * uminM3 instruction pattern: Standard Names. (line 222) |
| * umod: Arithmetic. (line 131) |
| * umodM3 instruction pattern: Standard Names. (line 222) |
| * umsubMN4 instruction pattern: Standard Names. (line 399) |
| * umulhisi3 instruction pattern: Standard Names. (line 347) |
| * umulM3_highpart instruction pattern: Standard Names. (line 361) |
| * umulqihi3 instruction pattern: Standard Names. (line 347) |
| * umulsidi3 instruction pattern: Standard Names. (line 347) |
| * unchanging: Flags. (line 324) |
| * unchanging, in call_insn: Flags. (line 19) |
| * unchanging, in jump_insn, call_insn and insn: Flags. (line 39) |
| * unchanging, in mem: Flags. (line 152) |
| * unchanging, in subreg: Flags. (line 188) |
| * 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) |
| * UNION_TYPE <1>: Classes. (line 6) |
| * UNION_TYPE: Types. (line 6) |
| * unions, returning: Interface. (line 10) |
| * UNITS_PER_SIMD_WORD: Storage Layout. (line 77) |
| * UNITS_PER_WORD: Storage Layout. (line 67) |
| * UNKNOWN_TYPE <1>: Types for C++. (line 6) |
| * UNKNOWN_TYPE: Types. (line 6) |
| * UNLE_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * UNLIKELY_EXECUTED_TEXT_SECTION_NAME: Sections. (line 49) |
| * 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 125) |
| * unsigned division with unsigned saturation: Arithmetic. (line 125) |
| * unsigned greater than: Comparisons. (line 64) |
| * unsigned less than: Comparisons. (line 68) |
| * unsigned minimum and maximum: Arithmetic. (line 144) |
| * 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 287) |
| * unspec_volatile: Side Effects. (line 287) |
| * untyped_call instruction pattern: Standard Names. (line 971) |
| * untyped_return instruction pattern: Standard Names. (line 1021) |
| * UPDATE_PATH_HOST_CANONICALIZE (PATH): Filesystem. (line 59) |
| * update_ssa: SSA. (line 76) |
| * update_stmt <1>: SSA Operands. (line 6) |
| * update_stmt: Manipulating GIMPLE statements. |
| (line 141) |
| * update_stmt_if_modified: Manipulating GIMPLE statements. |
| (line 144) |
| * UQQmode: Machine Modes. (line 123) |
| * US Software GOFAST, floating point emulation library: Library Calls. |
| (line 44) |
| * us_ashift: Arithmetic. (line 168) |
| * us_minus: Arithmetic. (line 36) |
| * us_mult: Arithmetic. (line 92) |
| * us_neg: Arithmetic. (line 81) |
| * us_plus: Arithmetic. (line 14) |
| * US_SOFTWARE_GOFAST: Library Calls. (line 45) |
| * us_truncate: Conversions. (line 48) |
| * usaddM3 instruction pattern: Standard Names. (line 222) |
| * USAmode: Machine Modes. (line 164) |
| * usashlM3 instruction pattern: Standard Names. (line 431) |
| * usdivM3 instruction pattern: Standard Names. (line 222) |
| * use: Side Effects. (line 162) |
| * USE_C_ALLOCA: Host Misc. (line 19) |
| * USE_LD_AS_NEEDED: Driver. (line 198) |
| * USE_LOAD_POST_DECREMENT: Costs. (line 174) |
| * USE_LOAD_POST_INCREMENT: Costs. (line 169) |
| * USE_LOAD_PRE_DECREMENT: Costs. (line 184) |
| * USE_LOAD_PRE_INCREMENT: Costs. (line 179) |
| * use_optype_d: Manipulating GIMPLE statements. |
| (line 101) |
| * use_param: GTY Options. (line 114) |
| * use_paramN: GTY Options. (line 132) |
| * use_params: GTY Options. (line 140) |
| * USE_SELECT_SECTION_FOR_FUNCTIONS: Sections. (line 195) |
| * USE_STORE_POST_DECREMENT: Costs. (line 194) |
| * USE_STORE_POST_INCREMENT: Costs. (line 189) |
| * USE_STORE_PRE_DECREMENT: Costs. (line 204) |
| * USE_STORE_PRE_INCREMENT: Costs. (line 199) |
| * used: Flags. (line 342) |
| * used, in symbol_ref: Flags. (line 215) |
| * USER_LABEL_PREFIX: Instruction Output. (line 139) |
| * USING_STMT: Statements for C++. (line 6) |
| * usmaddMN4 instruction pattern: Standard Names. (line 383) |
| * usmsubMN4 instruction pattern: Standard Names. (line 407) |
| * usmulhisi3 instruction pattern: Standard Names. (line 351) |
| * usmulM3 instruction pattern: Standard Names. (line 222) |
| * usmulqihi3 instruction pattern: Standard Names. (line 351) |
| * usmulsidi3 instruction pattern: Standard Names. (line 351) |
| * usnegM2 instruction pattern: Standard Names. (line 449) |
| * USQmode: Machine Modes. (line 132) |
| * ussubM3 instruction pattern: Standard Names. (line 222) |
| * usum_widenM3 instruction pattern: Standard Names. (line 275) |
| * UTAmode: Machine Modes. (line 172) |
| * UTQmode: Machine Modes. (line 140) |
| * V in constraint: Simple Constraints. (line 43) |
| * VA_ARG_EXPR: Unary and Binary Expressions. |
| (line 6) |
| * values, returned by functions: Scalar Return. (line 6) |
| * VAR_DECL: Declarations. (line 6) |
| * var_location: Debug Information. (line 14) |
| * varargs implementation: Varargs. (line 6) |
| * variable: Declarations. (line 6) |
| * Variable Location Debug Information in RTL: Debug Information. |
| (line 6) |
| * vashlM3 instruction pattern: Standard Names. (line 445) |
| * vashrM3 instruction pattern: Standard Names. (line 445) |
| * vec_concat: Vector Operations. (line 28) |
| * vec_duplicate: Vector Operations. (line 33) |
| * VEC_EXTRACT_EVEN_EXPR: Vectors. (line 6) |
| * vec_extract_evenM instruction pattern: Standard Names. (line 176) |
| * VEC_EXTRACT_ODD_EXPR: Vectors. (line 6) |
| * vec_extract_oddM instruction pattern: Standard Names. (line 183) |
| * vec_extractM instruction pattern: Standard Names. (line 171) |
| * vec_initM instruction pattern: Standard Names. (line 204) |
| * VEC_INTERLEAVE_HIGH_EXPR: Vectors. (line 6) |
| * vec_interleave_highM instruction pattern: Standard Names. (line 190) |
| * VEC_INTERLEAVE_LOW_EXPR: Vectors. (line 6) |
| * vec_interleave_lowM instruction pattern: Standard Names. (line 197) |
| * 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 302) |
| * vec_pack_ssat_M instruction pattern: Standard Names. (line 295) |
| * VEC_PACK_TRUNC_EXPR: Vectors. (line 6) |
| * vec_pack_trunc_M instruction pattern: Standard Names. (line 288) |
| * vec_pack_ufix_trunc_M instruction pattern: Standard Names. (line 302) |
| * vec_pack_usat_M instruction pattern: Standard Names. (line 295) |
| * VEC_RSHIFT_EXPR: Vectors. (line 6) |
| * vec_select: Vector Operations. (line 19) |
| * vec_setM instruction pattern: Standard Names. (line 166) |
| * vec_shl_M instruction pattern: Standard Names. (line 282) |
| * vec_shr_M instruction pattern: Standard Names. (line 282) |
| * 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_unpacks_float_hi_M instruction pattern: Standard Names. |
| (line 324) |
| * vec_unpacks_float_lo_M instruction pattern: Standard Names. |
| (line 324) |
| * vec_unpacks_hi_M instruction pattern: Standard Names. (line 309) |
| * vec_unpacks_lo_M instruction pattern: Standard Names. (line 309) |
| * vec_unpacku_float_hi_M instruction pattern: Standard Names. |
| (line 324) |
| * vec_unpacku_float_lo_M instruction pattern: Standard Names. |
| (line 324) |
| * vec_unpacku_hi_M instruction pattern: Standard Names. (line 317) |
| * vec_unpacku_lo_M instruction pattern: Standard Names. (line 317) |
| * VEC_WIDEN_MULT_HI_EXPR: Vectors. (line 6) |
| * VEC_WIDEN_MULT_LO_EXPR: Vectors. (line 6) |
| * vec_widen_smult_hi_M instruction pattern: Standard Names. (line 333) |
| * vec_widen_smult_lo_M instruction pattern: Standard Names. (line 333) |
| * vec_widen_umult_hi_M instruction pattern: Standard Names. (line 333) |
| * vec_widen_umult_lo__M instruction pattern: Standard Names. (line 333) |
| * vector: Containers. (line 6) |
| * vector operations: Vector Operations. (line 6) |
| * VECTOR_CST: Constant expressions. |
| (line 6) |
| * VECTOR_STORE_FLAG_VALUE: Misc. (line 308) |
| * 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) |
| * vlshrM3 instruction pattern: Standard Names. (line 445) |
| * VMS: Filesystem. (line 37) |
| * VMS_DEBUGGING_INFO: VMS Debug. (line 9) |
| * VOID_TYPE: Types. (line 6) |
| * VOIDmode: Machine Modes. (line 190) |
| * volatil: Flags. (line 356) |
| * volatil, in insn, call_insn, jump_insn, code_label, 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 94) |
| * volatil, in reg: Flags. (line 116) |
| * volatil, in subreg: Flags. (line 188) |
| * volatil, in symbol_ref: Flags. (line 224) |
| * volatile memory references: Flags. (line 357) |
| * volatile, in prefetch: Flags. (line 232) |
| * voptype_d: Manipulating GIMPLE statements. |
| (line 108) |
| * voting between constraint alternatives: Class Preferences. (line 6) |
| * vrotlM3 instruction pattern: Standard Names. (line 445) |
| * vrotrM3 instruction pattern: Standard Names. (line 445) |
| * walk_dominator_tree: SSA. (line 256) |
| * walk_gimple_op: Statement and operand traversals. |
| (line 32) |
| * walk_gimple_seq: Statement and operand traversals. |
| (line 50) |
| * walk_gimple_stmt: Statement and operand traversals. |
| (line 13) |
| * walk_use_def_chains: SSA. (line 232) |
| * WCHAR_TYPE: Type Layout. (line 192) |
| * WCHAR_TYPE_SIZE: Type Layout. (line 200) |
| * which_alternative: Output Statement. (line 59) |
| * WHILE_BODY: Statements for C++. (line 6) |
| * WHILE_COND: Statements for C++. (line 6) |
| * WHILE_STMT: Statements for C++. (line 6) |
| * WIDEST_HARDWARE_FP_SIZE: Type Layout. (line 147) |
| * WINT_TYPE: Type Layout. (line 205) |
| * word_mode: Machine Modes. (line 336) |
| * WORD_REGISTER_OPERATIONS: Misc. (line 63) |
| * WORD_SWITCH_TAKES_ARG: Driver. (line 20) |
| * WORDS_BIG_ENDIAN: Storage Layout. (line 29) |
| * WORDS_BIG_ENDIAN, effect on subreg: Regs and Memory. (line 217) |
| * X in constraint: Simple Constraints. (line 114) |
| * x-HOST: Host Fragment. (line 6) |
| * XCmode: Machine Modes. (line 197) |
| * XCOFF_DEBUGGING_INFO: DBX Options. (line 13) |
| * XEXP: Accessors. (line 6) |
| * XF_SIZE: Type Layout. (line 131) |
| * XFmode: Machine Modes. (line 79) |
| * XINT: Accessors. (line 6) |
| * xm-MACHINE.h <1>: Host Misc. (line 6) |
| * xm-MACHINE.h: Filesystem. (line 6) |
| * xor: Arithmetic. (line 163) |
| * xor, canonicalization of: Insn Canonicalizations. |
| (line 79) |
| * xorM3 instruction pattern: Standard Names. (line 222) |
| * 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 813) |
| * zero_extract: Bit-Fields. (line 30) |
| * zero_extract, canonicalization of: Insn Canonicalizations. |
| (line 88) |
| |
| |
| |
| Tag Table: |
| Node: Top2039 |
| Node: Contributing5099 |
| Node: Portability5840 |
| Node: Interface7628 |
| Node: Libgcc10668 |
| Node: Integer library routines12509 |
| Node: Soft float library routines19348 |
| Node: Decimal float library routines31285 |
| Node: Fixed-point fractional library routines47042 |
| Node: Exception handling routines147440 |
| Node: Miscellaneous routines148547 |
| Node: Languages148930 |
| Node: Source Tree150479 |
| Node: Configure Terms151061 |
| Node: Top Level154019 |
| Node: gcc Directory157188 |
| Node: Subdirectories158138 |
| Node: Configuration160010 |
| Node: Config Fragments160730 |
| Node: System Config161959 |
| Node: Configuration Files162895 |
| Node: Build165342 |
| Node: Makefile165754 |
| Ref: Makefile-Footnote-1172402 |
| Ref: Makefile-Footnote-2172547 |
| Node: Library Files172619 |
| Node: Headers173181 |
| Node: Documentation175264 |
| Node: Texinfo Manuals176123 |
| Node: Man Page Generation178463 |
| Node: Miscellaneous Docs180378 |
| Node: Front End181767 |
| Node: Front End Directory185686 |
| Node: Front End Config187006 |
| Node: Front End Makefile189948 |
| Node: Back End193730 |
| Node: Testsuites197409 |
| Node: Test Idioms198340 |
| Node: Test Directives201737 |
| Node: Directives202264 |
| Node: Selectors212332 |
| Node: Effective-Target Keywords213474 |
| Node: Add Options230019 |
| Node: Require Support230816 |
| Node: Final Actions233323 |
| Node: Ada Tests237386 |
| Node: C Tests238728 |
| Node: libgcj Tests243151 |
| Node: LTO Testing244278 |
| Node: gcov Testing245883 |
| Node: profopt Testing248870 |
| Node: compat Testing250585 |
| Node: Torture Tests254825 |
| Node: Options256442 |
| Node: Option file format256882 |
| Node: Option properties259631 |
| Node: Passes266106 |
| Node: Parsing pass266850 |
| Node: Gimplification pass270378 |
| Node: Pass manager272205 |
| Node: Tree SSA passes274000 |
| Node: RTL passes296535 |
| Node: RTL308878 |
| Node: RTL Objects311066 |
| Node: RTL Classes314940 |
| Node: Accessors319892 |
| Node: Special Accessors322286 |
| Node: Flags327652 |
| Node: Machine Modes343827 |
| Node: Constants356143 |
| Node: Regs and Memory362172 |
| Node: Arithmetic380073 |
| Node: Comparisons389705 |
| Node: Bit-Fields393997 |
| Node: Vector Operations395549 |
| Node: Conversions397384 |
| Node: RTL Declarations401882 |
| Node: Side Effects402703 |
| Node: Incdec419025 |
| Node: Assembler422360 |
| Node: Debug Information423905 |
| Node: Insns425103 |
| Node: Calls451303 |
| Node: Sharing453896 |
| Node: Reading RTL457006 |
| Node: GENERIC457998 |
| Node: Deficiencies459871 |
| Node: Tree overview460112 |
| Node: Macros and Functions464239 |
| Node: Identifiers465064 |
| Node: Containers466675 |
| Node: Types467832 |
| Node: Declarations479928 |
| Node: Working with declarations480423 |
| Node: Internal structure486029 |
| Node: Current structure hierarchy486413 |
| Node: Adding new DECL node types488507 |
| Node: Attributes492580 |
| Node: Expression trees493825 |
| Node: Constant expressions495578 |
| Node: Storage References499797 |
| Node: Unary and Binary Expressions502971 |
| Node: Vectors522389 |
| Node: Statements527318 |
| Node: Basic Statements527838 |
| Node: Blocks532345 |
| Node: Statement Sequences533749 |
| Node: Empty Statements534082 |
| Node: Jumps534656 |
| Node: Cleanups535309 |
| Node: OpenMP537077 |
| Node: Functions542824 |
| Node: Function Basics543295 |
| Node: Function Properties546980 |
| Node: Language-dependent trees550109 |
| Node: C and C++ Trees550995 |
| Node: Types for C++553899 |
| Node: Namespaces558869 |
| Node: Classes561976 |
| Node: Functions for C++567054 |
| Node: Statements for C++573307 |
| Node: C++ Expressions581355 |
| Node: Java Trees582856 |
| Node: GIMPLE582969 |
| Node: Tuple representation586590 |
| Node: GIMPLE instruction set595245 |
| Node: GIMPLE Exception Handling596913 |
| Node: Temporaries598827 |
| Ref: Temporaries-Footnote-1600146 |
| Node: Operands600209 |
| Node: Compound Expressions600983 |
| Node: Compound Lvalues601217 |
| Node: Conditional Expressions601983 |
| Node: Logical Operators602653 |
| Node: Manipulating GIMPLE statements609444 |
| Node: Tuple specific accessors615372 |
| Node: `GIMPLE_ASM'616191 |
| Node: `GIMPLE_ASSIGN'618796 |
| Node: `GIMPLE_BIND'622741 |
| Node: `GIMPLE_CALL'624548 |
| Node: `GIMPLE_CATCH'628807 |
| Node: `GIMPLE_COND'629950 |
| Node: `GIMPLE_DEBUG'632738 |
| Node: `GIMPLE_EH_FILTER'636110 |
| Node: `GIMPLE_LABEL'637597 |
| Node: `GIMPLE_NOP'638572 |
| Node: `GIMPLE_OMP_ATOMIC_LOAD'638941 |
| Node: `GIMPLE_OMP_ATOMIC_STORE'639851 |
| Node: `GIMPLE_OMP_CONTINUE'640490 |
| Node: `GIMPLE_OMP_CRITICAL'641840 |
| Node: `GIMPLE_OMP_FOR'642776 |
| Node: `GIMPLE_OMP_MASTER'646286 |
| Node: `GIMPLE_OMP_ORDERED'646669 |
| Node: `GIMPLE_OMP_PARALLEL'647069 |
| Node: `GIMPLE_OMP_RETURN'649838 |
| Node: `GIMPLE_OMP_SECTION'650488 |
| Node: `GIMPLE_OMP_SECTIONS'651154 |
| Node: `GIMPLE_OMP_SINGLE'652758 |
| Node: `GIMPLE_PHI'653694 |
| Node: `GIMPLE_RESX'655107 |
| Node: `GIMPLE_RETURN'655826 |
| Node: `GIMPLE_SWITCH'656394 |
| Node: `GIMPLE_TRY'658524 |
| Node: `GIMPLE_WITH_CLEANUP_EXPR'660314 |
| Node: GIMPLE sequences661197 |
| Node: Sequence iterators664403 |
| Node: Adding a new GIMPLE statement code672858 |
| Node: Statement and operand traversals674138 |
| Node: Tree SSA676748 |
| Node: Annotations678534 |
| Node: SSA Operands679060 |
| Node: SSA693591 |
| Node: Alias analysis705882 |
| Node: Memory model709662 |
| Node: Loop Analysis and Representation711025 |
| Node: Loop representation712206 |
| Node: Loop querying719126 |
| Node: Loop manipulation721959 |
| Node: LCSSA724327 |
| Node: Scalar evolutions726399 |
| Node: loop-iv729643 |
| Node: Number of iterations731569 |
| Node: Dependency analysis734378 |
| Node: Lambda740746 |
| Node: Omega742417 |
| Node: Control Flow743982 |
| Node: Basic Blocks744977 |
| Node: Edges749545 |
| Node: Profile information758107 |
| Node: Maintaining the CFG762793 |
| Node: Liveness information769670 |
| Node: Machine Desc771796 |
| Node: Overview774264 |
| Node: Patterns776305 |
| Node: Example779743 |
| Node: RTL Template781178 |
| Node: Output Template791833 |
| Node: Output Statement795798 |
| Node: Predicates799760 |
| Node: Machine-Independent Predicates802678 |
| Node: Defining Predicates807623 |
| Node: Constraints813588 |
| Node: Simple Constraints814836 |
| Node: Multi-Alternative827042 |
| Node: Class Preferences829883 |
| Node: Modifiers830775 |
| Node: Machine Constraints834907 |
| Node: Disable Insn Alternatives871770 |
| Node: Define Constraints874663 |
| Node: C Constraint Interface881444 |
| Node: Standard Names885085 |
| Ref: shift patterns904013 |
| Ref: prologue instruction pattern943732 |
| Ref: epilogue instruction pattern944225 |
| Node: Pattern Ordering953941 |
| Node: Dependent Patterns955177 |
| Node: Jump Patterns956797 |
| Ref: Jump Patterns-Footnote-1958941 |
| Node: Looping Patterns958987 |
| Node: Insn Canonicalizations963715 |
| Node: Expander Definitions967666 |
| Node: Insn Splitting975784 |
| Node: Including Patterns985386 |
| Node: Peephole Definitions987166 |
| Node: define_peephole988419 |
| Node: define_peephole2994750 |
| Node: Insn Attributes997817 |
| Node: Defining Attributes998923 |
| Node: Expressions1001443 |
| Node: Tagging Insns1008045 |
| Node: Attr Example1012398 |
| Node: Insn Lengths1014772 |
| Node: Constant Attributes1017831 |
| Node: Delay Slots1019000 |
| Node: Processor pipeline description1022224 |
| Ref: Processor pipeline description-Footnote-11039842 |
| Node: Conditional Execution1040164 |
| Node: Constant Definitions1043017 |
| Node: Iterators1044612 |
| Node: Mode Iterators1045059 |
| Node: Defining Mode Iterators1046037 |
| Node: Substitutions1047531 |
| Node: Examples1049772 |
| Node: Code Iterators1051220 |
| Node: Target Macros1053477 |
| Node: Target Structure1056565 |
| Node: Driver1057834 |
| Node: Run-time Target1081515 |
| Node: Per-Function Data1089387 |
| Node: Storage Layout1092150 |
| Node: Type Layout1117736 |
| Node: Registers1132236 |
| Node: Register Basics1133210 |
| Node: Allocation Order1138777 |
| Node: Values in Registers1140798 |
| Node: Leaf Functions1148287 |
| Node: Stack Registers1151145 |
| Node: Register Classes1152417 |
| Node: Old Constraints1180042 |
| Node: Stack and Calling1187194 |
| Node: Frame Layout1187728 |
| Node: Exception Handling1198608 |
| Node: Stack Checking1204986 |
| Node: Frame Registers1209799 |
| Node: Elimination1216692 |
| Node: Stack Arguments1220921 |
| Node: Register Arguments1227730 |
| Node: Scalar Return1243213 |
| Node: Aggregate Return1249305 |
| Node: Caller Saves1252986 |
| Node: Function Entry1254164 |
| Node: Profiling1266792 |
| Node: Tail Calls1268491 |
| Node: Stack Smashing Protection1269857 |
| Node: Varargs1270969 |
| Node: Trampolines1278964 |
| Node: Library Calls1285611 |
| Node: Addressing Modes1290461 |
| Node: Anchored Addresses1307870 |
| Node: Condition Code1310519 |
| Node: CC0 Condition Codes1312648 |
| Node: MODE_CC Condition Codes1315894 |
| Node: Cond. Exec. Macros1322123 |
| Node: Costs1323102 |
| Node: Scheduling1336563 |
| Node: Sections1353830 |
| Node: PIC1368898 |
| Node: Assembler Format1370902 |
| Node: File Framework1372040 |
| Ref: TARGET_HAVE_SWITCHABLE_BSS_SECTIONS1377515 |
| Node: Data Output1380780 |
| Node: Uninitialized Data1388539 |
| Node: Label Output1394103 |
| Node: Initialization1415793 |
| Node: Macros for Initialization1421755 |
| Node: Instruction Output1428207 |
| Node: Dispatch Tables1437878 |
| Node: Exception Region Output1441693 |
| Node: Alignment Output1447435 |
| Node: Debugging Info1451598 |
| Node: All Debuggers1452268 |
| Node: DBX Options1455123 |
| Node: DBX Hooks1460572 |
| Node: File Names and DBX1462498 |
| Node: SDB and DWARF1464610 |
| Node: VMS Debug1468911 |
| Node: Floating Point1469481 |
| Node: Mode Switching1474304 |
| Node: Target Attributes1478230 |
| Node: Emulated TLS1485066 |
| Node: MIPS Coprocessors1488456 |
| Node: PCH Target1490025 |
| Node: C++ ABI1491567 |
| Node: Named Address Spaces1496216 |
| Node: Misc1501318 |
| Ref: TARGET_SHIFT_TRUNCATION_MASK1508747 |
| Node: Host Config1553258 |
| Node: Host Common1554326 |
| Node: Filesystem1556705 |
| Node: Host Misc1560820 |
| Node: Fragments1563269 |
| Node: Target Fragment1564464 |
| Node: Host Fragment1570354 |
| Node: Collect21570594 |
| Node: Header Dirs1573230 |
| Node: Type Information1574653 |
| Node: GTY Options1576944 |
| Node: GGC Roots1587624 |
| Node: Files1588344 |
| Node: Invoking the garbage collector1591090 |
| Node: Plugins1592143 |
| Node: Funding1607965 |
| Node: GNU Project1610452 |
| Node: Copying1611101 |
| Node: GNU Free Documentation License1648632 |
| Node: Contributors1671041 |
| Node: Option Index1707728 |
| Node: Concept Index1708313 |
| |
| End Tag Table |