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

标签 llvm

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

最佳答案

由于您的问题缺少重要信息,我猜您想实现以下目标。我猜您将使用 c/c++ 接口(interface),并且该函数具有签名 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);

使用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

关于llvm - 如何使用 LLVM IRBuilder 从外部 DLL 调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24899568/

相关文章:

xcode - 如何禁用 "local declaration of ' foo'隐藏实例变量”警告?

c++ - Emscripten 1.34.1 问题

c++ - LLVM 运行 PassManager(非遗留)

c++ - 从 llvm IR 中的寄存器中获取存储的值

objective-c - LLVM 4.0 可以在 Xcode 4.3 中使用吗?

svn - 如何下载特定版本的 llvm?

LLVM 万花筒教程在本地 extern 上失败

c - LLVM 构建,将字符串传递给 LLVMSetValueName C API 时出现问题

c++ - llvm 基本 block 前辈 llvm pred_iterator 超出范围

clang - "Attributes.inc"找不到文件