llvm - llvm 别名可以用于模块间还是仅用于模块内?
问题描述
LLVM为全局值定义别名:
@<Name> = [Linkage] [PreemptionSpecifier] [Visibility] [DLLStorageClass] [ThreadLocal] [(unnamed_addr|local_unnamed_addr)] alias <AliaseeTy>, <AliaseeTy>* @<Aliasee>
什么是有效值<Aliasee>
?
- 仅出现在当前模块中其他地方的名称或
- 还出现在稍后链接的其他模块中的名称?
我认为模块间别名是允许的,但我无法让它工作。我不断收到这种类型的错误:
<string>:5:39: error: use of undefined value '@my_name'
@"MyAlias" = external alias i32, i32* @my_name
^
注意:@my_name
在当前模块中没有定义。它在另一个模块中定义。
解决方案
LLVM IR 中表示的任何内容都需要声明。你my_name
也应该被声明。但是请注意,别名是为现有定义创建的。请参阅手册中的“限制”部分:
由于别名只是第二个名称,因此存在一些限制,其中一些只能在生成目标文件时检查:
- 定义别名的表达式必须在汇编时可计算。由于它只是一个名称,因此不能使用重定位。
- 表达式中的别名不能是弱的,因为中间别名被覆盖的可能性不能在目标文件中表示。
- 表达式中的全局值不能是声明,因为这需要重定位,这是不可能的。
推荐阅读
- ios - Is creating a lot of UIViews in UIViewController a good practice for storyboards? Does it have any impact on application like memory?
- intellij-idea - IntelliJ 多行三元缩进
- google-apps-script - TypeError:找不到对象的默认值
- java - 使用java同时进行多个数据库连接和查询时是否应该使用同步?
- swift - 导航项的titleView向左移动?
- python - 现在反馈连接是否有效
- javascript - 对象数组转换为按索引排序的对象(Javascript)
- karate - 如何使用功能文件在空手道中实现 for 循环
- java - ANDROID中Intent的GetStringExtras默认值是多少?
- vue.js - 在 service-worker 中使用 vue store