LLVM OpenMP:变量声明中内部、thread_local、unnamed_addr、全局的含义是什么?



在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的任何部分,语言参考指南就是你的起点

最新更新