我想使用 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(使用前将#替换为@)