Skip to content

Commit 6385e97

Browse files
committed
add array initialization
1 parent ff08f72 commit 6385e97

File tree

2 files changed

+88
-24
lines changed

2 files changed

+88
-24
lines changed

include/tsar/Support/Directives.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def RegionName : Clause<"name", Region,
155155
[LParen, PPIdentifier, ZeroOrMore<[Comma, PPIdentifier]>, RParen]>;
156156

157157
def RemoveFirstPrivate : Clause<"removefirstprivate", Transform,
158-
[LParen, Identifier, Equal, OneOf<[Identifier, NumericConstant]>, ZeroOrMore<[Comma, Identifier, Equal, OneOf<[Identifier, NumericConstant]>]>, RParen]>;
158+
[LParen, Identifier, Equal, OneOf<[Identifier, NumericConstant]>, ZeroOrMore<[NumericConstant]>, ZeroOrMore<[Comma, Identifier, Equal, OneOf<[Identifier, NumericConstant]>, ZeroOrMore<[NumericConstant]>]>, RParen]>;
159159

160160
def ReplaceMetadata : Clause<"replace", Metadata,
161161
[LParen,

lib/Transform/Clang/RemoveFirstPrivate.cpp

Lines changed: 87 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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+
6386
namespace {
6487

6588
class 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
};
72101
public:
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

Comments
 (0)