aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/ArrayHandler.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-22 03:41:33 +0000
committer_ov4 <ov4@ov4.org>2026-10-22 03:58:26 +0000
commit91e506e404c0d285ec1ec77196e83248c8c77161 (patch)
treeadffdea64cc44d59f234293a7fb83a09abb92022 /lib/CodeGen/ArrayHandler.cc
parent0798836375047a051ad4bffa500e8e819fd51c5e (diff)
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 <noreply@anthropic.com>
Diffstat (limited to 'lib/CodeGen/ArrayHandler.cc')
-rw-r--r--lib/CodeGen/ArrayHandler.cc33
1 files changed, 20 insertions, 13 deletions
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<int>(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<Value*> 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<Value*> Lows,
+ std::vector<Value*> Highs,
+ Value *&TotalElements) {
+ std::vector<Value*> Multipliers;
+ computeDimsAndMultipliers(Name, Lows, Highs, Multipliers, TotalElements);
+
+ ArrayMetadata Meta;
+ Meta.Rank = static_cast<int>(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<Value*> &Lows,
const std::vector<Value*> &Highs,