ghc-7.4.2: The GHC API

Safe HaskellNone



The LLVM abstract syntax.



type LlvmBlockId = UniqueSource

Block labels

data LlvmBlock Source

A block of LLVM code.




blockLabel :: LlvmBlockId

The code label for this block

blockStmts :: [LlvmStatement]

A list of LlvmStatement's representing the code for this block. This list must end with a control flow statement.

data LlvmModule Source

An LLVM Module. This is a top level container in LLVM.




modComments :: [LMString]

Comments to include at the start of the module.

modAliases :: [LlvmAlias]

LLVM Alias type definitions.

modGlobals :: [LMGlobal]

Global variables to include in the module.

modFwdDecls :: LlvmFunctionDecls

LLVM Functions used in this module but defined in other modules.

modFuncs :: LlvmFunctions

LLVM Functions defined in this module.

data LlvmFunction Source

An LLVM Function




funcDecl :: LlvmFunctionDecl

The signature of this declared function.

funcArgs :: [LMString]

The functions arguments

funcAttrs :: [LlvmFuncAttr]

The function attributes.

funcSect :: LMSection

The section to put the function into,

funcBody :: LlvmBlocks

The body of the functions.

data LlvmSyncOrdering Source

LLVM ordering types for synchronization purposes. (Introduced in LLVM 3.0). Please see the LLVM documentation for a better description.



Some partial order of operations exists.


A single total order for operations at a single address exists.


Acquire synchronization operation.


Release synchronization operation.


Acquire + Release synchronization operation.


Full sequential Consistency operation.

data LlvmStatement Source

Llvm Statements


Assignment LlvmVar LlvmExpression

Assign an expression to an variable: * dest: Variable to assign to * source: Source expression

Fence Bool LlvmSyncOrdering

Memory fence operation

Branch LlvmVar

Always branch to the target label

BranchIf LlvmVar LlvmVar LlvmVar

Branch to label targetTrue if cond is true otherwise to label targetFalse * cond: condition that will be tested, must be of type i1 * targetTrue: label to branch to if cond is true * targetFalse: label to branch to if cond is false

Comment [LMString]

Comment Plain comment.

MkLabel LlvmBlockId

Set a label on this position. * name: Identifier of this label, unique for this module

Store LlvmVar LlvmVar

Store variable value in pointer ptr. If value is of type t then ptr must be of type t*. * value: Variable/Constant to store. * ptr: Location to store the value in

Switch LlvmVar LlvmVar [(LlvmVar, LlvmVar)]

Mutliway branch * scrutinee: Variable or constant which must be of integer type that is determines which arm is chosen. * def: The default label if there is no match in target. * target: A list of (value,label) where the value is an integer constant and label the corresponding label to jump to if the scrutinee matches the value.

Return (Maybe LlvmVar)

Return a result. * result: The variable or constant to return


An instruction for the optimizer that the code following is not reachable

Expr LlvmExpression

Raise an expression to a statement (if don't want result or want to use Llvm unnamed values.


A nop LLVM statement. Useful as its often more efficient to use this then to wrap LLvmStatement in a Just or [].

data LlvmExpression Source

Llvm Expressions


Alloca LlvmType Int

Allocate amount * sizeof(tp) bytes on the stack * tp: LlvmType to reserve room for * amount: The nr of tp's which must be allocated

LlvmOp LlvmMachOp LlvmVar LlvmVar

Perform the machine operator op on the operands left and right * op: operator * left: left operand * right: right operand

Compare LlvmCmpOp LlvmVar LlvmVar

Perform a compare operation on the operands left and right * op: operator * left: left operand * right: right operand

Malloc LlvmType Int

Allocate amount * sizeof(tp) bytes on the heap * tp: LlvmType to reserve room for * amount: The nr of tp's which must be allocated

Load LlvmVar

Load the value at location ptr

GetElemPtr Bool LlvmVar [LlvmVar]

Navigate in an structure, selecting elements * inbound: Is the pointer inbounds? (computed pointer doesn't overflow) * ptr: Location of the structure * indexes: A list of indexes to select the correct value.

Cast LlvmCastOp LlvmVar LlvmType

Cast the variable from to the to type. This is an abstraction of three cast operators in Llvm, inttoptr, prttoint and bitcast. * cast: Cast type * from: Variable to cast * to: type to cast to

Call LlvmCallType LlvmVar [LlvmVar] [LlvmFuncAttr]

Call a function. The result is the value of the expression. * tailJumps: CallType to signal if the function should be tail called * fnptrval: An LLVM value containing a pointer to a function to be invoked. Can be indirect. Should be LMFunction type. * args: Concrete arguments for the parameters * attrs: A list of function attributes for the call. Only NoReturn, NoUnwind, ReadOnly and ReadNone are valid here.

Phi LlvmType [(LlvmVar, LlvmVar)]

Merge variables from different basic blocks which are predecessors of this basic block in a new variable of type tp. * tp: type of the merged variable, must match the types of the predecessor variables. * precessors: A list of variables and the basic block that they originate from.

Asm LMString LMString LlvmType [LlvmVar] Bool Bool

Inline assembly expression. Syntax is very similar to the style used by GCC. * assembly: Actual inline assembly code. * contraints: Operand constraints. * return ty: Return type of function. * vars: Any variables involved in the assembly code. * sideeffect: Does the expression have side effects not visible from the constraints list. * alignstack: Should the stack be conservatively aligned before this expression is executed.