在我的應用程序的函數聲明我有2個LLVM模塊 - 運行時一個(其中包含void foo(int * a)
函數定義)和執行的一個(這我使用LLVM C++ API創建)。獲得從另一LLVM ::模塊
在我的可執行模塊中,我創建了int main(int argc, char ** argv)
,並且想將llvm::CallInst
放入它的正文中,這會從運行時模塊調用foo()
函數。
這裏是我的代碼:
Function * fooF = Function::Create(runtimeModule->getFunction("foo")->getFunctionType(),
GlobalValue::WeakAnyLinkage, "foo", execModule);
在那之後,我連接兩個模塊組合在一起:
Linker linker("blabla", execModule, false);
linker.LinkInFile("/path/to/runtime.bc", false);
execModule = linker.releaseModule();
這將編譯好的,但是當我運行驗證通過鏈接模塊上,我得到:
Global is external, but doesn't have external or dllimport or weak linkage!
void (%i32*)* @foo
invalid linkage type for function declaration
void (%i32*)* @foo
值得一提的是,在運行時模塊的所有全局使用的內化內化通過。鏈接之後,但在運行Verifier之前,我運行了Dead Global Elimination pass以及其他一些優化。當我上生成的模塊做dump()
,我看,那@foo
這是從運行時模塊來過被刪除,儘管它使用main()
。看來,LLVM認爲@foo
運行時定義和@foo
聲明在可執行文件中是無關的。
我試着聯動類型玩 - 沒有運氣。
那麼,什麼是創建從另一個模塊功能的調用的正確方法?
快速q:這兩個模塊共享相同的上下文嗎? –
什麼是上下文? LLVMContext?不知道。 – arrowd
這些類型僅在相同的上下文中「兼容」。確保您的模塊共享它們。查看http://llvm.org/docs/doxygen/html/classllvm_1_1LLVMContext.html瞭解更多信息。 –