如何使用LLVM IRBuilder从外部DLL调用函数?

use*_*335 2 llvm

如何从LLVM中调用外部DLL的函数?如何从LLVM代码调用DLL文件中定义的函数?

ant*_*ern 7

由于您的问题缺少重要信息,我猜您想要实现以下目标.我猜你将使用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);
Run Code Online (Sandbox Code Playgroud)

Function*为该功能创建一个.您应该Module* TheModule已经从初始化阶段开始.

FunctionType* signature = FunctionType::get(voidTypeARef, false);
Function* func = Function::Create(signature, Function::ExternalLinkage, "fun", TheModule);
Run Code Online (Sandbox Code Playgroud)

使用addGlobalMapping创建映射的功能.你应该有一个ExecutionEngine* TheExecutionEngine初始化阶段.

TheExecutionEngine->addGlobalMapping(func, const_cast<void*>(fnPtr));
Run Code Online (Sandbox Code Playgroud)

现在,在您想要调用的适当位置,您现在可以使用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
Run Code Online (Sandbox Code Playgroud)