Info file gcc.info, produced by Makeinfo, -*- Text -*- from input file gcc.texinfo. This file documents the use and the internals of the GNU compiler. Copyright (C) 1988, 1989 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 sections entitled ``GNU General Public License'' and ``Protect Your Freedom--Fight `Look And Feel''' are 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 sections entitled ``GNU General Public License'' and ``Protect Your Freedom--Fight `Look And Feel''' and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.  File: gcc.info, Node: Assembler Format, Prev: Misc, Up: Machine Macros 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. 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. Do not define this macro if it does not need to do anything. `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'. `STANDARD_EXEC_PREFIX' Define this macro as a C string constant if you wish to override the standard choice of `/usr/local/lib/gcc-' as the default prefix to try when searching for the executable files of the compiler. The prefix specified by the `-B' option, if any, is tried before the default prefix. After the default prefix, if the executable is not found that way, `/usr/lib/gcc-' is tried next; then the directories in your search path for shell commands are searched. `STANDARD_STARTFILE_PREFIX' Define this macro as a C string constant if you wish to override the standard choice of `/usr/local/lib/' as the default prefix to try when searching for startup files such as `crt0.o'. In this search, all the prefixes tried for executable files are tried first. Then comes the default startfile prefix specified by this macro, followed by the prefixes `/lib/' and `/usr/lib/' as last resorts. `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_FILE_END (STREAM)' A C expression which outputs to the stdio stream STREAM some appropriate text to go at the end of an assembler file. If this macro is not defined, the default is to output nothing special at the end of the file. Most systems don't require any definition. On systems that use SDB, it is necessary to output certain commands; see `tm-attasm.h'. `ASM_IDENTIFY_GCC (FILE)' A C statement to output assembler commands which will identify the object file as having been compiled with GNU CC (or another GNU compiler). If you don't define this macro, the string `gcc_compiled.:' is output. This string is calculated to define a symbol which, on BSD systems, will never be defined for any other reason. GDB checks for the presence of this symbol when reading the symbol table of an executable. On non-BSD systems, you must arrange communication with GDB in some other fashion. If GDB is not used on your system, you can define this macro with an empty body. `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. `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. `TEXT_SECTION_ASM_OP' 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. `EXTRA_SECTIONS' A list of names for sections other than the standard two, which are `in_text' and `in_data'. You need not define this macro on a system with no other sections (that GCC needs to use). `EXTRA_SECTION_FUNCTIONS' One or more functions to be defined in `varasm.c'. These functions should do jobs analogous to those of `text_section' and `data_section', for your additional sections. Do not define this macro if you do not define `EXTRA_SECTIONS'. `SELECT_SECTION (EXP)' A C statement or statements to switch to the appropriate section for output of EXP. You can assume that EXP is either a `VAR_DECL' node or a constant of some sort. Select the section by calling `text_section' or one of the alternatives for other sections. Do not define this macro if you use only the standard two sections and put all read-only variables and constants in the text section. `SELECT_RTX_SECTION (MODE, RTX)' A C statement or statements to switch to the appropriate section for output of RTX in mode MODE. You can assume that RTX is some kind of constant in RTL. The argument MODE is redundant except in the case of a `const_int' rtx. Select the section by calling `text_section' or one of the alternatives for other sections. Do not define this macro if you use only the standard two sections and put all constants in the text section. `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. `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. `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 information. `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. `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. `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. `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. `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 (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, 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. `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 (STREAM, "L%s%d:\n", PREFIX, NUM) `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'). 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_OUTPUT_ALIGN_CODE (FILE)' A C expression to output text to align the location counter in the way that is desirable at a point in the code that is reached only by jumping. 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. `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_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. `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. `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 (STREAM, "\t.word L%d-L%d\n", VALUE, REL) `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_DOUBLE_INT (STREAM, EXP)' A C statement to output to the stdio stream STREAM an assembler instruction to assemble a `long long' constant whose value is EXP. The argument EXP will be an RTL expression which represents a constant value. It may be a `const_double' RTX, or it may be an ordinary single-precision constant. In the latter case, you should zero-extend it. `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 (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, 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. 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. `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. `ASM_OUTPUT_SOURCE_FILENAME (STREAM, NAME)' A C statment to output DBX or SDB 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 debugging information for the debugger in use is appropriate. `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 need not be defined if the standard form of debugging information for the debugger in use is appropriate. `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_BELL' 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'. `TARGET_VT' `TARGET_FF' `TARGET_CR' C constant expressions for the integer values for escape sequences `\v', `\f' and `\r'. `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_operand'. 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. `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. `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: #define ASM_OPEN_PAREN "(" #define ASM_CLOSE_PAREN ")"  File: gcc.info, Node: Config, Prev: Machine Macros, Up: Top The Configuration File ********************** The configuration file `xm-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 large parts of 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. `SUCCESS_EXIT_CODE' A C expression for the status code to be returned when the compiler exits without serious errors. In addition, configuration files for system V define `bcopy', `bzero' and `bcmp' as aliases. Some files define `alloca' as a macro when compiled with GNU CC, in order to take advantage of the benefit of GNU CC's built-in `alloca'.