Fixed tool crash on kernels with empty parameter list

Esse commit está contido em:
atimofee
2016-02-25 22:54:58 +03:00
commit 63df6f915f
+54 -47
Ver Arquivo
@@ -307,49 +307,57 @@ namespace {
}; };
class Cuda2HipCallback : public MatchFinder::MatchCallback { class Cuda2HipCallback : public MatchFinder::MatchCallback {
public: public:
Cuda2HipCallback(Replacements *Replace) : Replace(Replace) {} Cuda2HipCallback(Replacements *Replace) : Replace(Replace) {}
void run(const MatchFinder::MatchResult &Result) override { void run(const MatchFinder::MatchResult &Result) override {
SourceManager * SM = Result.SourceManager; SourceManager * SM = Result.SourceManager;
if (const CallExpr * call = Result.Nodes.getNodeAs<clang::CallExpr>("cudaCall")) if (const CallExpr * call = Result.Nodes.getNodeAs<clang::CallExpr>("cudaCall"))
{ {
const FunctionDecl * funcDcl = call->getDirectCallee(); const FunctionDecl * funcDcl = call->getDirectCallee();
std::string name = funcDcl->getDeclName().getAsString(); std::string name = funcDcl->getDeclName().getAsString();
if (N.cuda2hipRename.count(name)) { if (N.cuda2hipRename.count(name)) {
std::string repName = N.cuda2hipRename[name]; std::string repName = N.cuda2hipRename[name];
SourceLocation sl = call->getLocStart(); SourceLocation sl = call->getLocStart();
Replacement Rep(*SM, SM->isMacroArgExpansion(sl) ? Replacement Rep(*SM, SM->isMacroArgExpansion(sl) ?
SM->getImmediateSpellingLoc(sl) : sl, name.length(), repName); SM->getImmediateSpellingLoc(sl) : sl, name.length(), repName);
Replace->insert(Rep); Replace->insert(Rep);
} }
} }
if (const CUDAKernelCallExpr * launchKernel = Result.Nodes.getNodeAs<clang::CUDAKernelCallExpr>("cudaLaunchKernel")) if (const CUDAKernelCallExpr * launchKernel = Result.Nodes.getNodeAs<clang::CUDAKernelCallExpr>("cudaLaunchKernel"))
{ {
LangOptions DefaultLangOptions; LangOptions DefaultLangOptions;
StringRef initialParamList;
SmallString<40> XStr;
raw_svector_ostream OS(XStr);
OS << "hipLaunchParm lp";
const FunctionDecl * kernelDecl = launchKernel->getDirectCallee();
SourceLocation l1 = kernelDecl->getNameInfo().getLocStart();
l1.dump(*SM);llvm::outs() << "\n";
SourceLocation kernelArgListStart = clang::Lexer::findLocationAfterToken(l1, clang::tok::l_paren, *SM, DefaultLangOptions, true);
kernelArgListStart.dump(*SM);llvm::outs() << "\n";
size_t replacementLength = 0;
if (kernelDecl->getNumParams() > 0) {
//const ParmVarDecl * pvdFirst = kernelDecl->getParamDecl(0);
const ParmVarDecl * pvdLast = kernelDecl->getParamDecl(kernelDecl->getNumParams()-1);
//kernelArgListStart = SourceLocation(pvdFirst->getLocStart());
SourceLocation kernelArgListEnd = SourceLocation(pvdLast->getLocEnd());
SourceLocation stop = clang::Lexer::getLocForEndOfToken(kernelArgListEnd, 0, *SM, DefaultLangOptions);
replacementLength = SM->getCharacterData(stop) - SM->getCharacterData(kernelArgListStart);
initialParamList = StringRef(SM->getCharacterData(kernelArgListStart), replacementLength);
OS << ", " << initialParamList;
}
const FunctionDecl * kernelDecl = launchKernel->getDirectCallee(); llvm::outs() << "initial paramlist: " << initialParamList << "\n";
llvm::outs() << "new paramlist: " << OS.str() << "\n";
const ParmVarDecl * pvdFirst = kernelDecl->getParamDecl(0); Replacement Rep0(*(Result.SourceManager), kernelArgListStart, replacementLength, OS.str());
const ParmVarDecl * pvdLast = kernelDecl->getParamDecl(kernelDecl->getNumParams()-1); Replace->insert(Rep0);
SourceLocation kernelArgListStart(pvdFirst->getLocStart());
SourceLocation kernelArgListEnd(pvdLast->getLocEnd());
SourceLocation stop = clang::Lexer::getLocForEndOfToken(kernelArgListEnd, 0, *SM, DefaultLangOptions);
size_t replacementLength = SM->getCharacterData(stop) - SM->getCharacterData(kernelArgListStart);
std::string outs(SM->getCharacterData(kernelArgListStart), replacementLength);
llvm::outs() << "initial paramlist: " << outs.c_str() << "\n";
outs = "hipLaunchParm lp, " + outs;
llvm::outs() << "new paramlist: " << outs.c_str() << "\n";
Replacement Rep0(*(Result.SourceManager), kernelArgListStart, replacementLength, outs);
Replace->insert(Rep0);
std::string name = kernelDecl->getDeclName().getAsString();
std::string repName = "hipLaunchKernel(HIP_KERNEL_NAME(" + name + "), ";
XStr.clear();
OS << "hipLaunchKernel(HIP_KERNEL_NAME(" << kernelDecl->getName() << "), ";
const CallExpr * config = launchKernel->getConfig(); const CallExpr * config = launchKernel->getConfig();
llvm::outs() << "\nKernel config arguments:\n"; llvm::outs() << "\nKernel config arguments:\n";
@@ -357,20 +365,19 @@ class Cuda2HipCallback : public MatchFinder::MatchCallback {
{ {
const Expr * arg = config->getArg(argno); const Expr * arg = config->getArg(argno);
if (!isa<CXXDefaultArgExpr>(arg)) { if (!isa<CXXDefaultArgExpr>(arg)) {
std::string typeCtor = "";
const ParmVarDecl * pvd = config->getDirectCallee()->getParamDecl(argno); const ParmVarDecl * pvd = config->getDirectCallee()->getParamDecl(argno);
SourceLocation sl(arg->getLocStart()); SourceLocation sl(arg->getLocStart());
SourceLocation el(arg->getLocEnd()); SourceLocation el(arg->getLocEnd());
SourceLocation stop = clang::Lexer::getLocForEndOfToken(el, 0, *SM, DefaultLangOptions); SourceLocation stop = clang::Lexer::getLocForEndOfToken(el, 0, *SM, DefaultLangOptions);
std::string outs(SM->getCharacterData(sl), SM->getCharacterData(stop) - SM->getCharacterData(sl)); StringRef outs(SM->getCharacterData(sl), SM->getCharacterData(stop) - SM->getCharacterData(sl));
llvm::outs() << "args[ " << argno << "]" << outs.c_str() << " <" << pvd->getType().getAsString() << ">\n"; llvm::outs() << "args[ " << argno << "]" << outs << " <" << pvd->getType().getAsString() << ">\n";
if (pvd->getType().getAsString().compare("dim3") == 0) if (pvd->getType().getAsString().compare("dim3") == 0)
repName += " dim3(" + outs + "),"; OS << " dim3(" << outs << "),";
else else
repName += " " + outs + ","; OS << " " << outs << ",";
} else } else
repName += " 0,"; OS << " 0,";
} }
for (unsigned argno = 0; argno < launchKernel->getNumArgs(); argno++) for (unsigned argno = 0; argno < launchKernel->getNumArgs(); argno++)
@@ -381,13 +388,13 @@ class Cuda2HipCallback : public MatchFinder::MatchCallback {
SourceLocation stop = clang::Lexer::getLocForEndOfToken(el, 0, *SM, DefaultLangOptions); SourceLocation stop = clang::Lexer::getLocForEndOfToken(el, 0, *SM, DefaultLangOptions);
std::string outs(SM->getCharacterData(sl), SM->getCharacterData(stop) - SM->getCharacterData(sl)); std::string outs(SM->getCharacterData(sl), SM->getCharacterData(stop) - SM->getCharacterData(sl));
llvm::outs() << outs.c_str() << "\n"; llvm::outs() << outs.c_str() << "\n";
repName += " " + outs + ","; OS << " " << outs << ",";
} }
repName.pop_back(); XStr.pop_back();
repName += ")"; OS << ")";
size_t length = SM->getCharacterData(clang::Lexer::getLocForEndOfToken(launchKernel->getLocEnd(), 0, *SM, DefaultLangOptions)) - size_t length = SM->getCharacterData(clang::Lexer::getLocForEndOfToken(launchKernel->getLocEnd(), 0, *SM, DefaultLangOptions)) -
SM->getCharacterData(launchKernel->getLocStart()); SM->getCharacterData(launchKernel->getLocStart());
Replacement Rep(*SM, launchKernel->getLocStart(), length, repName); Replacement Rep(*SM, launchKernel->getLocStart(), length, OS.str());
Replace->insert(Rep); Replace->insert(Rep);
} }