LLVM C ++程序编译

时间:2014-08-02 07:30:13

标签: c++ llvm llvm-ir llvm-c++-api

您好我已经用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文件?

感谢您的帮助

2 个答案:

答案 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()调用和命令行选项在内部使用我的解析器,因此这也可能是您想要考虑的事情^^