aboutsummaryrefslogtreecommitdiff
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
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>
-rw-r--r--include/cps/ArrayHandler.h5
-rw-r--r--lib/CodeGen/ArrayHandler.cc33
-rw-r--r--lib/CodeGen/ArrayParameters.cc13
3 files changed, 26 insertions, 25 deletions
diff --git a/include/cps/ArrayHandler.h b/include/cps/ArrayHandler.h
index 8ba631f..a09e708 100644
--- a/include/cps/ArrayHandler.h
+++ b/include/cps/ArrayHandler.h
@@ -47,6 +47,11 @@ class ArrayHandler {
const std::vector<llvm::Value*> &Highs,
std::vector<llvm::Value*> &Multipliers,
llvm::Value *&TotalElements);
+ // Computes the bounds math, then fills and registers Name's metadata.
+ const ArrayMetadata &defineMetadata(const std::string &Name, const TypeInfo *ElemInfo,
+ std::vector<llvm::Value*> Lows,
+ std::vector<llvm::Value*> Highs,
+ llvm::Value *&TotalElements);
bool emitCheckedIndices(const std::string &Name,
const std::vector<std::unique_ptr<ExprAST>> &IndexExprs,
int Line,
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,
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<Value*> Multipliers;
Value *TotalElements = nullptr;
- computeDimsAndMultipliers(Name, LBs, UBs, Multipliers, TotalElements);
-
- ArrayMetadata Meta;
- Meta.Rank = static_cast<int>(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) {