LLVM使用外部功能

时间:2014-11-16 20:20:04

标签: linker clang llvm llvm-clang llvm-ir

我有一个在另一个cpp文件中定义的函数,我想在LLVM IR中使用它。你能告诉我如何使用它们并链接它们。

我做了以下

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.cpp 使用threads.og++ -c threads.cpp。现在我试图将它们链接为

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

我收到错误:

  

加入

的未定义参考

即使我清楚地链接了所需的文件。有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

首先,g ++不了解LLVM的bitcode(.bc文件)。所有这些都是LLVM IR的二进制表示,因此您无法将IR与目标文件链接。

如果要与LLVM建立链接,可以使用llvm-link。这将要求您还将pthreads编译为LLVM(clang也支持-pthread选项)。

这应该会让你完全接受:

LLVM insert pthread function calls into IR