llvm-hs-quote is a quasiquoting-library for llvm-hs. It aims to support
all language constructs of LLVM.
llvm-hs-quote provides both quasiquotes and antiquotes. The following trivial
example uses both a quasiquote and an antiquote.
alloc :: Type -> Instruction
alloc t = [lli|alloca $type:t|]LLVM.Quote.LLVM provides quasiquoters or antiquoters for the following types.
For each type a, there's also a corresponding quasiquoter or antiquoter for
CodeGen a with an M added to the end of the name. For example,
Definition's quasiquoter is lldef; the corresponding quasiquoter for
CodeGen Definition is lldefM. Its antiquoter is $def:; the corresponding
antiquoter for CodeGen Definition is $defM:.
| AST Type | Quasiquoter | Antiquoter |
|---|---|---|
LLVM.AST.Module |
llmod |
|
LLVM.AST.Definition |
lldef |
$def: |
[LLVM.AST.Definition] |
$defs: |
|
LLVM.AST.Global |
llg |
|
LLVM.AST.Instruction.Instruction |
lli |
$instr: |
[LLVM.AST.Instruction.Instruction] |
$instrs: |
|
LLVM.AST.Instruction.Terminator |
llt |
$instr: |
LLVM.AST.DataLayout.DataLayout |
$dl: |
|
LLVM.Quote.AST.TargetTriple |
$tt: |
|
LLVM.AST.BasicBlock |
$bb: |
|
[LLVM.AST.BasicBlock] |
$bbs: |
|
LLVM.AST.Type.Type |
$type: |
|
LLVM.AST.Operand.Operand |
$opr: |
|
LLVM.AST.Constant.Constant |
$const: |
|
LLVM.AST.Name.Name (local) |
$id: |
|
LLVM.AST.Name.Name (global) |
$gid: |
|
LLVM.AST.Parameter |
$param: |
|
[LLVM.AST.Parameter] |
$params: |
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE OverloadedStrings #-}
import LLVM.AST as AST
import LLVM.Quote.LLVM as Q
-- | Module quotation
example1 :: AST.Module
example1 = [Q.llmod|
; ModuleID = 'simple module'
define i32 @foo(i32 %x) {
entry:
%x.addr = alloca i32
store i32 %x, i32* %x.addr
ret i32 1001
}
|]-- | Instruction antiquotation
example2 :: Either AST.Instruction AST.Terminator -> AST.Module
example2 instructionOrTerminator = [Q.llmod|
; ModuleID = 'simple module'
define i32 @myfunc(){
entry:
$instr:instructionOrTerminator
ret i32 0
}
|]-- | Instruction quotation
example3 :: AST.Type -> AST.Instruction
example3 t = [Q.lli|alloca $type:t|]-- | Definition quotation
example4 :: AST.Definition
example4 = [Q.lldef|@0 = global i32 1|]Copyright (c) 2014, Timo von Holtz