2
如何從LLVM的外部DLL中調用函數?如何從LLVM代碼調用DLL文件中定義的函數?如何使用LLVM IRBuilder從外部DLL調用函數?
如何從LLVM的外部DLL中調用函數?如何從LLVM代碼調用DLL文件中定義的函數?如何使用LLVM IRBuilder從外部DLL調用函數?
由於您的問題缺少重要信息,我可以猜想您想要實現以下目標。我猜你會使用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
優秀的答案。謝謝你幫助我。 – user3335