我想使用LLVM lli工具作为静态库(将main()重命名为lli()并在libLLi.a中导出它)-为它创建丰富的UI。我如何修改它(或者不用修改)来拦截stdin?
假设我知道如何生成LLVM程序集文件(使用clang -S -emit-llvm .. -o output.ll),以及如何使用lli工具(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程序集,并在InputBox调用cin.getline时显示TextBox,在cout <<调用时显示TextBox (InputBox和TextBox是丰富的UI控件)。
PS。我不能对整个子进程进行分叉处理并转发stdin/stdout。
发布于 2014-10-21 07:51:51
lli已经是llvm库函数的薄包装器,只需使用这些函数即可。tools/lli/lli.cpp中的main()函数很长,因为它支持大量的标志来控制每个可能的设置。在您去掉它之后,使用一个ExecutionEngine创建一个EngineBuilder并使用它运行一个llvm::Function应该少于10行。
您可能还会发现万花筒教程第4章很有帮助,在语言中添加了JIT支持。这也演示了如何使用EngineBuilder,虽然他们选择构建的ExecutionEngine是JIT而不是Interpreter,但是您可以为您的用例定制它。
现在,关于您问题的另一部分,您如何捕获stdin和stdout?LLVM不是VM,代码在您的进程中运行,并使用stdin和stdout。我的第一个建议是,既然您已经有了LLVM IR格式的函数,那么只需运行一个转换传递,用您自己的I/O函数代替标准的I/O函数。如果您可以让ABI排队,一个更简单的方法就是使用ExecutionEngine进行重新映射。调用EE->updateGlobalMapping(functionDeclInIR, &replacementFunctionInNativeCode)告诉ExecutionEngine,functionDeclInIR的Function*是由replacementFunctionInNativeCode用本机代码表示的。您需要提供自己的_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc实现(又名)。ostream::operator<<),它使用您的GUI。
https://stackoverflow.com/questions/26480332
复制相似问题