From 0fef2986daa2945c9e3d050c0f750d56792b30bd Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sun, 26 Jul 2026 17:13:15 +0000 Subject: refactor: groundwork for TYPE — sizeof constants, string guard, array scoping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Element sizes now flow as target-folded null-GEP sizeof constants (TypeSystem::getSizeOfConstant); the module has no DataLayout string, so host-side size math would diverge from the backend on padded structs. - Extract the triplicated STRING null->"" select into CodeGen::emitStringNullGuard. - Scope ArrayTable per function via ArrayHandler::exchangeTable, mirroring the Symbols save/clear/restore discipline. - Promote checked element addressing to public ArrayHandler::emitElementAddress for the upcoming lvalue layer. Co-Authored-By: Claude Fable 5 --- include/cps/ArrayHandler.h | 18 +++++++++++++++++- include/cps/CodeGen.h | 3 +++ include/cps/TypeSystem.h | 5 +++++ 3 files changed, 25 insertions(+), 1 deletion(-) (limited to 'include') diff --git a/include/cps/ArrayHandler.h b/include/cps/ArrayHandler.h index 6e2c015..e4ccc51 100644 --- a/include/cps/ArrayHandler.h +++ b/include/cps/ArrayHandler.h @@ -16,7 +16,7 @@ struct ArrayMetadata { int Rank = 0; std::string ElementTypeName; llvm::Type *ElementType = nullptr; - uint64_t ElementSize = 0; + llvm::Constant *ElementSizeC = nullptr; // i64 sizeof constant (target-folded) std::vector LowerBounds; std::vector UpperBounds; std::vector Multipliers; @@ -67,6 +67,22 @@ public: llvm::Value *emitArrayAccess(ArrayAccessExprAST *Expr, CodeGen &CG); bool tryEmitArrayOutput(ExprAST *Expr, CodeGen &CG); + + // Full-rank checked element address (bounds checks included); reports the + // element type name through ElemTypeNameOut. The lvalue layer builds + // field/deref accesses on top of this. + llvm::Value *emitElementAddress(const std::string &Name, + const std::vector> &IndexExprs, + int Line, + CodeGen &CG, + std::string &ElemTypeNameOut); + llvm::Value *emitElementAddress(ArrayAccessExprAST *Expr, + CodeGen &CG, + std::string &ElemTypeNameOut); + + // Swap in a fresh table (function bodies get their own scope, mirroring + // the Symbols save/clear/restore discipline); returns the previous table. + std::map exchangeTable(std::map NewTable); }; } // namespace cps diff --git a/include/cps/CodeGen.h b/include/cps/CodeGen.h index 43d3a32..2451cbd 100644 --- a/include/cps/CodeGen.h +++ b/include/cps/CodeGen.h @@ -87,6 +87,9 @@ public: llvm::Value *emitExpr(ExprAST *Expr); void emitStmt(StmtAST *Stmt); + // STRING slots zero-init to null; normalize null to "" at load/print sites. + llvm::Value *emitStringNullGuard(llvm::Value *StrVal); + const TypeInfo *resolveType(const std::string &TypeName) const; llvm::Type *getLLVMType(const std::string &TypeName) const; llvm::Value *getNamedValue(const std::string &Name) const; diff --git a/include/cps/TypeSystem.h b/include/cps/TypeSystem.h index 32c348f..14a21bd 100644 --- a/include/cps/TypeSystem.h +++ b/include/cps/TypeSystem.h @@ -66,6 +66,11 @@ public: llvm::Type *getLLVMType(const std::string &TypeName) const; uint64_t getElementSize(const std::string &TypeName) const; llvm::Constant *getZeroValue(const std::string &TypeName) const; + + // Target-independent sizeof: a null-GEP+ptrtoint i64 constant the backend + // folds with the *real* target's DataLayout. The module carries no + // DataLayout string, so sizes must never be computed host-side. + llvm::Constant *getSizeOfConstant(llvm::Type *Ty) const; }; } // namespace cps -- cgit v1.3.1-4-g156e