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"が正常に取得できています。