从 ExecutionEngine 调用 C/C++ 函数

2024-01-12

我正在学习 llvm,想要对我的想法进行概念验证。

基本上,我想分割我的编译器和运行时。编译器将给出一个 .bc,运行时将通过 ParseBitcodeFile 加载它并使用 ExecutionEngine 来运行它。这部分正在发挥作用。

现在,为了轻松进行系统调用,我希望能够在运行时实现 C/C++ 函数来执行所有系统调用(文件 io、stdout 打印等)。我的问题是,我如何从我的玩具编译器的代码中调用这些函数(该编译器是由 llvm 在不同的步骤中编译的),并允许在执行时使用它。


好消息:使用 JIT 时ExecutionEngine, 这会只是工作。当 JIT-er 发现 IR 使用的外部符号(在 IR 本身中未找到)时,它会在 JIT-ing 进程本身中查找,因此可以调用主机程序中可见的任何符号。

这直接解释在LLVM 教程的第 4 部分 http://llvm.org/docs/tutorial/LangImpl04.html:

哇,JIT 怎么知道 sin 和 cos 呢?答案是 出奇的简单:在这个例子中,JIT 开始执行一个 函数并进行函数调用。它意识到该函数是 尚未 JIT 编译并调用标准例程集 解析函数。在这种情况下,没有为 函数,因此 JIT 最终调用了“dlsym("sin")” 万花筒过程本身。由于“罪”是在 JIT 中定义的 地址空间,它只是修补模块中的调用以调用 直接使用 libm 版本的 sin。

对于血淋淋的细节请看lib/ExecutionEngine/JIT/JIT.cpp- 特别是它的用法DynamicLibrary.

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

从 ExecutionEngine 调用 C/C++ 函数 的相关文章

  • LLVM 检索 AllocaInst 的名称

    我正在尝试检索传递给 a 的指针的名称cudaMalloc https docs nvidia com cuda cuda runtime api group CUDART MEMORY html group CUDART MEMORY 1
  • 使用 readability-identifier-naming 时,clang-tidy 将名称空间视为全局变量

    我正在使用 clang tidy 来检查源代码 在文件中 clang tidy我定义 Checks readability identifier naming CheckOptions key readability identifier
  • 在 LLVM IR 中,我想复制一组指令并通过 LLVM pass 将这些指令粘贴到 IR 中的另一个位置。这个怎么做?

    我想从一个部分复制这些指令集并粘贴到 IR 中的另一部分 0 load i32 i32 x align 4 1 load i32 i32 y align 4 add add nsw i32 0 1 2 load i32 i32 n alig
  • 在 CMake 中设置 Clang 库的路径

    我从 git 构建 llvm 并希望在项目中使用这些库 尤其是 libclang makefiles 是通过 CMake 生成的 对于 LLVM 部分 我找到了设置LLVM DIR重新路由 llvm 库的路径 但对于 Clang 我找不到这
  • 使用 LLVM pass 添加内在函数

    我使用 LLVM 通道向输入代码添加了一个内在函数 我能够看到内部调用 但我无法弄清楚如何将代码编译到我的目标架构 x86 64 我正在运行以下命令 clang llvm config ldflags libs all ff s o foo
  • 如何将 c++filt 与 llvm-cov 报告一起使用?

    我正在尝试将 demangler 与 llvm cov 报告工具一起使用 以下是我正在运行的命令 llvm cov report path to executable instr profile path to default profda
  • 如何使用 Clang 编码生成未使用的声明? [复制]

    这个问题在这里已经有答案了 我正在寻找代码生成一个llvm Module来自一些 C 代码 具体来说 我将混合 Clang 生成的代码和其他来源的代码 不幸的是 铿锵CodeGenModule如果存在使用它的定义 类似乎坚持只在模块中生成声
  • 通过修改LLVM Backend来Clobber X86寄存器

    我正在尝试稍微改变 X86 目标的 LLVM 后端 以产生一些所需的行为 更具体地说 我想模拟一个像 gcc 的 fcall used 这样的标志reg option https gcc gnu org onlinedocs gcc Cod
  • 在 llvm 上运行 x86 程序

    是否可以使用llvm来运行x86程序 IE 我想使用 llvm 作为 x86 模拟器来运行 x86 程序 然后对 x86 程序进行检测 Thanks 我想你正在寻找LibCPU http LibCPU Org It has x86 前端 h
  • llvm OCaml 绑定

    我正在研究 llvm OCaml 绑定 我通过 opam 安装了 llvm 包 opam install llvm 当我在 utop 中使用 llvm 时 出现以下错误 require llvm Error The external fun
  • LLVM 6.0.0 的构建大小很大 (42G)

    I built llvm 6 0 0从源头开始 一切正常 我只是想知道它的尺寸怎么这么大 42G 我可以轻松删除一些目标文件或其他文件以使构建目录更小吗 du hs GIT llvm 6 0 0 build 42G home oren GI
  • LoadInst 和 StoreInst 值和地址 LLVM

    我有一个文件 print c 它有两个功能 void printLoad print address and value of memory location from which value printf address value vo
  • 从源代码构建 Clang 时什么时候需要 libc++ 源代码?

    我多年来一直在 Linux 和 OS X 上构建 Clang LLVM 下载页面 http llvm org releases download html 我一直使用以下来源 LLVM LLVM 源 编译器前端 Clang 源 编译器 RT
  • 如果别名会降低运行时性能,为什么编译器要执行别名?

    我出于纯粹的兴趣而学习 C 和计算机科学主题 这让我对编译器产生了兴趣 我读过的所有内容都告诉我 别名会导致程序集输出速度变慢 需要在每次迭代时重新加载值 我已经能够使用 Intel C C 编译器使用该标志在一些基准测试中获得轻微的提高
  • 构建 LLVM 失败并显示空错误消息

    我正在尝试构建 LLVM 3 1 和 Clang 3 1 我遵循了入门指南铿锵的网站 http clang llvm org get started html 检查必要位置的存储库 获取 Python 等 如果我安装了 Python 3 3
  • MSYS2环境的使用

    我想彻底了解MSYS2平台环境的使用情况 部分描述可在以下位置找到 https www msys2 org docs environments https www msys2 org docs environments 我理解的事情 MSY
  • 防止运行测试时优化掉未使用的静态函数

    我正在编写一个将利用 LLVM 的库 通过inkwell https github com TheDan64 inkwell 来 JIT 编译一些函数 这些函数需要能够回调我的代码中的一些 Rust 函数 我让它工作 但我的单元测试不起作用
  • LLVM到底是什么?

    我一直听说 LLVM 它是 Perl 语言 然后是 Haskell 语言 然后有人用其他语言使用它 它是什么 它与 GCC 到底有什么区别 视角 安全等 LLVM 是一个用于构建 优化和生成中间和 或二进制机器代码的库 LLVM 可以用作编
  • LLVM 尾调用优化

    以下是我对事情的理解 当函数 f 调用自身是其最后一个动作时 它是尾递归的 通过形成循环而不是再次调用函数 可以显着优化尾递归 函数的参数已就地更新 并且函数体再次运行 这称为递归尾调用优化 LLVM 在使用 fastcc GHC 或 Hi
  • Fedora 21 带 clang,不带 gcc

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

随机推荐

  • 如何在应用程序未运行时模拟位置

    我正在构建一个具有地理围栏功能的 iOS 8 应用程序 我需要对此进行测试 并且我知道我可以使用预配置的位置或提供 GPX 文件来模拟 Xcode 中的位置 然而 由于这个应用程序需要在被杀死时根据区域监控进行操作 用户在多任务处理中向上滑
  • 如何使用自定义工厂方法注册开放泛型?

    TL DR 我可以用 Autofac 创建一个通用工厂 以便我可以注入IProduct
  • 将列表列转换为数据框

    我在 Spark 数据框中有一列列表 features 0 45 63 0 0 0 0 0 0 0 85 0 69 0 0 89 56 0 0 0 0 如何将其转换为 Spark 数据框 其中列表中的每个元素都是数据框中的一列 我们可以假设
  • 分析网络软件/具有大量系统调用等待的分析软件

    我正在开发一个复杂的网络软件 但我无法确定如何提高系统性能 特别是在使用阻塞同步调用的软件部分 由于系统的这一部分正在进行大量计算 因此几乎不可能确定该组件的缓慢是由这些计算引起的还是由于等待系统的其他部分引起的 是否有任何轻量级分析器可以
  • 在模式推断解析 json 中检测到格式错误的记录

    我在尝试使用 ADF 中的数据集解析从 Blob 存储读取的基本 Json 时遇到一个非常令人沮丧的错误 我的 Json 如下 Bid 0 197514880839 BaseCurrency AED Bid 0 535403560434 B
  • 使用两个下拉按钮构建一个散点图,一个用于 x 轴,一个用于 y 轴

    我希望构建一个散点图 但使用 2 个下拉列表 我可以在一个用于 x 轴的变量和另一个用于 y 轴的变量之间切换 例如总测试和总案例 或最近案例和总案例 我尝试构建一个我通过替换找到的解决方案 cols dd Total tests Tota
  • SQLAlchemy 声明式:没有任何主键的表?

    如何使用ORM声明类创建没有主键的表 如果我没有制作任何专栏 它就无法启动primary key True SQLAlchemy 核心不会抱怨缺少主键 因此可以使用以下命令创建这样的表Table 但是ORM在设计上需要一种方法来识别对象对应
  • setColorFilter 不起作用

    我正在尝试在图像视图上实现一个简单的滤色器 将黑色图像变成白色图像 为了实现这一目标 我执行以下操作 weatherImg setColorFilter Color BLACK PorterDuff Mode MULTIPLY weathe
  • 异常类 - What() 函数

    我目前正在开发自己的异常类 该类继承自std exception 我不确定我是否应该自己做what 或者只是打电话std exception message 在我的类构造函数中 这是我当前的代码 FilterException Filter
  • 如何设置字体大小或标签大小以适合所有设备

    如何设置 kivy 字体大小或标签大小 使其适合所有手机设备屏幕 适合的方式是不与边界 矩形 甚至屏幕重叠 我知道 Kivy 中的按钮和其他一些小部件有size hint This size hint没有给出想要的结果 另外 设置font
  • 如何导入npgsql模块?

    我需要从 PowerShell 脚本中连接到 PostgreSQL 数据库 但是如何在没有 VisualStudio 的情况下安装 npgsql 呢 没有金块 所以我尝试使用最新的 MSI 文件在 GAC 中安装驱动程序 Npgsql 3
  • 尝试在 VS Code 中将 emmet 与 React 应用程序一起使用

    我正在使用 Visual Studio Code 并创建一个 React 应用程序 我知道 Emmet 附带了 Vsc 但它不适用于我的 React 应用程序 我尝试将以下代码放入设置中 emmet includeLanguages jav
  • 图像Python3的中值滤波器

    I wanted to implement a radial median filter I have the following picture size Nx Ny 我想导出每个像素的半径 对于每个半径计算中值并将其放入一个新矩阵中以代
  • 如何读取 ASP.NET 原始 URL 的查询字符串参数?

    我有一个变量 string rawURL HttpContext Current Request RawUrl 如何读取此 url 的查询字符串参数 这可能就是你想要的 Uri theRealURL new Uri HttpContext
  • JavaScript 数组与 JSON 响应的比较

    我正在处理这个项目 我需要从学校的时间表中获取所有空房间 我可以从 JSON 响应中获取数据 JSON 响应如下所示 status success reservations id 19598 subject subjectName modi
  • Linux cli 工具将 SQL Server 架构转储到文本文件

    您知道能够将 SQL Server 架构导出到文本文件的可靠命令行工具吗 您可以使用 mssql scripter 来完成此操作 下载通过 pip install mssql scripter 您要使用的命令类似于 mssql script
  • ios5 ARC 从 ARC 中排除文件的编译器标志是什么?

    谁能帮我记住告诉 XCode 对某些文件不使用 ARC 的标志是什么 我的项目中有几个文件被标记为这样 直到我添加了另一个文件并决定将该文件转换为 ARC 听起来很容易 对吧 我期望能够简单地检查我想要的文件并让 XCode 发挥它的魔力
  • Jenkins 内容安全策略

    我对詹金斯内容安全策略感到困惑 我知道这些网站 配置内容安全策略 https wiki jenkins ci org display JENKINS Configuring Content Security Policy 内容安全策略参考
  • 区分 VMware 网络适配器和物理网络适配器 - 或 - 检测虚拟网络适配器

    我必须使用任何 Windows API 来区分真实地址和虚拟机地址 我在用着GetAdaptersAddresses用于填充本地计算机的 IP 地址列表的 API 我只需要提取除与 VMware 网络适配器关联的地址和其他地址 自动配置和隧
  • 从 ExecutionEngine 调用 C/C++ 函数

    我正在学习 llvm 想要对我的想法进行概念验证 基本上 我想分割我的编译器和运行时 编译器将给出一个 bc 运行时将通过 ParseBitcodeFile 加载它并使用 ExecutionEngine 来运行它 这部分正在发挥作用 现在