mirror of
https://github.com/pmret/gcc-papermario.git
synced 2024-11-08 20:02:47 +01:00
1055 lines
47 KiB
Plaintext
1055 lines
47 KiB
Plaintext
|
This is Info file gcc.info, produced by Makeinfo version 1.67 from the
|
|||
|
input file gcc.texi.
|
|||
|
|
|||
|
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
|
|||
|
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," "Funding for
|
|||
|
Free Software," 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," "Funding for Free Software," 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: Costs, Next: Sections, Prev: Condition Code, Up: Target Macros
|
|||
|
|
|||
|
Describing Relative Costs of Operations
|
|||
|
=======================================
|
|||
|
|
|||
|
These macros let you describe the relative speed of various
|
|||
|
operations on the target machine.
|
|||
|
|
|||
|
`CONST_COSTS (X, CODE, OUTER_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, and the rtx code of the expression in which it is contained,
|
|||
|
found in OUTER_CODE.
|
|||
|
|
|||
|
CODE is the expression code--redundant, since it can be obtained
|
|||
|
with `GET_CODE (X)'.
|
|||
|
|
|||
|
`RTX_COSTS (X, CODE, OUTER_CODE)'
|
|||
|
Like `CONST_COSTS' but applies to nonconstant RTL expressions.
|
|||
|
This can be used, for example, to indicate how costly a multiply
|
|||
|
instruction is. In writing this macro, you can use the construct
|
|||
|
`COSTS_N_INSNS (N)' to specify a cost equal to N fast
|
|||
|
instructions. OUTER_CODE is the code of the expression in which X
|
|||
|
is contained.
|
|||
|
|
|||
|
This macro is optional; do not define it if the default cost
|
|||
|
assumptions are adequate for the target machine.
|
|||
|
|
|||
|
`ADDRESS_COST (ADDRESS)'
|
|||
|
An expression giving the cost of an addressing mode that contains
|
|||
|
ADDRESS. If not defined, the cost is computed from the ADDRESS
|
|||
|
expression and the `CONST_COSTS' values.
|
|||
|
|
|||
|
For most CISC machines, the default cost is a good approximation
|
|||
|
of the true cost of the addressing mode. However, on RISC
|
|||
|
machines, all instructions normally have the same length and
|
|||
|
execution time. Hence all addresses will have equal costs.
|
|||
|
|
|||
|
In cases where more than one form of an address is known, the form
|
|||
|
with the lowest cost will be used. If multiple forms have the
|
|||
|
same, lowest, cost, the one that is the most complex will be used.
|
|||
|
|
|||
|
For example, suppose an address that is equal to the sum of a
|
|||
|
register and a constant is used twice in the same basic block.
|
|||
|
When this macro is not defined, the address will be computed in a
|
|||
|
register and memory references will be indirect through that
|
|||
|
register. On machines where the cost of the addressing mode
|
|||
|
containing the sum is no higher than that of a simple indirect
|
|||
|
reference, this will produce an additional instruction and
|
|||
|
possibly require an additional register. Proper specification of
|
|||
|
this macro eliminates this overhead for such machines.
|
|||
|
|
|||
|
Similar use of this macro is made in strength reduction of loops.
|
|||
|
|
|||
|
ADDRESS need not be valid as an address. In such a case, the cost
|
|||
|
is not relevant and can be any value; invalid addresses need not be
|
|||
|
assigned a different cost.
|
|||
|
|
|||
|
On machines where an address involving more than one register is as
|
|||
|
cheap as an address computation involving only one register,
|
|||
|
defining `ADDRESS_COST' to reflect this can cause two registers to
|
|||
|
be live over a region of code where only one would have been if
|
|||
|
`ADDRESS_COST' were not defined in that manner. This effect should
|
|||
|
be considered in the definition of this macro. Equivalent costs
|
|||
|
should probably only be given to addresses with different numbers
|
|||
|
of registers on machines with lots of registers.
|
|||
|
|
|||
|
This macro will normally either not be defined or be defined as a
|
|||
|
constant.
|
|||
|
|
|||
|
`REGISTER_MOVE_COST (FROM, TO)'
|
|||
|
A C expression for the cost of moving data from a register in class
|
|||
|
FROM to one in class TO. The classes are expressed using the
|
|||
|
enumeration values such as `GENERAL_REGS'. A value of 2 is the
|
|||
|
default; other values are interpreted relative to that.
|
|||
|
|
|||
|
It is not required that the cost always equal 2 when FROM is the
|
|||
|
same as TO; on some machines it is expensive to move between
|
|||
|
registers if they are not general registers.
|
|||
|
|
|||
|
If reload sees an insn consisting of a single `set' between two
|
|||
|
hard registers, and if `REGISTER_MOVE_COST' applied to their
|
|||
|
classes returns a value of 2, reload does not check to ensure that
|
|||
|
the constraints of the insn are met. Setting a cost of other than
|
|||
|
2 will allow reload to verify that the constraints are met. You
|
|||
|
should do this if the `movM' pattern's constraints do not allow
|
|||
|
such copying.
|
|||
|
|
|||
|
`MEMORY_MOVE_COST (M)'
|
|||
|
A C expression for the cost of moving data of mode M between a
|
|||
|
register and memory. A value of 4 is the default; this cost is
|
|||
|
relative to those in `REGISTER_MOVE_COST'.
|
|||
|
|
|||
|
If moving between registers and memory is more expensive than
|
|||
|
between two registers, you should define this macro to express the
|
|||
|
relative cost.
|
|||
|
|
|||
|
`BRANCH_COST'
|
|||
|
A C expression for the cost of a branch instruction. A value of 1
|
|||
|
is the default; other values are interpreted relative to that.
|
|||
|
|
|||
|
Here are additional macros which do not specify precise relative
|
|||
|
costs, but only that certain actions are more expensive than GNU CC
|
|||
|
would ordinarily expect.
|
|||
|
|
|||
|
`SLOW_BYTE_ACCESS'
|
|||
|
Define this macro as a C expression which is nonzero if accessing
|
|||
|
less than a word of memory (i.e. a `char' or a `short') is no
|
|||
|
faster than accessing a word of memory, i.e., if such access
|
|||
|
require more than one instruction or if there is no difference in
|
|||
|
cost between byte and (aligned) word loads.
|
|||
|
|
|||
|
When this macro is not defined, the compiler will access a field by
|
|||
|
finding the smallest containing object; when it is defined, a
|
|||
|
fullword load will be used if alignment permits. Unless bytes
|
|||
|
accesses are faster than word accesses, using word accesses is
|
|||
|
preferable since it may eliminate subsequent memory access if
|
|||
|
subsequent accesses occur to other fields in the same word of the
|
|||
|
structure, but to different bytes.
|
|||
|
|
|||
|
`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'.
|
|||
|
|
|||
|
`SLOW_UNALIGNED_ACCESS'
|
|||
|
Define this macro to be the value 1 if unaligned accesses have a
|
|||
|
cost many times greater than aligned accesses, for example if they
|
|||
|
are emulated in a trap handler.
|
|||
|
|
|||
|
When this macro is non-zero, the compiler will act as if
|
|||
|
`STRICT_ALIGNMENT' were non-zero when generating code for block
|
|||
|
moves. This can cause significantly more instructions to be
|
|||
|
produced. Therefore, do not set this macro non-zero if unaligned
|
|||
|
accesses only add a cycle or two to the time for a memory access.
|
|||
|
|
|||
|
If the value of this macro is always zero, it need not be defined.
|
|||
|
|
|||
|
`DONT_REDUCE_ADDR'
|
|||
|
Define this macro to inhibit strength reduction of memory
|
|||
|
addresses. (On some machines, such strength reduction seems to do
|
|||
|
harm rather than good.)
|
|||
|
|
|||
|
`MOVE_RATIO'
|
|||
|
The number of scalar move insns which should be generated instead
|
|||
|
of a string move insn or a library call. Increasing the value
|
|||
|
will always make code faster, but eventually incurs high cost in
|
|||
|
increased code size.
|
|||
|
|
|||
|
If you don't define this, a reasonable default is used.
|
|||
|
|
|||
|
`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.
|
|||
|
|
|||
|
`NO_RECURSIVE_FUNCTION_CSE'
|
|||
|
Define this macro if it is as good or better for a function to call
|
|||
|
itself with an explicit address than to call an address kept in a
|
|||
|
register.
|
|||
|
|
|||
|
`ADJUST_COST (INSN, LINK, DEP_INSN, COST)'
|
|||
|
A C statement (sans semicolon) to update the integer variable COST
|
|||
|
based on the relationship between INSN that is dependent on
|
|||
|
DEP_INSN through the dependence LINK. The default is to make no
|
|||
|
adjustment to COST. This can be used for example to specify to
|
|||
|
the scheduler that an output- or anti-dependence does not incur
|
|||
|
the same cost as a data-dependence.
|
|||
|
|
|||
|
`ADJUST_PRIORITY (INSN)'
|
|||
|
A C statement (sans semicolon) to update the integer scheduling
|
|||
|
priority `INSN_PRIORITY(INSN)'. Reduce the priority to execute
|
|||
|
the INSN earlier, increase the priority to execute INSN later.
|
|||
|
Do not define this macro if you do not need to adjust the
|
|||
|
scheduling priorities of insns.
|
|||
|
|
|||
|
|
|||
|
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 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 `PPIC_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.
|
|||
|
|