【问题标题】:LLVM IR limitationsLLVM IR 限制
【发布时间】:2013-11-17 00:13:48
【问题描述】:

我希望从 C 代码生成 LLVM-IR 代码,并且想知道以下函数的 IR 生成效果如何:

stdio.h、string.h、stdlib.h 以及一般标准的基于内存的函数,例如 malloc、calloc,因为我无法在以下位置找到大部分常用函数:

http://llvm.org/docs/LangRef.html 并且想知道这种表示的局限性,以及是否可能需要我添加自己的内在函数来处理标准/最流行的 c 函数。

我希望在运行时更改代码,所以想知道哪种方法会给我最大的灵活性,例如:改为在 AST 级别操作代码。

谢谢

【问题讨论】:

  • 我为类似 C 的语言编写了一个编译器,并针对您引用的 LLVM 汇编语言。它需要一点时间来适应并且有一些细微差别,但我对这个选择感到满意。您可以使用 clang 编译标准库,然后将其与您的代码链接。我发现使用 clang 将 C 编译为 llvm 程序集很有用,然后查看它以了解有关在 llvm 程序集中如何完成的信息。但是在运行时操作代码,即 JIT 编译,则完全不同。
  • 嗨,我实际上正在考虑使用 LLVM Mutate 操作 LLVM-IR 来表示我希望做的小代码更改,例如:将参数更改为标准库函数等。

标签: c llvm llvm-clang llvm-ir


【解决方案1】:

从 C 中发出 LLVM IR 正是工业级编译器 Clang 所做的。我建议使用-emit-llvm(本文档中的详细信息:http://clang.llvm.org/get_started.html)在 C 代码的小 sn-ps 上运行 Clang 并观察生成的 IR。

您甚至可以在浏览器中执行此操作:http://ellcc.org/demo/index.cgi

这将让您了解如何处理像 memcpy 这样的内置函数以及任何其他类似的疑问。

请注意,LLVM 和 Clang 都没有携带完整的 C 库,但它们可用于编译现有的库。 newlib 是一个流行的可移植 C 库,专为在各种新平台上构建而设计。例如,PNaCl 使用它将 C/C++ 代码构建为可移植的可执行文件 - 它将 newlib 与用户代码一起编译为单个 LLVM IR 模块。

【讨论】:

  • 您好,感谢您的回复。此外,您是否知道与 LLVM IR 交互的任何更高级别的 API?我知道 LLVM C++ Api.. 和它的其他绑定,例如:llvmpy 和一些 java 包装器到..
  • @user1479589:LLVM C++ API 非常高级。正如您所提到的,llvmpy(使用最新的项目 - github.com/llvmpy/llvmpy)可能很有用。你需要什么比这些更高的层次,即这些低层次对你有什么特定的需求?
猜你喜欢
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多