Node:Sections, Next:, Previous:Scheduling, 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, including spacing, containing the assembler operation that should precede instructions and read-only data. Normally "\t.text" is right.
TEXT_SECTION
A C statement that switches to the default section containing instructions. Normally this is not needed, as simply defining TEXT_SECTION_ASM_OP is enough. The MIPS port uses this to sort all functions after all data declarations.
HOT_TEXT_SECTION_NAME
If defined, a C string constant for the name of the section containing most frequently executed functions of the program. If not defined, GCC will provide a default definition if the target supports named sections.
UNLIKELY_EXECUTED_TEXT_SECTION_NAME
If defined, a C string constant for the name of the section containing unlikely executed functions in the program.
DATA_SECTION_ASM_OP
A C expression whose value is a string, including spacing, containing the assembler operation to identify the following data as writable initialized data. Normally "\t.data" is right.
READONLY_DATA_SECTION_ASM_OP
A C expression whose value is a string, including spacing, containing the assembler operation to identify the following data as read-only initialized data.
READONLY_DATA_SECTION
A macro naming a function to call to switch to the proper section for read-only data. The default is to use READONLY_DATA_SECTION_ASM_OP if defined, else fall back to text_section.

The most common definition will be data_section, if the target does not have a special read-only data section, and does not put data in the text section.

SHARED_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing, containing the assembler operation to identify the following data as 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, including spacing, containing the assembler operation to identify the following data as uninitialized global data. If not defined, and neither ASM_OUTPUT_BSS nor ASM_OUTPUT_ALIGNED_BSS are defined, uninitialized global data will be output in the data section if -fno-common is passed, otherwise ASM_OUTPUT_COMMON will be used.
SHARED_BSS_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing, containing the assembler operation to identify the following data as uninitialized global 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, including spacing, containing the assembler operation to identify the following data as initialization code. If not defined, GCC will assume such a section does not exist.
FINI_SECTION_ASM_OP
If defined, a C expression whose value is a string, including spacing, containing the assembler operation to identify the following data as finalization code. If not defined, GCC will assume such a section does not exist.
CRT_CALL_STATIC_FUNCTION (section_op, function)
If defined, an ASM statement that switches to a different section via section_op, calls function, and switches back to the text section. This is used in crtstuff.c if INIT_SECTION_ASM_OP or FINI_SECTION_ASM_OP to calls to initialization and finalization functions from the init and fini sections. By default, this macro uses a simple function call. Some ports need hand-crafted assembly code to avoid dependencies on registers initialized in the function prologue or to ensure that constant pools don't end up too far way in the text section.
FORCE_CODE_SECTION_ALIGN
If defined, an ASM statement that aligns a code section to some arbitrary boundary. This is used to force all fragments of the .init and .fini sections to have to same alignment and thus prevent the linker from having to add any padding.
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.
JUMP_TABLES_IN_TEXT_SECTION
Define this macro to be an expression with a nonzero value if jump tables (for tablejump insns) should be output in the text section, along with the assembler instructions. Otherwise, the readonly data section is used.

This macro is irrelevant if there is no separate readonly data section.

void TARGET_ASM_SELECT_SECTION (tree exp, int reloc, unsigned HOST_WIDE_INT align) Target Hook
Switches 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. Bit 0 is set when variable contains local relocations only, while bit 1 is set for global relocations. Select the section by calling data_section or one of the alternatives for other sections. align is the constant alignment in bits.

The default version of this function takes care of putting read-only variables in readonly_data_section.

void TARGET_ASM_UNIQUE_SECTION (tree decl, int reloc) Target Hook
Build up a unique section name, expressed as a STRING_CST node, and assign it to DECL_SECTION_NAME (decl). As with TARGET_ASM_SELECT_SECTION, reloc indicates whether the initial value of exp requires link-time relocations.

The default version of this function appends the symbol name to the ELF section name that would normally be used for the symbol. For example, the function foo would be placed in .text.foo. Whatever the actual target object format, this is often good enough.

void TARGET_ASM_SELECT_RTX_SECTION (enum machine_mode mode, rtx x, unsigned HOST_WIDE_INT align) Target Hook
Switches to the appropriate section for output of constant pool entry x in mode. You can assume that x is some kind of constant in RTL. The argument mode is redundant except in the case of a const_int rtx. Select the section by calling readonly_data_section or one of the alternatives for other sections. align is the constant alignment in bits.

The default version of this function takes care of putting symbolic constants in flag_pic mode in data_section and everything else in readonly_data_section.

void TARGET_ENCODE_SECTION_INFO (tree decl, int new_decl_p) Target Hook
Define this hook if references to a symbol or a constant must be treated differently depending on something about the variable or function named by the symbol (such as what section it is in).

The hook is executed under two circumstances. One is immediately after the rtl for decl that represents a variable or a function 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 other is immediately after the rtl for decl that represents a constant has been created and stored in TREE_CST_RTL (decl). The macro is called once for each distinct constant in a source file.

The new_decl_p argument will be true if this is the first time that ENCODE_SECTION_INFO has been invoked on this decl. It will be false for subsequent invocations, which will happen for duplicate declarations. Whether or not anything must be done for the duplicate declaration depends on whether the hook examines DECL_ATTRIBUTES.

The usual thing for this hook 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).

const char *TARGET_STRIP_NAME_ENCODING (const char *name) Target Hook
Decode name and return the real name part, sans the characters that TARGET_ENCODE_SECTION_INFO may have added.

bool TARGET_IN_SMALL_DATA_P (tree exp) Target Hook
Returns true if exp should be placed into a "small data" section. The default version of this hook always returns false.

Target Hook bool TARGET_HAVE_SRODATA_SECTION Variable
Contains the value true if the target places read-only "small data" into a separate section. The default value is false.

bool TARGET_BINDS_LOCAL_P (tree exp) Target Hook
Returns true if exp names an object for which name resolution rules must resolve to the current "module" (dynamic shared library or executable image).

The default version of this hook implements the name resolution rules for ELF, which has a looser model of global name binding than other currently supported object file formats.

Target Hook bool TARGET_HAVE_TLS Variable
Contains the value true if the target supports thread-local storage. The default value is false.