From e374b3d356bf0789c1035d8a1a5860134c1436d2 Mon Sep 17 00:00:00 2001 From: Evgeny Mankov Date: Sat, 7 Dec 2019 13:50:13 +0300 Subject: [PATCH] [HIPIFY] main source file refactoring [ROCm/clr commit: 72b1d16115d93b1a9ada0fab9eeb8193ca60e725] --- projects/clr/hipamd/hipify-clang/src/main.cpp | 156 +++++++++--------- 1 file changed, 81 insertions(+), 75 deletions(-) diff --git a/projects/clr/hipamd/hipify-clang/src/main.cpp b/projects/clr/hipamd/hipify-clang/src/main.cpp index 62c4e1d5eb..91ff9c36d4 100644 --- a/projects/clr/hipamd/hipify-clang/src/main.cpp +++ b/projects/clr/hipamd/hipify-clang/src/main.cpp @@ -50,6 +50,81 @@ constexpr auto DEBUG_TYPE = "cuda2hip"; namespace ct = clang::tooling; +void sortInputFiles(int argc, const char **argv, std::vector &files) { + if (files.size() < 2) return; + IntrusiveRefCntPtr diagOpts(new clang::DiagnosticOptions()); + clang::TextDiagnosticPrinter diagClient(llvm::errs(), &*diagOpts); + clang::DiagnosticsEngine Diagnostics(IntrusiveRefCntPtr(new clang::DiagnosticIDs()), &*diagOpts, &diagClient, false); + std::unique_ptr driver(new clang::driver::Driver("", "nvptx64-nvidia-cuda", Diagnostics)); + SmallVector Args(argv, argv + argc); + std::unique_ptr C(driver->BuildCompilation(Args)); + std::vector sortedFiles; + for (const auto &J : C->getJobs()) { + if (std::string(J.getCreator().getName()) != "clang") continue; + const auto &JA = J.getArguments(); + for (size_t i = 0; i < JA.size(); ++i) { + const auto &A = std::string(JA[i]); + if (std::find(files.begin(), files.end(), A) != files.end() && + i > 0 && std::string(JA[i - 1]) == "-main-file-name") { + sortedFiles.push_back(A); + } + } + } + if (sortedFiles.empty()) return; + std::reverse(sortedFiles.begin(), sortedFiles.end()); + files.assign(sortedFiles.begin(), sortedFiles.end()); +} + +void appendArgumentsAdjusters(ct::RefactoringTool &Tool, const std::string &sSourceAbsPath) { + if (!IncludeDirs.empty()) { + for (std::string s : IncludeDirs) { + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(s.c_str(), ct::ArgumentInsertPosition::BEGIN)); + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-I", ct::ArgumentInsertPosition::BEGIN)); + } + } + if (!MacroNames.empty()) { + for (std::string s : MacroNames) { + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(s.c_str(), ct::ArgumentInsertPosition::BEGIN)); + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-D", ct::ArgumentInsertPosition::BEGIN)); + } + } + // Includes for clang's CUDA wrappers for using by packaged hipify-clang + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("./include", ct::ArgumentInsertPosition::BEGIN)); + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-isystem", ct::ArgumentInsertPosition::BEGIN)); + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("./include/cuda_wrappers", ct::ArgumentInsertPosition::BEGIN)); + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-isystem", ct::ArgumentInsertPosition::BEGIN)); + // Ensure at least c++11 is used. + std::string stdCpp = "-std=c++11"; +#if defined(_MSC_VER) + stdCpp = "-std=c++14"; +#endif + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(stdCpp.c_str(), ct::ArgumentInsertPosition::BEGIN)); + std::string sInclude = "-I" + sys::path::parent_path(sSourceAbsPath).str(); +#if defined(HIPIFY_CLANG_RES) + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-resource-dir=" HIPIFY_CLANG_RES, ct::ArgumentInsertPosition::BEGIN)); +#endif + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(sInclude.c_str(), ct::ArgumentInsertPosition::BEGIN)); + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-fno-delayed-template-parsing", ct::ArgumentInsertPosition::BEGIN)); + if (llcompat::pragma_once_outside_header()) { + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-Wno-pragma-once-outside-header", ct::ArgumentInsertPosition::BEGIN)); + } + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("--cuda-host-only", ct::ArgumentInsertPosition::BEGIN)); + if (!CudaGpuArch.empty()) { + std::string sCudaGpuArch = "--cuda-gpu-arch=" + CudaGpuArch; + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(sCudaGpuArch.c_str(), ct::ArgumentInsertPosition::BEGIN)); + } + if (!CudaPath.empty()) { + std::string sCudaPath = "--cuda-path=" + CudaPath; + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(sCudaPath.c_str(), ct::ArgumentInsertPosition::BEGIN)); + } + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("cuda", ct::ArgumentInsertPosition::BEGIN)); + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-x", ct::ArgumentInsertPosition::BEGIN)); + if (Verbose) { + Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-v", ct::ArgumentInsertPosition::END)); + } + Tool.appendArgumentsAdjuster(ct::getClangSyntaxOnlyAdjuster()); +} + 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()) { @@ -127,7 +202,7 @@ int main(int argc, const char **argv) { } // Arguments for the Statistics print routines. std::unique_ptr csv = nullptr; - llvm::raw_ostream* statPrint = nullptr; + llvm::raw_ostream *statPrint = nullptr; bool create_csv = false; if (!OutputStatsFilename.empty()) { PrintStatsCSV = true; @@ -147,31 +222,8 @@ int main(int argc, const char **argv) { if (PrintStats) { statPrint = &llvm::errs(); } - if (fileSources.size() > 1) { - IntrusiveRefCntPtr diagOpts(new clang::DiagnosticOptions()); - clang::TextDiagnosticPrinter diagClient(llvm::errs(), &*diagOpts); - clang::DiagnosticsEngine Diagnostics(IntrusiveRefCntPtr(new clang::DiagnosticIDs()), &*diagOpts, &diagClient, false); - std::unique_ptr driver(new clang::driver::Driver("", "nvptx64-nvidia-cuda", Diagnostics)); - SmallVector Args(argv, argv + argc); - std::unique_ptr C(driver->BuildCompilation(Args)); - std::vector fileSourcesOrdered; - for (const auto &J : C->getJobs()) { - if (std::string(J.getCreator().getName()) != "clang") continue; - const auto &JA = J.getArguments(); - for (size_t i = 0; i < JA.size(); ++i) { - const auto &A = std::string(JA[i]); - if (std::find(fileSources.begin(), fileSources.end(), A) != fileSources.end() && - i > 0 && std::string(JA[i-1]) == "-main-file-name") { - fileSourcesOrdered.push_back(A); - } - } - } - if (!fileSourcesOrdered.empty()) { - std::reverse(fileSourcesOrdered.begin(), fileSourcesOrdered.end()); - fileSources = fileSourcesOrdered; - } - } - for (const auto & src : fileSources) { + sortInputFiles(argc, argv, fileSources); + for (const auto &src : fileSources) { // Create a copy of the file to work on. When we're done, we'll move this onto the // output (which may mean overwriting the input, if we're in-place). // Should we fail for some reason, we'll just leak this file and not corrupt the input. @@ -224,56 +276,10 @@ int main(int argc, const char **argv) { // because that'll break relative includes, and we don't want to overwrite the input file. // So what we do is operate on a copy, which we then move to the output. ct::RefactoringTool Tool(OptionsParser.getCompilations(), std::string(tmpFile.c_str())); - ct::Replacements& replacementsToUse = llcompat::getReplacements(Tool, tmpFile.c_str()); + ct::Replacements &replacementsToUse = llcompat::getReplacements(Tool, tmpFile.c_str()); ReplacementsFrontendActionFactory actionFactory(&replacementsToUse); - if (!IncludeDirs.empty()) { - for (std::string s : IncludeDirs) { - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(s.c_str(), ct::ArgumentInsertPosition::BEGIN)); - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-I", ct::ArgumentInsertPosition::BEGIN)); - } - } - if (!MacroNames.empty()) { - for (std::string s : MacroNames) { - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(s.c_str(), ct::ArgumentInsertPosition::BEGIN)); - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-D", ct::ArgumentInsertPosition::BEGIN)); - } - } - // Includes for clang's CUDA wrappers for using by packaged hipify-clang - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("./include", ct::ArgumentInsertPosition::BEGIN)); - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-isystem", ct::ArgumentInsertPosition::BEGIN)); - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("./include/cuda_wrappers", ct::ArgumentInsertPosition::BEGIN)); - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-isystem", ct::ArgumentInsertPosition::BEGIN)); - // Ensure at least c++11 is used. - std::string stdCpp = "-std=c++11"; -#if defined(_MSC_VER) - stdCpp = "-std=c++14"; -#endif - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(stdCpp.c_str(), ct::ArgumentInsertPosition::BEGIN)); - std::string sInclude = "-I" + sys::path::parent_path(sSourceAbsPath).str(); -#if defined(HIPIFY_CLANG_RES) - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-resource-dir=" HIPIFY_CLANG_RES, ct::ArgumentInsertPosition::BEGIN)); -#endif - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(sInclude.c_str(), ct::ArgumentInsertPosition::BEGIN)); - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-fno-delayed-template-parsing", ct::ArgumentInsertPosition::BEGIN)); - if (llcompat::pragma_once_outside_header()) { - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-Wno-pragma-once-outside-header", ct::ArgumentInsertPosition::BEGIN)); - } - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("--cuda-host-only", ct::ArgumentInsertPosition::BEGIN)); - if (!CudaGpuArch.empty()) { - std::string sCudaGpuArch = "--cuda-gpu-arch=" + CudaGpuArch; - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(sCudaGpuArch.c_str(), ct::ArgumentInsertPosition::BEGIN)); - } - if (!CudaPath.empty()) { - std::string sCudaPath = "--cuda-path=" + CudaPath; - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster(sCudaPath.c_str(), ct::ArgumentInsertPosition::BEGIN)); - } - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("cuda", ct::ArgumentInsertPosition::BEGIN)); - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-x", ct::ArgumentInsertPosition::BEGIN)); - if (Verbose) { - Tool.appendArgumentsAdjuster(ct::getInsertArgumentAdjuster("-v", ct::ArgumentInsertPosition::END)); - } - Tool.appendArgumentsAdjuster(ct::getClangSyntaxOnlyAdjuster()); - Statistics& currentStat = Statistics::current(); + appendArgumentsAdjusters(Tool, sSourceAbsPath); + Statistics ¤tStat = Statistics::current(); // Hipify _all_ the things! if (Tool.runAndSave(&actionFactory)) { currentStat.hasErrors = true;