【问题标题】:C++ string to LLVM IRC++ 字符串到 LLVM IR
【发布时间】:2014-10-30 21:36:26
【问题描述】:
我想采用这样的 C++ lambda 函数的字符串表示形式:
string fun = "[](int x) { return x + 5;}";
string llvm_ir = clang.get_llvm_ir(fun); // does something like this exist?
并使用 C++ 中的 Clang 将其转换为 LLVM IR。有没有办法直接使用 Clang 的内部 API 来做到这一点?
【问题讨论】:
标签:
c++11
llvm
clang++
llvm-clang
【解决方案1】:
据我所知,没有稳定的、官方支持的 API 可以执行此操作。 Clang C API 提供前端级别的信息(源代码级别)。 Clang 工具也不提供此功能。
不过,您确实有不错的选择。最简单的方法是将 Clang 前端作为子进程 clang -cc1 -emit-llvm ...<other options> 调用。这将生成一个 LLVM IR 文件,然后您可以读取该文件。这实际上是编译器中相当普遍的做法——Clang 驱动程序本身就是这样做的——它调用前端和一堆其他工具(如链接器),具体取决于具体的编译任务。
或者,如果你觉得你必须有一个编程API,你可以挖掘Clang前端的代码(上面提到的-cc1调用)看看它是如何完成的,并收集点点滴滴的代码。不过,请准备好编写大量的脚手架,因为这些 API 并不是为外部使用而设计的。
重申一下,可以使用内部 API,但没有简单或推荐的方法遵循此路径。