在LLVM程序中,与函数或变量不同,别名不会创建任何新数据。它们只是现有位置的新符号和元数据。
别名有一个名称和别名,可以是全局值或常量表达式。
别名可能具有可选的链接类型,可选的运行时抢占说明符,可选的可见性样式,可选的DLL存储类和可选的tls模型。
Syntax:
@<Name> = [Linkage] [PreemptionSpecifier] [Visibility] [DLLStorageClass] [ThreadLocal] [(unnamed_addr|local_unnamed_addr)] alias <AliaseeTy>, <AliaseeTy>* @<Aliasee> |
链接必须是一个private
,internal
,linkonce
,weak
,linkonce_odr
,weak_odr
,external
。请注意,某些系统链接器可能无法正确处理丢弃具有别名的弱符号(就是内存溢出的问题)。
不是unnamed_addr
的别名保证具有与别名表达式相同的地址。unnamed_addr
只保证指向相同的内容。
如果local_unnamed_addr
给出该属性,则该地址在模块内不显著。
由于别名只是第二个名称,因此有些限制适用,其中一些只能在生成对象文件时进行检查:
- 定义别名的表达式必须在汇编时可计算。因为它只是一个名字,不能使用重定位。
- 表达式中的别名不会很弱,因为中间别名被覆盖的可能性无法在对象文件中表示。
- 表达式中的全局值不能是一个声明,因为这需要重定位,这是不可能的。