1108 lines
50 KiB
Plaintext
1108 lines
50 KiB
Plaintext
This is Info file gcc.info, produced by Makeinfo version 1.68 from the
|
||
input file ../../gcc-2.95.2/gcc/gcc.texi.
|
||
|
||
INFO-DIR-SECTION Programming
|
||
START-INFO-DIR-ENTRY
|
||
* gcc: (gcc). The GNU Compiler Collection.
|
||
END-INFO-DIR-ENTRY
|
||
This file documents the use and the internals of the GNU compiler.
|
||
|
||
Published by the Free Software Foundation 59 Temple Place - Suite 330
|
||
Boston, MA 02111-1307 USA
|
||
|
||
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
||
1999 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 "Funding
|
||
for Free Software" 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 "Funding for Free Software", 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: Sections, Next: PIC, Prev: Costs, Up: Target Macros
|
||
|
||
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.
|
||
|
||
The compiler must tell the assembler when to switch sections. These
|
||
macros control what commands to output to tell the assembler this. You
|
||
can also define additional sections.
|
||
|
||
`TEXT_SECTION_ASM_OP'
|
||
A C expression whose value is a string containing the assembler
|
||
operation that should precede instructions and read-only data.
|
||
Normally `".text"' is right.
|
||
|
||
`DATA_SECTION_ASM_OP'
|
||
A C expression whose value is a string containing the assembler
|
||
operation to identify the following data as writable initialized
|
||
data. Normally `".data"' is right.
|
||
|
||
`SHARED_SECTION_ASM_OP'
|
||
If defined, a C expression whose value is a string containing the
|
||
assembler operation to identify the following data as shared data.
|
||
If not defined, `DATA_SECTION_ASM_OP' will be used.
|
||
|
||
`BSS_SECTION_ASM_OP'
|
||
If defined, a C expression whose value is a string 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.
|
||
|
||
`SHARED_BSS_SECTION_ASM_OP'
|
||
If defined, a C expression whose value is a string containing the
|
||
assembler operation to identify the following data as
|
||
uninitialized global shared data. If not defined, and
|
||
`BSS_SECTION_ASM_OP' is, the latter will be used.
|
||
|
||
`INIT_SECTION_ASM_OP'
|
||
If defined, a C expression whose value is a string containing the
|
||
assembler operation to identify the following data as
|
||
initialization code. If not defined, GNU CC will assume such a
|
||
section does not exist.
|
||
|
||
`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'.
|
||
|
||
`READONLY_DATA_SECTION'
|
||
On most machines, read-only variables, constants, and jump tables
|
||
are placed in the text section. If this is not the case on your
|
||
machine, this macro should be defined to be the name of a function
|
||
(either `data_section' or a function defined in `EXTRA_SECTIONS')
|
||
that switches to the section to be used for read-only items.
|
||
|
||
If these items should be placed in the text section, this macro
|
||
should not be defined.
|
||
|
||
`SELECT_SECTION (EXP, RELOC)'
|
||
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. RELOC indicates whether the
|
||
initial value of EXP requires link-time relocations. Select the
|
||
section by calling `text_section' or one of the alternatives for
|
||
other sections.
|
||
|
||
Do not define this macro if you put all read-only variables and
|
||
constants in the read-only data section (usually 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 put all constants in the read-only
|
||
data section.
|
||
|
||
`JUMP_TABLES_IN_TEXT_SECTION'
|
||
Define this macro to be an expression with a non-zero 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.
|
||
|
||
`ENCODE_SECTION_INFO (DECL)'
|
||
Define this macro if references to a symbol must be treated
|
||
differently depending on something about the variable or function
|
||
named by the symbol (such as what section it is in).
|
||
|
||
The macro definition, if any, is executed immediately after the
|
||
rtl for DECL has been created and stored in `DECL_RTL (DECL)'.
|
||
The value of the rtl will be a `mem' whose address is a
|
||
`symbol_ref'.
|
||
|
||
The usual thing for this macro to do is to record a flag in the
|
||
`symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified
|
||
name string in the `symbol_ref' (if one bit is not enough
|
||
information).
|
||
|
||
`STRIP_NAME_ENCODING (VAR, SYM_NAME)'
|
||
Decode SYM_NAME and store the real name part in VAR, sans the
|
||
characters that encode section info. Define this macro if
|
||
`ENCODE_SECTION_INFO' alters the symbol's name string.
|
||
|
||
`UNIQUE_SECTION_P (DECL)'
|
||
A C expression which evaluates to true if DECL should be placed
|
||
into a unique section for some target-specific reason. If you do
|
||
not define this macro, the default is `0'. Note that the flag
|
||
`-ffunction-sections' will also cause functions to be placed into
|
||
unique sections.
|
||
|
||
`UNIQUE_SECTION (DECL, RELOC)'
|
||
A C statement to build up a unique section name, expressed as a
|
||
STRING_CST node, and assign it to `DECL_SECTION_NAME (DECL)'.
|
||
RELOC indicates whether the initial value of EXP requires
|
||
link-time relocations. If you do not define this macro, GNU CC
|
||
will use the symbol name prefixed by `.' as the section name.
|
||
|
||
|
||
File: gcc.info, Node: PIC, Next: Assembler Format, Prev: Sections, Up: Target Macros
|
||
|
||
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 macros
|
||
`GO_IF_LEGITIMATE_ADDRESS' and `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.
|
||
|
||
`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).
|
||
|
||
`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.
|
||
|
||
`FINALIZE_PIC'
|
||
By generating position-independent code, when two different
|
||
programs (A and B) share a common library (libC.a), the text of
|
||
the library can be shared whether or not the library is linked at
|
||
the same address for both programs. In some of these
|
||
environments, position-independent code requires not only the use
|
||
of different addressing modes, but also special code to enable the
|
||
use of these addressing modes.
|
||
|
||
The `FINALIZE_PIC' macro serves as a hook to emit these special
|
||
codes once the function is being compiled into assembly code, but
|
||
not before. (It is not done before, because in the case of
|
||
compiling an inline function, it would lead to multiple PIC
|
||
prologues being included in functions which used inline functions
|
||
and were compiled to assembly language.)
|
||
|
||
`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: gcc.info, Node: Assembler Format, Next: Debugging Info, Prev: PIC, Up: Target Macros
|
||
|
||
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: gcc.info, Node: File Framework, Next: Data Output, Up: Assembler Format
|
||
|
||
The Overall Framework of an Assembler File
|
||
------------------------------------------
|
||
|
||
This describes the overall framework of an assembler file.
|
||
|
||
`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 `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 `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_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.
|
||
|
||
`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.
|
||
|
||
`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.
|
||
|
||
`OUTPUT_QUOTED_STRING (STREAM, NAME)'
|
||
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, GNU CC 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.
|
||
|
||
`ASM_OUTPUT_SOURCE_LINE (STREAM, LINE)'
|
||
A C statement 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.
|
||
|
||
`ASM_OUTPUT_SECTION_NAME (STREAM, DECL, NAME, RELOC)'
|
||
A C statement to output something to the assembler file to switch
|
||
to section NAME for object DECL which is either a `FUNCTION_DECL',
|
||
a `VAR_DECL' or `NULL_TREE'. RELOC indicates whether the initial
|
||
value of EXP requires link-time relocations. Some target formats
|
||
do not support arbitrary sections. Do not define this macro in
|
||
such cases.
|
||
|
||
At present this macro is only used to support section attributes.
|
||
When this macro is undefined, section attributes are disabled.
|
||
|
||
`OBJC_PROLOGUE'
|
||
A C statement to output any assembler statements which are
|
||
required to precede any Objective C object definitions or message
|
||
sending. The statement is executed only when compiling an
|
||
Objective C program.
|
||
|
||
|
||
File: gcc.info, Node: Data Output, Next: Uninitialized Data, Prev: File Framework, Up: Assembler Format
|
||
|
||
Output of Data
|
||
--------------
|
||
|
||
This describes data output.
|
||
|
||
`ASM_OUTPUT_LONG_DOUBLE (STREAM, VALUE)'
|
||
`ASM_OUTPUT_DOUBLE (STREAM, VALUE)'
|
||
`ASM_OUTPUT_FLOAT (STREAM, VALUE)'
|
||
`ASM_OUTPUT_THREE_QUARTER_FLOAT (STREAM, VALUE)'
|
||
`ASM_OUTPUT_SHORT_FLOAT (STREAM, VALUE)'
|
||
`ASM_OUTPUT_BYTE_FLOAT (STREAM, VALUE)'
|
||
A C statement to output to the stdio stream STREAM an assembler
|
||
instruction to assemble a floating-point constant of `TFmode',
|
||
`DFmode', `SFmode', `TQFmode', `HFmode', or `QFmode',
|
||
respectively, whose value is VALUE. VALUE will be a C expression
|
||
of type `REAL_VALUE_TYPE'. Macros such as
|
||
`REAL_VALUE_TO_TARGET_DOUBLE' are useful for writing these
|
||
definitions.
|
||
|
||
`ASM_OUTPUT_QUADRUPLE_INT (STREAM, EXP)'
|
||
`ASM_OUTPUT_DOUBLE_INT (STREAM, EXP)'
|
||
`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 an integer of 16, 8, 4, 2 or 1 bytes,
|
||
respectively, whose value is VALUE. The argument EXP will be an
|
||
RTL expression which represents a constant value. Use
|
||
`output_addr_const (STREAM, EXP)' to output this value as an
|
||
assembler expression.
|
||
|
||
For sizes larger than `UNITS_PER_WORD', if the action of a macro
|
||
would be identical to repeatedly calling the macro corresponding to
|
||
a size of `UNITS_PER_WORD', once for each word, you need not define
|
||
the macro.
|
||
|
||
`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_BYTE_OP'
|
||
A C string constant giving the pseudo-op to use for a sequence of
|
||
single-byte constants. If this macro is not defined, the default
|
||
is `"byte"'.
|
||
|
||
`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'.
|
||
|
||
`CONSTANT_POOL_BEFORE_FUNCTION'
|
||
You may define this macro as a C expression. You should define the
|
||
expression to have a non-zero value if GNU CC should output the
|
||
constant pool for a function before the code for the function, or
|
||
a zero value if GNU CC should output the constant pool after the
|
||
function. If you do not define this macro, the usual case, GNU CC
|
||
will output the constant pool before the function.
|
||
|
||
`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.
|
||
|
||
`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:
|
||
|
||
ASM_OUTPUT_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.
|
||
|
||
`CONSTANT_AFTER_FUNCTION_P (EXP)'
|
||
Define this macro as a C expression which is nonzero if the
|
||
constant EXP, of type `tree', should be output after the code for a
|
||
function. The compiler will normally output all constants before
|
||
the function; you need not define this macro if this is OK.
|
||
|
||
`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 GNU CC wrote immediately before
|
||
this call.
|
||
|
||
If no constant-pool epilogue is required, the usual case, you need
|
||
not define this macro.
|
||
|
||
`IS_ASM_LOGICAL_LINE_SEPARATOR (C)'
|
||
Define this macro as a C expression which is nonzero if C is used
|
||
as a logical line separator by the assembler.
|
||
|
||
If you do not define this macro, the default is that only the
|
||
character `;' is treated as a logical line separator.
|
||
|
||
`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 ")"
|
||
|
||
These macros are provided by `real.h' for writing the definitions of
|
||
`ASM_OUTPUT_DOUBLE' and the like:
|
||
|
||
`REAL_VALUE_TO_TARGET_SINGLE (X, L)'
|
||
`REAL_VALUE_TO_TARGET_DOUBLE (X, L)'
|
||
`REAL_VALUE_TO_TARGET_LONG_DOUBLE (X, L)'
|
||
These translate X, of type `REAL_VALUE_TYPE', to the target's
|
||
floating point representation, and store its bit pattern in the
|
||
array of `long int' whose address is L. The number of elements in
|
||
the output 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.
|
||
|
||
`REAL_VALUE_TO_DECIMAL (X, FORMAT, STRING)'
|
||
This macro converts X, of type `REAL_VALUE_TYPE', to a decimal
|
||
number and stores it as a string into STRING. You must pass, as
|
||
STRING, the address of a long enough block of space to hold the
|
||
result.
|
||
|
||
The argument FORMAT is a `printf'-specification that serves as a
|
||
suggestion for how to format the output string.
|
||
|
||
|
||
File: gcc.info, Node: Uninitialized Data, Next: Label Output, Prev: Data Output, Up: Assembler Format
|
||
|
||
Output of Uninitialized Variables
|
||
---------------------------------
|
||
|
||
Each of the macros in this section is used to do the whole job of
|
||
outputting a single uninitialized variable.
|
||
|
||
`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
|
||
common global variables are output.
|
||
|
||
`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.
|
||
|
||
`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 not
|
||
corresponding variable. If you define this macro, GNU CC wil 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.
|
||
|
||
`ASM_OUTPUT_SHARED_COMMON (STREAM, NAME, SIZE, ROUNDED)'
|
||
If defined, it is similar to `ASM_OUTPUT_COMMON', except that it
|
||
is used when NAME is shared. If not defined, `ASM_OUTPUT_COMMON'
|
||
will be used.
|
||
|
||
`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.
|
||
|
||
This macro controls how the assembler definitions of uninitialized
|
||
global variables are output. This macro exists to properly
|
||
support languages like `c++' which do not have `common' data.
|
||
However, this macro currently is not defined for all targets. If
|
||
this macro and `ASM_OUTPUT_ALIGNED_BSS' are not defined then
|
||
`ASM_OUTPUT_COMMON' or `ASM_OUTPUT_ALIGNED_COMMON' or
|
||
`ASM_OUTPUT_ALIGNED_DECL_COMMON' is used.
|
||
|
||
`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.
|
||
|
||
`ASM_OUTPUT_SHARED_BSS (STREAM, DECL, NAME, SIZE, ROUNDED)'
|
||
If defined, it is similar to `ASM_OUTPUT_BSS', except that it is
|
||
used when NAME is shared. If not defined, `ASM_OUTPUT_BSS' will
|
||
be used.
|
||
|
||
`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_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.
|
||
|
||
`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 not
|
||
corresponding variable. If you define this macro, GNU CC wil 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.
|
||
|
||
`ASM_OUTPUT_SHARED_LOCAL (STREAM, NAME, SIZE, ROUNDED)'
|
||
If defined, it is similar to `ASM_OUTPUT_LOCAL', except that it is
|
||
used when NAME is shared. If not defined, `ASM_OUTPUT_LOCAL' will
|
||
be used.
|
||
|
||
|
||
File: gcc.info, Node: Label Output, Next: Initialization, Prev: Uninitialized Data, Up: Assembler Format
|
||
|
||
Output and Generation of Labels
|
||
-------------------------------
|
||
|
||
This is about outputting labels.
|
||
|
||
`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_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.
|
||
|
||
`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').
|
||
|
||
`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.
|
||
|
||
`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_WEAKEN_LABEL'
|
||
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, GNU CC will not support weak
|
||
symbols and you should not define the `SUPPORTS_WEAK' 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 `ASM_WEAKEN_LABEL' 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'.
|
||
|
||
`MAKE_DECL_ONE_ONLY'
|
||
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.
|
||
|
||
`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.
|
||
|
||
`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_EXTERNAL_LIBCALL (STREAM, SYMREF)'
|
||
A C statement (sans semicolon) to output on STREAM an assembler
|
||
pseudo-op to declare a library function name external. The name
|
||
of the library function is given by SYMREF, which has type `rtx'
|
||
and is a `symbol_ref'.
|
||
|
||
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 (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'.
|
||
|
||
`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.
|
||
|
||
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 usual definition of this macro is as follows:
|
||
|
||
fprintf (STREAM, "L%s%d:\n", PREFIX, NUM)
|
||
|
||
`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 `ASM_OUTPUT_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.)
|
||
|
||
`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.
|
||
|
||
`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.
|
||
|
||
`ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL (STREAM, SYMBOL, HIGH, LOW)'
|
||
A C statement to output to the stdio stream STREAM assembler code
|
||
which defines (equates) the symbol SYMBOL to have a value equal to
|
||
the difference of the two symbols HIGH and LOW, i.e. HIGH minus
|
||
LOW. GNU CC guarantees that the symbols HIGH and LOW are already
|
||
known by the assembler so that the difference resolves into a
|
||
constant.
|
||
|
||
If SET_ASM_OP is defined, a default definition is provided which is
|
||
correct for most systems.
|
||
|
||
`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.
|
||
|
||
Define this macro if the target only supports weak aliases; define
|
||
ASM_OUTPUT_DEF instead if possible.
|
||
|
||
`OBJC_GEN_METHOD_LABEL (BUF, IS_INST, CLASS_NAME, CAT_NAME, SEL_NAME)'
|
||
Define this macro to override the default assembler names used for
|
||
Objective C methods.
|
||
|
||
The default name is a unique method number followed by the name of
|
||
the class (e.g. `_1_Foo'). For methods in categories, the name of
|
||
the category is also included in the assembler name (e.g.
|
||
`_1_Foo_Bar').
|
||
|
||
These names are safe on most systems, but make debugging difficult
|
||
since the method's selector is not present in the name.
|
||
Therefore, particular systems define other ways of computing names.
|
||
|
||
BUF is an expression of type `char *' which gives you a buffer in
|
||
which to store the name; its length is as long as CLASS_NAME,
|
||
CAT_NAME and SEL_NAME put together, plus 50 characters extra.
|
||
|
||
The argument IS_INST specifies whether the method is an instance
|
||
method or a class method; CLASS_NAME is the name of the class;
|
||
CAT_NAME is the name of the category (or NULL if the method is not
|
||
in a category); and SEL_NAME is the name of the selector.
|
||
|
||
On systems where the assembler can handle quoted names, you can
|
||
use this macro to provide more human-readable names.
|
||
|
||
|
||
File: gcc.info, Node: Initialization, Next: Macros for Initialization, Prev: Label Output, Up: Assembler Format
|
||
|
||
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.
|
||
|
||
To use this method, you need appropriate definitions of the macros
|
||
`ASM_OUTPUT_CONSTRUCTOR' and `ASM_OUTPUT_DESTRUCTOR'. Usually you can
|
||
get them by including `svr4.h'.
|
||
|
||
When arbitrary sections are available, there are two variants,
|
||
depending upon how the code in `crtstuff.c' is called. On systems that
|
||
support an "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 crtbegin.o ... crtend.o -lgcc
|
||
|
||
The head of a function (`__do_global_ctors') appears in the init
|
||
section of `crtbegin.o'; the remainder of the function appears in the
|
||
init section of `crtend.o'. The linker will pull these two parts of
|
||
the section together, making a whole function. If any of the user's
|
||
object files linked into the middle of it contribute code, then that
|
||
code will be executed as part of the body of `__do_global_ctors'.
|
||
|
||
To use this variant, you must define the `INIT_SECTION_ASM_OP' macro
|
||
properly.
|
||
|
||
If no init section is available, do not define
|
||
`INIT_SECTION_ASM_OP'. Then `__do_global_ctors' is built into the text
|
||
section like all other functions, and resides in `libgcc.a'. When GCC
|
||
compiles any function called `main', it inserts a procedure call to
|
||
`__main' as the first executable code after the function prologue. The
|
||
`__main' function, also defined in `libgcc2.c', simply calls
|
||
`__do_global_ctors'.
|
||
|
||
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,
|
||
`ASM_OUTPUT_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. `ASM_OUTPUT_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, `ASM_OUTPUT_CONSTRUCTOR' does not produce an `N_SETT'
|
||
symbol; 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 GNU CC; 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.
|
||
|
||
Choosing among these configuration options has been simplified by a
|
||
set of operating-system-dependent files in the `config' subdirectory.
|
||
These files define all of the relevant parameters. Usually it is
|
||
sufficient to include one into your specific machine-dependent
|
||
configuration file. These files are:
|
||
|
||
`aoutos.h'
|
||
For operating systems using the `a.out' format.
|
||
|
||
`next.h'
|
||
For operating systems using the `MachO' format.
|
||
|
||
`svr3.h'
|
||
For System V Release 3 and similar systems using `COFF' format.
|
||
|
||
`svr4.h'
|
||
For System V Release 4 and similar systems using `ELF' format.
|
||
|
||
`vms.h'
|
||
For the VMS operating system.
|
||
|
||
The following section describes the specific macros that control and
|
||
customize the handling of initialization and termination functions.
|
||
|
||
|
||
File: gcc.info, Node: Macros for Initialization, Next: Instruction Output, Prev: Initialization, Up: Assembler Format
|
||
|
||
Macros Controlling Initialization Routines
|
||
------------------------------------------
|
||
|
||
Here are the macros that control how the compiler handles
|
||
initialization and termination functions:
|
||
|
||
`INIT_SECTION_ASM_OP'
|
||
If defined, a C string constant for the assembler operation to
|
||
identify the following data as initialization code. If not
|
||
defined, GNU CC 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.
|
||
|
||
`HAS_INIT_SECTION'
|
||
If defined, `main' will not call `__main' as described above.
|
||
This macro should be defined for systems that control the contents
|
||
of the init section on a symbol-by-symbol basis, such as OSF/1,
|
||
and should not be defined explicitly for systems that support
|
||
`INIT_SECTION_ASM_OP'.
|
||
|
||
`LD_INIT_SWITCH'
|
||
If defined, a C string constant for a switch that tells the linker
|
||
that the following symbol is an initialization routine.
|
||
|
||
`LD_FINI_SWITCH'
|
||
If defined, a C string constant for a switch that tells the linker
|
||
that the following symbol is a finalization routine.
|
||
|
||
`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.
|
||
|
||
`ASM_OUTPUT_CONSTRUCTOR (STREAM, NAME)'
|
||
Define this macro as a C statement to output on the stream STREAM
|
||
the assembler code to arrange to call the function named NAME at
|
||
initialization time.
|
||
|
||
Assume that NAME is the name of a C function generated
|
||
automatically by the compiler. This function takes no arguments.
|
||
Use the function `assemble_name' to output the name NAME; this
|
||
performs any system-specific syntactic transformations such as
|
||
adding an underscore.
|
||
|
||
If you don't define this macro, nothing special is output to
|
||
arrange to call the function. This is correct when the function
|
||
will be called in some other manner--for example, by means of the
|
||
`collect2' program, which looks through the symbol table to find
|
||
these functions by their names.
|
||
|
||
`ASM_OUTPUT_DESTRUCTOR (STREAM, NAME)'
|
||
This is like `ASM_OUTPUT_CONSTRUCTOR' but used for termination
|
||
functions rather than initialization functions.
|
||
|
||
When `ASM_OUTPUT_CONSTRUCTOR' and `ASM_OUTPUT_DESTRUCTOR' are
|
||
defined, the initializaiton 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 such systems you must
|
||
not define `ASM_OUTPUT_CONSTRUCTOR' and `ASM_OUTPUT_DESTRUCTOR' as the
|
||
object file's initialization routine must have global scope.
|
||
|
||
On certain kinds of systems, you can define these macros to make
|
||
`collect2' work faster (and, in some cases, make it work at all):
|
||
|
||
`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.
|
||
|
||
`OBJECT_FORMAT_ROSE'
|
||
Define this macro if the system uses ROSE format object files, so
|
||
that `collect2' can assume this format and scan object files
|
||
directly for dynamic constructor/destructor functions.
|
||
|
||
These macros are effective only in a native compiler; `collect2' as
|
||
part of a cross compiler always uses `nm' for the target machine.
|
||
|
||
`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:
|
||
|
||
`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.
|
||
|
||
`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'.
|
||
|