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関数が期待する型にビットキャストし、そのビットキャストの結果を 3 番目の引数として渡す必要があります。そのために静的ConstantExpr::getBitCastメソッドを使用して、最初の引数として関数を渡しfunc_pthread_create、2 番目の引数として の 3 番目のパラメーターの型を渡すことができます。

于 2013-11-12T17:17:06.897 に答える