直接或通过C / Clang转换为LLVM IR

时间:2013-03-01 03:41:04

标签: c llvm clang frontend

假设有人想使用LLVM静态编译给定的语言,将它首先转换为C然后使用CLang而不是处理直接IR转换的最大差异(优点和缺点)是什么。

我认为明显的答案是通过使用知道源语言的前端,更容易想出一个优化的IR表示,而不是期望CLang能够很好地处理生成的C语言。

我在这里遗失了什么?

1 个答案:

答案 0 :(得分:1)

使用通用C后端的优点:

  • 您可以使用任何C编译器(不仅仅是Clang)
  • 如果中间代码是如此高级语言,则更容易调试中间代码
  • 根据您的源语言语义,通过C(但不一定)翻译它可能更容易

缺点是:

  • 如果您的语言是逐步编译的(例如,没有明确分离的模块,或复杂的宏系统,或其他任何东西),通过LLVM IR在单个模块中进行编译并立即进行JIT编译比生成数百个微小C模块更有意义。换句话说,C正在执行单独的编译。
  • 如果您的源语言语义与C相距太远,则将其直接编译为较低级别可能会更容易。
  • 并非所有LLVM功能都可以从C.直接访问,例如,内在函数,替代调用约定,更高级语言的调试元数据。
  • Clang很大,不包括它会改善你的记忆
  • Clang不易维护,它取决于标题的存在和确切位置,取决于gcc的某些部分,等等。没有它,裸LLVM可以单独使用,并且可以保留依赖关系自包含的。

大多数情况下的优化不是问题。 Clang故意生成极其非最佳的LLVM IR。 LLVM应该关注所有的优化,而不是前端。当然,除非您可以进行一些高级优化,否则它们将不依赖于您的后端选择。