LLVMを動かしてみる(No2:A First Function)
LLVM TutorialとKMCさんのコードを参考に動かしてみました。
変数xに1を代入し、戻り値として利用するコードです。
TutorialどおりではコンパイルオプションがらみでNGがでたため、若干修正しています。
- 環境
- コード:"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"が正常に取得できています。