とりあえず今回はお試しで、OSXから
brew install --with-toolchain llvm
#include <iostream> | |
#include "llvm/IR/IRBuilder.h" | |
#include "llvm/IR/LLVMContext.h" | |
#include "llvm/IR/Module.h" | |
#include "llvm/Support/raw_ostream.h" | |
int main() | |
{ | |
llvm::LLVMContext context; | |
llvm::IRBuilder<> builder(context); | |
std::unique_ptr<llvm::Module> module = | |
llvm::make_unique<llvm::Module>("top", context); | |
llvm::FunctionType *funcType = llvm::FunctionType::get(builder.getVoidTy(), false); | |
llvm::Function *mainFunc = | |
llvm::Function::Create(funcType, llvm::Function::ExternalLinkage, "main", module.get()); | |
llvm::BasicBlock *entry = llvm::BasicBlock::Create(context, "entrypoint", mainFunc); | |
builder.SetInsertPoint(entry); | |
llvm::Value *hello = builder.CreateGlobalStringPtr("Hello %s\n"); | |
llvm::Value *john = builder.CreateGlobalStringPtr("John"); | |
std::vector<llvm::Type *> putsArgs; | |
putsArgs.push_back(builder.getInt8Ty()->getPointerTo()); | |
llvm::ArrayRef<llvm::Type *> argsRef(putsArgs); | |
llvm::FunctionType *putsType = | |
// 可変長引数なので trueにした | |
llvm::FunctionType::get(builder.getInt32Ty(), argsRef, true); | |
llvm::Constant *putsFunc = module->getOrInsertFunction("printf", putsType); | |
std::vector<llvm::Value *> args; | |
args.push_back(hello); | |
args.push_back(john); | |
llvm::ArrayRef<llvm::Value *> argumentsRef(args); | |
builder.CreateCall(putsFunc, argumentsRef); | |
builder.CreateRetVoid(); | |
module->print(llvm::outs(), nullptr); | |
return 0; | |
} | |