0

嗨,我用 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 文件?

谢谢你的帮助

4

2 回答 2

0

最简单的做法是将输出转发到一个文件中,然后像这样处理它(假设上面的编译代码被编译成一个可执行名称'parser'):

./parser >> test.ll
llvm-as test.ll
llc test.bc
clang -o test test.s

希望这会有所帮助!

作为旁注,我通过system()调用和命令行选项在内部有我的解析器,所以这可能也是你想要考虑的事情^^

于 2015-01-15T08:13:43.727 回答
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,从而呈现.bc文件。

$ llvm-as file.s

同样lli也很乐意运行该文件:

$ lli file.s.bc

运行或解释任何这些生成的文件(llvm IR、bitcode 或本机程序)当然会产生相同的结果,即转储程序中top定义的模块的 llvm IR 代码(它是空的)。

文档:

于 2014-08-04T22:15:32.820 回答