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
 
CodeBuilderKind getBackendKind () 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 (unsigned AS)
 
llvm::Type * getPointerTypeUnqual ()
 
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, bool IsKernel=false) 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
 
IRValueemitIntrinsic (const std::string &Name, IRType RetTy, const std::vector< IRValue * > &Args) override
 Lower a frontend intrinsic name to backend IR.
 
IRValueemitBuiltin (const std::string &Name, IRType RetTy, const std::vector< IRValue * > &Args) 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,
bool  IsKernel = false 
)
overridevirtual

Create a function with the given name and signature. Kernel intent is explicit so backends can select the correct IR container up front. 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 
)

◆ emitBuiltin()

IRValue * proteus::LLVMCodeBuilder::emitBuiltin ( const std::string &  Name,
IRType  RetTy,
const std::vector< IRValue * > &  Args 
)
overridevirtual

Lower a frontend GPU builtin name to backend IR. Returns nullptr for void builtins (e.g. syncThreads).

Implements proteus::CodeBuilder.

◆ emitIntrinsic()

IRValue * proteus::LLVMCodeBuilder::emitIntrinsic ( const std::string &  Name,
IRType  RetTy,
const std::vector< IRValue * > &  Args 
)
overridevirtual

Lower a frontend intrinsic name to backend IR.

Implements proteus::CodeBuilder.

◆ 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.

◆ getBackendKind()

CodeBuilderKind proteus::LLVMCodeBuilder::getBackendKind ( ) const
inlineoverridevirtual

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 ( unsigned  AS)

◆ getPointerTypeUnqual()

Type * proteus::LLVMCodeBuilder::getPointerTypeUnqual ( )

◆ 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: