Tutorial

http://llvm.org/docs/tutorial/LLVM 2.5 環境で動かすには少し修正がいるらしい。最初っから動かない。
ちょこっと修正して動くようにした(つもり)。C++ 自体がよく分かっていないのだけど。

以下は C++API を使って LLVM の main を作る例。

c++ -g tut0.cpp `/usr/local/bin/llvm-config --cxxflags --ldflags --libs core` -o tut0

tut0.cpp の内容。

#include "llvm/Module.h"
#include "llvm/Function.h"
#include "llvm/PassManager.h"
#include "llvm/CallingConv.h"
#include "llvm/Analysis/Verifier.h"
#include "llvm/Assembly/PrintModulePass.h"
#include "llvm/Support/IRBuilder.h"
#include "llvm/Support/raw_ostream.h"

using namespace llvm;

Module* makeLLVMModule();

int main(int argc, char**argv) {
  Module* Mod = makeLLVMModule();

  verifyModule(*Mod, PrintMessageAction);

  PassManager PM;
  PM.add(createPrintModulePass(&outs()));
  PM.run(*Mod);
  delete Mod;
  return 0;
}

Module* makeLLVMModule() {
  // Module Construction
  Module* mod = new Module("test");
  Constant* cmain = mod->getOrInsertFunction("main", IntegerType::get(32), NULL);
  Function* main = cast<Function>(cmain);
  main->setCallingConv(CallingConv::C);
  BasicBlock* block = BasicBlock::Create("entry", main);
  IRBuilder<> builder(block);
  builder.CreateRet(ConstantInt::get(Type::Int32Ty, 8));

  return mod;
}

./tut0 として実行すると、LLVM IR が確かに生成される。なんというまどろっこしさ。(ret i32 8 の 8 は特に意味はない。)

; ModuleID = 'test'

define i32 @main() {
entry:
ret i32 8
}

しかしこれで、以下のようにパイプでコンパイル/インタプリタで実行ができる。

./tut0 | llvm-as | lli
echo $?
=> 8

これだけだと何も便利に思えないが、llvm-as や lli 相当は C++ のプログラムから直接実行できるはず。
http://llvm.org/docs/tutorial/LangImpl4.html のようなことができるわけだ、多分。