在openmp代码的llvm IR中,我们看到与变量声明相关的内部,thread_local,unnamed_addr,全局等。下面是一个示例:
@count = internal thread_local unnamed_addr global [64 x i32] zeroinitializer, align 16
它们的含义是什么,它们之间的区别是什么?
谢谢。
根据 LLVM 语言参考,这是全局变量的格式:
[@<GlobalVarName> =] [Linkage] [Visibility] [DLLStorageClass] [ThreadLocal]
[unnamed_addr] [AddrSpace] [ExternallyInitialized]
<global | constant> <Type> [<InitializerConstant>]
[, section "name"] [, comdat [($name)]]
[, align <Alignment>]
该指南还解释了每种含义。具体在这种情况下,
对@count = internal thread_local unnamed_addr global [64 x i32] zeroinitializer, align 16
是:
-
count
- 全局名称。 -
internal
- 只能在当前模块中访问。 -
thread_local
- 每个线程都会获得此变量的自己的副本。 -
unnamed_addr
- 永远不会访问全局地址(这对于某些优化很有用)。 -
global
- 这是一个全局变量(这不是修饰符,这就是这个语句)。 -
zeroinitializer
- 全局内存初始化为零。 -
align 16
- 全局地址为 16 对齐(可被 16 整除)。
一般来说,如果你想理解LLVM IR的任何部分,语言参考指南就是你的起点。