[HIPIFY] Fix string routines.

Some Clang tooling functions return std::string, some return StringRef. Assigning of returning std::string to StringRef variables leads to garbage in it.
DEBUG build is always affected.
这个提交包含在:
Evgeny Mankov
2017-05-11 21:50:36 +03:00
父节点 ff9bed6535
当前提交 aa52b94be1
+25 -26
查看文件
@@ -2690,7 +2690,7 @@ private:
bool cudaCall(const MatchFinder::MatchResult &Result) {
if (const CallExpr *call = Result.Nodes.getNodeAs<CallExpr>("cudaCall")) {
const FunctionDecl *funcDcl = call->getDirectCallee();
StringRef name = funcDcl->getDeclName().getAsString();
std::string name = funcDcl->getDeclName().getAsString();
SourceManager *SM = Result.SourceManager;
SourceLocation sl = call->getLocStart();
const auto found = N.cuda2hipRename.find(name);
@@ -2714,16 +2714,16 @@ private:
}
}
if (bReplace) {
updateCounters(found->second, name.str());
updateCounters(found->second, name);
Replacement Rep(*SM, sl, length, repName);
FullSourceLoc fullSL(sl, *SM);
insertReplacement(Rep, fullSL);
}
} else {
updateCounters(found->second, name.str());
updateCounters(found->second, name);
}
} else {
std::string msg = "the following reference is not handled: '" + name.str() + "' [function call].";
std::string msg = "the following reference is not handled: '" + name + "' [function call].";
printHipifyMessage(*SM, sl, msg);
}
return true;
@@ -2838,7 +2838,7 @@ private:
bool cudaEnumConstantRef(const MatchFinder::MatchResult &Result) {
if (const DeclRefExpr *enumConstantRef = Result.Nodes.getNodeAs<DeclRefExpr>("cudaEnumConstantRef")) {
StringRef name = enumConstantRef->getDecl()->getNameAsString();
StringRef name = enumConstantRef->getDecl()->getName();
SourceLocation sl = enumConstantRef->getLocStart();
SourceManager *SM = Result.SourceManager;
const auto found = N.cuda2hipRename.find(name);
@@ -2861,10 +2861,10 @@ private:
bool cudaEnumDecl(const MatchFinder::MatchResult &Result) {
if (const VarDecl *enumDecl = Result.Nodes.getNodeAs<VarDecl>("cudaEnumDecl")) {
StringRef name = enumDecl->getType()->getAsTagDecl()->getNameAsString();
std::string name = enumDecl->getType()->getAsTagDecl()->getNameAsString();
QualType QT = enumDecl->getType().getUnqualifiedType();
StringRef name_unqualified = QT.getAsString();
if ((name_unqualified.find(' ') == StringRef::npos && name.find(' ') == StringRef::npos) || name.empty()) {
std::string name_unqualified = QT.getAsString();
if ((name_unqualified.find(' ') == std::string::npos && name.find(' ') == std::string::npos) || name.empty()) {
name = name_unqualified;
}
// Workaround for enum VarDecl as param decl, declared with enum type specifier
@@ -2882,7 +2882,7 @@ private:
//-------------------------------------------------
const auto found = N.cuda2hipRename.find(name);
if (found != N.cuda2hipRename.end()) {
updateCounters(found->second, name.str());
updateCounters(found->second, name);
if (!found->second.unsupported) {
StringRef repName = found->second.hipName;
Replacement Rep(*SM, sl, name.size(), repName);
@@ -2890,7 +2890,7 @@ private:
insertReplacement(Rep, fullSL);
}
} else {
std::string msg = "the following reference is not handled: '" + name.str() + "' [enum constant decl].";
std::string msg = "the following reference is not handled: '" + name + "' [enum constant decl].";
printHipifyMessage(*SM, sl, msg);
}
return true;
@@ -2905,12 +2905,12 @@ private:
QT = QT.getTypePtr()->getAsArrayTypeUnsafe()->getElementType();
}
QT = QT.getUnqualifiedType();
StringRef name = QT.getAsString();
std::string name = QT.getAsString();
SourceLocation sl = typedefVar->getLocStart();
SourceManager *SM = Result.SourceManager;
const auto found = N.cuda2hipRename.find(name);
if (found != N.cuda2hipRename.end()) {
updateCounters(found->second, name.str());
updateCounters(found->second, name);
if (!found->second.unsupported) {
StringRef repName = found->second.hipName;
Replacement Rep(*SM, sl, name.size(), repName);
@@ -2918,7 +2918,7 @@ private:
insertReplacement(Rep, fullSL);
}
} else {
std::string msg = "the following reference is not handled: '" + name.str() + "' [typedef var].";
std::string msg = "the following reference is not handled: '" + name + "' [typedef var].";
printHipifyMessage(*SM, sl, msg);
}
return true;
@@ -2935,10 +2935,10 @@ private:
SourceLocation sl = TL.getUnqualifiedLoc().getLocStart();
QualType QT = t->getPointeeType();
QT = QT.getUnqualifiedType();
StringRef name = QT.getAsString();
std::string name = QT.getAsString();
const auto found = N.cuda2hipRename.find(name);
if (found != N.cuda2hipRename.end()) {
updateCounters(found->second, name.str());
updateCounters(found->second, name);
if (!found->second.unsupported) {
StringRef repName = found->second.hipName;
Replacement Rep(*SM, sl, name.size(), repName);
@@ -2947,7 +2947,7 @@ private:
}
}
else {
std::string msg = "the following reference is not handled: '" + name.str() + "' [typedef var ptr].";
std::string msg = "the following reference is not handled: '" + name + "' [typedef var ptr].";
printHipifyMessage(*SM, sl, msg);
}
}
@@ -2961,13 +2961,13 @@ private:
QualType QT = structVar->getType();
// ToDo: find case-studies with types other than Struct.
if (QT->isStructureType()) {
StringRef name = QT.getTypePtr()->getAsStructureType()->getDecl()->getNameAsString();
std::string name = QT.getTypePtr()->getAsStructureType()->getDecl()->getNameAsString();
TypeLoc TL = structVar->getTypeSourceInfo()->getTypeLoc();
SourceLocation sl = TL.getUnqualifiedLoc().getLocStart();
SourceManager *SM = Result.SourceManager;
const auto found = N.cuda2hipRename.find(name);
if (found != N.cuda2hipRename.end()) {
updateCounters(found->second, name.str());
updateCounters(found->second, name);
if (!found->second.unsupported) {
StringRef repName = found->second.hipName;
Replacement Rep(*SM, sl, name.size(), repName);
@@ -2976,7 +2976,7 @@ private:
}
}
else {
std::string msg = "the following reference is not handled: '" + name.str() + "' [struct var].";
std::string msg = "the following reference is not handled: '" + name + "' [struct var].";
printHipifyMessage(*SM, sl, msg);
}
}
@@ -3049,7 +3049,7 @@ private:
// Example: extern __shared__ uint sRadix1[];
if (sharedVar->hasExternalFormalLinkage()) {
QualType QT = sharedVar->getType();
StringRef typeName;
std::string typeName;
if (QT->isIncompleteArrayType()) {
const ArrayType *AT = QT.getTypePtr()->getAsArrayTypeUnsafe();
QT = AT->getElementType();
@@ -3071,9 +3071,8 @@ private:
SourceLocation slEnd = sharedVar->getLocEnd();
SourceManager *SM = Result.SourceManager;
size_t repLength = SM->getCharacterData(slEnd) - SM->getCharacterData(slStart) + 1;
SmallString<128> tmpData;
StringRef varName = sharedVar->getNameAsString();
StringRef repName = Twine("HIP_DYNAMIC_SHARED(" + typeName + ", " + varName + ")").toStringRef(tmpData);
std::string varName = sharedVar->getNameAsString();
std::string repName = "HIP_DYNAMIC_SHARED(" + typeName + ", " + varName + ")";
Replacement Rep(*SM, slStart, repLength, repName);
FullSourceLoc fullSL(slStart, *SM);
insertReplacement(Rep, fullSL);
@@ -3089,7 +3088,7 @@ private:
bool cudaParamDecl(const MatchFinder::MatchResult &Result) {
if (const ParmVarDecl *paramDecl = Result.Nodes.getNodeAs<ParmVarDecl>("cudaParamDecl")) {
QualType QT = paramDecl->getOriginalType().getUnqualifiedType();
StringRef name = QT.getAsString();
std::string name = QT.getAsString();
const Type *t = QT.getTypePtr();
if (t->isStructureOrClassType()) {
name = t->getAsCXXRecordDecl()->getName();
@@ -3099,7 +3098,7 @@ private:
SourceManager *SM = Result.SourceManager;
const auto found = N.cuda2hipRename.find(name);
if (found != N.cuda2hipRename.end()) {
updateCounters(found->second, name.str());
updateCounters(found->second, name);
if (!found->second.unsupported) {
StringRef repName = found->second.hipName;
Replacement Rep(*SM, sl, name.size(), repName);
@@ -3107,7 +3106,7 @@ private:
insertReplacement(Rep, fullSL);
}
} else {
std::string msg = "the following reference is not handled: '" + name.str() + "' [param decl].";
std::string msg = "the following reference is not handled: '" + name + "' [param decl].";
printHipifyMessage(*SM, sl, msg);
}
return true;