由于您的问题缺少重要信息,我猜您想实现以下目标。我猜你会使用 c/c++ 接口并且该函数有一个签名void fun(void)
。我还猜测您将使用 LLVM Builder 创建对此函数的调用(而不是 clang 等)。
首先使用dlopen
/ loadlibrary
动态加载函数并获取函数指针fnPtr
.
创建一个Type*
对于函数的返回值
Type* voidType[1];
voidType[0] = Type::getVoidTy(getGlobalContext());
ArrayRef<Type*> voidTypeARef (voidType, 1);
创建一个Function*
为函数。你应该有一个Module* TheModule
已经从初始化阶段开始。
FunctionType* signature = FunctionType::get(voidTypeARef, false);
Function* func = Function::Create(signature, Function::ExternalLinkage, "fun", TheModule);
Use 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