LLVMを動かしてみる(No2:A First Function)

LLVM TutorialとKMCさんのコードを参考に動かしてみました。


変数xに1を代入し、戻り値として利用するコードです。


TutorialどおりではコンパイルオプションがらみでNGがでたため、若干修正しています。

  • 環境

OSX 10.5 &LLVM 2.6

  • コード:"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"
#include "llvm/Bitcode/ReaderWriter.h"
using namespace llvm;

Module* makeLLVMModule();

int main() {
  LLVMContext ctx;

  Module *m = new Module("test", ctx);
  Function *f = cast<Function>(m->getOrInsertFunction("main",
                                                      Type::getInt32Ty(ctx),
                                                      NULL));
  BasicBlock *block = BasicBlock::Create(ctx, "", f);
  IRBuilder<> builder(block);

  // 1
  Value *c = ConstantInt::get(Type::getInt32Ty(ctx), 1);

  Value *xp = builder.CreateAlloca(Type::getInt32Ty(ctx), 0, "x");
  builder.CreateStore(c, xp);
  Value *x = builder.CreateLoad(xp);
  builder.CreateRet(x);

  WriteBitcodeToFile(m, outs());

  delete m;
  return 0;
}

あとはコンパイルして動かすのみです。

$c++ -g tut0.cpp `llvm-config --cxxflags --ldflags --libs` -o tut0
$./tut0 > tut0.bc
$lli tut0.bc ;echo $?
1

動作正常、戻り値"1"が正常に取得できています。