如何拦截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工具输入? 的相关文章

  • 高级:为什么 ?function(){} 在 R 中有效

    我了解 R 中的一些运算符和函数在使用帮助函数之前需要反引号 但是 我不明白为什么 function 也有效 有人对此有任何想法吗 让我们看看会发生什么 的代码使用 flow 包 它可以帮助您检查代码所采用的逻辑路径 遵循整行 flow f
  • 从 Haskell 代码生成 LLVM IR

    我的目标是获取不同语言 主要是 C C Obj C 和 Haskell 的源代码 并提供有关它们的各种统计信息 例如变量 函数 内存分配 复杂性等的数量 LLVM 似乎是一个完美的工具 因为我可以为这些语言生成位码 并且通过 LLVM 的可
  • LoadInst 和 StoreInst 值和地址 LLVM

    我有一个文件 print c 它有两个功能 void printLoad print address and value of memory location from which value printf address value vo
  • JIT代码生成技术

    虚拟机如何动态生成本机机器代码并执行它 假设您可以弄清楚想要发出的本机机器操作码是什么 那么如何实际运行它呢 它是否像将助记符指令映射到二进制代码 将其填充到 char 指针中并将其转换为函数并执行一样hacky 或者您会生成一个临时共享库
  • 统一不同 clang-format 版本的输出

    我们尝试使用 clang format 工具稍微美化我们的代码 为了在我们所做的所有机器上获得统一的结果clang format style llvm dump config 已进行了一些调整并存储到 repo 中 问题是 clang 10
  • 是否有像 pygccxml 一样的 Python Clang 包装器来包装 GCC-XML?

    很长一段时间以来 我一直在使用 pygccxml 来解析和内省我的 C 源代码 它帮助我在构建过程中进行一些巧妙的代码生成 最近我读了很多关于 LLVM 堆栈的好处 特别是 LLVM Clang 解析器给 C 编译带来的好处 我现在想知道
  • 构建 LLVM 失败并显示空错误消息

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

    我正在使用 CMake 来构建我的项目 并且有以下行 include directories LLVM INCLUDE DIRS 评估后LLVM INCLUDE DIRS 评估为 include directories C Program
  • 我用带有垃圾收集器的语言构建了一个解释器。我需要一个用于解释器的垃圾收集器吗?

    这是一个幼稚的问题 但在我迄今为止看到的教程中并没有拼写清楚 如果我在一种高级语言 不是 C C 等 之上构建一个解释器 并且它有一个垃圾收集器 是否有必要为解释器本身制作一个 如果答案是肯定的 那一定是同一类宿主吧 即 如果主机是标记 清
  • 值的 Ocaml 表示 - 原子

    我查看了一些 OCaml 值的内部表示 空数组的表示是atom 0 即一个块tag 0 and size 0 空浮点数数组由atom 0 too 是否存在由原子表示的任何 OCaml 值tag gt 0 如果不是 OCaml 字节码集包含以
  • 使用 LLVM 内联特定函数调用

    给定一个llvm CallInst 我如何告诉内联器内联这个特定的调用 我可以将目标函数标记为AlwaysInline这将内联调用 但它也会内联每个调用 也许有某种方法可以在我发出特定调用时调用内联函数 内联基本块内的所有调用也可以 您可以
  • 在嵌入式 Python 解释器中打印变量

    我编写了一个嵌入 Python 的小型 C 程序 我使用 Py Initialize 和 Py Finalize 正确设置它 并且能够使用 PyRun SimpleString 或 PyRun SimpleFile 运行脚本 但是 我不知道
  • __attribute__ ((已弃用)) 不适用于 Objective-C 协议方法?

    我需要弃用 Objective C 协议中的单个方法 在普通的类 实例方法上我添加 attribute deprecated 声明后 看来它不适用于协议方法 如果我将它们标记为已弃用并在某个地方使用它们 则项目编译正常 不会出现预期的弃用警
  • 如何启动 VBS 的交互式控制台?

    与这个问题非常相似 如何启动 Perl 的交互式控制台 https stackoverflow com questions 73667 how can i start an interactive console for perl 我只是希
  • XCode 4.2 编译器错误

    当我使用 XCode 4 2 创建新项目 例如 单视图 iOS 应用程序 时 支持文件 文件夹中的 main m 文件如下所示 import
  • 通过 cmake 链接 libc++ 时 libc++abi 的链接问题

    我正在尝试构建一个简单的 hello world C 使用 LLVM Clang 3 7 0 的程序 根据工具链的源代码构建libc 使用命令行 clang std c 14 stdlib libc fno exceptions hello
  • 为什么在Python解释器中输入_会返回True? [复制]

    这个问题在这里已经有答案了 我的翻译行为非常奇怪 gt gt gt True gt gt gt type True
  • Function 对象与普通对象有何不同?

    函数如何存储在变量中 根据MDN https developer mozilla org en US docs Web JavaScript Reference Functions 在 JavaScript 中 函数是一等对象 因为它们可以
  • gcc 与 clang:符号剥离

    gcc 和 AMD Open64 opencc 都有一个 s选项 剥离符号表和重定位信息 到目前为止我还没能在 Clang LLVM 中找到相同的选项 它存在吗 您可以使用stripbinutils 中的实用程序 实际上 llvm ld 有
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题

随机推荐