如何在LLVM中获取函数指针

时间:2013-11-12 00:29:12

标签: c compiler-construction pthreads llvm llvm-ir

我需要插入IR指令来调用LoopPass中的pthread_create,所以我需要将实际函数作为pthread_create应该在新线程上调用的参数传递。

目前我已将函数定义为在新线程上运行

Function *worker_func = Function::Create(funcType,
                                      GlobalValue::ExternalLinkage,
                                      "worker_func",
                                      CurrentModule);

我通过以下方式得到了指向pthread_create的指针:

Function *func_pthread_create = dyn_cast<Function>(
    TheModule->getOrInsertFunction("pthread_create", pthreadCreateTy));

我需要将Type*数组作为参数传递给pthread_create,如下所示。

Value* pthread_create_call = builder.CreateCall(
    func_pthread_create, args, "pthread_create");

以args为:

Value* args[4];
args[0] = pthread_t_ld
args[1] = llvm::Constant::getNullValue(llvm::Type::getInt8Ty(getGlobalContext())->getPointerTo());

args[2] = ??? // supposed to be the pointer to worker_func`

args[3] = llvm::Constant::getNullValue(llvm::Type::getInt8Ty(getGlobalContext())->getPointerTo());

那么如何才能将指向此worker_func函数的指针传递到pthread_create

1 个答案:

答案 0 :(得分:5)

你需要将func_pthread_create bitcast到函数所期望的类型,并将该bitcast的结果作为第3个参数传递。您可以使用静态ConstantExpr::getBitCast方法,将函数作为第一个参数传递,并将func_pthread_create的第三个参数的类型作为第二个参数传递。