首页 > 解决方案 > llvm 别名可以用于模块间还是仅用于模块内?

问题描述

LLVM为全局值定义别名

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

什么是有效值<Aliasee>

  1. 仅出现在当前模块中其他地方的名称或
  2. 还出现在稍后链接的其他模块中的名称?

我认为模块间别名是允许的,但我无法让它工作。我不断收到这种类型的错误:

<string>:5:39: error: use of undefined value '@my_name'
@"MyAlias" = external alias i32, i32* @my_name
                                      ^

注意:@my_name在当前模块中没有定义。它在另一个模块中定义。

标签: llvmllvm-ir

解决方案


LLVM IR 中表示的任何内容都需要声明。你my_name也应该被声明。但是请注意,别名是为现有定义创建的。请参阅手册中的“限制”部分:

由于别名只是第二个名称,因此存在一些限制,其中一些只能在生成目标文件时检查:

  • 定义别名的表达式必须在汇编时可计算。由于它只是一个名称,因此不能使用重定位。
  • 表达式中的别名不能是弱的,因为中间别名被覆盖的可能性不能在目标文件中表示。
  • 表达式中的全局值不能是声明,因为这需要重定位,这是不可能的。

推荐阅读