【发布时间】:2015-04-27 12:31:40
【问题描述】:
手动发出 LLVM IR 而不是使用 LLVM API/绑定是否可行?很少有语言具有 LLVM 绑定,而且它们通常已经过时或缺乏良好的文档,我真的很想避免使用 C++,因此直接发出 LLVM IR 可以让我使用我选择的语言 (F#)。
为了清楚起见,我希望编写自己的针对 LLVM 的小型编译器,这样我就可以使用 LLVM ARM 后端为 ARM Cortex M 微控制器生成代码。
【问题讨论】:
-
可行是什么意思? LLVM 语言规范完整地定义了 IR,包括文本表示。据我所知,它已经稳定了很多年。几十年来,编译器一直在发布汇编代码。为什么这会从根本上有所不同?至于是否更可取 使用可能有问题的绑定,我认为归结为个人意见。
-
那么手动发出 LLVM IR 是否比使用 API 需要更多的工作?我的意思是显然一切皆有可能,但问题是这是否是一个好主意。请记住,我以前从未编写过编译器,并且对 LLVM 完全陌生。
-
抱歉,如果我觉得我很苛刻——那不是我的本意! :-) 我认为这是最好尝试的时代之一。我看不出为什么以文本形式发出 LLVM IR 比发出 x86-64 汇编代码要困难得多。如果您发现 F# LLVM 绑定的质量欠缺(或者根本没有),您最好生成文本表示。
-
改用 C 绑定,它们现在非常全面。无需通过 C++。在 llvm-c 周围生成 p/invoke .net 包装器很简单,请参见此处的示例:github.com/combinatorylogic/clike/tree/master/llvm-wrapper(python cindex 用于解析 llvm-c 标头)
-
这个问题不会简化为“LLVM IR 代码是否稳定”,例如跨版本?
标签: compiler-construction llvm llvm-ir