直截了当地说,我正在尝试将两个(或更多)llvm模块链接在一起,但我面对着LLVM的某些奇怪错误。我不想发布太多代码,所以我将在此使用一堆伪代码。我有3个模块,假设为A、B和C。A是主模块;我用它初始化了
请注意它们具有相同的成员类型。此外,一个名为
请注意,
llvm::Linker
。B和C是辅助模块;我调用linker.linkInModule(B and C)
。除其他事项外,这3个模块都定义了以下两种类型:%String = type { i8*, i64 }
%Character = type { i8*, i64 }
请注意它们具有相同的成员类型。此外,一个名为
foo
的函数被定义如下(在模块B中):define i1 @_ZN9Character7hasDataEv(%Character*) { }
这个函数在模块A和C中声明。现在,一切都看起来很好 - 这个函数从模块A和C中都被调用,并且IR看起来正常,如下所示:
%21 = call i1 @_ZN9Character7hasDataEv(%Character* %4)
以下是需要翻译的内容:
问题出现在这里:当所有3个模块链接在一起时,这些类型发生了变化:
- 它们失去了名称,变成了
%2
(%String
)和%3
(%Character
)。 - 它们似乎被合并在了一起。
奇怪的是,尽管这种转换在A和C两个模块中都发生了,但错误只发生在C中 - 请注意,A是所谓的“主”模块。
链接文件的函数定义现在如下:
define i1 @_ZN9Character7hasDataEv(%2*)
请注意,
%Character
或%3
已被转换为%2
。此外,在调用站点中,可能是为了取消合并类型,我得到了以下结果:%10 = call i1 bitcast (i1 (%2*)* @_ZN9Character7hasDataEv to i1 (%3*)*)(%2* %2)
有趣的是,虽然该函数是从i1 (%2*)
转换为%3 (%2*)
,但传递的参数(arg. 1)仍然是类型为%2
。发生了什么?
请注意,在模块A中,无论发生什么情况,都会正确执行,没有错误。这种情况发生在许多函数中,但只发生在模块C中。
我尝试通过复制这些.ll
文件并调用llvm-link
和llvm-dis
来重现它,但是1.类型没有合并,2.没有这样的错误。
谢谢...?