Skip to content

Commit d01ce43

Browse files
committed
WIP
Signed-off-by: Jiang, Zhiwei <zhiwei.jiang@intel.com>
1 parent c97541b commit d01ce43

2 files changed

Lines changed: 29 additions & 13 deletions

File tree

clang/lib/DPCT/RuleInfra/ExprAnalysis.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,10 @@ void ExprAnalysis::analyzeExpr(const DeclRefExpr *DRE) {
560560
ExprAnalysis EA(VD->getInit());
561561
std::string VDInitStr = EA.getReplacedString();
562562
std::string VDStr = VD->getNameAsString();
563+
// This offset is relative to the original str
563564
addReplacement(0, VDStr.size(), VDInitStr);
565+
//
566+
addReplacement("ThreadsPerBlock", 0);
564567
}
565568
} else if (auto ECD = dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
566569
std::unordered_set<std::string> targetStr = {

clang/lib/DPCT/RuleInfra/ExprAnalysis.h

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class StringReplacement {
4040
}
4141

4242
inline const std::string &getReplacedText() { return Text; }
43+
inline size_t getLength() { return Length; }
4344

4445
private:
4546
// SourceStr is the string which need replaced.
@@ -132,17 +133,30 @@ class StringReplacements {
132133
// Add a template dependent replacement
133134
inline void addTemplateDependentReplacement(size_t Offset, size_t Length,
134135
unsigned TemplateIndex) {
135-
TDRs.insert(
136-
std::make_pair(Offset, std::make_shared<TemplateDependentReplacement>(
137-
SourceStr, Offset, Length, TemplateIndex)));
136+
// Find items in ReplMap whose offset <= Offset.
137+
// Then check length, is there is overlap, ignore this insertion.
138+
// Finally calculate the shift length.
139+
int Shift = 0;
140+
auto UpperBound = ReplMap.upper_bound(Offset);
141+
for (auto It = ReplMap.begin(); It != UpperBound; ++It) {
142+
if ((It->first + It->second->getLength()) > Offset) {
143+
// overlap
144+
return;
145+
}
146+
Shift +=
147+
(It->second->getReplacedText().length() - It->second->getLength());
148+
}
149+
auto TDR = std::make_shared<TemplateDependentReplacement>(
150+
SourceStr, Offset, Length, TemplateIndex);
151+
TDR->shift(Shift);
152+
TDRs.insert(std::make_pair(Offset + Shift, TDR));
138153
}
139154

140-
inline void addTemplateDependentReplacement(
141-
size_t Offset, size_t Length,
142-
std::shared_ptr<TemplateDependentStringInfo> TDSI) {
143-
// TDRs.insert(
144-
// std::make_pair(Offset, std::make_shared<TemplateDependentReplacement>(
145-
// SourceStr, Offset, Length, TemplateIndex)));
155+
inline void addTemplateDependentReplacement(std::string String,
156+
unsigned TemplateIndex) {
157+
auto TDR = std::make_shared<TemplateDependentReplacement>(
158+
String, String.size(), TemplateIndex);
159+
TDRs.insert(std::make_pair(0, TDR));
146160
}
147161

148162
// Add a string replacement
@@ -595,10 +609,9 @@ class ExprAnalysis {
595609
ReplSet.addTemplateDependentReplacement(Offset, Length, TemplateIndex);
596610
}
597611

598-
inline void
599-
addReplacement(size_t Offset, size_t Length,
600-
std::shared_ptr<TemplateDependentStringInfo> TDSI) {
601-
ReplSet.addTemplateDependentReplacement(Offset, Length, TDSI);
612+
inline void addReplacement(std::string String,
613+
unsigned TemplateIndex) {
614+
ReplSet.addTemplateDependentReplacement(String, TemplateIndex);
602615
}
603616

604617
// Analyze the expression, jump to corresponding analysis function according

0 commit comments

Comments
 (0)