LLVM IR 别名

在LLVM程序中,与函数或变量不同,别名不会创建任何新数据。它们只是现有位置的新符号和元数据。

别名有一个名称和别名,可以是全局值或常量表达式。

别名可能具有可选的链接类型,可选的运行时抢占说明符,可选的可见性样式,可选的DLL存储类和可选的tls模型。

Syntax:

@<Name> = [Linkage] [PreemptionSpecifier] [Visibility] [DLLStorageClass] [ThreadLocal] [(unnamed_addr|local_unnamed_addr)] alias <AliaseeTy>, <AliaseeTy>* @<Aliasee>

链接必须是一个privateinternallinkonceweaklinkonce_odrweak_odrexternal。请注意,某些系统链接器可能无法正确处理丢弃具有别名的弱符号(就是内存溢出的问题)。

不是unnamed_addr的别名保证具有与别名表达式相同的地址。unnamed_addr只保证指向相同的内容。

如果local_unnamed_addr给出该属性,则该地址在模块内不显著。

由于别名只是第二个名称,因此有些限制适用,其中一些只能在生成对象文件时进行检查:

  • 定义别名的表达式必须在汇编时可计算。因为它只是一个名字,不能使用重定位。
  • 表达式中的别名不会很弱,因为中间别名被覆盖的可能性无法在对象文件中表示。
  • 表达式中的全局值不能是一个声明,因为这需要重定位,这是不可能的。