如何拦截LLVM lli工具输入?

2023-12-19

我想使用 LLVMlli工具作为静态库(重命名main() to lli()并将其导出到 libLLi.a) - 为其创建丰富的 UI。我如何修改它(或不加修改地使用)以拦截标准输入?

假设我知道如何生成 LLVM 汇编文件(使用clang -S -emit-llvm .. -o output.ll)以及如何使用它来执行它lli tool (lli output.ll).

常见用例:

由lli解释的简单应用程序的源代码:

#include <iostream>

using namespace std;

int main() {
    char name[128]; 
    cout << "type your name: ";
    cin.getline(name, sizeof(name));
    cout << "hi, " << name << endl;

    return 0;
}

我需要为其解释 LLVM 程序集并在何时显示输入框cin.getline调用并显示 TextBox 时cout <<调用(InputBox 和 TextBox 是丰富的 UI 控件)。

附言。我无法分叉进程并转发整个子进程的标准输入/标准输出。


lli已经是 llvm 库函数的薄包装器,只需使用它们即可。中的 main() 函数tools/lli/lli.cpp之所以长只是因为它支持大量标志来控制每个可能的设置。剥离后,创建一个内容应该少于 10 行ExecutionEngine http://llvm.org/doxygen/classllvm_1_1ExecutionEngine.html使用一个EngineBuilder并用它来运行llvm::Function.

您可能还会发现万花筒教程的第四章 http://llvm.org/docs/tutorial/LangImpl04.html很有帮助,他们向该语言添加了 JIT 支持。这也演示了如何使用 EngineBuilder,尽管他们选择构建的 ExecutionEngine 是一个JIT而不是Interpreter,您可以根据您的用例对其进行自定义。

现在对于你问题的另一部分,你如何陷阱stdin and stdout? LLVM 不是虚拟机,代码在您的进程中运行并使用您的标准输入和标准输出。我的第一个建议是,由于您已经拥有 LLVM IR 格式的函数,因此只需运行一个转换过程,用您自己的 I/O 函数替换标准 I/O 函数。如果您可以使 ABI 对齐,则更简单的方法是使用 ExecutionEngine 进行重新映射。称呼EE->updateGlobalMapping(functionDeclInIR, &replacementFunctionInNativeCode)告诉 ExecutionEngineFunction*functionDeclInIR 在本机代码中由 replacementFunctionInNativeCode 表示。您需要提供您自己的 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc (又名。ostream::operator

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

如何拦截LLVM lli工具输入? 的相关文章

  • 持久的 Python 命令行历史记录

    我希望能够 向上箭头 指向我在以前的 Python 解释器中输入的命令 我已经找到了readline模块提供以下功能 read history file write history file and set startup hook 我还不
  • 是否有可通过 USB 密钥在 Mac OS X 10.6 上运行的便携式 python 解释器?

    我一直在努力寻找一个可以通过工作计算机上的 USB 密钥运行的便携式解释器 Work comp 运行的是 Mac OS X 10 6 环境相当受限 无法访问终端 无法安装应用程序 但我知道便携式应用程序可以从 USB 驱动器运行 我一直在使
  • pycharm看不到python3.7解释器

    我在 Linux Mint 19 Tara Xfce 上使用 Pycharm Community 2018 1 4 它与 Python 3 5 解释器配合良好 我安装了 Python 3 7 作为系统上默认的 Python 解释器 pyth
  • 在 llvm 上运行 x86 程序

    是否可以使用llvm来运行x86程序 IE 我想使用 llvm 作为 x86 模拟器来运行 x86 程序 然后对 x86 程序进行检测 Thanks 我想你正在寻找LibCPU http LibCPU Org It has x86 前端 h
  • 如何使用 LLVM IRBuilder 从外部 DLL 调用函数?

    如何从 LLVM 调用外部 DLL 的函数 如何从 LLVM 代码调用 DLL 文件中定义的函数 由于您的问题缺少重要信息 我猜您想实现以下目标 我猜你会使用 c c 接口并且该函数有一个签名void fun void 我还猜测您将使用 L
  • 是否可以在 OCaml 解释器中使用箭头键?

    每次我在解释器中使用这些键时 我都会不断出现如下符号 D C 我在 ZSH 中使用 Linux Mint 12 但是在 Ubuntu 中使用 bash 得到了相同的结果 另外 ssh 中也是同样的情况 库存 OCaml 顶层没有内置行编辑功
  • 设置 llvm::ConstantInt 的值

    我正在玩 LLVM 我考虑过改变中间代码中常量的值 然而对于班级llvm 常量Int http llvm org docs doxygen html classllvm 1 1ConstantInt html 我没有看到设置值函数 知道如何
  • 为什么错误回溯显示编辑后的脚本而不是实际运行的脚本?

    背景 考虑以下最小示例 当我保存以下脚本并从终端运行它时 import time time sleep 5 raise Exception 该代码将在休眠五秒后引发错误 并留下以下回溯 回溯 最近一次调用最后一次 文件 test minim
  • LLVM 执行哪些优化?

    我想具体了解一下LLVM的各个优化级别分别对应什么 也就是说 我想知道当我使用 llvm 或 clang 或 opt 的 0x 选项时 哪些优化过程是准确执行的 在前端之外 以及按什么顺序执行 相应工具的 man 没有提供关于此事的太多信息
  • 使用 Clang AST 打印函数的参数

    我想将参数传递给函数 例如 如果我接到电话 printf d d i j 输出应该是 d dij 我可以使用 RecursiveASTVisitor 中的 VisitCallExpr 进行函数调用 还能够获取参数数量和参数类型 但我不知道如
  • 防止运行测试时优化掉未使用的静态函数

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

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • 如何在 Xcode 中禁用一个文件的优化

    我的 Xcode 项目依赖于另一个库 当我使用以下命令构建项目时 这会导致项目出现错误 O3 option 这些错误仅存在于一个文件中 所以我想关掉 O3 该文件的选项 是否可以 打开目标 看下Build Phases 打开Compile
  • ld:警告:__DATA/__objc_imageinfo__DATA 节的大小意外地大

    有谁知道这个警告是什么意思 接下来是错误 Command Developer Platforms iPhoneSimulator platform Developer usr bin llvm gcc 4 2 failed with exi
  • 如何编译LLVM Kaleidscope教程?

    我之前一直在 C 中使用 LLVM 其中包含一个 Nuget LLVM 库 我转向 C 并尝试遵循万花筒教程 https llvm org docs tutorial LangImpl03 html 不幸的是我不知道如何编译它 我保存了第三
  • 如何在 Simple Build Tool 项目中调用 scala 解释器?

    我的 scala 程序正在使用 scala tools nsc interpreter IMain 的编译器接口 当我用 scalac 编译时 一切都按预期进行 但是当我使用 sbt 编译时 它仍然可以编译 但在执行时 它会在从 IMain
  • 找不到“Attributes.inc”文件

    我一直在使用中提供的标题include llvm and include llvm c尝试制作我自己的编译器 但是 每当我尝试编译时 都会收到此错误 没有llvm IR Attributes inc在我的文件或我见过的任何 LLVM 项目中
  • 获取 LLVM getelementptr 中的操作数名称

    我正在尝试获取 getelementptr 指令引用的数组的名称 当在实际的 C 代码中使用中间变量对数组进行索引时 这似乎起作用 如下所示 int a 0 i a 3 在这种情况下 我得到以下位码 arrayidx getelementp
  • Xcode 3.1.4 中内置分析器

    我想知道 Xcode 3 1 4 中内置的分析器是否使得单独使用 LLVM Clang 静态分析器变得多余 请参考这里的原文 使用 LLVM Clang 静态分析器查找内存泄漏 http www fruitstandsoftware com
  • LLVM IR:如何调用另一个 .ll 文件中的函数

    我正在编写 LLVM IR 代码 我可以调用另一个 ll 文件中的函数吗 例如 在 ll文件中 有一个函数foo 我可以在 b ll 中使用这个函数 就像调用 foo 一样吗 如果是这样 我怎样才能包括a ll Thanks 您需要在调用函

随机推荐