LLVMSwift is a set of Swifty API wrappers for the LLVM C API. It makes compiler development feel great from Swift!
To start emitting IR, you'll want to create a Module
object, with an optional Context
parameter,
and an IRBuilder
that will build instructions for that module.
let module = Module(name: "main")
let builder = IRBuilder(module: module)
Once you do that, you can start adding functions, global variables, and generating instructions!
let main = builder.addFunction(name: "main",
type: FunctionType(argTypes: [],
returnType: VoidType())
let entry = function.appendBasicBlock(named: "entry")
builder.positionAtEnd(of: entry)
builder.buildRetVoid()
module.dump()
The IRBuilder class has methods for almost all functions from the LLVM C API, like:
builder.buildAdd
builder.buildSub
builder.buildMul
builder.buildCondBr
builder.addSwitch
and so many more.
Plus, it provides common wrappers around oft-used types like Function
, Global
, Switch
, and PhiNode
.
There are a couple, annoying steps you need to get it working before it'll build.
- Install LLVM 3.9 using your favorite package manager. For example:
brew install llvm
- Ensure
llvm-config
is in yourPATH
- That will reside in the
/bin
folder wherever your package manager installed LLVM.
- That will reside in the
- Create a pkg-config file for your specific LLVM installation.
- We have a utility for this:
swift utils/make-pkgconfig.swift
- We have a utility for this:
Once you do that, you can add LLVMSwift as a dependency for your own Swift compiler projects!
This project is used by Trill for all its code generation.
- Harlan Haskins (@harlanhaskins)
- Robert Widmann (@CodaFi)
This project is released under the MIT license, a copy of which is available in this repo.