当前位置: 首页 > 工具软件 > Intrinsic > 使用案例 >

Intrinsic Global Variables

东郭良弼
2023-12-01

Intrinsic Global Variables

LLVM有一些magic的全局变量,这些全局变量包含一些影响代码产生或者IR语义的数据。以llvm.为开始的全局变量即为LLVM的保留变量。这些变量都被放在llvm.metadata的section中。

llvm.used

@llvm.used是一个全局数组,包含一些指针,指向已被命名的全局变量,函数和别名。这些可能有一些bitcast形式转换或者getelementptr指令类型。

如果符号出现在@llvm.used,那么编译器、汇编器和链接器就需要将该符号视为它看不到的符号引用(这就是为什么必须命名它们的原因)。

例如,如果一个变量有内部链接,并且除了@llvm.used之外没有其他引用,不能删除。这通常用于表示来自内联的asms和其他编译器无法“看到”的东西的引用,并且对应于GNU C中的“attribute((used))”。

在某些目标上,代码生成器必须向汇编程序或目标文件发出指令,以防止汇编程序和连接器删除该符号。

llvm.compiler.used

@llvm.compiler.used@llvm.used基本相同,而它只是阻止编译器接触这些符号。

这是一种罕见的结构,只应该在罕见的情况下使用,不应该向源语言公开。

llvm.global_ctors

 %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相关的数据没有被丢弃。

llvm.global_dtors

 %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相关的数据没有被丢弃。

 类似资料:

相关阅读

相关文章

相关问答