diff --git a/projects/clr/hipamd/hipify-clang/src/ArgParse.cpp b/projects/clr/hipamd/hipify-clang/src/ArgParse.cpp index bcd1457ec4..346cdfd1b1 100644 --- a/projects/clr/hipamd/hipify-clang/src/ArgParse.cpp +++ b/projects/clr/hipamd/hipify-clang/src/ArgParse.cpp @@ -34,6 +34,21 @@ cl::opt OutputDir("o-dir", cl::value_desc("directory"), cl::cat(ToolTemplateCategory)); +cl::opt GeneratePerl("perl", + cl::desc("Generate hipify-perl"), + cl::value_desc("perl"), + cl::cat(ToolTemplateCategory)); + +cl::opt OutputPerlMapFilename("o-perl-map", + cl::desc("Output filename for Perl map"), + cl::value_desc("filename"), + cl::cat(ToolTemplateCategory)); + +cl::opt OutputPerlMapDir("o-perl-map-dir", + cl::desc("Output direcory for Perl map"), + cl::value_desc("directory"), + cl::cat(ToolTemplateCategory)); + cl::opt TemporaryDir("temp-dir", cl::desc("Temporary direcory"), cl::value_desc("directory"), diff --git a/projects/clr/hipamd/hipify-clang/src/ArgParse.h b/projects/clr/hipamd/hipify-clang/src/ArgParse.h index 11d84c8e33..d4ea64fd10 100644 --- a/projects/clr/hipamd/hipify-clang/src/ArgParse.h +++ b/projects/clr/hipamd/hipify-clang/src/ArgParse.h @@ -30,6 +30,8 @@ namespace ct = clang::tooling; extern cl::OptionCategory ToolTemplateCategory; extern cl::opt OutputFilename; +extern cl::opt OutputPerlMapFilename; +extern cl::opt OutputPerlMapDir; extern cl::opt OutputDir; extern cl::opt TemporaryDir; extern cl::opt CudaPath; @@ -37,6 +39,7 @@ extern cl::list IncludeDirs; extern cl::list MacroNames; extern cl::opt Inplace; extern cl::opt SaveTemps; +extern cl::opt GeneratePerl; extern cl::opt Verbose; extern cl::opt NoBackup; extern cl::opt NoOutput; diff --git a/projects/clr/hipamd/hipify-clang/src/main.cpp b/projects/clr/hipamd/hipify-clang/src/main.cpp index ae22f83ce0..3af20e6ffe 100644 --- a/projects/clr/hipamd/hipify-clang/src/main.cpp +++ b/projects/clr/hipamd/hipify-clang/src/main.cpp @@ -93,6 +93,57 @@ std::string getAbsoluteDirectoryPath(const std::string& sDir, std::error_code& E return dirAbsPath.c_str(); } +bool generatePerl(bool Generate = true) { + if (!Generate) { + return true; + } + std::string dstPerlMap = OutputPerlMapFilename, dstPerlMapDir = OutputPerlMapDir; + if (dstPerlMap.empty()) { + dstPerlMap = "hipify-perl-map"; + } + std::error_code EC; + if (!dstPerlMapDir.empty()) { + std::string sOutputPerlMapDirAbsPath = getAbsoluteDirectoryPath(OutputPerlMapDir, EC, "output hipify-perl map"); + if (EC) { + return false; + } + dstPerlMap = sOutputPerlMapDirAbsPath + "/" + dstPerlMap; + } + SmallString<128> tmpFile; + StringRef ext = "hipify-tmp"; + EC = sys::fs::createTemporaryFile(dstPerlMap, ext, tmpFile); + if (EC) { + llvm::errs() << "\n" << sHipify << sError << EC.message() << ": " << tmpFile << "\n"; + return false; + } + std::unique_ptr perlStreamPtr = std::unique_ptr(new std::ofstream(tmpFile.c_str(), std::ios_base::trunc)); + std::string sConv = "my $conversions = "; + *perlStreamPtr.get() << "@statNames = ("; + for (int i = 0; i < NUM_CONV_TYPES - 1; i++) { + *perlStreamPtr.get() << "\"" << counterNames[i] << "\", "; + sConv += "$ft{'" + std::string(counterNames[i]) + "'} + "; + } + *perlStreamPtr.get() << "\"" << counterNames[NUM_CONV_TYPES - 1] << "\");\n\n"; + *perlStreamPtr.get() << sConv << "$ft{'" << counterNames[NUM_CONV_TYPES - 1] << "'};\n\n"; + for (auto& ma : CUDA_RENAMES_MAP()) { + if (Statistics::isUnsupported(ma.second)) { + continue; + } + *perlStreamPtr.get() << "$ft{'" + std::string(counterNames[ma.second.type]) + "'} += s/\\b" + std::string(ma.first) + "\\b/" + std::string(ma.second.hipName) + "/g;\n"; + } + perlStreamPtr.get()->flush(); + bool ret = true; + EC = sys::fs::copy_file(tmpFile, dstPerlMap); + if (EC) { + llvm::errs() << "\n" << sHipify << sError << EC.message() << ": while copying " << tmpFile << " to " << dstPerlMap << "\n"; + ret = false; + } + if (!SaveTemps) { + sys::fs::remove(tmpFile); + } + return ret; +} + int main(int argc, const char **argv) { std::vector new_argv(argv, argv + argc); if (std::find(new_argv.begin(), new_argv.end(), std::string("--")) == new_argv.end()) { @@ -102,8 +153,19 @@ int main(int argc, const char **argv) { argc++; } llcompat::PrintStackTraceOnErrorSignal(); - ct::CommonOptionsParser OptionsParser(argc, argv, ToolTemplateCategory, llvm::cl::OneOrMore); + ct::CommonOptionsParser OptionsParser(argc, argv, ToolTemplateCategory, llvm::cl::Optional); std::vector fileSources = OptionsParser.getSourcePathList(); + if (fileSources.empty() && !GeneratePerl) { + llvm::errs() << "\n" << sHipify << sError << "Must specify at least 1 positional argument for source file." << "\n"; + return 1; + } + if (!generatePerl(GeneratePerl)) { + llvm::errs() << "\n" << sHipify << sError << "hipify-perl generating failed." << "\n"; + return 1; + } + if (fileSources.empty()) { + return 0; + } std::string dst = OutputFilename, dstDir = OutputDir; std::error_code EC; std::string sOutputDirAbsPath = getAbsoluteDirectoryPath(OutputDir, EC, "output");