4242#include < bcl/utility.h>
4343#include < llvm/Pass.h>
4444#include < stack>
45+ #include < iostream>
4546
4647using namespace clang ;
4748using 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