--- gcc/internals-7 2018/04/24 16:39:24 1.1 +++ gcc/internals-7 2018/04/24 16:40:27 1.1.1.2 @@ -1,3 +1,220 @@ +Info file internals, produced by Makeinfo, -*- Text -*- from input +file internals.texinfo. + +This file documents the internals of the GNU compiler. + +Copyright (C) 1988 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. + +Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, provided also +that the section entitled ``GNU CC General Public License'' is +included exactly as in the original, and provided that the entire +resulting derived work is distributed under the terms of a permission +notice identical to this one. + +Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that the section entitled ``GNU CC General Public +License'' and this permission notice may be included in translations +approved by the Free Software Foundation instead of in the original +English. + + + +File: internals, Node: Misc, Next: Condition Code, Prev: Addressing Modes, Up: Machine Macros + +Miscellaneous Parameters +======================== + +`CASE_VECTOR_MODE' + An alias for a machine mode name. This is the machine mode that + elements of a jump-table should have. + +`CASE_VECTOR_PC_RELATIVE' + Define this macro if jump-tables should contain relative + addresses. + +`CASE_DROPS_THROUGH' + Define this if control falls through a `case' insn when the + index value is out of range. This means the specified + default-label is actually ignored by the `case' insn proper. + +`IMPLICIT_FIX_EXPR' + An alias for a tree code that should be used by default for + conversion of floating point values to fixed point. Normally, + `FIX_ROUND_EXPR' is used. + +`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. + +`EASY_DIV_EXPR' + An alias for a tree code that is the easiest kind of division to + compile code for in the general case. It may be + `TRUNC_DIV_EXPR', `FLOOR_DIV_EXPR', `CEIL_DIV_EXPR' or + `ROUND_DIV_EXPR'. These four division operators differ in how + they round the result to an integer. `EASY_DIV_EXPR' is used + when it is permissible to use any of those kinds of division and + the choice should be made on the basis of efficiency. + +`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'. + +`SCCS_DIRECTIVE' + Define this if the preprocessor should ignore `#sccs' directives + and print no error message. + +`IDENT_DIRECTIVE' + Define this if the preprocessor should ignore `#ident' + directives and print no error message. + +`MOVE_MAX' + The maximum number of bytes that a single instruction can move + quickly from memory to memory. + +`INT_TYPE_SIZE' + A C expression for the size in bits of the type `int' on the + target machine. + +`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 slow (requires more than one instruction). + +`SLOW_ZERO_EXTEND' + Define this macro if zero-extension (of a `char' or `short' to + an `int') can be done faster if the destination is a register + that is known to be zero. + + If you define this macro, you must have instruction patterns + that recognize RTL structures like this: + + (set (strict-low-part (subreg:QI (reg:SI ...) 0)) ...) + + and likewise for `HImode'. + +`SHIFT_COUNT_TRUNCATED' + Define this macro if shift instructions ignore all but the + lowest few bits of the shift count. It implies that a + sign-extend or zero-extend instruction for the shift count can + be omitted. + +`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. + +`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. + +`PROMOTE_PROTOTYPES' + Define this macro if an argument declared as `char' or `short' + in a prototype 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. + +`STORE_FLAG_VALUE' + A C expression for the value stored by a store-flag instruction + (`sCOND') when the condition is true. This is usually 1 or -1; + it is required to be an odd number. + + Do not define `STORE_FLAG_VALUE' if the machine has no + store-flag instructions. + +`Pmode' + An alias for the machine mode for pointers. Normally the + definition can be + + #define Pmode SImode + +`FUNCTION_MODE' + An alias for the machine mode used for memory references to + functions being called, in `call' RTL expressions. On most + machines this should be `QImode'. + +`CONST_COSTS (X, CODE)' + A part of a C `switch' statement that describes the relative + costs of constant RTL expressions. It must contain `case' + labels for expression codes `const_int', `const', `symbol_ref', + `label_ref' and `const_double'. Each case must ultimately reach + a `return' statement to return the relative cost of the use of + that kind of constant value in an expression. The cost may + depend on the precise value of the constant, which is available + for examination in X. + + CODE is the expression code--redundant, since it can be obtained + with `GET_CODE (X)'. + +`DOLLARS_IN_IDENTIFIERS' + Define this to be nonzero if the character `$' should be allowed + by default in identifier names. + + + +File: internals, Node: Condition Code, Next: Assembler Format, Prev: Misc, Up: Machine Macros + +Condition Code Information +========================== + +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'. + +`CC_STATUS_MDEP' + C code for a data type which is used for declaring the `mdep' + component of `cc_status'. It defaults to `int'. + +`CC_STATUS_MDEP_INIT' + A C expression for the initial value of the `mdep' field. It + defaults to 0. + +`NOTICE_UPDATE_CC (EXP)' + A C compound statement to set the components of `cc_status' + appropriately for an 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)'. + + If there are insn 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'. +  File: internals, Node: Assembler Format, Prev: Condition Code, Up: Machine Macros @@ -6,420 +223,449 @@ Output of Assembler Code ======================== `ASM_SPEC' - A C string constant that tells the GNU CC driver program options to - pass to the assembler. It can also specify how to translate options - you give to GNU CC into options for GNU CC to pass to the assembler. - See the file `tm-sun3.h' for an example of this. + A C string constant that tells the GNU CC driver program options + to pass to the assembler. It can also specify how to translate + options you give to GNU CC into options for GNU CC to pass to + the assembler. See the file `tm-sun3.h' for an example of this. Do not define this macro if it does not need to do anything. `LINK_SPEC' - A C string constant that tells the GNU CC driver program options to - pass to the linker. It can also specify how to translate options you - give to GNU CC into options for GNU CC to pass to the linker. + A C string constant that tells the GNU CC driver program options + to pass to the linker. It can also specify how to translate + options you give to GNU CC into options for GNU CC to pass to + the linker. Do not define this macro if it does not need to do anything. -`ASM_FILE_START' - A C string constant for text to be output at the start of each - assembler output file. Normally this is `"#NO_APP"', which is a - comment that has no effect on most assemblers but tells the GNU - assembler that it can save time by not checking for certain assembler - constructs. +`LIB_SPEC' + Another C string constant used much like `LINK_SPEC'. The + difference between the two is that `LIBS_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'. + +`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'. + +`ASM_FILE_START (STREAM)' + A C expression which outputs to the stdio stream STREAM some + appropriate text to go at the start of an assembler file. + + Normally this macro is defined to output a line containing + `#NO_APP', which is a comment that has no effect on most + assemblers but tells the GNU assembler that it can save time by + not checking for certain assembler constructs. + + On systems that use SDB, it is necessary to output certain + commands; see `tm-attasm.h'. `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. + 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. `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. + 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. `TEXT_SECTION_ASM_OP' - A C string constant for the assembler operation that should precede - instructions and read-only data. Normally `".text"' is right. + A C string constant for the assembler operation that should + precede instructions and read-only data. Normally `".text"' is + right. `DATA_SECTION_ASM_OP' A C string constant for the assembler operation to identify the - following data as writable initialized data. Normally `".data"' is - right. + following data as writable initialized data. Normally `".data"' + is right. `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. + registers, each one as a C string constant. This is what + translates register numbers in the compiler into assembler + language. `DBX_REGISTER_NUMBER (REGNO)' - A C expression that returns the DBX register number for the compiler - register number REGNO. In simple cases, the value of this expression - may 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. + A C expression that returns the DBX register number for the + compiler register number REGNO. In simple cases, the value of + this expression may 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. + +`DBX_DEBUGGING_INFO' + Define this macro if GNU CC should produce debugging output for + DBX in response to the `-g' option. + +`SDB_DEBUGGING_INFO' + Define this macro if GNU CC should produce debugging output for + SDB in response to the `-g' option. + +`PUT_SDB_OP' + 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. + +`SDB_GENERATE_FAKE' + Define this macro to override the usual method of constructing a + dummy name for anonymous structure and union types. See + `sdbout.c' for more infomation. `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. + 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. `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. + 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. `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. - -`ASM_OUTPUT_LABEL (FILE, NAME)' - A C statement (sans semicolon) to output to the stdio stream FILE the - assembler definition of a label named NAME. Use the expression - `assemble_name (FILE, NAME)' to output the name itself; before and - after that, output the additional assembler syntax for defining the - name, and a newline. + 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. + +`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. -`ASM_DECLARE_FUNCTION_NAME (FILE, NAME)' - A C statement (sans semicolon) to output to the stdio stream FILE any - text necessary for declaring the name of a function which is being - defined. This macro is responsible for outputting the label - definition (perhaps using `ASM_OUTPUT_LABEL'). - - 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'). - -`ASM_GLOBALIZE_LABEL (FILE, NAME)' - A C statement (sans semicolon) to output to the stdio stream FILE some - commands that will make the label NAME global; that is, available for - reference from other files. Use the expression `assemble_name (FILE, - NAME)' to output the name itself; before and after that, output the - additional assembler syntax for making that name global, and a newline. - -`ASM_OUTPUT_EXTERNAL (FILE, NAME)' - A C statement (sans semicolon) to output to the stdio stream FILE any - text necessary for declaring the name of an external symbol which is - referenced in this compilation but not defined. - - 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. - -`ASM_OUTPUT_LABELREF (FILE, NAME)' - A C statement to output to the stdio stream FILE a reference in - assembler syntax to a label named NAME. The character `_' should be - added 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'. - -`ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM)' - A C statement to output to the stdio stream FILE a label whose name is - made from the string PREFIX and the number NUM. These labels are used - for internal purposes, and there is no reason for them to appear in - the symbol table of the object file. On many systems, the letter `L' - at the beginning of a label has this effect. The usual definition of - this macro is as follows: +`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'). + +`ASM_GLOBALIZE_LABEL (STREAM, NAME)' + A C statement (sans semicolon) to output to the stdio stream + STREAM some commands that will make the label NAME global; that + is, available for reference from other files. 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 global, and a newline. + +`ASM_OUTPUT_EXTERNAL (STREAM, NAME, DECL)' + 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. + +`ASM_OUTPUT_LABELREF (STREAM, NAME)' + A C statement to output to the stdio stream STREAM a reference + in assembler syntax to a label named NAME. The character `_' + should be added 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'. + +`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 `ASM_OUTPUT_LABELREF', + should produce the same output that `ASM_OUTPUT_INTERNAL_LABEL' + would produce with the same PREFIX and NUM. + +`ASM_OUTPUT_INTERNAL_LABEL (STREAM, PREFIX, NUM)' + A C statement to output to the stdio stream STREAM a label whose + name is made from the string PREFIX and the number NUM. These + labels are used for internal purposes, and there is no reason + for them to appear in the symbol table of the object file. On + many systems, the letter `L' at the beginning of a label has + this effect. The usual definition of this macro is as follows: - fprintf (FILE, "L%s%d:\n", PREFIX, NUM) + fprintf (STREAM, "L%s%d:\n", PREFIX, NUM) -`ASM_OUTPUT_CASE_LABEL (FILE, PREFIX, NUM, TABLE)' +`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 - `ASM_OUTPUT_INTERNAL_LABEL'; the fourth argument is the jump-table - which follows (a `jump_insn' containing an `addr_vec' or - `addr_diff_vec'). + `ASM_OUTPUT_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. + 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 `ASM_OUTPUT_INTERNAL_LABEL'. +`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. + `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. - - This string will be used as the 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. - -`ASM_OUTPUT_ADDR_DIFF_ELT (FILE, VALUE, REL)' - This macro should be provided on machines where the addresses in a - dispatch table are relative to the table's own address. - - The definition should be a C statement to output to the stdio stream - FILE 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 - `ASM_OUTPUT_INTERNAL_LABEL', and they must be printed in the same way - here. For example, + 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. + + This string will be used as the 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. + +`ASM_OUTPUT_ADDR_DIFF_ELT (STREAM, VALUE, REL)' + This macro should be provided on machines where the addresses in + a dispatch table are relative to the table's own address. + + The definition should be 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 `ASM_OUTPUT_INTERNAL_LABEL', and they must be printed in + the same way here. For example, - fprintf (FILE, "\t.word L%d-L%d\n", + fprintf (STREAM, "\t.word L%d-L%d\n", VALUE, REL) -`ASM_OUTPUT_ADDR_VEC_ELT (FILE, 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 - FILE an assembler pseudo-instruction to generate a reference to a - label. VALUE is the number of an internal label whose definition is - output using `ASM_OUTPUT_INTERNAL_LABEL'. For example, - - fprintf (FILE, "\t.word L%d\n", VALUE) - -`ASM_OUTPUT_DOUBLE (FILE, VALUE)' - A C statement to output to the stdio stream FILE an assembler - instruction to assemble a `double' constant whose value is VALUE. - VALUE will be a C expression of type `double'. - -`ASM_OUTPUT_FLOAT (FILE, VALUE)' - A C statement to output to the stdio stream FILE an assembler - instruction to assemble a `float' constant whose value is VALUE. - VALUE will be a C expression of type `float'. - -`ASM_OUTPUT_INT (FILE, EXP)' -`ASM_OUTPUT_SHORT (FILE, EXP)' -`ASM_OUTPUT_CHAR (FILE, EXP)' - A C statement to output to the stdio stream FILE an assembler - instruction to assemble a `int', `short' or `char' constant whose - value is VALUE. The argument EXP will be an RTL expression which - represents a constant value. Use `output_addr_const (EXP)' to output - this value as an assembler expression. +`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 `ASM_OUTPUT_INTERNAL_LABEL'. + For example, + + fprintf (STREAM, "\t.word L%d\n", VALUE) + +`ASM_OUTPUT_DOUBLE (STREAM, VALUE)' + A C statement to output to the stdio stream STREAM an assembler + instruction to assemble a `double' constant whose value is + VALUE. VALUE will be a C expression of type `double'. + +`ASM_OUTPUT_FLOAT (STREAM, VALUE)' + A C statement to output to the stdio stream STREAM an assembler + instruction to assemble a `float' constant whose value is VALUE. + vALUE will be a C expression of type `float'. + +`ASM_OUTPUT_INT (STREAM, EXP)' +`ASM_OUTPUT_SHORT (STREAM, EXP)' +`ASM_OUTPUT_CHAR (STREAM, EXP)' + A C statement to output to the stdio stream STREAM an assembler + instruction to assemble a `int', `short' or `char' constant + whose value is VALUE. The argument EXP will be an RTL + expression which represents a constant value. Use + `output_addr_const (EXP)' to output this value as an assembler + expression. -`ASM_OUTPUT_BYTE (FILE, VALUE)' - A C statement to output to the stdio stream FILE an assembler +`ASM_OUTPUT_BYTE (STREAM, VALUE)' + A C statement to output to the stdio stream STREAM an assembler instruction to assemble a single byte containing the number VALUE. -`ASM_OUTPUT_ASCII (FILE, PTR, LEN)' - A C statement to output to the stdio stream FILE 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'. - -`ASM_OUTPUT_SKIP (FILE, NBYTES)' - A C statement to output to the stdio stream FILE an assembler - instruction to advance the location counter by NBYTES bytes. NBYTES - will be a C expression of type `int'. - -`ASM_OUTPUT_ALIGN (FILE, POWER)' - A C statement to output to the stdio stream FILE an assembler - instruction to advance the location counter to a multiple of 2 to the - POWER bytes. POWER will be a C expression of type `int'. - -`ASM_OUTPUT_COMMON (FILE, NAME, SIZE)' - A C statement (sans semicolon) to output to the stdio stream FILE the - assembler definition of a common-label named NAME whose size is SIZE - bytes. Use the expression `assemble_name (FILE, NAME)' to output the - name itself; before and after that, output the additional assembler - syntax for defining the name, and a newline. +`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'. + +`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. + NBYTES will be a C expression of type `int'. + +`ASM_OUTPUT_ALIGN (STREAM, POWER)' + A C statement to output to the stdio stream STREAM an assembler + instruction to advance the location counter to a multiple of 2 + to the POWER bytes. POWER will be a C expression of type `int'. + +`ASM_OUTPUT_COMMON (STREAM, NAME, SIZE)' + 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. 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 - global variables are output. + This macro controls how the assembler definitions of + uninitialized global variables are output. -`ASM_OUTPUT_LOCAL (FILE, NAME, SIZE)' - A C statement (sans semicolon) to output to the stdio stream FILE the - assembler definition of a local-common-label named NAME whose size is - SIZE bytes. Use the expression `assemble_name (FILE, NAME)' to output - the name itself; before and after that, output the additional - assembler syntax for defining the name, and a newline. +`ASM_OUTPUT_LOCAL (STREAM, NAME, SIZE)' + 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. 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. + +`ASM_OUTPUT_SOURCE_LINE (STREAM, LINE)' + A C statment to output DBX or SDB debugging information before + code for line number LINE of the current source file to the + stdio stream STREAM. - This macro controls how the assembler definitions of uninitialized - static variables are output. + This macro need not be defined if the standard form of debugging + information for the debugger in use is appropriate. `TARGET_BELL' - A C constant expression for the integer value for escape sequence `\a'. + A C constant expression for the integer value for escape + sequence `\a'. `TARGET_BS' `TARGET_TAB' `TARGET_NEWLINE' - C constant expressions for the integer values for escape sequences - `\b', `\t' and `\n'. + C constant expressions for the integer values for escape + sequences `\b', `\t' and `\n'. `TARGET_VT' `TARGET_FF' `TARGET_CR' - C constant expressions for the integer values for escape sequences - `\v', `\f' and `\r'. + C constant expressions for the integer values for escape + sequences `\v', `\f' and `\r'. -`ASM_OUTPUT_OPCODE (FILE, PTR)' - Define this macro if you are using an unusual assembler that requires - different names for the machine instructions. +`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 FILE. 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 - FILE, 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 the macro definition does nothing, the instruction is output in the - usual way. - -`PRINT_OPERAND (FILE, X, CODE)' - A C compound statement to output to stdio stream FILE 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'. + 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 the macro definition does nothing, the instruction is output + in the usual way. + +`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. + +`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. + followed by a punctuation character), this macro is called with + a null pointer for X and the punctuation character for CODE. -`PRINT_OPERAND_ADDRESS (FILE, X)' - A C compound statement to output to stdio stream FILE the assembler - syntax for an instruction operand that is a memory reference whose - address is X. X is an RTL expression. +`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. `ASM_OPEN_PAREN' `ASM_CLOSE_PAREN' - These macros are defined as C string constant, describing the syntax - in the assembler for grouping arithmetic expressions. The following - definitions are correct for most assemblers: + These macros are defined as C string constant, describing the + syntax in the assembler for grouping arithmetic expressions. + The following definitions are correct for most assemblers: #define ASM_OPEN_PAREN "(" #define ASM_CLOSE_PAREN ")" +  File: internals, Node: Config, Prev: Machine Macros, Up: Top The Configuration File ********************** -The configuration file `config-MACHINE.h' contains macro definitions that -describe the machine and system on which the compiler is running. Most of -the values in it are actually the same on all machines that GNU CC runs on, -so most all configuration files are identical. But there are some macros -that vary: +The configuration file `config-MACHINE.h' contains macro definitions +that describe the machine and system on which the compiler is +running. Most of the values in it are actually the same on all +machines that GNU CC runs on, so most all configuration files are +identical. But there are some macros that vary: `FAILURE_EXIT_CODE' - A C expression for the status code to be returned when the compiler - exits after serious errors. + A C expression for the status code to be returned when the + compiler exits after serious errors. `SUCCESS_EXIT_CODE' - A C expression for the status code to be returned when the compiler - exits without serious errors. + A C expression for the status code to be returned when the + compiler exits without serious errors. - -Tag Table: -Node: Top1084 -Node: Copying2276 -Node: Contributors9633 -Node: Options11165 -Node: Installation36068 -Node: VMS Install42638 -Node: Trouble44602 -Node: Incompatibilities44958 -Node: Extensions49707 -Node: Statement Exprs51271 -Node: Naming Types52721 -Node: Typeof53804 -Node: Lvalues55502 -Node: Conditionals57396 -Node: Zero-Length58315 -Node: Variable-Length58987 -Node: Subscripting61129 -Node: Pointer Arith61610 -Node: Initializers62102 -Node: Constructors62518 -Node: Dollar Signs64001 -Node: Alignment64297 -Node: Inline65610 -Node: Extended Asm67488 -Node: Asm Labels72522 -Node: Bugs73789 -Node: Bug Criteria74501 -Node: Bug Reporting77281 -Node: Portability83698 -Node: Interface85455 -Node: Passes88262 -Node: RTL100724 -Node: RTL Objects102547 -Node: Accessors105457 -Node: Flags108739 -Node: Machine Modes110408 -Node: Constants115011 -Node: Regs and Memory117505 -Node: Arithmetic123494 -Node: Comparisons128710 -Node: Bit Fields131473 -Node: Conversions132545 -Node: RTL Declarations135210 -Node: Side Effects135979 -Node: Incdec142816 -Node: Assembler145179 -Node: Insns146695 -Node: Calls155414 -Node: Sharing157518 -Node: Machine Desc159926 -Node: Patterns161563 -Node: Example164365 -Node: RTL Template165484 -Node: Output Template169785 -Node: Output Statement172660 -Node: Constraints174777 -Node: Simple Constraints175704 -Node: Multi-Alternative183654 -Node: Class Preferences186658 -Node: Modifiers187535 -Node: No Constraints190908 -Node: Standard Names191897 -Node: Pattern Ordering204067 -Node: Dependent Patterns205288 -Node: Jump Patterns209220 -Node: Peephole Definitions211585 -Node: Expander Definitions216806 -Node: Machine Macros223309 -Node: Run-time Target224405 -Node: Storage Layout227084 -Node: Registers229331 -Node: Register Classes237267 -Node: Stack Layout244585 -Node: Library Names259278 -Node: Addressing Modes260175 -Node: Misc264695 -Node: Condition Code269375 -Node: Assembler Format271457 -Node: Config286336 - -End Tag Table