快轉到主要內容

llvm - helloworld

·213 字·1 分鐘
Denny Cheng / 月月冬瓜
作者
Denny Cheng / 月月冬瓜
獸控兼工程師兼鍵盤武術家

環境設置
#

  • ubuntu體系:sudo apt-get install llvm
  • MAC: brew install llvm

makefile (MAC)
#

BIN_PATH=/usr/local/Cellar/llvm/3.6.1/bin/
export PATH:=$(PATH):$(BIN_PATH)
LLVM_CONFIG=llvm-config
FLAGS= --cxxflags --ldflags --system-libs --libs core

toy: toy.cpp
	clang++ -g -O3 toy.cpp `$(LLVM_CONFIG) $(FLAGS)` -o toy
clean:
	rm -f toy

top module
#

#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Support/IRBuilder.h"

int main()
{
  llvm::LLVMContext& context = llvm::getGlobalContext();
  llvm::Module* module = new llvm::Module("top", context);
  llvm::IRBuilder<> builder(context);

  module->dump( );
}

function
#

宣告function
#

無參數
#

  llvm::FunctionType *funcType =
      llvm::FunctionType::get(builder.getInt32Ty(), false);
  llvm::Function *mainFunc = llvm::Function::Create(funcType, llvm::Function::ExternalLinkage, "main", module);

有參數
#

  std::vector< llvm::Type* > putsArgs;
  putsArgs.push_back(builder.getInt8Ty()->getPointerTo());
  llvm::ArrayRef< llvm::Type* >  argsRef(putsArgs);

  llvm::FunctionType *putsType =
    llvm::FunctionType::get(builder.getInt32Ty(), argsRef, false);

定義function
#

引用已有的function
#

  llvm::Constant *putsFunc = module->getOrInsertFunction("puts", putsType);

創造新的function
#

  llvm::BasicBlock *entry = llvm::BasicBlock::Create(context, "entrypoint", mainFunc);
  builder.SetInsertPoint(entry);

增添function內容

新增變數
#

  • global variable
  llvm::Value *helloWorld = builder.CreateGlobalStringPtr("hello world!\n");
  • local variable

Reference
#

Create a working compiler with the LLVM framework