aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/ArrayHandler.cc33
-rw-r--r--lib/CodeGen/ArrayParameters.cc13
2 files changed, 21 insertions, 25 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,
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) {