diff --git a/clang/lib/DPCT/MigrationAction.cpp b/clang/lib/DPCT/MigrationAction.cpp index c468c21e8667..a7b33579a2d4 100644 --- a/clang/lib/DPCT/MigrationAction.cpp +++ b/clang/lib/DPCT/MigrationAction.cpp @@ -15,6 +15,7 @@ #include "AnalysisInfo.h" #include "MigrationRuleManager.h" #include "RulesSecurity/MisleadingBidirectional.h" +#include "MigrationReport/Statics.h" #ifdef _WIN32 #include @@ -127,6 +128,7 @@ DpctFrontEndAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { void DpctFrontEndAction::EndSourceFileAction() { getCompilerInstance().getASTContext().getParentMapContext().clear(); + setDependenciesInfo(Info->Groups); if (Info->Groups.isMKLEnabled()) DpctGlobalInfo::setMKLHeaderUsed(); } diff --git a/clang/lib/DPCT/MigrationReport/Libraries.inc b/clang/lib/DPCT/MigrationReport/Libraries.inc new file mode 100644 index 000000000000..88dfb0afe175 --- /dev/null +++ b/clang/lib/DPCT/MigrationReport/Libraries.inc @@ -0,0 +1,18 @@ +#ifndef LIBRARY +#define LIBRARY +#endif + +LIBRARY(MKL, "oneAPI Math Kernel Library (oneMKL)", RuleGroupKind::RK_Sparse, + RuleGroupKind::RK_BLas, RuleGroupKind::RK_Solver, RuleGroupKind::RK_Rng, + RuleGroupKind::RK_FFT) + +LIBRARY(DPL, "oneAPI DPC++ Library (oneDPL)", RuleGroupKind::RK_Thrust, + RuleGroupKind::RK_CUB) + +LIBRARY(DNN, "oneAPI Deep Neural Network Library (oneDNN)", + RuleGroupKind::RK_DNN) + +LIBRARY(CCL, "oneAPI Collective Communications Library (oneCCL)", + RuleGroupKind::RK_NCCL) + +#undef LIBRARY \ No newline at end of file diff --git a/clang/lib/DPCT/MigrationReport/Statics.cpp b/clang/lib/DPCT/MigrationReport/Statics.cpp index c9f9fda9fc3c..25ab254425fb 100644 --- a/clang/lib/DPCT/MigrationReport/Statics.cpp +++ b/clang/lib/DPCT/MigrationReport/Statics.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// #include "MigrationReport/Statics.h" #include "ASTTraversal.h" -#include "FileGenerator/GenFiles.h" +#include "RulesInclude/InclusionHeaders.h" #include #include @@ -193,16 +193,15 @@ enum { class LineStream { const static StringRef NL; - llvm::raw_ostream& OS; + llvm::raw_ostream &OS; public: - LineStream(llvm::raw_ostream &OS, unsigned Indent) - : OS(OS) { + LineStream(llvm::raw_ostream &OS, unsigned Indent) : OS(OS) { OS.indent(Indent); } ~LineStream() { OS << NL; } - template LineStream &operator<<(T &&Input) { + template LineStream &operator<<(T &&Input) { OS << std::forward(Input); return *this; } @@ -215,7 +214,7 @@ struct AnalysisModeSummary { StringRef Name; unsigned Total = 0; - unsigned Counter[CounterNum] = { 0 }; + unsigned Counter[CounterNum] = {0}; AnalysisModeSummary(StringRef Name) : Name(Name) {} @@ -281,6 +280,11 @@ class AnalysisModeStats { static const std::string LastMsg; static llvm::StringMap AnalysisModeStaticsMap; + static struct { + uint8_t Flag = 0; + bool operator[](uint8_t Idx) { return Flag & (1 << Idx); } + } DependencyBits; + struct EffortLevelWrap { unsigned EL; EffortLevelWrap() : EL(NoEffort) {} @@ -319,6 +323,25 @@ class AnalysisModeStats { Total += Summary; } Total.dump(OS, Indent); + if (DependencyBits.Flag) { + LineStream(OS, Indent) << llvm::raw_ostream::Colors::BLUE + << "Library Dependencies of SYCL Project:" + << llvm::raw_ostream::Colors::RESET; + struct DependenceNames { + llvm::StringRef Strs[static_cast(LibraryDependencies::NUMS)]; + DependenceNames() noexcept { +#define LIBRARY(LIBNAME, LIBDESC, ...) \ + Strs[static_cast(LibraryDependencies::LD_##LIBNAME)] = LIBDESC; +#include "Libraries.inc" + } + } Names; + auto EntryIndent = Indent + AnalysisModeSummary::IndentIncremental; + for (unsigned i = 0; i < static_cast(LibraryDependencies::NUMS); + ++i) { + if (DependencyBits[i]) + LineStream(OS, EntryIndent) << "- The Intel " << Names.Strs[i]; + } + } LineStream(OS, Indent) << LastMsg; } @@ -335,8 +358,17 @@ class AnalysisModeStats { unsigned Offset, EffortLevel EL) { AnalysisModeStaticsMap[Filename.getPath()].recordEffort(Offset, EL); } + static void setDependencies(const RuleGroups &Group) noexcept { + for (unsigned i = 0; i < static_cast(LibraryDependencies::NUMS); + ++i) { + DependencyBits.Flag |= + Group.isDependsOn(static_cast(i)) << i; + } + } }; +decltype(AnalysisModeStats::DependencyBits) AnalysisModeStats::DependencyBits; + const std::string AnalysisModeStats::LastMsg = "See " "https://www.intel.com/content/www/us/en/docs/dpcpp-compatibility-tool/" @@ -366,6 +398,9 @@ void recordRecognizedType(TypeLoc TL) { if (DpctGlobalInfo::isAnalysisModeEnabled()) AnalysisModeStats::recordApisOrTypes(TL.getBeginLoc()); } +void setDependenciesInfo(const RuleGroups &Group) noexcept { + AnalysisModeStats::setDependencies(Group); +} } // namespace dpct } // namespace clang diff --git a/clang/lib/DPCT/MigrationReport/Statics.h b/clang/lib/DPCT/MigrationReport/Statics.h index 2972108349d3..f809daae00cb 100644 --- a/clang/lib/DPCT/MigrationReport/Statics.h +++ b/clang/lib/DPCT/MigrationReport/Statics.h @@ -66,6 +66,9 @@ void recordAnalysisModeEffort(const clang::tooling::UnifiedPath &Filename, unsig void recordRecognizedAPI(const CallExpr *CE); void recordRecognizedType(TypeLoc TL); +class RuleGroups; +void setDependenciesInfo(const RuleGroups &) noexcept; + } // namespace dpct } // namespace clang #endif // DPCT_DEBUG_H diff --git a/clang/lib/DPCT/RulesInclude/InclusionHeaders.h b/clang/lib/DPCT/RulesInclude/InclusionHeaders.h index 37fe7dd31301..0e32d9785b3b 100644 --- a/clang/lib/DPCT/RulesInclude/InclusionHeaders.h +++ b/clang/lib/DPCT/RulesInclude/InclusionHeaders.h @@ -38,6 +38,12 @@ enum class RuleGroupKind : uint8_t { NUM }; +enum class LibraryDependencies : uint8_t { +#define LIBRARY(LIBNAME, ...) LD_##LIBNAME, +#include "MigrationReport/Libraries.inc" + NUMS +}; + struct DpctInclusionInfo { enum InclusionFlag { IF_MarkInserted, @@ -54,21 +60,33 @@ struct DpctInclusionInfo { class RuleGroups { using FlagsType = uint64_t; - FlagsType Flags = flag(RuleGroupKind::RK_Common); - - static constexpr FlagsType flag(RuleGroupKind K) { + template + static constexpr FlagsType flag(RuleGroupKind First, Args... Rest) noexcept { + return flag(First) | flag(Rest...); + } + static constexpr FlagsType flag(RuleGroupKind K) noexcept { return 1 << static_cast(K); } + FlagsType Flags = flag(RuleGroupKind::RK_Common); + public: - void enableRuleGroup(RuleGroupKind K) { Flags |= flag(K); } - bool isEnabled(RuleGroupKind K) const { return Flags & flag(K); } - bool isMKLEnabled() const { - static constexpr FlagsType MKLFlag = - flag(RuleGroupKind::RK_BLas) | flag(RuleGroupKind::RK_Sparse) | - flag(RuleGroupKind::RK_Solver) | flag(RuleGroupKind::RK_FFT) | - flag(RuleGroupKind::RK_Rng); - return Flags & MKLFlag; + void enableRuleGroup(RuleGroupKind K) noexcept { Flags |= flag(K); } + bool isEnabled(RuleGroupKind K) const noexcept { return Flags & flag(K); } + bool isDependsOn(LibraryDependencies LD) const noexcept { + static struct LibraryMasks { + FlagsType BitMasks[static_cast(LibraryDependencies::NUMS)]; + LibraryMasks() noexcept { +#define LIBRARY(LIBNAME, LIBDESC, ...) \ + BitMasks[static_cast(LibraryDependencies::LD_##LIBNAME)] = \ + flag(__VA_ARGS__); +#include "MigrationReport/Libraries.inc" + } + } Masks; + return Flags & Masks.BitMasks[static_cast(LD)]; + } + bool isMKLEnabled() const noexcept { + return isDependsOn(LibraryDependencies::LD_MKL); } };