LLVM有一些magic的全局变量,这些全局变量包含一些影响代码产生或者IR语义的数据。以llvm.
为开始的全局变量即为LLVM的保留变量。这些变量都被放在llvm.metadata
的section中。
@llvm.used
是一个全局数组,包含一些指针,指向已被命名的全局变量,函数和别名。这些可能有一些bitcast
形式转换或者getelementptr
指令类型。
如果符号出现在@llvm.used,那么编译器、汇编器和链接器就需要将该符号视为它看不到的符号引用(这就是为什么必须命名它们的原因)。
例如,如果一个变量有内部链接,并且除了@llvm.used
之外没有其他引用,不能删除。这通常用于表示来自内联的asms和其他编译器无法“看到”的东西的引用,并且对应于GNU C中的“attribute((used))
”。
在某些目标上,代码生成器必须向汇编程序或目标文件发出指令,以防止汇编程序和连接器删除该符号。
@llvm.compiler.used
和@llvm.used
基本相同,而它只是阻止编译器接触这些符号。
这是一种罕见的结构,只应该在罕见的情况下使用,不应该向源语言公开。
%0 = type { i32, void ()*, i8* }
@llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @ctor, i8* @data }]
@llvm.global_ctors
是包含一些构造函数,优先级和一个相关的全局变量或者函数的数组。被这个数组引用的函数将会在module被加载时按照优先级升序的顺序进行调用。不能定义相同优先级的函数。
如果第三个字段不为空,并且指向一个全局变量或者函数,那么初始化函数会运行当且仅当本module相关的数据没有被丢弃。
%0 = type { i32, void ()*, i8* }
@llvm.global_dtors = appending global [1 x %0] [%0 { i32 65535, void ()* @dtor, i8* @data }]
@llvm.global_dtors
是包含析构函数的数组、优先级和相关全局变量或者函数的数组。被这个数组引用的函数将会在module被卸载时以优先级降序的方式调用。不能定义相同优先级的函数。
如果第三个字段不为空,并指向一个全局变量或者函数,那么析构函数将被调用当且仅当当前module相关的数据没有被丢弃。