Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions clang/lib/DPCT/MigrationAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "AnalysisInfo.h"
#include "MigrationRuleManager.h"
#include "RulesSecurity/MisleadingBidirectional.h"
#include "MigrationReport/Statics.h"

#ifdef _WIN32
#include <Windows.h>
Expand Down Expand Up @@ -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();
}
Expand Down
18 changes: 18 additions & 0 deletions clang/lib/DPCT/MigrationReport/Libraries.inc
Original file line number Diff line number Diff line change
@@ -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
47 changes: 41 additions & 6 deletions clang/lib/DPCT/MigrationReport/Statics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
//===----------------------------------------------------------------------===//
#include "MigrationReport/Statics.h"
#include "ASTTraversal.h"
#include "FileGenerator/GenFiles.h"
#include "RulesInclude/InclusionHeaders.h"

#include <numeric>
#include <unordered_set>
Expand Down Expand Up @@ -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<class T> LineStream &operator<<(T &&Input) {
template <class T> LineStream &operator<<(T &&Input) {
OS << std::forward<T>(Input);
return *this;
}
Expand All @@ -215,7 +214,7 @@ struct AnalysisModeSummary {

StringRef Name;
unsigned Total = 0;
unsigned Counter[CounterNum] = { 0 };
unsigned Counter[CounterNum] = {0};

AnalysisModeSummary(StringRef Name) : Name(Name) {}

Expand Down Expand Up @@ -281,6 +280,11 @@ class AnalysisModeStats {
static const std::string LastMsg;
static llvm::StringMap<AnalysisModeStats> AnalysisModeStaticsMap;

static struct {
uint8_t Flag = 0;
bool operator[](uint8_t Idx) { return Flag & (1 << Idx); }
} DependencyBits;

struct EffortLevelWrap {
unsigned EL;
EffortLevelWrap() : EL(NoEffort) {}
Expand Down Expand Up @@ -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<uint8_t>(LibraryDependencies::NUMS)];
DependenceNames() noexcept {
#define LIBRARY(LIBNAME, LIBDESC, ...) \
Strs[static_cast<uint8_t>(LibraryDependencies::LD_##LIBNAME)] = LIBDESC;
#include "Libraries.inc"
}
} Names;
auto EntryIndent = Indent + AnalysisModeSummary::IndentIncremental;
for (unsigned i = 0; i < static_cast<uint8_t>(LibraryDependencies::NUMS);
++i) {
if (DependencyBits[i])
LineStream(OS, EntryIndent) << "- The Intel " << Names.Strs[i];
}
}
LineStream(OS, Indent) << LastMsg;
}

Expand All @@ -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<uint8_t>(LibraryDependencies::NUMS);
++i) {
DependencyBits.Flag |=
Group.isDependsOn(static_cast<LibraryDependencies>(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/"
Expand Down Expand Up @@ -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
3 changes: 3 additions & 0 deletions clang/lib/DPCT/MigrationReport/Statics.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
40 changes: 29 additions & 11 deletions clang/lib/DPCT/RulesInclude/InclusionHeaders.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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 <class... Args>
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<uint8_t>(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<uint8_t>(LibraryDependencies::NUMS)];
LibraryMasks() noexcept {
#define LIBRARY(LIBNAME, LIBDESC, ...) \
BitMasks[static_cast<uint8_t>(LibraryDependencies::LD_##LIBNAME)] = \
flag(__VA_ARGS__);
#include "MigrationReport/Libraries.inc"
}
} Masks;
return Flags & Masks.BitMasks[static_cast<uint8_t>(LD)];
}
bool isMKLEnabled() const noexcept {
return isDependsOn(LibraryDependencies::LD_MKL);
}
};

Expand Down