From 91e506e404c0d285ec1ec77196e83248c8c77161 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Thu, 22 Oct 2026 03:41:33 +0000 Subject: refactor(codegen): share array metadata registration DECLARE and array-parameter binding both computed the dimension multipliers, filled the same ArrayMetadata and stored it in ArrayTable. Move that into a private ArrayHandler::defineMetadata helper that also yields the total element count. Co-Authored-By: Claude Opus 5.5 --- lib/CodeGen/ArrayHandler.cc | 33 ++++++++++++++++++++------------- lib/CodeGen/ArrayParameters.cc | 13 +------------ 2 files changed, 21 insertions(+), 25 deletions(-) (limited to 'lib') diff --git a/lib/CodeGen/ArrayHandler.cc b/lib/CodeGen/ArrayHandler.cc index bfe6a78..de07ff7 100644 --- a/lib/CodeGen/ArrayHandler.cc +++ b/lib/CodeGen/ArrayHandler.cc @@ -78,7 +78,6 @@ Value *ArrayHandler::getElementPointer(const std::string &Name, Value *Offset) { void ArrayHandler::emitArrayDeclare(ArrayDeclareStmtAST *Stmt, CodeGen &CG) { std::string Name = Stmt->getName(); - int Rank = static_cast(Stmt->getBounds().size()); const TypeInfo *ElemInfo = Types.resolve(Stmt->getType()); if (!ElemInfo || !ElemInfo->LLVMType || ElemInfo->isVoid()) { @@ -113,19 +112,9 @@ void ArrayHandler::emitArrayDeclare(ArrayDeclareStmtAST *Stmt, CodeGen &CG) { Highs.push_back(R); } - std::vector Multipliers; Value *TotalElements = nullptr; - computeDimsAndMultipliers(Name, Lows, Highs, Multipliers, TotalElements); - - ArrayMetadata Meta; - Meta.Rank = Rank; - Meta.ElementTypeName = ElemInfo->Name; - Meta.ElementType = ElemInfo->LLVMType; - Meta.ElementSizeC = Types.getSizeOfConstant(ElemInfo->LLVMType); - Meta.LowerBounds = std::move(Lows); - Meta.UpperBounds = std::move(Highs); - Meta.Multipliers = std::move(Multipliers); - ArrayTable[Name] = Meta; + const ArrayMetadata &Meta = + defineMetadata(Name, ElemInfo, std::move(Lows), std::move(Highs), TotalElements); Value *TotalBytes = Builder->CreateMul(TotalElements, Meta.ElementSizeC, Name + "_total_bytes"); CallInst *Ptr = Builder->CreateCall(MallocFunc, TotalBytes, Name + "_malloc"); @@ -161,6 +150,24 @@ void ArrayHandler::emitArrayDeclare(ArrayDeclareStmtAST *Stmt, CodeGen &CG) { CG.activateStackObject(Lifetime, TotalElements); } +const ArrayMetadata &ArrayHandler::defineMetadata(const std::string &Name, const TypeInfo *ElemInfo, + std::vector Lows, + std::vector Highs, + Value *&TotalElements) { + std::vector Multipliers; + computeDimsAndMultipliers(Name, Lows, Highs, Multipliers, TotalElements); + + ArrayMetadata Meta; + Meta.Rank = static_cast(Lows.size()); + Meta.ElementTypeName = ElemInfo->Name; + Meta.ElementType = ElemInfo->LLVMType; + Meta.ElementSizeC = Types.getSizeOfConstant(ElemInfo->LLVMType); + Meta.LowerBounds = std::move(Lows); + Meta.UpperBounds = std::move(Highs); + Meta.Multipliers = std::move(Multipliers); + return ArrayTable[Name] = std::move(Meta); +} + void ArrayHandler::computeDimsAndMultipliers(const std::string &Name, const std::vector &Lows, const std::vector &Highs, diff --git a/lib/CodeGen/ArrayParameters.cc b/lib/CodeGen/ArrayParameters.cc index 4f2d54d..57cf6dd 100644 --- a/lib/CodeGen/ArrayParameters.cc +++ b/lib/CodeGen/ArrayParameters.cc @@ -21,19 +21,8 @@ void ArrayHandler::bindArrayParameter(const std::string &Name, return; } - std::vector Multipliers; Value *TotalElements = nullptr; - computeDimsAndMultipliers(Name, LBs, UBs, Multipliers, TotalElements); - - ArrayMetadata Meta; - Meta.Rank = static_cast(LBs.size()); - Meta.ElementTypeName = ElemInfo->Name; - Meta.ElementType = ElemInfo->LLVMType; - Meta.ElementSizeC = Types.getSizeOfConstant(ElemInfo->LLVMType); - Meta.LowerBounds = LBs; - Meta.UpperBounds = UBs; - Meta.Multipliers = std::move(Multipliers); - ArrayTable[Name] = Meta; + const ArrayMetadata &Meta = defineMetadata(Name, ElemInfo, LBs, UBs, TotalElements); Value *Ptr = DataPtr; if (MakeCopy) { -- cgit v1.3.1-4-g156e