您好我已经用LLVM Api编写了一个简单的C ++代码
#include <stdio.h>
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/IRBuilder.h"
int main()
{
llvm::LLVMContext& context = llvm::getGlobalContext();
llvm::Module* module = new llvm::Module("top", context);
llvm::IRBuilder<> builder(context);
module->dump( );
}
如何编译它以获取LLVM IR文件?
感谢您的帮助
答案 0 :(得分:0)
将程序本身编译为本机机器代码二进制文件非常简单。在Unix平台上:
$ clang++ <c++ file> `llvm-config --cppflags --ldflags --libs core`
llvm-config
是一个工具,提供必要的编译标志以包含llvm框架的某些组件。在您的情况下,您似乎只需要核心组件。
将-v
参数添加到命令行需要clang
来输出所有使用的命令。添加-S -emit-llvm
(两个参数必须一起使用)将使其输出源的llvm IR转换
$ clang++ -v file.cpp `llvm-config --cppflags --ldflags --libs core` -S -emit-llvm
然后可以使用file.s
直接解释生成的lli
,或者使用llvm-as
进一步编译为bitcode,这将呈现.bc
文件。
$ llvm-as file.s
同样的lli
也很乐意运行该文件:
$ lli file.s.bc
运行或解释任何这些结果文件(llvm IR,bitcode或本机程序),当然会产生相同的结果,转储程序中定义的模块top
的llvm IR代码(是空的。
文档:
答案 1 :(得分:0)
最简单的方法是将输出转发到一个文件中,然后像这样处理(假设上面编译的代码被编译成可执行名称'parser'):
./parser >> test.ll
llvm-as test.ll
llc test.bc
clang -o test test.s
希望这有帮助!
作为旁注,我通过system()
调用和命令行选项在内部使用我的解析器,因此这也可能是您想要考虑的事情^^