Skip to content

Commit acc7714

Browse files
committed
add auto size determination for arrays
1 parent 9c89fc2 commit acc7714

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

lib/Transform/Clang/RemoveFirstPrivate.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include <bcl/utility.h>
4343
#include <llvm/Pass.h>
4444
#include <stack>
45+
#include <iostream>
4546

4647
using namespace clang;
4748
using namespace llvm;
@@ -50,14 +51,18 @@ using namespace tsar;
5051
#undef DEBUG_TYPE
5152
#define DEBUG_TYPE "clang-rfp"
5253

53-
static int getDimensionsNum(QualType qt) {
54+
static int getDimensionsNum(QualType qt, std::vector<int>& default_dimensions) {
5455
int res = 0;
5556
if (qt -> isPointerType()) { // todo: multidimensional dynamyc-sized arrays
5657
return 1;
5758
}
5859
while(1) {
5960
if (qt -> isArrayType()) {
6061
auto at = qt->getAsArrayTypeUnsafe();
62+
if (auto t = dyn_cast_or_null<ConstantArrayType>(at)) { // get size
63+
uint64_t dim = t -> getSize().getLimitedValue();
64+
default_dimensions.push_back(dim);
65+
}
6166
qt = at -> getElementType();
6267
res++;
6368
} else {
@@ -84,9 +89,9 @@ struct vars { // contains information about variables in
8489
bool rvalIsArray = false; // removefirstprivate clause
8590
std::string lvalName;
8691
std::string rvalName;
87-
std::string count = "";
8892
int dimensionsNum;
8993
std::vector<int> dimensions;
94+
std::vector<int> default_dimensions;
9095
};
9196
}
9297

@@ -136,14 +141,14 @@ class DeclVisitor : public RecursiveASTVisitor<DeclVisitor> {
136141
std::string txtStr, beforeFor, forBody, lval, rval, indeces;
137142
std::vector<std::string> inits;
138143
while (varStack.size()) {
139-
for (std::vector<int>::iterator it = varStack.top().dimensions.begin();
140-
it != varStack.top().dimensions.end();
141-
it ++) {
142-
}
143144
if (varStack.top().dimensionsNum) { // lvalue is array
144-
if (varStack.top().count.empty()) {
145-
varStack.pop();
146-
continue; // count is mandatory for arrays, skip initialization if no count found
145+
if (varStack.top().dimensions.size() < varStack.top().dimensionsNum) {
146+
if (varStack.top().default_dimensions.size() == varStack.top().dimensionsNum) {
147+
varStack.top().dimensions = varStack.top().default_dimensions;
148+
} else {
149+
varStack.pop();
150+
continue; // dimensions ar mandatory for arrays, skip
151+
} // initialization if no dimensions found
147152
}
148153
forBody = std::string();
149154
indeces = std::string();
@@ -209,7 +214,6 @@ class DeclVisitor : public RecursiveASTVisitor<DeclVisitor> {
209214
if (waitingForDimensions && curDimensionNum == varStack.top().dimensionsNum) {
210215
waitingForDimensions = false;
211216
curDimensionNum = 0;
212-
213217
}
214218
if (auto *Var{dyn_cast<VarDecl>(Ex->getDecl())}) {
215219
varName = Var -> getName();
@@ -221,8 +225,8 @@ class DeclVisitor : public RecursiveASTVisitor<DeclVisitor> {
221225
vars tmp;
222226

223227
tmp.lvalName = varName;
224-
tmp.dimensionsNum = getDimensionsNum(qt);
225228
varStack.push(tmp);
229+
varStack.top().dimensionsNum = getDimensionsNum(qt, varStack.top().default_dimensions);
226230
} else { // get rvalue
227231
ValueDecl *vd = Ex -> getDecl();
228232
QualType qt = vd -> getType();
@@ -244,12 +248,15 @@ class DeclVisitor : public RecursiveASTVisitor<DeclVisitor> {
244248
bool TraverseIntegerLiteral(IntegerLiteral *IL) {
245249

246250
if (isInPragma) {
251+
if (waitingForDimensions && curDimensionNum == varStack.top().dimensionsNum) {
252+
waitingForDimensions = false;
253+
curDimensionNum = 0;
254+
}
247255
int val = IL -> getValue().getLimitedValue();
248256
if (waitingForDimensions) {
249257
if (varStack.size()) {
250258
varStack.top().dimensions.push_back(val);
251259
curDimensionNum++;
252-
varStack.top().count = std::to_string(val);
253260
}
254261
} else if (!waitingForVar) { // get rvalue
255262
varStack.top().rvalName = std::to_string(val);

0 commit comments

Comments
 (0)