Proteus
Programmable JIT compilation and optimization for C/C++ using LLVM
Loading...
Searching...
No Matches
Classes | Public Member Functions | List of all members
proteus::LLVMCodeBuilder Class Reference

#include <LLVMCodeBuilder.h>

Inheritance diagram for proteus::LLVMCodeBuilder:
Inheritance graph
[legend]
Collaboration diagram for proteus::LLVMCodeBuilder:
Collaboration graph
[legend]

Classes

struct  Impl
 

Public Member Functions

 LLVMCodeBuilder (std::unique_ptr< llvm::LLVMContext > Ctx, std::unique_ptr< llvm::Module > Mod, TargetModelType TM=TargetModelType::HOST)
 Construct as owner of LLVMContext and Module.
 
 ~LLVMCodeBuilder () override
 
TargetModelType getTargetModel () const override
 
 LLVMCodeBuilder (const LLVMCodeBuilder &)=delete
 
LLVMCodeBuilderoperator= (const LLVMCodeBuilder &)=delete
 
llvm::IRBuilderBase & getIRBuilder ()
 Get the underlying IRBuilderBase (internal use only).
 
llvm::Function & getFunction ()
 
llvm::Module & getModule ()
 
llvm::LLVMContext & getContext ()
 
std::unique_ptr< llvm::LLVMContext > takeLLVMContext ()
 Transfer ownership of the LLVMContext (leaves internal pointer null).
 
std::unique_ptr< llvm::Module > takeModule ()
 Transfer ownership of the Module (leaves internal pointer null).
 
std::tuple< llvm::BasicBlock *, llvm::BasicBlock * > splitCurrentBlock ()
 
llvm::BasicBlock * createBasicBlock (const std::string &Name="", llvm::BasicBlock *InsertBefore=nullptr)
 
void eraseTerminator (llvm::BasicBlock *BB)
 
llvm::BasicBlock * getUniqueSuccessor (llvm::BasicBlock *BB)
 
void pushScope (const char *File, int Line, ScopeKind Kind, llvm::BasicBlock *NextBlock)
 
void createBr (llvm::BasicBlock *Dest)
 
void createCondBr (IRValue *Cond, llvm::BasicBlock *True, llvm::BasicBlock *False)
 
llvm::Type * getPointerType (llvm::Type *ElemTy, unsigned AS)
 
llvm::Type * getPointerTypeUnqual (llvm::Type *ElemTy)
 
llvm::Type * getInt16Ty ()
 
llvm::Type * getInt32Ty ()
 
llvm::Type * getInt64Ty ()
 
llvm::Type * getFloatTy ()
 
unsigned getAddressSpace (llvm::Type *Ty)
 
bool isIntegerTy (llvm::Type *Ty)
 
bool isFloatingPointTy (llvm::Type *Ty)
 
IRValueemitAlloca (llvm::Type *Ty, const std::string &Name, AddressSpace AS=AddressSpace::DEFAULT)
 
IRValueemitArrayCreate (llvm::Type *Ty, AddressSpace AT, const std::string &Name)
 
IRFunctionaddFunction (const std::string &Name, IRType RetTy, const std::vector< IRType > &ArgTys) override
 
void setFunctionName (IRFunction *F, const std::string &Name) override
 Rename the function identified by F.
 
IRValuegetArg (IRFunction *F, size_t Idx) override
 Return the Nth argument of F as an IRValue.
 
void beginFunction (IRFunction *F, const char *File, int Line) override
 Set F as the active function and begin IR emission.
 
void endFunction () override
 
void setInsertPointAtEntry () override
 
void clearInsertPoint () override
 
void beginIf (IRValue *Cond, const char *File, int Line) override
 
void endIf () override
 
void beginFor (IRValue *IterSlot, IRType IterTy, IRValue *InitVal, IRValue *UpperBoundVal, IRValue *IncVal, bool IsSigned, const char *File, int Line, LoopHints Hints={}) override
 
void endFor () override
 
void beginWhile (std::function< IRValue *()> CondFn, const char *File, int Line) override
 
void endWhile () override
 
void createRetVoid () override
 
void createRet (IRValue *V) override
 
IRValuecreateArith (ArithOp Op, IRValue *LHS, IRValue *RHS, IRType Ty) override
 
IRValuecreateAtomicAdd (IRValue *Addr, IRValue *Val) override
 
IRValuecreateAtomicSub (IRValue *Addr, IRValue *Val) override
 
IRValuecreateAtomicMax (IRValue *Addr, IRValue *Val) override
 
IRValuecreateAtomicMin (IRValue *Addr, IRValue *Val) override
 
IRValuecreateCmp (CmpOp Op, IRValue *LHS, IRValue *RHS, IRType Ty) override
 
IRValuecreateAnd (IRValue *LHS, IRValue *RHS) override
 
IRValuecreateOr (IRValue *LHS, IRValue *RHS) override
 
IRValuecreateXor (IRValue *LHS, IRValue *RHS) override
 
IRValuecreateNot (IRValue *Val) override
 
IRValuecreateLoad (IRType Ty, IRValue *Ptr, const std::string &Name="") override
 
void createStore (IRValue *Val, IRValue *Ptr) override
 
IRValuecreateCast (IRValue *V, IRType FromTy, IRType ToTy) override
 
IRValuecreateBitCast (IRValue *V, IRType DestTy) override
 
IRValuecreateZExt (IRValue *V, IRType DestTy) override
 
IRValuegetConstantInt (IRType Ty, uint64_t Val) override
 
IRValuegetConstantFP (IRType Ty, double Val) override
 
VarAlloc getElementPtr (IRValue *Base, IRType BaseTy, IRValue *Index, IRType ElemTy) override
 
VarAlloc getElementPtr (IRValue *Base, IRType BaseTy, size_t Index, IRType ElemTy) override
 
IRValuecreateCall (const std::string &FName, IRType RetTy, const std::vector< IRType > &ArgTys, const std::vector< IRValue * > &Args) override
 
IRValuecreateCall (const std::string &FName, IRType RetTy) override
 
IRValueloadScalar (IRValue *Slot, IRType ValueTy) override
 Load the value stored directly in Slot (scalar alloca).
 
void storeScalar (IRValue *Slot, IRValue *Val) override
 Store Val directly into Slot (scalar alloca).
 
IRValueloadAddress (IRValue *Slot, IRType AllocTy) override
 Load the pointer stored in Slot (pointer alloca).
 
void storeAddress (IRValue *Slot, IRValue *Addr) override
 Store Addr into Slot (pointer alloca).
 
IRValueloadFromPointee (IRValue *Slot, IRType AllocTy, IRType ValueTy) override
 Dereference the pointer stored in Slot, then load the pointee.
 
void storeToPointee (IRValue *Slot, IRType AllocTy, IRValue *Val) override
 Dereference the pointer stored in Slot, then store Val to it.
 
VarAlloc allocScalar (const std::string &Name, IRType ValueTy) override
 
VarAlloc allocPointer (const std::string &Name, IRType ElemTy, unsigned AddrSpace=0) override
 
VarAlloc allocArray (const std::string &Name, AddressSpace AS, IRType ElemTy, size_t NElem) override
 
- Public Member Functions inherited from proteus::CodeBuilder
virtual ~CodeBuilder ()=default
 

Detailed Description

LLVMCodeBuilder encapsulates LLVM IR generation using IRBuilder. It manages insertion points, scopes, and provides methods for creating LLVM IR instructions.

Constructor & Destructor Documentation

◆ LLVMCodeBuilder() [1/2]

proteus::LLVMCodeBuilder::LLVMCodeBuilder ( std::unique_ptr< llvm::LLVMContext >  Ctx,
std::unique_ptr< llvm::Module >  Mod,
TargetModelType  TM = TargetModelType::HOST 
)

Construct as owner of LLVMContext and Module.

◆ ~LLVMCodeBuilder()

proteus::LLVMCodeBuilder::~LLVMCodeBuilder ( )
overridedefault

◆ LLVMCodeBuilder() [2/2]

proteus::LLVMCodeBuilder::LLVMCodeBuilder ( const LLVMCodeBuilder )
delete

Member Function Documentation

◆ addFunction()

IRFunction * proteus::LLVMCodeBuilder::addFunction ( const std::string &  Name,
IRType  RetTy,
const std::vector< IRType > &  ArgTys 
)
overridevirtual

Create a function with the given name and signature. Returns an opaque IRFunction handle owned by this builder.

Implements proteus::CodeBuilder.

◆ allocArray()

VarAlloc proteus::LLVMCodeBuilder::allocArray ( const std::string &  Name,
AddressSpace  AS,
IRType  ElemTy,
size_t  NElem 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ allocPointer()

VarAlloc proteus::LLVMCodeBuilder::allocPointer ( const std::string &  Name,
IRType  ElemTy,
unsigned  AddrSpace = 0 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ allocScalar()

VarAlloc proteus::LLVMCodeBuilder::allocScalar ( const std::string &  Name,
IRType  ValueTy 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ beginFor()

void proteus::LLVMCodeBuilder::beginFor ( IRValue IterSlot,
IRType  IterTy,
IRValue InitVal,
IRValue UpperBoundVal,
IRValue IncVal,
bool  IsSigned,
const char *  File,
int  Line,
LoopHints  Hints = {} 
)
overridevirtual

IterSlot : alloca holding the loop iterator. IterTy : value type of the iterator (must be an integer type). InitVal : initial value to store into IterSlot. UpperBoundVal : exclusive upper bound for the loop condition. IncVal : increment added to the iterator on each iteration. IsSigned : true → ICmpSLT, false → ICmpULT.

Implements proteus::CodeBuilder.

◆ beginFunction()

void proteus::LLVMCodeBuilder::beginFunction ( IRFunction F,
const char *  File,
int  Line 
)
overridevirtual

Set F as the active function and begin IR emission.

Implements proteus::CodeBuilder.

◆ beginIf()

void proteus::LLVMCodeBuilder::beginIf ( IRValue Cond,
const char *  File,
int  Line 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ beginWhile()

void proteus::LLVMCodeBuilder::beginWhile ( std::function< IRValue *()>  CondFn,
const char *  File,
int  Line 
)
overridevirtual

CondFn : callable that emits the condition IR at the current insert point and returns the resulting i1 Value (true → continue loop).

Implements proteus::CodeBuilder.

◆ clearInsertPoint()

void proteus::LLVMCodeBuilder::clearInsertPoint ( )
overridevirtual

Implements proteus::CodeBuilder.

◆ createAnd()

IRValue * proteus::LLVMCodeBuilder::createAnd ( IRValue LHS,
IRValue RHS 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createArith()

IRValue * proteus::LLVMCodeBuilder::createArith ( ArithOp  Op,
IRValue LHS,
IRValue RHS,
IRType  Ty 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createAtomicAdd()

IRValue * proteus::LLVMCodeBuilder::createAtomicAdd ( IRValue Addr,
IRValue Val 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createAtomicMax()

IRValue * proteus::LLVMCodeBuilder::createAtomicMax ( IRValue Addr,
IRValue Val 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createAtomicMin()

IRValue * proteus::LLVMCodeBuilder::createAtomicMin ( IRValue Addr,
IRValue Val 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createAtomicSub()

IRValue * proteus::LLVMCodeBuilder::createAtomicSub ( IRValue Addr,
IRValue Val 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createBasicBlock()

BasicBlock * proteus::LLVMCodeBuilder::createBasicBlock ( const std::string &  Name = "",
llvm::BasicBlock *  InsertBefore = nullptr 
)

◆ createBitCast()

IRValue * proteus::LLVMCodeBuilder::createBitCast ( IRValue V,
IRType  DestTy 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createBr()

void proteus::LLVMCodeBuilder::createBr ( llvm::BasicBlock *  Dest)

◆ createCall() [1/2]

IRValue * proteus::LLVMCodeBuilder::createCall ( const std::string &  FName,
IRType  RetTy 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createCall() [2/2]

IRValue * proteus::LLVMCodeBuilder::createCall ( const std::string &  FName,
IRType  RetTy,
const std::vector< IRType > &  ArgTys,
const std::vector< IRValue * > &  Args 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createCast()

IRValue * proteus::LLVMCodeBuilder::createCast ( IRValue V,
IRType  FromTy,
IRType  ToTy 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createCmp()

IRValue * proteus::LLVMCodeBuilder::createCmp ( CmpOp  Op,
IRValue LHS,
IRValue RHS,
IRType  Ty 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createCondBr()

void proteus::LLVMCodeBuilder::createCondBr ( IRValue Cond,
llvm::BasicBlock *  True,
llvm::BasicBlock *  False 
)

◆ createLoad()

IRValue * proteus::LLVMCodeBuilder::createLoad ( IRType  Ty,
IRValue Ptr,
const std::string &  Name = "" 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createNot()

IRValue * proteus::LLVMCodeBuilder::createNot ( IRValue Val)
overridevirtual

Implements proteus::CodeBuilder.

◆ createOr()

IRValue * proteus::LLVMCodeBuilder::createOr ( IRValue LHS,
IRValue RHS 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createRet()

void proteus::LLVMCodeBuilder::createRet ( IRValue V)
overridevirtual

Implements proteus::CodeBuilder.

◆ createRetVoid()

void proteus::LLVMCodeBuilder::createRetVoid ( )
overridevirtual

Implements proteus::CodeBuilder.

◆ createStore()

void proteus::LLVMCodeBuilder::createStore ( IRValue Val,
IRValue Ptr 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createXor()

IRValue * proteus::LLVMCodeBuilder::createXor ( IRValue LHS,
IRValue RHS 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ createZExt()

IRValue * proteus::LLVMCodeBuilder::createZExt ( IRValue V,
IRType  DestTy 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ emitAlloca()

IRValue * proteus::LLVMCodeBuilder::emitAlloca ( llvm::Type *  Ty,
const std::string &  Name,
AddressSpace  AS = AddressSpace::DEFAULT 
)

◆ emitArrayCreate()

IRValue * proteus::LLVMCodeBuilder::emitArrayCreate ( llvm::Type *  Ty,
AddressSpace  AT,
const std::string &  Name 
)

◆ endFor()

void proteus::LLVMCodeBuilder::endFor ( )
overridevirtual

Implements proteus::CodeBuilder.

◆ endFunction()

void proteus::LLVMCodeBuilder::endFunction ( )
overridevirtual

Implements proteus::CodeBuilder.

◆ endIf()

void proteus::LLVMCodeBuilder::endIf ( )
overridevirtual

Implements proteus::CodeBuilder.

◆ endWhile()

void proteus::LLVMCodeBuilder::endWhile ( )
overridevirtual

Implements proteus::CodeBuilder.

◆ eraseTerminator()

void proteus::LLVMCodeBuilder::eraseTerminator ( llvm::BasicBlock *  BB)

◆ getAddressSpace()

unsigned proteus::LLVMCodeBuilder::getAddressSpace ( llvm::Type *  Ty)

◆ getArg()

IRValue * proteus::LLVMCodeBuilder::getArg ( IRFunction F,
size_t  Idx 
)
overridevirtual

Return the Nth argument of F as an IRValue.

Implements proteus::CodeBuilder.

◆ getConstantFP()

IRValue * proteus::LLVMCodeBuilder::getConstantFP ( IRType  Ty,
double  Val 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ getConstantInt()

IRValue * proteus::LLVMCodeBuilder::getConstantInt ( IRType  Ty,
uint64_t  Val 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ getContext()

LLVMContext & proteus::LLVMCodeBuilder::getContext ( )

◆ getElementPtr() [1/2]

VarAlloc proteus::LLVMCodeBuilder::getElementPtr ( IRValue Base,
IRType  BaseTy,
IRValue Index,
IRType  ElemTy 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ getElementPtr() [2/2]

VarAlloc proteus::LLVMCodeBuilder::getElementPtr ( IRValue Base,
IRType  BaseTy,
size_t  Index,
IRType  ElemTy 
)
overridevirtual

Implements proteus::CodeBuilder.

◆ getFloatTy()

Type * proteus::LLVMCodeBuilder::getFloatTy ( )

◆ getFunction()

Function & proteus::LLVMCodeBuilder::getFunction ( )

◆ getInt16Ty()

Type * proteus::LLVMCodeBuilder::getInt16Ty ( )

◆ getInt32Ty()

Type * proteus::LLVMCodeBuilder::getInt32Ty ( )

◆ getInt64Ty()

Type * proteus::LLVMCodeBuilder::getInt64Ty ( )

◆ getIRBuilder()

IRBuilderBase & proteus::LLVMCodeBuilder::getIRBuilder ( )

Get the underlying IRBuilderBase (internal use only).

◆ getModule()

Module & proteus::LLVMCodeBuilder::getModule ( )

◆ getPointerType()

Type * proteus::LLVMCodeBuilder::getPointerType ( llvm::Type *  ElemTy,
unsigned  AS 
)

◆ getPointerTypeUnqual()

Type * proteus::LLVMCodeBuilder::getPointerTypeUnqual ( llvm::Type *  ElemTy)

◆ getTargetModel()

TargetModelType proteus::LLVMCodeBuilder::getTargetModel ( ) const
inlineoverridevirtual

Implements proteus::CodeBuilder.

◆ getUniqueSuccessor()

BasicBlock * proteus::LLVMCodeBuilder::getUniqueSuccessor ( llvm::BasicBlock *  BB)

◆ isFloatingPointTy()

bool proteus::LLVMCodeBuilder::isFloatingPointTy ( llvm::Type *  Ty)

◆ isIntegerTy()

bool proteus::LLVMCodeBuilder::isIntegerTy ( llvm::Type *  Ty)

◆ loadAddress()

IRValue * proteus::LLVMCodeBuilder::loadAddress ( IRValue Slot,
IRType  AllocTy 
)
overridevirtual

Load the pointer stored in Slot (pointer alloca).

Implements proteus::CodeBuilder.

◆ loadFromPointee()

IRValue * proteus::LLVMCodeBuilder::loadFromPointee ( IRValue Slot,
IRType  AllocTy,
IRType  ValueTy 
)
overridevirtual

Dereference the pointer stored in Slot, then load the pointee.

Implements proteus::CodeBuilder.

◆ loadScalar()

IRValue * proteus::LLVMCodeBuilder::loadScalar ( IRValue Slot,
IRType  ValueTy 
)
overridevirtual

Load the value stored directly in Slot (scalar alloca).

Implements proteus::CodeBuilder.

◆ operator=()

LLVMCodeBuilder & proteus::LLVMCodeBuilder::operator= ( const LLVMCodeBuilder )
delete

◆ pushScope()

void proteus::LLVMCodeBuilder::pushScope ( const char *  File,
int  Line,
ScopeKind  Kind,
llvm::BasicBlock *  NextBlock 
)

◆ setFunctionName()

void proteus::LLVMCodeBuilder::setFunctionName ( IRFunction F,
const std::string &  Name 
)
overridevirtual

Rename the function identified by F.

Implements proteus::CodeBuilder.

◆ setInsertPointAtEntry()

void proteus::LLVMCodeBuilder::setInsertPointAtEntry ( )
overridevirtual

Implements proteus::CodeBuilder.

◆ splitCurrentBlock()

std::tuple< BasicBlock *, BasicBlock * > proteus::LLVMCodeBuilder::splitCurrentBlock ( )

◆ storeAddress()

void proteus::LLVMCodeBuilder::storeAddress ( IRValue Slot,
IRValue Addr 
)
overridevirtual

Store Addr into Slot (pointer alloca).

Implements proteus::CodeBuilder.

◆ storeScalar()

void proteus::LLVMCodeBuilder::storeScalar ( IRValue Slot,
IRValue Val 
)
overridevirtual

Store Val directly into Slot (scalar alloca).

Implements proteus::CodeBuilder.

◆ storeToPointee()

void proteus::LLVMCodeBuilder::storeToPointee ( IRValue Slot,
IRType  AllocTy,
IRValue Val 
)
overridevirtual

Dereference the pointer stored in Slot, then store Val to it.

Implements proteus::CodeBuilder.

◆ takeLLVMContext()

std::unique_ptr< LLVMContext > proteus::LLVMCodeBuilder::takeLLVMContext ( )

Transfer ownership of the LLVMContext (leaves internal pointer null).

◆ takeModule()

std::unique_ptr< Module > proteus::LLVMCodeBuilder::takeModule ( )

Transfer ownership of the Module (leaves internal pointer null).


The documentation for this class was generated from the following files: