1- // === DeadDeclsElimination .cpp - Dead Decls Elimination (Clang) --*- C++ -*===//
1+ // === RemoveFirstPrivate .cpp - RFP (Clang) --*- C++ -*===//
22//
33// Traits Static Analyzer (SAPFOR)
44//
@@ -60,14 +60,43 @@ INITIALIZE_PASS_IN_GROUP_END(ClangRemoveFirstPrivate, "remove-firstprivate",
6060 " Initialize variables in for" , false , false ,
6161 TransformationQueryManager::getPassRegistry ())
6262
63+
64+ bool isNameOfArray(std::string type) {
65+ if (type.find (' [' ) != std::string::npos || type.find (' *' ) != std::string::npos) {
66+ return true ;
67+ }
68+ return false ;
69+ }
70+
71+ void replaceSqrBrWithAsterisk (std::string &str) {
72+ size_t openingSqrBracket = str.find (" [" );
73+ size_t closingSqrBracket = str.find (" ]" );
74+ str.erase (openingSqrBracket, closingSqrBracket - openingSqrBracket + 1 );
75+ str += " *" ;
76+ }
77+
78+ struct vars { // contains information about variables in
79+ std::string var1Type; // removefirstprivate clause
80+ std::string var2Type;
81+ std::string var1Name;
82+ std::string var2Name;
83+ std::string count = " " ;
84+ };
85+
6386namespace {
6487
6588class DeclVisitor : public RecursiveASTVisitor <DeclVisitor> {
89+
90+ std::string getStrByLoc (SourceLocation begin, SourceLocation end) {
91+ SourceRange SR (begin, end);
92+ CharSourceRange CSR (SR, true );
93+ return mRewriter .getRewrittenText (CSR);
94+ }
95+
6696 struct DeclarationInfo {
6797 DeclarationInfo (Stmt *S) : Scope(S) {}
6898
6999 Stmt *Scope;
70- SmallVector<Stmt *, 16 > DeadAccesses;
71100 };
72101public:
73102 explicit DeclVisitor (TransformationContext &TfmCtx, const ASTImportInfo &ImportInfo,
@@ -92,18 +121,37 @@ class DeclVisitor : public RecursiveASTVisitor<DeclVisitor> {
92121 ast = RecursiveASTVisitor::TraverseStmt (S);
93122 isInPragma = false ;
94123
95-
96- std::string txtStr;
124+ std::string txtStr, beforeFor, forBody, type1, type2;
97125 std::vector<std::string> inits;
98- while (starts.size ()) {
99- SourceRange toInsert (starts.top (), ends.top ());
100- CharSourceRange txtToInsert (toInsert, true );
101- starts.pop ();
102- ends.pop ();
103-
104- txtStr = mRewriter .getRewrittenText (txtToInsert);
105- txtStr += " ;\n " ;
126+ while (varStack.size ()) {
127+ if (isNameOfArray (varStack.top ().var1Type )) {
128+ if (varStack.top ().count .empty ()) {
129+ varStack.pop ();
130+ continue ; // count is mandatory for arrays, skip initialization if no count found
131+ }
132+ type1 = varStack.top ().var1Type ;
133+ type2 = varStack.top ().var2Type ;
134+ if (type1.find (' [' ) != std::string::npos) {
135+ replaceSqrBrWithAsterisk (type1);
136+ }
137+ if (type2.find (' [' ) != std::string::npos) {
138+ replaceSqrBrWithAsterisk (type2);
139+ }
140+ if (isNameOfArray (varStack.top ().var2Type )) { // arr1 = arr2
141+ beforeFor = type1 + " var1Ptr" + " = " + varStack.top ().var1Name + " ;\n " +
142+ type2 + " var2Ptr" + " = " + varStack.top ().var2Name + " ;\n " ;
143+ forBody = " var1Ptr[i] = var2Ptr[i];\n " ;
144+ } else { // arr1 = val
145+ beforeFor = type1 + " var1Ptr" + " = " + varStack.top ().var1Name + " ;\n " ;
146+ forBody = " var1Ptr[i] = " + varStack.top ().var2Name + " ;\n " ;
147+ }
148+ txtStr = beforeFor;
149+ txtStr += " for (int i = 0; i < " + varStack.top ().count + " ; i++) {\n " + forBody + " \n }\n " ;
150+ } else { // Initialize non-array variable
151+ txtStr = varStack.top ().var1Name + " = " + varStack.top ().var2Name + " ;\n " ;
152+ }
106153 inits.push_back (txtStr);
154+ varStack.pop ();
107155 }
108156
109157 llvm::SmallVector<clang::CharSourceRange, 8 > ToRemove;
@@ -135,19 +183,41 @@ class DeclVisitor : public RecursiveASTVisitor<DeclVisitor> {
135183 }
136184
137185 bool TraverseDeclRefExpr (clang::DeclRefExpr *Ex) {
138- NamedDecl *named = nullptr ;
139186 if (isInPragma) {
140-
187+ std::string varName = getStrByLoc (Ex -> getBeginLoc (), Ex -> getEndLoc ());
141188 if (waitingForVar) {
142- starts.push (Ex -> getLocation ());
189+ ValueDecl *vd = Ex -> getDecl ();
190+ QualType qt = vd -> getType ();
191+ std::string typeStr = qt.getCanonicalType ().getAsString ();
192+
193+ vars tmp;
194+ tmp.var1Type = typeStr;
195+ tmp.var1Name = varName;
196+ varStack.push (tmp);
197+
143198 } else {
144- ends.push (Ex -> getLocation ());
199+
200+ ValueDecl *vd = Ex -> getDecl ();
201+ QualType qt = vd -> getType ();
202+ std::string typeStr = qt.getCanonicalType ().getAsString ();
203+ varStack.top ().var2Type = typeStr;
204+ varStack.top ().var2Name = varName;
205+
145206 }
146207 waitingForVar = !waitingForVar;
147208 }
148209 return RecursiveASTVisitor::TraverseDeclRefExpr (Ex);
149210 }
150211
212+ bool TraverseIntegerLiteral (IntegerLiteral *IL) {
213+ if (isInPragma && waitingForVar) {
214+ if (varStack.size ()) {
215+ varStack.top ().count = getStrByLoc (IL -> getBeginLoc (), IL -> getEndLoc ());
216+ }
217+ }
218+ return RecursiveASTVisitor::TraverseIntegerLiteral (IL);
219+ }
220+
151221#ifdef LLVM_DEBUG
152222// debug info
153223#endif
@@ -163,12 +233,7 @@ class DeclVisitor : public RecursiveASTVisitor<DeclVisitor> {
163233
164234 bool isInPragma = false ;
165235 bool waitingForVar = true ;
166- std::map<NamedDecl *, DeclarationInfo> mDeadDecls ;
167236 std::vector<Stmt*> mScopes ;
168- // clang::Rewriter *mRewriter;
169- DenseSet<DeclStmt*> mMultipleDecls ;
170- DenseMap<const clang::Type *, decltype (mDeadDecls )::const_iterator> mTypeDecls ;
171- DeclRefExpr *mSimpleAssignLHS = nullptr ;
172237
173238 TransformationContext *mTfmCtx ;
174239 const ASTImportInfo &mImportInfo ;
@@ -179,8 +244,7 @@ class DeclVisitor : public RecursiveASTVisitor<DeclVisitor> {
179244 const LangOptions &mLangOpts ;
180245 SmallVector<Stmt *, 1 > mClauses ;
181246
182- std::stack<SourceLocation> starts;
183- std::stack<SourceLocation> ends;
247+ std::stack<vars> varStack;
184248
185249};
186250}
0 commit comments