2014-11-16 102 views
3

我有一個函數定義在另一個cpp文件中,我想在LLVM IR中使用。你能告訴我如何使用它們並鏈接它們嗎?LLVM使用外部函數

我做了以下

FunctionType *joinTy = FunctionType::get(voidTy, false); 
Function *join = Function::Create(joinTy, Function::ExternalLinkage,"join", &M); 
join->setCallingConv(CallingConv::C); 

並把它稱爲如下:

Function *join = (&M)->getFunction("join"); 
CallInst * calljoin = CallInst::Create(join,"",branchInst); 

我在外部文件threads.cpp join函數像

void join() { 
     printf("join\n"); 
     int i; 
     for (i = 0; i < NUM_THREADS; i++) { 
       if (threads[i]) { 
         pthread_join(threads[i], NULL); 
       } 
     } 
} 

我有一個.bc(LLVM IR)文件,我使用llc編譯爲.s。我編輯threads.cppthreads.o使用g++ -c threads.cpp。現在,我想他們作爲

g++ -o exe test.bc threads.o -pthreads 

鏈接我得到錯誤:

undefined reference to join

即使我清楚地連接所需的文件。任何幫助?

回答

2

首先,g ++不理解LLVM的位碼(.bc文件)。所有這一切都是LLVM IR的二進制表示,因此您無法將IR與對象文件鏈接起來。

如果你想鏈接LLVM,你可以使用llvm-link。這將需要你也編譯你的pthread到LLVM(clang也支持-pthread選項)。

這應該把你的剩下的路:

LLVM insert pthread function calls into IR