2012-01-26 28 views
3

在我的應用程序的函數聲明我有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聲明在可執行文件中是無關的。

我試着聯動類型玩 - 沒有運氣。

那麼,什麼是創建從另一個模塊功能的調用的正確方法?

+0

快速q:這兩個模塊共享相同的上下文嗎? –

+0

什麼是上下文? LLVMContext?不知道。 – arrowd

+0

這些類型僅在相同的上下文中「兼容」。確保您的模塊共享它們。查看http://llvm.org/docs/doxygen/html/classllvm_1_1LLVMContext.html瞭解更多信息。 –

回答

0

好吧,我已經修復它,但我仍然不明白是什麼問題。在構建運行時位碼模塊期間,我一直在對其應用內部轉換。所以我試圖在連接後在運行時做到這一點,它幫助了我。

啊,我一直在使用GlobalValue::WeakAnyLinkage