如何调用未知类型的 JITed LLVM 函数?

2024-01-23

我正在使用 LLVM 实现 JIT 编译器的前端。我首先遵循 LLVM 教程中的 Kaleidscope 示例。我知道如何使用 LLVM C++ API 生成和 JIT LLVM IR。我还知道如何使用 llvm::ExecutionEngine 的“getPointerToFunction”方法调用 JITed 函数。

getPointerToFunction 返回一个 void*,然后我必须将其转换为正确的函数类型。例如,在我的编译器中,我有如下所示的单元测试:

void* compiled_func = compiler.get_function("f");   
auto f = reinterpret_cast<int32_t(*)(int32_t)>(compiled_func);
int32_t result = f(10);

问题是我必须事先知道函数签名。在上面的示例中,我有一个函数“f”,它接受一个 32 位整数并返回一个 32 位整数。由于我自己创建了“f”,所以我知道函数类型是什么,因此我能够调用 JIT 函数。但是,一般来说,我不知道用户输入的函数签名是什么(或者结构类型是什么)。用户可以使用任意参数和返回类型创建任意函数,因此我不知道从 LLVM 的 getPointerToFunction 中转换 void* 的函数指针类型。我的运行时需要能够调用这些函数(例如,对于读取-评估-打印循环)。如何从 JIT 运行时处理此类任意函数?

Thanks


您无法从中获得太多信息compiled_func- 正如你所写,这只是一个void*。但是当你写“一般来说,我不知道函数签名是什么”时,这是不准确的 - 你刚刚编译了该函数,所以你应该有权访问 LLVMFunction对象,可以查询其类型。确实,它是 LLVM IR 类型而不是 C++ 类型,但您通常可以知道哪个类型转换为哪个类型。

例如,如果我们借用代码教程中有关 JITting 万花筒的部分 http://llvm.org/docs/tutorial/LangImpl4.html#adding-a-jit-compiler:

if (Function *LF = F->Codegen()) {
  LF->dump();  // Dump the function for exposition purposes.

  // JIT the function, returning a function pointer.
  void *FPtr = TheExecutionEngine->getPointerToFunction(LF);

  // Cast it to the right type (takes no arguments, returns a double) so we
  // can call it as a native function.
  double (*FP)() = (double (*)())(intptr_t)FPtr;
  fprintf(stderr, "Evaluated to %f\n", FP());
}

好的,FPtr被“假定”为类型double (),但也有LF类型的Function*在这里,所以你could做过类似的事情:

Type* RetTy = LF->getReturnType();
if (RetTy->isDoubleTy()) {
  double (*FP)() = (double (*)())(intptr_t)FPtr;
  fprintf(stderr, "Evaluated to %f\n", FP());
} else if (RetTy->isIntegerTy(32)) {
  int (*FP)() = (int (*)())(intptr_t)FPtr;
  fprintf(stderr, "Evaluated to %d\n", FP());
} else ...

以大致相同的方式,您可以查询函数的参数类型。

有点麻烦?您可以使用执行引擎通过其方便的方式调用该函数runFunction http://llvm.org/docs/doxygen/html/classllvm_1_1ExecutionEngine.html#a83ac805ce571233b79802b8210332039方法,它接收一个向量GenericValue http://llvm.org/docs/doxygen/html/structllvm_1_1GenericValue.htmls 并返回 aGenericValue。您仍然应该查询Functiontype 来查找每个下的基础类型GenericValue应该。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何调用未知类型的 JITed LLVM 函数? 的相关文章

  • 使用 LLVM 将 x86 代码重新编译为更快的 x86

    是否可以输入 x86 32 位代码来运行 LLVM 编译器 有一个巨大的算法 我没有源代码 我想让它在相同的硬件上运行得更快 我可以通过优化将其从 x86 转换回 x86 吗 这段代码运行时间很长 所以我想对其进行静态重新编译 另外 我可以
  • Windows 服务中 RuntimeHelpers.PrepareMethod 的缺点[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在调查服务器 具有多个服务 启动后不久发生的延迟问题 我添加了一个简单的方法来加载引用的 DLL 并执行RuntimeHelpers Pre
  • WeakHashMap 在完整 GC 期间是否被清除?

    我在使用 Wea kHashMap 时遇到了一些麻烦 考虑这个示例代码 List
  • 从 Haskell 代码生成 LLVM IR

    我的目标是获取不同语言 主要是 C C Obj C 和 Haskell 的源代码 并提供有关它们的各种统计信息 例如变量 函数 内存分配 复杂性等的数量 LLVM 似乎是一个完美的工具 因为我可以为这些语言生成位码 并且通过 LLVM 的可
  • 在源代码上添加一个新属性,该属性会传播到 LLVM 中的 MC 级别?

    我对以下内容的传播方式感兴趣 void foo int attribute aligned 16 p 在这种情况下 指针的 对齐 在 MC 级别可用 但显然没有使用 LLVM IR 元数据方法来实现这一点 对齐信息对于某些目标非常重要 这些
  • 运行JDK代码时Java JIT会作弊吗?

    我正在对一些代码进行基准测试 但我无法让它运行得像java math BigInteger https docs oracle com javase 7 docs api java math BigInteger html 即使使用完全相同
  • 从一个函数在 Pandas Dataframe 中创建多列

    我是一个Python新手 所以我希望我的两个问题是清楚和完整的 我在下面发布了实际代码和 csv 格式的测试数据集 我已经能够构建以下代码 主要是在 StackOverflow 贡献者的帮助下 来使用 Newton Raphson 方法计算
  • 是否可以使 java.lang.invoke.MethodHandle 与直接调用一样快?

    我正在比较性能MethodHandle invoke以及直接静态方法调用 这是静态方法 public class IntSum public static int sum int a int b return a b 这是我的基准 Stat
  • Angular 2 引导选项 - AOT 与 JIT

    刚开始使用 Angular 2 Angular 2 中的各种 Bootstrapping 选项有哪些 为什么当我进行更改并刷新时 index html 只需要很少的时间来检索 HTML 标记 它们之间的区别 有两种选择 动态引导 使用的编译
  • 如何从 LLVM 的中间表示中获取程序每个函数中执行的函数调用列表?

    我正在尝试使用 LLVM 构建一个简单版本的代码分析工具 我有一些 ll 文件 其中包含某些程序的中间 LLVM 表示 如何从 LLVM 的中间表示中获取程序每个函数中执行的函数调用列表 我的输入参数是 LLVM Module 类的一个实例
  • ld:警告:__DATA/__objc_imageinfo__DATA 节的大小意外地大

    有谁知道这个警告是什么意思 接下来是错误 Command Developer Platforms iPhoneSimulator platform Developer usr bin llvm gcc 4 2 failed with exi
  • 玩框架。无需编译

    我被介绍到 Play 框架 我发现它的令人惊奇的事情之一是不需要编译项目 您只需保存编辑的文件并重新加载网页即可 我听说 Java 源代码被编译为字节码 然后使用 JIT 编译器进行编译 那么 Play 框架内部到底有什么魔力呢 在 DEV
  • 在 numba.jit 装饰器中使用并行选项会使函数给出错误的结果

    给定一个矩形的两个对角 x1 y1 and x2 y2 和两个半径r1 and r2 找到位于由半径定义的圆之间的点的比率r1 and r2到矩形中的点数 简单的 NumPy 方法 def func 1 x1 y1 x2 y2 r1 r2
  • JVM 是否会内联对象的实例变量和方法?

    假设我有一个非常紧密的内部循环 每次迭代都会访问和改变一个簿记对象 该对象存储有关算法的一些简单数据 并具有用于操作它的简单逻辑 簿记对象是私有的和最终的 并且它的所有方法都是私有的 最终的和 inline 下面是一个示例 Scala 语法
  • 使用 libclang 从内存中的 C 代码生成程序集

    我需要实现一个使用 LLVM Clang 作为后端将 C 代码编译为 eBPF 字节码的库 代码将从内存中读取 我也需要在内存中获取生成的汇编代码 到目前为止 我已经能够使用以下代码编译为 LLVM IR include
  • C++11 的 LLVM&Clang 支持

    我有一些为 MS VC 10 编写的代码 我使用 C 11 特别是像这样的表达式 std function
  • Fedora 21 带 clang,不带 gcc

    你能 合理地 让 Fedora 21 变得只有 llvm clang libc libc abi 吗 我发现有些东西暗示不可以 但它们都已经有 3 岁了 从那时起 llvm clang 已经取得了长足的进步 通过全新安装 我尝试了 yum
  • 链接 llvm 库

    我正在开发一个基于 llvm 的编译器 当我尝试生成可执行文件时 会发生以下错误 bin llvmcode s 35 对 operator new unsigned long 的未定义引用 请注意 在生成的 IR 中 调用了位于 llvm
  • 通过 cmake 链接 libc++ 时 libc++abi 的链接问题

    我正在尝试构建一个简单的 hello world C 使用 LLVM Clang 3 7 0 的程序 根据工具链的源代码构建libc 使用命令行 clang std c 14 stdlib libc fno exceptions hello
  • 字节码和位码有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 LLVM 和 java 字节码有什么区别 https stackoverflow com questions 454720 what are the differences between llvm

随机推荐