Next: PIC, Previous: Scheduling, Up: Target Macros
目标文件被划分到包含不同类型数据的section中。大多数情况下, 有三个section:text section,存放指令和只读数据;data section, 存放初始化的可写数据;bss section,存放未初始化的数据。 一些系统还具有其它类型的section。
varasm.c提供了一些已知的section,例如text_section
,
data_section
和bss_section
。
通常控制一个foo_section
变量的方式是定义一个相关联的
宏FOO_SECTION_ASM_OP
,正如下面将要描述的。
宏只在varasm.c初始化时被读一次,
所以它们的值必须为运行时常量。不过它们可以依赖于命令行标记。
注意:一些运行时文件,例如crtstuff.c,
也使用FOO_SECTION_ASM_OP
宏,并且将它们作为字符串文字。
一些汇编器要求每次选择section时,都要写入一个不同的字符串。
如果你的汇编器属于这类,
你应该定义TARGET_ASM_INIT_SECTIONS
钩子并使用
get_unnamed_section
来建立section。
你必须总是创建一个text_section
,
或者通过定义TEXT_SECTION_ASM_OP
,
或者通过在TARGET_ASM_INIT_SECTIONS
中初始化text_section
。
同样对于data_section
和DATA_SECTION_ASM_OP
。
如果你没有创建一个独立的readonly_data_section
,
则缺省使用text_section
。
所有其他varasm.c section都是可选的,如果target不提供则为null。
如果定义,则为一个C字符串常量,为包含最频繁被执行的程序的函数的section名字。 如果没有定义,GCC将会提供一个缺省定义,如果target支持命名section。
如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为未初始化的,global数据的汇编操作。如果没有定义, 并且
ASM_OUTPUT_BSS
和ASM_OUTPUT_ALIGNED_BSS
也都没有定义, 则为初始化的global数据将被输出在data section,如果使用了-fno-common, 否则将使用ASM_OUTPUT_COMMON
。
If defined, a C expression whose value is a string containing the assembler operation to identify the following data as thread-local common data. The default is
".tls_common"
.
If defined, a C expression whose value is a character constant containing the flag used to mark a section as a TLS section. The default is
'T'
.
如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为初始化代码的汇编操作。如果没有定义, GCC将假设这样的section不存在。该section没有相应的
init_section
变量; 其完全在运行时代码中使用。
如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为结束代码的汇编操作。如果没有定义, GCC将假设这样的section不存在。该section没有相应的
fini_section
变量; 其完全在运行时代码中使用。
如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为
.init_array
(或相当的) section的一部分的 汇编操作。如果没有定义,GCC将假设这样的section不存在。 不要同时定义该宏和INIT_SECTION_ASM_OP
。
如果定义,则为一个C表达式,值为一个字符串,包括空格, 其包含了标识后续的数据为
.fini_array
(或相当的) section的一部分的 汇编操作。如果没有定义,GCC将假设这样的section不存在。 不要同时定义该宏和FINI_SECTION_ASM_OP
。
如果定义,为一个ASM语句,其通过section_op来切换到不同的section, 调用function,然后切换回到text section。这在crtstuff.c中使用, 如果
INIT_SECTION_ASM_OP
或FINI_SECTION_ASM_OP
从init和 fini section中调用初始化和结束函数。缺省下,该宏使用简单的函数调用。 一些port需要手工的代码来避免在函数前奏中对寄存器初始化的依赖, 或者确保常量池在text section中不要结束的太远。
如果定义,则为一个字符串, 其命名了在crtstuff和libgcc中定义的小变量应该存放的section。 这在target具有选项来优化访问小数据的时候很有用。例如, 对于具有
.sdata
section(像MIPS)的target, 你可以使用-G 0
来编译crtstuff,使得其不需要小数据的支持, 但是使用该宏将小数据放到.sdata
中, 这样你的应用程序不管是否使用小数据,都可以访问到这些变量。
如果定义,则为一个ASM语句,其将code section对齐到某个任意的边界。 这用于使得所有
.init
和.fini
section的fragment都具有同样的对齐, 这样就可以阻止连接器增加任何padding。
定义该宏为一个表达式,具有非零值,如果跳转表(对于
tablejump
insn) 应该被输出到text secton中,以及汇编指令。否则,使用只读data section。如果没有独立的只读data section,则该宏不相关。
定义该钩子,如果你需要在建立varasm.c section时做一些特殊的处理, 或者你的target具有一些特殊的section需要创建。
GCC在处理完命令行之后,在写任何汇编代码之前, 并在调用任何下面描述的返回section的钩子之前调用该钩子。
返回一个掩码,用来描述当选择section时,应该如何对待重定位。 如果全局重定位应该放在读写section中,则应该设置位1; 如果局部重定位应该被放在读写section中,则应该设置位0。
该函数的缺省版本返回3,当-fpic有效时,否则返回0。 当target不支持(某种)在只读section中,甚至在可执行程序中的动态重定位时, 通常会重定义该钩子。
返回exp应该被放入的section。 你可以假设exp为
VAR_DECL
节点或者一个常量。 reloc指示exp的初始化值是否需要连接时重定位。 当变量只包含局部重定位时位0被设置,对于全局重定位位1被设置。 align为常量对齐位数。该函数的缺省版本只关心将只读变量放到
readonly_data_section
中。参见USE_SELECT_SECTION_FOR_FUNCTIONS.
如果你希望对于
FUNCTION_DECL
, 将会调用TARGET_ASM_SELECT_SECTION,则定义该宏。同样对于变量和常量。对于
FUNCTION_DECL
,reloc将为0,如果函数被确定有可能被调用, 非零如果其不能被调用。
构建一个唯一的section名,使用
STRING_CST
节点表示, 并赋值为‘DECL_SECTION_NAME (decl)’。 跟TARGET_ASM_SELECT_SECTION
一样, reloc指示exp的初始化值是否需要连接时重定位。该函数的缺省版本向ELF section名中追加一个符号名。例如, 函数
foo
将被放在.text.foo
中。 这对于实际的target目标格式通常是可以的。
返回与‘DECL_SECTION_NAME (decl)’关联的只读data section。 该函数的缺省版本选择
.gnu.linkonce.r.name
, 如果函数的section为.gnu.linkonce.t.name
,.rodata.name
如果函数在.text.name
中, 否则为通常的只读data section。
返回具有机器模式mode的常量x应该放入的section。 你可以假设x为RTL形式的某种常量。参数mode除了
const_int
之外, 是冗余的。align为常量对齐位数。该函数的缺省版本考虑将符号常量
flag_pic
模式的,放在data_section
中, 其它放在readonly_data_section
中。
定义该钩子,如果你需要处理由target无关的代码生成的汇编名。 提供给该钩子的id将为被计算的名字(例如C中的
DECL_NAME
宏, 或者C++中的mangled name)。该钩子的返回值为一个IDENTIFIER_NODE
。 该钩子的缺省实现只是返回提供的id。
定义该钩子,如果对符号或者常量的引用必须根据符号所命名的变量或者函数来不同处理 (例如其在哪个section中)。
钩子在为decl创建rtl之后立即被执行, decl可能为一个变量或者函数声明,或者常量池的入口。不要在该钩子中 使用
DECL_RTL (
decl)
;那个域可能还没有被初始化。对于常量,可以假设rtl为一个
mem
,其地址为一个symbol_ref
。 大多数decl将具有这种形式,但不被保证。全局寄存器变量,例如, 它们的rtl将具有一个reg
。(对于这样不寻常的rtl通常是将其放在一边)。参数new_decl_p将为真, 如果这是第一次对于该decl调用
TARGET_ENCODE_SECTION_INFO
。 对于后续的调用其将为假,这放生在复制的声明中。对于复制声明,是否需要做什么, 取决于钩子是否检查DECL_ATTRIBUTES
。当钩子对于常量被调用, 则new_decl_p总为真。该钩子通常做的事情是记录
symbol_ref
中的标记, 使用SYMBOL_REF_FLAG
或SYMBOL_REF_FLAGS
。该钩子的缺省定义,varasm.c中的
default_encode_section_info
, 设置了SYMBOL_REF_FLAGS
中通常有用的位。 在覆盖它之前检查缺省代码是否做了你所需要的。
解析name并返回真实的名字部分, 没有
TARGET_ENCODE_SECTION_INFO
可能加进去的字符。
返回真,如果exp应该被放到“小数据”section中。该钩子的缺省版本总是返回假。
如果target将只读“小数据”放到单独的section中,则包含值为真。缺省值为假。
It returns true if target wants profile code emitted before prologue.
The default version of this hook use the target macro
PROFILE_BEFORE_PROLOGUE
.