6

我需要在我的 中插入IR调用 pthread_create 的指令LoopPass,因此我需要将实际函数作为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");

参数为:

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呢?

4

1 回答 1

5

您需要对func_pthread_create函数期望的类型进行位转换,并将该位转换的结果作为第三个参数传递。您可以为此使用静态ConstantExpr::getBitCast方法,将函数作为第一个参数传递,将第三个参数的类型func_pthread_create作为第二个参数传递。

于 2013-11-12T17:17:06.897 回答