2014-07-22 141 views

回答

7

由於您的問題缺少重要信息,我可以猜想您想要實現以下目標。我猜你會使用c/C++接口,並且該函數有一個簽名void fun(void)。我也猜測你將使用LLVM Builder來創建對這個函數的調用(而不是叮噹之類)。

開始通過使用dlopen/loadlibrary動態加載的功能和獲取函數指針fnPtr

爲函數的返回值

Type* voidType[1]; 
voidType[0] = Type::getVoidTy(getGlobalContext()); 
ArrayRef<Type*> voidTypeARef (voidType, 1); 

創建功能的Function*創建Type*。您應該從初始化階段獲得Module* TheModule

FunctionType* signature = FunctionType::get(voidTypeARef, false); 
Function* func = Function::Create(signature, Function::ExternalLinkage, "fun", TheModule); 

使用addGlobalMapping創建映射到函數。初始化階段應該有一個ExecutionEngine* TheExecutionEngine

TheExecutionEngine->addGlobalMapping(func, const_cast<void*>(fnPtr)); 

現在,在您要撥打此時,相應的地方,你現在可以插入使用IRBuilder這樣的函數調用。

Function *FuncToCall= TheModule->getFunction("fun"); 
std::vector<Value*> Args; // This is empty since void parameters of function 
Value *Result = IRBuilder->CreateCall(FuncToCall, Args, "calltmp"); // Result is void 
+0

優秀的答案。謝謝你幫助我。 – user3335