LLVM使用外部函数

4

我有一个在另一个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。我使用g++ -c threads.cppthreads.cpp编译为threads.o。现在我正在尝试将它们链接起来,如下:

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

我出现了一个错误:

undefined reference to join

尽管我明确链接了所需的文件。有什么帮助吗?

1个回答

3
首先,g++无法理解LLVM的位码(即.bc文件)。这只是LLVM IR的二进制表示,因此您无法将IR与目标文件链接。
如果要使用LLVM进行链接,则可以使用llvm-link。这将要求您还将pthreads编译为LLVM(clang也支持-pthread选项)。
这应该能帮助您完成剩下的工作:
{{link1:将pthread函数调用插入IR}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接