MXVM 1.8.1
Virtual Machine, Compiler, and Pascal Frontend
Loading...
Searching...
No Matches
pascal::CodeGenVisitor Class Reference

AST visitor that generates MXVM intermediate code. More...

#include <icode.hpp>

Inheritance diagram for pascal::CodeGenVisitor:

Classes

struct  Scope
struct  FuncInfo
 Describes a user-declared function's parameter and return types. More...
struct  ValueLocation
 Describes where a value currently resides (register, memory, or immediate). More...
struct  RecordField
 A field within a record type definition. More...
struct  RecordTypeInfo
 Complete description of a record type. More...

Public Member Functions

void registerExternalFunc (const std::string &funcName, const std::string &unitName)
 Register a function or procedure as originating from an external unit.
bool isImportedUnit (const std::string &name) const
 Check whether a name refers to an imported unit.
void registerImportedConst (const std::string &unitName, ConstDeclNode &node)
 Register imported constant values from a dependency unit.
void registerImportedVar (const std::string &unitName, VarDeclNode &node)
 Register imported variable metadata from a dependency unit (no alloc emitted).
 CodeGenVisitor ()
 Construct and initialise registers and float register pool.
virtual ~CodeGenVisitor ()=default
void initializeBuiltins ()
 Register all built-in function handlers (IO, Std, SDL, String).
void emitFree (const std::string &s)
 Emit a free instruction for an allocated pointer.
void generate (ASTNode *root)
 Generate MXVM code for the entire AST.
void markAllocatedPtr (const std::string &p)
 Mark a pointer name as allocated (will be freed at scope end).
void emit_invoke (const std::string &funcName, const std::vector< std::string > &params)
 Emit an invoke instruction calling a named function with parameters.
bool isIntLiteral (const std::string &s) const
void writeTo (std::ostream &out) const
 Write the complete MXVM program to a stream.
std::string getTypeString (const VarDeclNode &node)
std::string storageSymbolFor (const std::string &mangled)
bool isRecordTypeName (const std::string &t)
int getTypeSizeByName (const std::string &t)
VarType getTypeFromString (const std::string &typeStr)
void emitArrayBoundsCheck (const std::string &idxReg, int lower, int upper)
 Emit bounds-check code for a static array access.
void emitDynArrayBoundsCheck (const std::string &idxReg, const std::string &lenSym)
 Emit bounds-check code for a dynamic array access.
VarType getExpressionType (ASTNode *node)
void updateDataSectionInitialValue (const std::string &varName, const std::string &type, const std::string &value)
AST Visitor Overrides

Code generation for each Pascal AST node type.

void visit (ProgramNode &node) override
void visit (UnitNode &node) override
 Generate MXVM object code from a Pascal unit.
void visit (BlockNode &node) override
void visit (VarDeclNode &node) override
void visit (ProcCallNode &node) override
void visit (FuncCallNode &node) override
void visit (FuncDeclNode &node) override
void visit (ProcDeclNode &node) override
void visit (TypeAliasNode &node) override
void visit (ParameterNode &node) override
void visit (CompoundStmtNode &node) override
 Visit a compound statement block, freeing temporary pointers after each statement.
void visit (IfStmtNode &node) override
void visit (WhileStmtNode &node) override
void visit (ForStmtNode &node) override
void visit (BinaryOpNode &node) override
void visit (UnaryOpNode &node) override
void visit (VariableNode &node) override
void visit (NumberNode &node) override
void visit (StringNode &node) override
void visit (BooleanNode &node) override
void visit (EmptyStmtNode &node) override
void visit (ConstDeclNode &node) override
void visit (RepeatStmtNode &node) override
void visit (CaseStmtNode &node) override
void visit (ArrayTypeNode &node) override
void visit (ArrayDeclarationNode &node) override
void visit (FieldAccessNode &node) override
void visit (AssignmentNode &node) override
void visit (ArrayAssignmentNode &node) override
void visit (ArrayAccessNode &node) override
void visit (RecordTypeNode &node) override
void visit (RecordDeclarationNode &node) override
void visit (TypeDeclNode &node) override
void visit (SimpleTypeNode &node) override
void visit (ArrayTypeDeclarationNode &node) override
void visit (ExitNode &node) override
void visit (BreakNode &node) override
void visit (ContinueNode &node) override
void visit (NilNode &node) override
void visit (PointerTypeNode &node) override
void visit (PointerDerefNode &node) override
void visit (AddressOfNode &node) override
void visit (WithStmtNode &node) override
void visit (GotoStmtNode &node) override
void visit (LabelStmtNode &node) override
void visit (SetLiteralNode &node) override
void visit (SetTypeNode &node) override
void visit (EnumTypeDeclNode &node) override
Public Member Functions inherited from pascal::ASTVisitor
virtual ~ASTVisitor ()=default

Public Attributes

BuiltinFunctionRegistry builtinRegistry
 registry of built-in function handlers
std::string name = "App"
 program name emitted in the output header
std::unordered_map< std::string, int > enumConstants
 Enum value → ordinal mapping (lowercased name → integer).
std::unordered_map< std::string, std::vector< std::string > > enumTypes
 Enum type name → ordered list of value names.
std::unordered_set< std::string > setVars
 Set of variable names that are set types (allocated as 256-byte bitsets).
std::unordered_set< std::string > fileVars
 Set of variable names that are file types (pointer to FILE).
std::unordered_map< std::string, std::string > fileVarNames
 Maps file variable name to companion filename variable name.

Private Member Functions

std::string generateRealConstantName ()
bool isRealNumber (const std::string &s) const
std::string mangleWithScope (const std::string &baseName, const std::vector< std::string > &scopePath) const
std::string mangleVariableName (const std::string &varName) const
std::string getCurrentScopeName () const
std::string funcLabel (const char *prefix, const std::string &name)
VarType getVarType (const std::string &name) const
bool isRealConstSymbol (const std::string &s) const
std::string coerceToIntImmediate (const std::string &v)
void setVarType (const std::string &name, VarType t)
void setSlotType (int slot, VarType t)
bool isStringVar (const std::string &name) const
std::string emptyString ()
void initializeFloatRegisters ()
void addTempPtr (const std::string &v)
bool isRegisterSlot (int slot) const
bool isTempVar (const std::string &name) const
std::string slotVar (int slot) const
std::string allocReg ()
std::string allocPtrReg ()
std::string allocFloatReg ()
void expandFloatRegisters ()
void freePtrReg (const std::string &reg)
void freeReg (const std::string &reg)
void freeFloatReg (const std::string &reg)
bool isFloatReg (const std::string &name) const
bool isPtrReg (const std::string &name) const
bool isReg (const std::string &name) const
int newSlotFor (const std::string &name)
std::string newTemp ()
std::string newLabel (const std::string &prefix="L")
void freeTempPtr (const std::string &ptrName)
void releaseTempPtr (const std::string &ptrName)
bool isTempPtr (const std::string &name) const
std::string allocTempPtr (const std::string &forScope="")
void emit (const std::string &s)
void emitLabel (const std::string &label)
void emit1 (const std::string &op, const std::string &a)
void emit2 (const std::string &op, const std::string &a, const std::string &b)
void emit3 (const std::string &op, const std::string &a, const std::string &b, const std::string &c)
void emit4 (const std::string &op, const std::string &a, const std::string &b, const std::string &c, const std::string &d)
std::string escapeStringForMxvm (const std::string &raw) const
std::string ensureFloatConstSymbol (const std::string &value)
std::string internString (const std::string &val)
std::string convertCharLiteral (const std::string &c)
void pushValue (const std::string &v)
std::string popValue ()
std::string eval (ASTNode *n)
void recordLocation (const std::string &var, ValueLocation loc)
void pushTri (const char *op, const std::string &a, const std::string &b)
void pushCmpResult (const std::string &a, const std::string &b, const char *jop)
void pushFloatCmpResult (const std::string &aIn, const std::string &bIn, const char *jop)
void pushLogicalAnd (const std::string &a, const std::string &b)
void pushLogicalOr (const std::string &a, const std::string &b)
bool isParmReg (const std::string &name) const
void allocateRecordFieldArrays (const std::string &recordVarName, const std::string &recordTypeName)
ArrayInfo buildArrayInfoFromNode (ArrayTypeNode *atn)
int getArrayElementSize (const std::string &tIn)
std::string evaluateConstantExpression (ASTNode *node)
std::string getTypeString (ASTNode *typeNode)
std::string resolveTypeName (std::string t) const
int getRecordTypeSize (const std::string &typeName)
std::string findMangledFuncName (const std::string &name, bool isProc) const
std::string findMangledName (const std::string &name) const
std::string findMangledArrayName (const std::string &name) const
bool isIntegerLiteral (const std::string &s) const
bool isFloatLiteral (const std::string &s) const
bool tryGetConstNumeric (const std::string &name, std::string &out)
std::string foldNumeric (ASTNode *n)
std::pair< int, int > getRecordFieldOffsetAndSize (const std::string &recType, const std::string &field)
std::string getVarRecordTypeNameFromExpr (ASTNode *expr)
std::string getVarRecordTypeName (const std::string &varName)
bool isArrayTypeName (const std::string &t) const
std::string getPointerBaseTypeName (const std::string &varName) const
int getPointerElementSize (const std::string &varName)
VarType getPointerDerefType (const std::string &varName)
std::string getCurrentEndLabel () const
std::string ensurePtrBase (const std::string &v)
std::string getArrayNameFromBase (ASTNode *base)
ArrayInfogetArrayInfoForArrayAccess (ArrayAccessNode *arr)

Static Private Member Functions

static bool endsWithColon (const std::string &s)
static std::string lc (std::string s)
static bool isPtrLike (VarType t)

Private Attributes

std::unordered_map< std::string, std::string > compileTimeConstants
std::unordered_set< std::string > usedRealConstants
int realConstantCounter = 0
std::unordered_map< std::string, std::string > currentParamTypes
std::set< std::string > usedModules
std::vector< std::string > objectDeps
 unit/object dependencies for section object
bool isUnit = false
 true when generating code for a unit (object output)
std::unordered_map< std::string, std::string > externalFuncs
 maps function/proc name to source unit name
std::unordered_set< std::string > importedUnitNames
 names of units imported via uses clause
std::unordered_map< std::string, ArrayInfoimportedArrayInfo
 array metadata for imported unit vars
std::unordered_map< std::string, VarTypeimportedVarTypes
 var types for imported unit vars
std::vector< std::string > globalArrays
std::unordered_map< std::string, std::vector< std::string > > functionScopedArrays
std::vector< std::string > scopeHierarchy
std::vector< ScopescopeStack
std::unordered_map< std::string, std::string > typeAliases
std::map< std::string, std::pair< std::string, std::string > > constInitialValues
std::map< std::string, size_t > bufferStringVars
std::map< std::string, std::string > currentParamLocations
std::vector< std::pair< ProcDeclNode *, std::vector< std::string > > > deferredProcs
std::vector< std::string > allTempPtrs
std::vector< bool > tempPtrInUse
std::unordered_map< std::string, FuncInfofuncSignatures
std::unordered_map< std::string, VarTypevarTypes
std::unordered_map< int, VarTypeslotToType
bool needsEmptyString = false
int nextSpillReg = 0
std::vector< std::string > registers = {"rax", "rbx", "rcx", "rdx", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}
const std::vector< std::string > ptrRegisters
std::vector< std::string > floatRegisters
std::vector< bool > floatRegInUse
int nextFloatRegIndex = 0
std::vector< bool > regInUse
std::vector< bool > ptrRegInUse
std::vector< std::pair< FuncDeclNode *, std::vector< std::string > > > deferredFuncs
std::string currentFunctionName
std::string currentFunctionReturnSlot
 slot variable that holds the return value until FUNC_END
std::vector< std::string > currentFuncLocalSlots
bool functionSetReturn = false
int nextSlot = 0
int nextTemp = 0
int labelCounter = 0
std::unordered_map< std::string, int > varSlot
std::vector< std::string > prolog
std::vector< std::string > instructions
std::vector< std::string > evalStack
std::vector< std::pair< std::string, std::string > > stringLiterals
std::unordered_set< std::string > usedStrings
std::unordered_map< int, std::string > slotToName
std::unordered_map< std::string, std::vector< std::string > > recordsToFreeInScope
std::unordered_map< std::string, std::vector< std::string > > tempPtrByScope
std::unordered_map< std::string, bool > declaredProcs
std::unordered_map< std::string, bool > declaredFuncs
bool generatingDeferredCode = false
std::unordered_map< std::string, ValueLocationvalueLocations
std::unordered_set< std::string > allocatedPtrs
std::unordered_set< std::string > escapedTempPtrs
std::unordered_map< std::string, std::string > realConstants
std::unordered_map< std::string, ArrayInfoarrayInfo
std::unordered_map< std::string, int > dynArrayLenSlot
 mangled array name → slot of companion length variable
std::unordered_map< std::string, RecordTypeInforecordTypes
std::unordered_map< std::string, std::string > varRecordType
std::unordered_map< std::string, std::string > pointerBaseType
std::vector< std::string > loopEndLabels
std::vector< std::string > loopContinueLabels
std::vector< std::unordered_map< std::string, std::string > > withFieldScopes
 Stack of active with scopes: each entry maps unqualified field name -> record variable name.
std::unordered_map< std::string, std::string > gotoLabels
 Maps user-declared goto label numbers to generated MXVM labels.

Friends

class IOFunctionHandler
class MathFunctionHandler
class StdFunctionHandler
class SDLFunctionHandler
class StringFunctionHandler
class FileFunctionHandler

Detailed Description

AST visitor that generates MXVM intermediate code.

Traverses the Pascal AST, emitting register-based intermediate instructions into an instruction list. The final output is written via writeTo() in MXVM program format.

Definition at line 178 of file icode.hpp.

Constructor & Destructor Documentation

◆ CodeGenVisitor()

pascal::CodeGenVisitor::CodeGenVisitor ( )

Construct and initialise registers and float register pool.

Definition at line 10 of file icode_visit.cpp.

References initializeBuiltins(), initializeFloatRegisters(), ptrRegInUse, ptrRegisters, regInUse, and registers.

◆ ~CodeGenVisitor()

virtual pascal::CodeGenVisitor::~CodeGenVisitor ( )
virtualdefault

Member Function Documentation

◆ addTempPtr()

void pascal::CodeGenVisitor::addTempPtr ( const std::string & v)
inlineprivate

Definition at line 353 of file icode.hpp.

References getCurrentScopeName(), and tempPtrByScope.

◆ allocateRecordFieldArrays()

void pascal::CodeGenVisitor::allocateRecordFieldArrays ( const std::string & recordVarName,
const std::string & recordTypeName )
inlineprivate

◆ allocFloatReg()

std::string pascal::CodeGenVisitor::allocFloatReg ( )
inlineprivate

◆ allocPtrReg()

std::string pascal::CodeGenVisitor::allocPtrReg ( )
inlineprivate

Definition at line 401 of file icode.hpp.

References ptrRegInUse, and ptrRegisters.

◆ allocReg()

◆ allocTempPtr()

std::string pascal::CodeGenVisitor::allocTempPtr ( const std::string & forScope = "")
inlineprivate

◆ buildArrayInfoFromNode()

◆ coerceToIntImmediate()

std::string pascal::CodeGenVisitor::coerceToIntImmediate ( const std::string & v)
inlineprivate

Definition at line 290 of file icode.hpp.

References isFloatLiteral(), isRealConstSymbol(), and realConstants.

Referenced by visit().

◆ convertCharLiteral()

std::string pascal::CodeGenVisitor::convertCharLiteral ( const std::string & c)
inlineprivate

Definition at line 587 of file icode.hpp.

◆ emit()

◆ emit1()

void pascal::CodeGenVisitor::emit1 ( const std::string & op,
const std::string & a )
inlineprivate

◆ emit2()

◆ emit3()

void pascal::CodeGenVisitor::emit3 ( const std::string & op,
const std::string & a,
const std::string & b,
const std::string & c )
inlineprivate

Definition at line 537 of file icode.hpp.

References allocatedPtrs, and instructions.

Referenced by allocateRecordFieldArrays(), visit(), visit(), visit(), visit(), and visit().

◆ emit4()

void pascal::CodeGenVisitor::emit4 ( const std::string & op,
const std::string & a,
const std::string & b,
const std::string & c,
const std::string & d )
inlineprivate

◆ emit_invoke()

void pascal::CodeGenVisitor::emit_invoke ( const std::string & funcName,
const std::vector< std::string > & params )
inline

◆ emitArrayBoundsCheck()

void pascal::CodeGenVisitor::emitArrayBoundsCheck ( const std::string & idxReg,
int lower,
int upper )
inline

Emit bounds-check code for a static array access.

Parameters
idxRegRegister or variable holding the index
lowerCompile-time lower bound
upperCompile-time upper bound

Generates code that exits with code 1 when the index is out of the static [lower..upper] range. Gated by MXVM_BOUNDS_CHECK.

Definition at line 1572 of file icode.hpp.

References emit1(), emit2(), emitLabel(), and newLabel().

Referenced by visit(), and visit().

◆ emitDynArrayBoundsCheck()

void pascal::CodeGenVisitor::emitDynArrayBoundsCheck ( const std::string & idxReg,
const std::string & lenSym )
inline

Emit bounds-check code for a dynamic array access.

Parameters
idxRegRegister or variable holding the index
lenSymVariable holding the runtime array length

Generates code that exits with code 1 when the index is negative or >= the runtime length stored in lenSym. Gated by MXVM_BOUNDS_CHECK.

Definition at line 1596 of file icode.hpp.

References allocReg(), emit1(), emit2(), emitLabel(), freeReg(), and newLabel().

Referenced by visit(), and visit().

◆ emitFree()

void pascal::CodeGenVisitor::emitFree ( const std::string & s)
inline

Emit a free instruction for an allocated pointer.

Definition at line 980 of file icode.hpp.

References allocatedPtrs, and emit().

Referenced by generate().

◆ emitLabel()

void pascal::CodeGenVisitor::emitLabel ( const std::string & label)
inlineprivate

◆ emptyString()

std::string pascal::CodeGenVisitor::emptyString ( )
inlineprivate

Definition at line 311 of file icode.hpp.

References needsEmptyString.

Referenced by generate().

◆ endsWithColon()

bool pascal::CodeGenVisitor::endsWithColon ( const std::string & s)
inlinestaticprivate

Definition at line 368 of file icode.hpp.

Referenced by writeTo().

◆ ensureFloatConstSymbol()

std::string pascal::CodeGenVisitor::ensureFloatConstSymbol ( const std::string & value)
inlineprivate

◆ ensurePtrBase()

std::string pascal::CodeGenVisitor::ensurePtrBase ( const std::string & v)
inlineprivate

◆ escapeStringForMxvm()

std::string pascal::CodeGenVisitor::escapeStringForMxvm ( const std::string & raw) const
inlineprivate

Definition at line 545 of file icode.hpp.

Referenced by writeTo().

◆ eval()

◆ evaluateConstantExpression()

◆ expandFloatRegisters()

void pascal::CodeGenVisitor::expandFloatRegisters ( )
inlineprivate

Definition at line 425 of file icode.hpp.

References floatRegInUse, and floatRegisters.

Referenced by allocFloatReg().

◆ findMangledArrayName()

std::string pascal::CodeGenVisitor::findMangledArrayName ( const std::string & name) const
inlineprivate

Definition at line 1877 of file icode.hpp.

References name, scopeHierarchy, and varSlot.

Referenced by visit(), visit(), visit(), and visit().

◆ findMangledFuncName()

std::string pascal::CodeGenVisitor::findMangledFuncName ( const std::string & name,
bool isProc ) const
inlineprivate

Definition at line 1843 of file icode.hpp.

References declaredFuncs, declaredProcs, mangleWithScope(), name, and scopeHierarchy.

Referenced by getCurrentEndLabel(), visit(), visit(), and visit().

◆ findMangledName()

◆ foldNumeric()

◆ freeFloatReg()

void pascal::CodeGenVisitor::freeFloatReg ( const std::string & reg)
inlineprivate

Definition at line 448 of file icode.hpp.

References floatRegInUse, and floatRegisters.

Referenced by pascal::StdFunctionHandler::generateWithResult(), and pushFloatCmpResult().

◆ freePtrReg()

void pascal::CodeGenVisitor::freePtrReg ( const std::string & reg)
inlineprivate

Definition at line 431 of file icode.hpp.

References ptrRegInUse, and ptrRegisters.

Referenced by freeReg().

◆ freeReg()

◆ freeTempPtr()

void pascal::CodeGenVisitor::freeTempPtr ( const std::string & ptrName)
inlineprivate

Definition at line 477 of file icode.hpp.

References allTempPtrs, emit1(), and tempPtrInUse.

◆ funcLabel()

std::string pascal::CodeGenVisitor::funcLabel ( const char * prefix,
const std::string & name )
inlineprivate

Definition at line 274 of file icode.hpp.

References name.

Referenced by generate().

◆ generate()

◆ generateRealConstantName()

std::string pascal::CodeGenVisitor::generateRealConstantName ( )
inlineprivate

Definition at line 208 of file icode.hpp.

References realConstantCounter.

Referenced by ensureFloatConstSymbol(), generate(), and pushFloatCmpResult().

◆ getArrayElementSize()

int pascal::CodeGenVisitor::getArrayElementSize ( const std::string & tIn)
inlineprivate

Definition at line 865 of file icode.hpp.

References lc(), recordTypes, and resolveTypeName().

Referenced by buildArrayInfoFromNode(), and visit().

◆ getArrayInfoForArrayAccess()

◆ getArrayNameFromBase()

std::string pascal::CodeGenVisitor::getArrayNameFromBase ( ASTNode * base)
inlineprivate

Definition at line 2194 of file icode.hpp.

References getArrayNameFromBase().

Referenced by getArrayNameFromBase(), visit(), visit(), and visit().

◆ getCurrentEndLabel()

std::string pascal::CodeGenVisitor::getCurrentEndLabel ( ) const
inlineprivate

Definition at line 2150 of file icode.hpp.

References currentFunctionName, declaredFuncs, declaredProcs, and findMangledFuncName().

Referenced by visit().

◆ getCurrentScopeName()

std::string pascal::CodeGenVisitor::getCurrentScopeName ( ) const
inlineprivate

◆ getExpressionType()

◆ getPointerBaseTypeName()

std::string pascal::CodeGenVisitor::getPointerBaseTypeName ( const std::string & varName) const
inlineprivate

Definition at line 2115 of file icode.hpp.

References findMangledName(), and pointerBaseType.

Referenced by getPointerDerefType(), getPointerElementSize(), and visit().

◆ getPointerDerefType()

VarType pascal::CodeGenVisitor::getPointerDerefType ( const std::string & varName)
inlineprivate

Definition at line 2134 of file icode.hpp.

References getPointerBaseTypeName(), getTypeFromString(), and pascal::INT.

Referenced by getExpressionType(), and visit().

◆ getPointerElementSize()

int pascal::CodeGenVisitor::getPointerElementSize ( const std::string & varName)
inlineprivate

Definition at line 2126 of file icode.hpp.

References getPointerBaseTypeName(), getTypeSizeByName(), lc(), and resolveTypeName().

Referenced by visit().

◆ getRecordFieldOffsetAndSize()

std::pair< int, int > pascal::CodeGenVisitor::getRecordFieldOffsetAndSize ( const std::string & recType,
const std::string & field )
inlineprivate

Definition at line 2005 of file icode.hpp.

References lc(), recordTypes, and resolveTypeName().

Referenced by visit(), and visit().

◆ getRecordTypeSize()

int pascal::CodeGenVisitor::getRecordTypeSize ( const std::string & typeName)
inlineprivate

Definition at line 1835 of file icode.hpp.

References recordTypes.

◆ getTypeFromString()

VarType pascal::CodeGenVisitor::getTypeFromString ( const std::string & typeStr)
inline

◆ getTypeSizeByName()

int pascal::CodeGenVisitor::getTypeSizeByName ( const std::string & t)
inline

Definition at line 1522 of file icode.hpp.

References lc(), recordTypes, and resolveTypeName().

Referenced by getPointerElementSize(), visit(), and visit().

◆ getTypeString() [1/2]

std::string pascal::CodeGenVisitor::getTypeString ( ASTNode * typeNode)
inlineprivate

Definition at line 1802 of file icode.hpp.

◆ getTypeString() [2/2]

std::string pascal::CodeGenVisitor::getTypeString ( const VarDeclNode & node)
inline

Definition at line 1502 of file icode.hpp.

References pascal::VarDeclNode::type.

◆ getVarRecordTypeName()

std::string pascal::CodeGenVisitor::getVarRecordTypeName ( const std::string & varName)
inlineprivate

Definition at line 2089 of file icode.hpp.

References currentParamTypes, findMangledName(), resolveTypeName(), and varRecordType.

Referenced by visit(), visit(), visit(), and visit().

◆ getVarRecordTypeNameFromExpr()

◆ getVarType()

VarType pascal::CodeGenVisitor::getVarType ( const std::string & name) const
inlineprivate

◆ initializeBuiltins()

void pascal::CodeGenVisitor::initializeBuiltins ( )
inline

Register all built-in function handlers (IO, Std, SDL, String).

Definition at line 969 of file icode.hpp.

References builtinRegistry.

Referenced by CodeGenVisitor().

◆ initializeFloatRegisters()

void pascal::CodeGenVisitor::initializeFloatRegisters ( )
inlineprivate

Definition at line 323 of file icode.hpp.

References floatRegInUse, and floatRegisters.

Referenced by CodeGenVisitor().

◆ internString()

std::string pascal::CodeGenVisitor::internString ( const std::string & val)
inlineprivate

◆ isArrayTypeName()

bool pascal::CodeGenVisitor::isArrayTypeName ( const std::string & t) const
inlineprivate

Definition at line 2110 of file icode.hpp.

References arrayInfo, lc(), and resolveTypeName().

◆ isFloatLiteral()

bool pascal::CodeGenVisitor::isFloatLiteral ( const std::string & s) const
inlineprivate

◆ isFloatReg()

bool pascal::CodeGenVisitor::isFloatReg ( const std::string & name) const
inlineprivate

◆ isImportedUnit()

bool pascal::CodeGenVisitor::isImportedUnit ( const std::string & name) const
inlinenodiscard

Check whether a name refers to an imported unit.

Definition at line 909 of file icode.hpp.

References importedUnitNames, and name.

Referenced by getArrayInfoForArrayAccess(), visit(), visit(), and visit().

◆ isIntegerLiteral()

bool pascal::CodeGenVisitor::isIntegerLiteral ( const std::string & s) const
inlineprivate

Definition at line 1894 of file icode.hpp.

Referenced by tryGetConstNumeric(), and visit().

◆ isIntLiteral()

bool pascal::CodeGenVisitor::isIntLiteral ( const std::string & s) const
inline

Definition at line 1305 of file icode.hpp.

Referenced by emit_invoke().

◆ isParmReg()

◆ isPtrLike()

bool pascal::CodeGenVisitor::isPtrLike ( VarType t)
inlinestaticprivate

Definition at line 2167 of file icode.hpp.

References pascal::PTR, pascal::RECORD, and pascal::STRING.

◆ isPtrReg()

bool pascal::CodeGenVisitor::isPtrReg ( const std::string & name) const
inlineprivate

Definition at line 456 of file icode.hpp.

References name, and ptrRegisters.

Referenced by ensurePtrBase(), isReg(), and writeTo().

◆ isRealConstSymbol()

bool pascal::CodeGenVisitor::isRealConstSymbol ( const std::string & s) const
inlineprivate

Definition at line 288 of file icode.hpp.

Referenced by coerceToIntImmediate().

◆ isRealNumber()

bool pascal::CodeGenVisitor::isRealNumber ( const std::string & s) const
inlineprivate

◆ isRecordTypeName()

bool pascal::CodeGenVisitor::isRecordTypeName ( const std::string & t)
inline

Definition at line 1517 of file icode.hpp.

References lc(), recordTypes, and resolveTypeName().

Referenced by getExpressionType(), getTypeFromString(), visit(), visit(), visit(), visit(), visit(), and visit().

◆ isReg()

◆ isRegisterSlot()

bool pascal::CodeGenVisitor::isRegisterSlot ( int slot) const
inlineprivate

Definition at line 369 of file icode.hpp.

Referenced by writeTo().

◆ isStringVar()

bool pascal::CodeGenVisitor::isStringVar ( const std::string & name) const
inlineprivate

Definition at line 307 of file icode.hpp.

References getVarType(), name, pascal::PTR, and pascal::STRING.

◆ isTempPtr()

bool pascal::CodeGenVisitor::isTempPtr ( const std::string & name) const
inlineprivate

Definition at line 498 of file icode.hpp.

References allTempPtrs, and name.

Referenced by isReg(), and visit().

◆ isTempVar()

bool pascal::CodeGenVisitor::isTempVar ( const std::string & name) const
inlineprivate

Definition at line 370 of file icode.hpp.

References name.

Referenced by writeTo().

◆ lc()

◆ mangleVariableName()

std::string pascal::CodeGenVisitor::mangleVariableName ( const std::string & varName) const
inlineprivate

Definition at line 241 of file icode.hpp.

References mangleWithScope(), and scopeHierarchy.

Referenced by generate(), visit(), visit(), visit(), visit(), and visit().

◆ mangleWithScope()

std::string pascal::CodeGenVisitor::mangleWithScope ( const std::string & baseName,
const std::vector< std::string > & scopePath ) const
inlineprivate

Definition at line 227 of file icode.hpp.

Referenced by findMangledFuncName(), generate(), getCurrentScopeName(), and mangleVariableName().

◆ markAllocatedPtr()

void pascal::CodeGenVisitor::markAllocatedPtr ( const std::string & p)
inline

Mark a pointer name as allocated (will be freed at scope end).

Definition at line 1280 of file icode.hpp.

References allocatedPtrs.

Referenced by pascal::StringFunctionHandler::generateWithResult().

◆ newLabel()

std::string pascal::CodeGenVisitor::newLabel ( const std::string & prefix = "L")
inlineprivate

◆ newSlotFor()

int pascal::CodeGenVisitor::newSlotFor ( const std::string & name)
inlineprivate

◆ newTemp()

std::string pascal::CodeGenVisitor::newTemp ( )
inlineprivate

Definition at line 472 of file icode.hpp.

References newSlotFor(), nextTemp, and slotVar().

◆ popValue()

std::string pascal::CodeGenVisitor::popValue ( )
inlineprivate

Definition at line 626 of file icode.hpp.

References evalStack.

Referenced by eval(), visit(), visit(), visit(), and visit().

◆ pushCmpResult()

void pascal::CodeGenVisitor::pushCmpResult ( const std::string & a,
const std::string & b,
const char * jop )
inlineprivate

Definition at line 681 of file icode.hpp.

References allocReg(), emit1(), emit2(), emitLabel(), freeReg(), isParmReg(), isReg(), newLabel(), and pushValue().

Referenced by visit().

◆ pushFloatCmpResult()

void pascal::CodeGenVisitor::pushFloatCmpResult ( const std::string & aIn,
const std::string & bIn,
const char * jop )
inlineprivate

◆ pushLogicalAnd()

void pascal::CodeGenVisitor::pushLogicalAnd ( const std::string & a,
const std::string & b )
inlineprivate

Definition at line 735 of file icode.hpp.

References allocReg(), emit1(), emit2(), emitLabel(), freeReg(), isParmReg(), isReg(), newLabel(), and pushValue().

Referenced by visit().

◆ pushLogicalOr()

void pascal::CodeGenVisitor::pushLogicalOr ( const std::string & a,
const std::string & b )
inlineprivate

Definition at line 755 of file icode.hpp.

References allocReg(), emit1(), emit2(), emitLabel(), freeReg(), isParmReg(), isReg(), newLabel(), and pushValue().

Referenced by visit().

◆ pushTri()

void pascal::CodeGenVisitor::pushTri ( const char * op,
const std::string & a,
const std::string & b )
inlineprivate

◆ pushValue()

◆ recordLocation()

void pascal::CodeGenVisitor::recordLocation ( const std::string & var,
ValueLocation loc )
inlineprivate

Definition at line 647 of file icode.hpp.

References valueLocations.

Referenced by pascal::IOFunctionHandler::generate(), pushValue(), and visit().

◆ registerExternalFunc()

void pascal::CodeGenVisitor::registerExternalFunc ( const std::string & funcName,
const std::string & unitName )
inline

Register a function or procedure as originating from an external unit.

When generating code for a program that imports units, the compiler needs to emit qualified MXVM object references (e.g. MathUtils.FUNC_Add) for cross-object calls. This method records the mapping so that the code generator can prefix call targets and parameter/return registers with the correct object name.

Parameters
funcNameUnqualified function or procedure name
unitNameName of the unit that defines the function

Definition at line 903 of file icode.hpp.

References externalFuncs, and importedUnitNames.

Referenced by compileFile().

◆ registerImportedConst()

void pascal::CodeGenVisitor::registerImportedConst ( const std::string & unitName,
ConstDeclNode & node )
inline

Register imported constant values from a dependency unit.

Definition at line 914 of file icode.hpp.

References pascal::ConstDeclNode::assignments, compileTimeConstants, ensureFloatConstSymbol(), evaluateConstantExpression(), importedUnitNames, internString(), isRealNumber(), and realConstants.

Referenced by compileFile().

◆ registerImportedVar()

void pascal::CodeGenVisitor::registerImportedVar ( const std::string & unitName,
VarDeclNode & node )
inline

Register imported variable metadata from a dependency unit (no alloc emitted).

Definition at line 940 of file icode.hpp.

References arrayInfo, buildArrayInfoFromNode(), getTypeFromString(), pascal::VarDeclNode::identifiers, importedArrayInfo, importedUnitNames, importedVarTypes, pascal::PTR, setVarType(), and pascal::VarDeclNode::type.

Referenced by compileFile().

◆ releaseTempPtr()

void pascal::CodeGenVisitor::releaseTempPtr ( const std::string & ptrName)
inlineprivate

Definition at line 489 of file icode.hpp.

References allTempPtrs, and tempPtrInUse.

Referenced by freeReg().

◆ resolveTypeName()

◆ setSlotType()

void pascal::CodeGenVisitor::setSlotType ( int slot,
VarType t )
inlineprivate

Definition at line 306 of file icode.hpp.

References slotToType.

Referenced by allocateRecordFieldArrays(), generate(), visit(), visit(), visit(), visit(), visit(), and visit().

◆ setVarType()

void pascal::CodeGenVisitor::setVarType ( const std::string & name,
VarType t )
inlineprivate

Definition at line 305 of file icode.hpp.

References name, and varTypes.

Referenced by generate(), registerImportedVar(), visit(), visit(), visit(), visit(), visit(), and visit().

◆ slotVar()

std::string pascal::CodeGenVisitor::slotVar ( int slot) const
inlineprivate

◆ storageSymbolFor()

std::string pascal::CodeGenVisitor::storageSymbolFor ( const std::string & mangled)
inline

Definition at line 1511 of file icode.hpp.

References slotVar(), and varSlot.

Referenced by visit(), visit(), visit(), and visit().

◆ tryGetConstNumeric()

bool pascal::CodeGenVisitor::tryGetConstNumeric ( const std::string & name,
std::string & out )
inlineprivate

Definition at line 1914 of file icode.hpp.

References compileTimeConstants, findMangledName(), isFloatLiteral(), isIntegerLiteral(), and name.

Referenced by foldNumeric(), and visit().

◆ updateDataSectionInitialValue()

void pascal::CodeGenVisitor::updateDataSectionInitialValue ( const std::string & varName,
const std::string & type,
const std::string & value )
inline

Definition at line 1791 of file icode.hpp.

References constInitialValues.

Referenced by allocateRecordFieldArrays(), visit(), visit(), and visit().

◆ visit() [1/48]

void pascal::CodeGenVisitor::visit ( AddressOfNode & node)
overridevirtual

◆ visit() [2/48]

◆ visit() [3/48]

◆ visit() [4/48]

◆ visit() [5/48]

void pascal::CodeGenVisitor::visit ( ArrayTypeDeclarationNode & node)
overridevirtual

◆ visit() [6/48]

void pascal::CodeGenVisitor::visit ( ArrayTypeNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 1673 of file icode_visit.cpp.

◆ visit() [7/48]

◆ visit() [8/48]

◆ visit() [9/48]

void pascal::CodeGenVisitor::visit ( BlockNode & node)
overridevirtual

◆ visit() [10/48]

void pascal::CodeGenVisitor::visit ( BooleanNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 1544 of file icode_visit.cpp.

References pushValue(), and pascal::BooleanNode::value.

◆ visit() [11/48]

void pascal::CodeGenVisitor::visit ( BreakNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 2516 of file icode_visit.cpp.

References emit1(), and loopEndLabels.

◆ visit() [12/48]

◆ visit() [13/48]

void pascal::CodeGenVisitor::visit ( CompoundStmtNode & node)
overridevirtual

Visit a compound statement block, freeing temporary pointers after each statement.

Snapshots the set of allocated temporary pointers before each statement and emits free instructions for any new temporaries that were not "escaped" (assigned to a named variable). This prevents memory leaks from intermediate string concatenation results and other temporary heap allocations.

Implements pascal::ASTVisitor.

Definition at line 1010 of file icode_visit.cpp.

References allocatedPtrs, declaredProcs, emit(), emit1(), escapedTempPtrs, externalFuncs, findMangledFuncName(), funcSignatures, and pascal::CompoundStmtNode::statements.

◆ visit() [14/48]

◆ visit() [15/48]

void pascal::CodeGenVisitor::visit ( ContinueNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 2522 of file icode_visit.cpp.

References emit1(), and loopContinueLabels.

◆ visit() [16/48]

void pascal::CodeGenVisitor::visit ( EmptyStmtNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 1548 of file icode_visit.cpp.

◆ visit() [17/48]

void pascal::CodeGenVisitor::visit ( EnumTypeDeclNode & node)
overridevirtual

◆ visit() [18/48]

◆ visit() [19/48]

◆ visit() [20/48]

◆ visit() [21/48]

◆ visit() [22/48]

◆ visit() [23/48]

void pascal::CodeGenVisitor::visit ( GotoStmtNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 2597 of file icode_visit.cpp.

References emit1(), gotoLabels, pascal::GotoStmtNode::label, and newLabel().

◆ visit() [24/48]

void pascal::CodeGenVisitor::visit ( IfStmtNode & node)
overridevirtual

◆ visit() [25/48]

void pascal::CodeGenVisitor::visit ( LabelStmtNode & node)
overridevirtual

◆ visit() [26/48]

void pascal::CodeGenVisitor::visit ( NilNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 2528 of file icode_visit.cpp.

References pushValue().

◆ visit() [27/48]

void pascal::CodeGenVisitor::visit ( NumberNode & node)
overridevirtual

◆ visit() [28/48]

◆ visit() [29/48]

◆ visit() [30/48]

void pascal::CodeGenVisitor::visit ( PointerTypeNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 2532 of file icode_visit.cpp.

◆ visit() [31/48]

◆ visit() [32/48]

void pascal::CodeGenVisitor::visit ( ProcDeclNode & node)
overridevirtual

◆ visit() [33/48]

void pascal::CodeGenVisitor::visit ( ProgramNode & node)
overridevirtual

◆ visit() [34/48]

◆ visit() [35/48]

void pascal::CodeGenVisitor::visit ( RecordTypeNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 2319 of file icode_visit.cpp.

◆ visit() [36/48]

void pascal::CodeGenVisitor::visit ( RepeatStmtNode & node)
overridevirtual

◆ visit() [37/48]

void pascal::CodeGenVisitor::visit ( SetLiteralNode & node)
overridevirtual

◆ visit() [38/48]

void pascal::CodeGenVisitor::visit ( SetTypeNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 2652 of file icode_visit.cpp.

◆ visit() [39/48]

void pascal::CodeGenVisitor::visit ( SimpleTypeNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 2478 of file icode_visit.cpp.

◆ visit() [40/48]

void pascal::CodeGenVisitor::visit ( StringNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 1539 of file icode_visit.cpp.

References internString(), pushValue(), and pascal::StringNode::value.

◆ visit() [41/48]

void pascal::CodeGenVisitor::visit ( TypeAliasNode & node)
overridevirtual

◆ visit() [42/48]

void pascal::CodeGenVisitor::visit ( TypeDeclNode & node)
overridevirtual

Implements pascal::ASTVisitor.

Definition at line 2472 of file icode_visit.cpp.

References pascal::TypeDeclNode::typeDeclarations.

◆ visit() [43/48]

◆ visit() [44/48]

◆ visit() [45/48]

◆ visit() [46/48]

◆ visit() [47/48]

void pascal::CodeGenVisitor::visit ( WhileStmtNode & node)
overridevirtual

◆ visit() [48/48]

void pascal::CodeGenVisitor::visit ( WithStmtNode & node)
overridevirtual

◆ writeTo()

void pascal::CodeGenVisitor::writeTo ( std::ostream & out) const
inline

Write the complete MXVM program to a stream.

Parameters
outOutput stream

Emits the program header, module section, data section (registers, variables, string literals, real constants), and code section.

Definition at line 1324 of file icode.hpp.

References allTempPtrs, bufferStringVars, pascal::CHAR, constInitialValues, pascal::DOUBLE, endsWithColon(), escapeStringForMxvm(), floatRegisters, instructions, isPtrReg(), isRegisterSlot(), isTempVar(), isUnit, name, needsEmptyString, nextSlot, objectDeps, prolog, pascal::PTR, ptrRegisters, realConstants, registers, slotToType, slotVar(), pascal::STRING, stringLiterals, tempPtrByScope, usedModules, and usedStrings.

Referenced by compileFile().

◆ FileFunctionHandler

friend class FileFunctionHandler
friend

Definition at line 887 of file icode.hpp.

References FileFunctionHandler.

Referenced by FileFunctionHandler.

◆ IOFunctionHandler

friend class IOFunctionHandler
friend

Definition at line 882 of file icode.hpp.

References IOFunctionHandler.

Referenced by IOFunctionHandler.

◆ MathFunctionHandler

friend class MathFunctionHandler
friend

Definition at line 883 of file icode.hpp.

References MathFunctionHandler.

Referenced by MathFunctionHandler.

◆ SDLFunctionHandler

friend class SDLFunctionHandler
friend

Definition at line 885 of file icode.hpp.

References SDLFunctionHandler.

Referenced by SDLFunctionHandler.

◆ StdFunctionHandler

friend class StdFunctionHandler
friend

Definition at line 884 of file icode.hpp.

References StdFunctionHandler.

Referenced by StdFunctionHandler.

◆ StringFunctionHandler

friend class StringFunctionHandler
friend

Definition at line 886 of file icode.hpp.

References StringFunctionHandler.

Referenced by StringFunctionHandler.

Member Data Documentation

◆ allocatedPtrs

std::unordered_set<std::string> pascal::CodeGenVisitor::allocatedPtrs
private

Definition at line 1794 of file icode.hpp.

Referenced by emit3(), emitFree(), generate(), markAllocatedPtr(), visit(), and visit().

◆ allTempPtrs

std::vector<std::string> pascal::CodeGenVisitor::allTempPtrs
private

Definition at line 205 of file icode.hpp.

Referenced by allocTempPtr(), freeTempPtr(), isTempPtr(), releaseTempPtr(), and writeTo().

◆ arrayInfo

std::unordered_map<std::string, ArrayInfo> pascal::CodeGenVisitor::arrayInfo
private

◆ bufferStringVars

std::map<std::string, size_t> pascal::CodeGenVisitor::bufferStringVars
private

Definition at line 202 of file icode.hpp.

Referenced by writeTo().

◆ builtinRegistry

BuiltinFunctionRegistry pascal::CodeGenVisitor::builtinRegistry

registry of built-in function handlers

Definition at line 889 of file icode.hpp.

Referenced by getExpressionType(), initializeBuiltins(), visit(), and visit().

◆ compileTimeConstants

std::unordered_map<std::string, std::string> pascal::CodeGenVisitor::compileTimeConstants
private

◆ constInitialValues

std::map<std::string, std::pair<std::string, std::string> > pascal::CodeGenVisitor::constInitialValues
private

Definition at line 201 of file icode.hpp.

Referenced by updateDataSectionInitialValue(), and writeTo().

◆ currentFuncLocalSlots

std::vector<std::string> pascal::CodeGenVisitor::currentFuncLocalSlots
private

Definition at line 334 of file icode.hpp.

Referenced by generate(), visit(), visit(), and visit().

◆ currentFunctionName

std::string pascal::CodeGenVisitor::currentFunctionName
private

Definition at line 332 of file icode.hpp.

Referenced by generate(), getCurrentEndLabel(), visit(), visit(), visit(), and visit().

◆ currentFunctionReturnSlot

std::string pascal::CodeGenVisitor::currentFunctionReturnSlot
private

slot variable that holds the return value until FUNC_END

Definition at line 333 of file icode.hpp.

Referenced by generate(), visit(), and visit().

◆ currentParamLocations

std::map<std::string, std::string> pascal::CodeGenVisitor::currentParamLocations
private

Definition at line 203 of file icode.hpp.

Referenced by generate(), visit(), and visit().

◆ currentParamTypes

std::unordered_map<std::string, std::string> pascal::CodeGenVisitor::currentParamTypes
private

Definition at line 183 of file icode.hpp.

Referenced by generate(), getVarRecordTypeName(), getVarRecordTypeNameFromExpr(), and visit().

◆ declaredFuncs

std::unordered_map<std::string, bool> pascal::CodeGenVisitor::declaredFuncs
private

Definition at line 350 of file icode.hpp.

Referenced by findMangledFuncName(), generate(), getCurrentEndLabel(), and visit().

◆ declaredProcs

std::unordered_map<std::string, bool> pascal::CodeGenVisitor::declaredProcs
private

Definition at line 349 of file icode.hpp.

Referenced by findMangledFuncName(), getCurrentEndLabel(), visit(), and visit().

◆ deferredFuncs

std::vector<std::pair<FuncDeclNode *, std::vector<std::string> > > pascal::CodeGenVisitor::deferredFuncs
private

Definition at line 331 of file icode.hpp.

Referenced by generate(), getCurrentScopeName(), and visit().

◆ deferredProcs

std::vector<std::pair<ProcDeclNode *, std::vector<std::string> > > pascal::CodeGenVisitor::deferredProcs
private

Definition at line 204 of file icode.hpp.

Referenced by generate(), and visit().

◆ dynArrayLenSlot

std::unordered_map<std::string, int> pascal::CodeGenVisitor::dynArrayLenSlot
private

mangled array name → slot of companion length variable

Definition at line 1800 of file icode.hpp.

Referenced by visit(), visit(), visit(), visit(), and visit().

◆ enumConstants

std::unordered_map<std::string, int> pascal::CodeGenVisitor::enumConstants

Enum value → ordinal mapping (lowercased name → integer).

Definition at line 1492 of file icode.hpp.

Referenced by visit().

◆ enumTypes

std::unordered_map<std::string, std::vector<std::string> > pascal::CodeGenVisitor::enumTypes

Enum type name → ordered list of value names.

Definition at line 1494 of file icode.hpp.

Referenced by visit().

◆ escapedTempPtrs

std::unordered_set<std::string> pascal::CodeGenVisitor::escapedTempPtrs
private

Definition at line 1795 of file icode.hpp.

Referenced by generate(), visit(), and visit().

◆ evalStack

std::vector<std::string> pascal::CodeGenVisitor::evalStack
private

Definition at line 343 of file icode.hpp.

Referenced by eval(), popValue(), and pushValue().

◆ externalFuncs

std::unordered_map<std::string, std::string> pascal::CodeGenVisitor::externalFuncs
private

maps function/proc name to source unit name

Definition at line 187 of file icode.hpp.

Referenced by registerExternalFunc(), visit(), visit(), visit(), visit(), and visit().

◆ fileVarNames

std::unordered_map<std::string, std::string> pascal::CodeGenVisitor::fileVarNames

Maps file variable name to companion filename variable name.

Definition at line 1500 of file icode.hpp.

Referenced by pascal::FileFunctionHandler::generate(), and visit().

◆ fileVars

std::unordered_set<std::string> pascal::CodeGenVisitor::fileVars

Set of variable names that are file types (pointer to FILE).

Definition at line 1498 of file icode.hpp.

Referenced by pascal::IOFunctionHandler::generate(), and visit().

◆ floatRegInUse

std::vector<bool> pascal::CodeGenVisitor::floatRegInUse
private

◆ floatRegisters

std::vector<std::string> pascal::CodeGenVisitor::floatRegisters
private

◆ funcSignatures

std::unordered_map<std::string, FuncInfo> pascal::CodeGenVisitor::funcSignatures
private

Definition at line 269 of file icode.hpp.

Referenced by getExpressionType(), visit(), visit(), visit(), visit(), visit(), and visit().

◆ functionScopedArrays

std::unordered_map<std::string, std::vector<std::string> > pascal::CodeGenVisitor::functionScopedArrays
private

Definition at line 192 of file icode.hpp.

Referenced by allocateRecordFieldArrays(), generate(), visit(), and visit().

◆ functionSetReturn

bool pascal::CodeGenVisitor::functionSetReturn = false
private

Definition at line 335 of file icode.hpp.

Referenced by generate(), visit(), and visit().

◆ generatingDeferredCode

bool pascal::CodeGenVisitor::generatingDeferredCode = false
private

Definition at line 351 of file icode.hpp.

Referenced by generate(), getCurrentScopeName(), and visit().

◆ globalArrays

std::vector<std::string> pascal::CodeGenVisitor::globalArrays
private

Definition at line 191 of file icode.hpp.

Referenced by allocateRecordFieldArrays(), generate(), visit(), and visit().

◆ gotoLabels

std::unordered_map<std::string, std::string> pascal::CodeGenVisitor::gotoLabels
private

Maps user-declared goto label numbers to generated MXVM labels.

Definition at line 2148 of file icode.hpp.

Referenced by visit(), and visit().

◆ importedArrayInfo

std::unordered_map<std::string, ArrayInfo> pascal::CodeGenVisitor::importedArrayInfo
private

array metadata for imported unit vars

Definition at line 189 of file icode.hpp.

Referenced by generate(), and registerImportedVar().

◆ importedUnitNames

std::unordered_set<std::string> pascal::CodeGenVisitor::importedUnitNames
private

names of units imported via uses clause

Definition at line 188 of file icode.hpp.

Referenced by isImportedUnit(), registerExternalFunc(), registerImportedConst(), and registerImportedVar().

◆ importedVarTypes

std::unordered_map<std::string, VarType> pascal::CodeGenVisitor::importedVarTypes
private

var types for imported unit vars

Definition at line 190 of file icode.hpp.

Referenced by generate(), and registerImportedVar().

◆ instructions

std::vector<std::string> pascal::CodeGenVisitor::instructions
private

Definition at line 342 of file icode.hpp.

Referenced by emit(), emit3(), emitLabel(), generate(), and writeTo().

◆ isUnit

bool pascal::CodeGenVisitor::isUnit = false
private

true when generating code for a unit (object output)

Definition at line 186 of file icode.hpp.

Referenced by generate(), visit(), and writeTo().

◆ labelCounter

int pascal::CodeGenVisitor::labelCounter = 0
private

Definition at line 338 of file icode.hpp.

Referenced by newLabel().

◆ loopContinueLabels

std::vector<std::string> pascal::CodeGenVisitor::loopContinueLabels
private

Definition at line 2143 of file icode.hpp.

Referenced by visit(), visit(), visit(), and visit().

◆ loopEndLabels

std::vector<std::string> pascal::CodeGenVisitor::loopEndLabels
private

Definition at line 2142 of file icode.hpp.

Referenced by visit(), visit(), visit(), and visit().

◆ name

std::string pascal::CodeGenVisitor::name = "App"

◆ needsEmptyString

bool pascal::CodeGenVisitor::needsEmptyString = false
private

Definition at line 273 of file icode.hpp.

Referenced by emptyString(), and writeTo().

◆ nextFloatRegIndex

int pascal::CodeGenVisitor::nextFloatRegIndex = 0
private

Definition at line 321 of file icode.hpp.

◆ nextSlot

int pascal::CodeGenVisitor::nextSlot = 0
private

Definition at line 336 of file icode.hpp.

Referenced by newSlotFor(), and writeTo().

◆ nextSpillReg

int pascal::CodeGenVisitor::nextSpillReg = 0
private

Definition at line 315 of file icode.hpp.

Referenced by allocReg().

◆ nextTemp

int pascal::CodeGenVisitor::nextTemp = 0
private

Definition at line 337 of file icode.hpp.

Referenced by allocTempPtr(), and newTemp().

◆ objectDeps

std::vector<std::string> pascal::CodeGenVisitor::objectDeps
private

unit/object dependencies for section object

Definition at line 185 of file icode.hpp.

Referenced by generate(), visit(), visit(), and writeTo().

◆ pointerBaseType

std::unordered_map<std::string, std::string> pascal::CodeGenVisitor::pointerBaseType
private

Definition at line 2003 of file icode.hpp.

Referenced by generate(), getPointerBaseTypeName(), and visit().

◆ prolog

std::vector<std::string> pascal::CodeGenVisitor::prolog
private

Definition at line 341 of file icode.hpp.

Referenced by generate(), visit(), and writeTo().

◆ ptrRegInUse

std::vector<bool> pascal::CodeGenVisitor::ptrRegInUse
private

Definition at line 329 of file icode.hpp.

Referenced by CodeGenVisitor(), allocPtrReg(), freePtrReg(), and generate().

◆ ptrRegisters

const std::vector<std::string> pascal::CodeGenVisitor::ptrRegisters
private
Initial value:
= {
"arg0", "arg1", "arg2", "arg3", "arg4", "arg5", "arg6", "arg7", "arg8", "arg9"}

Definition at line 317 of file icode.hpp.

Referenced by CodeGenVisitor(), allocPtrReg(), freePtrReg(), generate(), isParmReg(), isPtrReg(), visit(), visit(), and writeTo().

◆ realConstantCounter

int pascal::CodeGenVisitor::realConstantCounter = 0
private

Definition at line 182 of file icode.hpp.

Referenced by generateRealConstantName().

◆ realConstants

std::unordered_map<std::string, std::string> pascal::CodeGenVisitor::realConstants
private

◆ recordsToFreeInScope

std::unordered_map<std::string, std::vector<std::string> > pascal::CodeGenVisitor::recordsToFreeInScope
private

Definition at line 347 of file icode.hpp.

Referenced by generate(), and visit().

◆ recordTypes

◆ regInUse

std::vector<bool> pascal::CodeGenVisitor::regInUse
private

Definition at line 328 of file icode.hpp.

Referenced by CodeGenVisitor(), allocReg(), freeReg(), generate(), visit(), and visit().

◆ registers

std::vector<std::string> pascal::CodeGenVisitor::registers = {"rax", "rbx", "rcx", "rdx", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}
private

◆ scopeHierarchy

std::vector<std::string> pascal::CodeGenVisitor::scopeHierarchy
private

◆ scopeStack

std::vector<Scope> pascal::CodeGenVisitor::scopeStack
private

Definition at line 199 of file icode.hpp.

Referenced by generate().

◆ setVars

std::unordered_set<std::string> pascal::CodeGenVisitor::setVars

Set of variable names that are set types (allocated as 256-byte bitsets).

Definition at line 1496 of file icode.hpp.

Referenced by visit(), visit(), and visit().

◆ slotToName

std::unordered_map<int, std::string> pascal::CodeGenVisitor::slotToName
private

Definition at line 346 of file icode.hpp.

Referenced by newSlotFor(), and slotVar().

◆ slotToType

std::unordered_map<int, VarType> pascal::CodeGenVisitor::slotToType
private

Definition at line 271 of file icode.hpp.

Referenced by ensurePtrBase(), getVarType(), setSlotType(), and writeTo().

◆ stringLiterals

std::vector<std::pair<std::string, std::string> > pascal::CodeGenVisitor::stringLiterals
private

Definition at line 344 of file icode.hpp.

Referenced by internString(), and writeTo().

◆ tempPtrByScope

std::unordered_map<std::string, std::vector<std::string> > pascal::CodeGenVisitor::tempPtrByScope
private

Definition at line 348 of file icode.hpp.

Referenced by addTempPtr(), allocTempPtr(), generate(), and writeTo().

◆ tempPtrInUse

std::vector<bool> pascal::CodeGenVisitor::tempPtrInUse
private

Definition at line 206 of file icode.hpp.

Referenced by allocTempPtr(), freeTempPtr(), and releaseTempPtr().

◆ typeAliases

std::unordered_map<std::string, std::string> pascal::CodeGenVisitor::typeAliases
private

◆ usedModules

◆ usedRealConstants

std::unordered_set<std::string> pascal::CodeGenVisitor::usedRealConstants
private

Definition at line 181 of file icode.hpp.

Referenced by ensureFloatConstSymbol(), generate(), and pushFloatCmpResult().

◆ usedStrings

std::unordered_set<std::string> pascal::CodeGenVisitor::usedStrings
private

Definition at line 345 of file icode.hpp.

Referenced by generate(), pascal::IOFunctionHandler::generate(), and writeTo().

◆ valueLocations

std::unordered_map<std::string, ValueLocation> pascal::CodeGenVisitor::valueLocations
private

Definition at line 366 of file icode.hpp.

Referenced by generate(), and recordLocation().

◆ varRecordType

std::unordered_map<std::string, std::string> pascal::CodeGenVisitor::varRecordType
private

◆ varSlot

std::unordered_map<std::string, int> pascal::CodeGenVisitor::varSlot
private

◆ varTypes

std::unordered_map<std::string, VarType> pascal::CodeGenVisitor::varTypes
private

Definition at line 270 of file icode.hpp.

Referenced by generate(), getVarType(), and setVarType().

◆ withFieldScopes

std::vector<std::unordered_map<std::string, std::string> > pascal::CodeGenVisitor::withFieldScopes
private

Stack of active with scopes: each entry maps unqualified field name -> record variable name.

Definition at line 2146 of file icode.hpp.

Referenced by visit(), visit(), and visit().


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