From ef405daaeed9fa0931bc9ad4cd9ace5fcef49b20 Mon Sep 17 00:00:00 2001 From: Evgeny Mankov Date: Sat, 7 Dec 2019 11:20:17 +0300 Subject: [PATCH] [HIPIFY][fix][#1246][#1655] Sort input files based on their dependency graph + Implemented by using clang Driver infrastructure [ToDo] Add tests for in-place hipification of multiple files --- hipamd/hipify-clang/src/main.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/hipamd/hipify-clang/src/main.cpp b/hipamd/hipify-clang/src/main.cpp index b4200bd109..62c4e1d5eb 100644 --- a/hipamd/hipify-clang/src/main.cpp +++ b/hipamd/hipify-clang/src/main.cpp @@ -34,6 +34,14 @@ THE SOFTWARE. #include "ArgParse.h" #include "StringUtils.h" #include "llvm/Support/Debug.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Basic/DiagnosticIDs.h" +#include "clang/Basic/DiagnosticOptions.h" +#include "clang/Driver/Driver.h" +#include "clang/Driver/Compilation.h" +#include "clang/Driver/Tool.h" +#include "clang/Frontend/TextDiagnosticPrinter.h" + #if LLVM_VERSION_MAJOR < 8 #include "llvm/Support/Path.h" #endif @@ -139,6 +147,30 @@ 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) { // 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).