首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何拦截LLVM lli工具输入?

如何拦截LLVM lli工具输入?
EN

Stack Overflow用户
提问于 2014-10-21 06:33:38
回答 1查看 500关注 0票数 2

我想使用LLVM lli工具作为静态库(将main()重命名为lli()并在libLLi.a中导出它)-为它创建丰富的UI。我如何修改它(或者不用修改)来拦截stdin?

假设我知道如何生成LLVM程序集文件(使用clang -S -emit-llvm .. -o output.ll),以及如何使用lli工具(lli output.ll)执行它。

通用用例:

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

代码语言:javascript
复制
#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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-21 07:51:51

lli已经是llvm库函数的薄包装器,只需使用这些函数即可。tools/lli/lli.cpp中的main()函数很长,因为它支持大量的标志来控制每个可能的设置。在您去掉它之后,使用一个ExecutionEngine创建一个EngineBuilder并使用它运行一个llvm::Function应该少于10行。

您可能还会发现万花筒教程第4章很有帮助,在语言中添加了JIT支持。这也演示了如何使用EngineBuilder,虽然他们选择构建的ExecutionEngine是JIT而不是Interpreter,但是您可以为您的用例定制它。

现在,关于您问题的另一部分,您如何捕获stdinstdout?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。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26480332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档