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 のようなことができるわけだ、多分。