【问题标题】:Just-in-time compilation using libclang and LLVM C使用 libclang 和 LLVM C 进行即时编译
【发布时间】:2015-11-22 03:50:04
【问题描述】:

我有一个能够生成我想在即时编译上下文中使用的 C 代码的软件。据我了解,LLVM/Clang 是要走的路,为了项目的可维护性,我想使用 llvm 和 Clang (libclang) 的 C API。

我开始使用 clang_createIndex 创建一个 libclang 上下文,并使用 createTranslationUnitFromSourceFile 创建一个翻译单元(如果能够避免通过文件系统并将源代码作为字符串传递,那就太好了)。但我几乎被困在那里。如何从 libclang 翻译单元转到 JIT 似乎需要的 LLVM“执行引擎”?或者这甚至不能使用 C API 实现?

【问题讨论】:

    标签: llvm jit llvm-clang llvm-c++-api libclang


    【解决方案1】:

    了解如何使用代码体的最佳方法是研究您提供的示例。

    现有教程介绍了如何利用 clang/llvm 工具编译 C++ 代码并发出 LLVM-IR,将 LLVM-IR 编译为 LLVM-Bitcode,以及执行该 LLVM-bitcode。学习在我们的应用程序中加入此功能所需要做的就是调查这些工具的执行路径,找到完成我们想要的方法的序列。

    这里是使用示例工具将cpp文件编译为llvm-bitcode并执行它的示例。

    clang++ -c -O3 -emit-llvm main.cpp -o main.bc
    lli main.bc

    这是一个很好的开始,我们可以只查看工具背后的源代码,并研究参数概述的执行路径。由于这些工具只是暴露 llvm/clang 库中可用的底层功能的接口,我们可以添加到我们的项目中,因此浅层执行路径将为我们提供一系列库可用方法,我们可以在应用程序中调用这些方法来完成相同的任务结果。

    一旦建立了库方法的序列,您就可以深入研究将各个库方法分解为它们的底层功能,并通过相对较少的修改来梳理我们想要的确切行为,而不是尝试重新实现从头开始的东西。

    【讨论】:

    • 那将是否。因为在像 clang/llvm 这样动态的项目中使用内部接口是非常短视的。
    • 它没有使用内部接口。这些工具是如何使用这些库的示例,并且在 llvm 和 clang 项目的公共接口中提供了多个抽象级别。但是你是对的,如果 API 不是一成不变的,你应该小心在你的代码中直接使用它,你应该从动态 API 构建抽象,这样如果它确实改变了你只需要重写你的抽象。
    • 只是想我会为这个古老的答案添加更多内容。在 LLVM 站点上实际上有一个进行 JIT 编译的教程。 llvm.org/docs/tutorial/BuildingAJIT1.html 看,你不必喜欢答案,但当它们是正确答案时,或者在这种情况下......唯一的答案时,你必须接受它们。
    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 2023-03-24
    • 2019-04-30
    • 2011-08-08
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多