如何拦截LLVM lli工具输入?

如何拦截LLVM lli工具输入?,llvm,interpreter,Llvm,Interpreter,我想使用LLVMlli工具作为静态库(将main()重命名为lli()并将其导出到libLLi.a中),为其创建丰富的UI。我如何修改它(或在不修改的情况下使用它)以拦截stdin 假设我知道如何生成LLVM程序集文件(使用clang-S-emit LLVM..-o output.ll),以及如何使用lli工具(lli output.ll)执行它 常见用例: lli将解释的简单应用程序源代码: #include <iostream> using namespace std; in

我想使用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;
}
#包括
使用名称空间std;
int main(){
字符名[128];

cout
lli
已经是llvm库函数的薄包装器,只需使用它们即可
tools/lli/lli.cpp
中的函数很长,这仅仅是因为它支持大量的标志来控制每个可能的设置。将其剥离后,使用
EngineBuilder
创建一个函数并使用它运行
llvm::函数
,应该少于10行

您可能还发现了一些帮助,他们在语言中添加了JIT支持。这还演示了如何使用EngineBuilder,尽管他们选择构建的执行引擎是
JIT
而不是
解释器,但您可以根据您的用例对其进行自定义


现在,关于问题的另一部分,您如何捕获
stdin
stdout
?LLVM不是VM,代码正在您的进程中运行,并使用您的stdin和stdout。我的第一个建议是,既然您已经拥有LLVM IR格式的函数,只需运行一个转换过程,将标准I/O函数替换为你自己的I/O函数。如果你能让ABI对齐,一个更简单的方法是使用ExecutionEngine进行重新映射。调用
EE->updateGlobalMapping(functionDeclInIR,&replacementFunctionInNativeCode)
告诉执行引擎functionDeclInIR的
函数*
在本机代码中由replacementFunctionInNativeCode表示。您需要提供自己的_zstList11Char\u TraitSicers13Basic\u ostreamIcT\u ES5\u PKc实现(又名。ostream::operator听起来很有希望。关于如何编写
ostream::operator有什么建议/示例/链接吗