llvm openmp:变量声明中internal,thread_local,unnamed_addr,global的含义是什么?

时间:2016-03-18 14:45:30

标签: llvm openmp

在openmp代码的llvm IR中,我们看到与变量声明相关联的internal,thread_local,unnamed_addr,global等。这是一个示例:

@count = internal thread_local unnamed_addr global [64 x i32] zeroinitializer, align 16

它们的含义和它们之间的区别是什么?

感谢。

1 个答案:

答案 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 的地方可以开始。