在openmp代码的llvm IR中,我们看到与变量声明相关联的internal,thread_local,unnamed_addr,global等。这是一个示例:
@count = internal thread_local unnamed_addr global [64 x i32] zeroinitializer, align 16
它们的含义和它们之间的区别是什么?
感谢。
答案 0 :(得分:1)
从LLVM语言参考,这是the format of a global variable:
[@<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,the language reference guide 的地方可以开始。