Skip to content

Commit da93b6e

Browse files
committed
Merge from 'master' to 'sycl-web' (#1)
CONFLICT (content): Merge conflict in clang/utils/TableGen/TableGen.cpp
2 parents 2b9d175 + 55120f7 commit da93b6e

File tree

1,312 files changed

+76271
-16190
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,312 files changed

+76271
-16190
lines changed

clang-tools-extra/clang-tidy/ClangTidyOptions.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,9 @@ llvm::Optional<OptionsSource>
325325
FileOptionsBaseProvider::tryReadConfigFile(StringRef Directory) {
326326
assert(!Directory.empty());
327327

328-
if (!llvm::sys::fs::is_directory(Directory)) {
328+
llvm::ErrorOr<llvm::vfs::Status> DirectoryStatus = FS->status(Directory);
329+
330+
if (!DirectoryStatus || !DirectoryStatus->isDirectory()) {
329331
llvm::errs() << "Error reading configuration from " << Directory
330332
<< ": directory doesn't exist.\n";
331333
return llvm::None;
@@ -336,15 +338,13 @@ FileOptionsBaseProvider::tryReadConfigFile(StringRef Directory) {
336338
llvm::sys::path::append(ConfigFile, ConfigHandler.first);
337339
LLVM_DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n");
338340

339-
bool IsFile = false;
340-
// Ignore errors from is_regular_file: we only need to know if we can read
341-
// the file or not.
342-
llvm::sys::fs::is_regular_file(Twine(ConfigFile), IsFile);
343-
if (!IsFile)
341+
llvm::ErrorOr<llvm::vfs::Status> FileStatus = FS->status(ConfigFile);
342+
343+
if (!FileStatus || !FileStatus->isRegularFile())
344344
continue;
345345

346346
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
347-
llvm::MemoryBuffer::getFile(ConfigFile.c_str());
347+
FS->getBufferForFile(ConfigFile);
348348
if (std::error_code EC = Text.getError()) {
349349
llvm::errs() << "Can't read " << ConfigFile << ": " << EC.message()
350350
<< "\n";
@@ -363,7 +363,7 @@ FileOptionsBaseProvider::tryReadConfigFile(StringRef Directory) {
363363
<< ParsedOptions.getError().message() << "\n";
364364
continue;
365365
}
366-
return OptionsSource(*ParsedOptions, ConfigFile.c_str());
366+
return OptionsSource(*ParsedOptions, std::string(ConfigFile));
367367
}
368368
return llvm::None;
369369
}

clang-tools-extra/clang-tidy/altera/AlteraTidyModule.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "../ClangTidy.h"
1010
#include "../ClangTidyModule.h"
1111
#include "../ClangTidyModuleRegistry.h"
12+
#include "KernelNameRestrictionCheck.h"
1213
#include "StructPackAlignCheck.h"
1314

1415
using namespace clang::ast_matchers;
@@ -20,6 +21,8 @@ namespace altera {
2021
class AlteraModule : public ClangTidyModule {
2122
public:
2223
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
24+
CheckFactories.registerCheck<KernelNameRestrictionCheck>(
25+
"altera-kernel-name-restriction");
2326
CheckFactories.registerCheck<StructPackAlignCheck>(
2427
"altera-struct-pack-align");
2528
}

clang-tools-extra/clang-tidy/altera/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS
55

66
add_clang_library(clangTidyAlteraModule
77
AlteraTidyModule.cpp
8+
KernelNameRestrictionCheck.cpp
89
StructPackAlignCheck.cpp
910

1011
LINK_LIBS
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
//===--- KernelNameRestrictionCheck.cpp - clang-tidy ----------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "KernelNameRestrictionCheck.h"
10+
#include "clang/Frontend/CompilerInstance.h"
11+
#include "clang/Lex/PPCallbacks.h"
12+
#include "clang/Lex/Preprocessor.h"
13+
#include <string>
14+
#include <vector>
15+
16+
using namespace clang::ast_matchers;
17+
18+
namespace clang {
19+
namespace tidy {
20+
namespace altera {
21+
22+
namespace {
23+
24+
class KernelNameRestrictionPPCallbacks : public PPCallbacks {
25+
public:
26+
explicit KernelNameRestrictionPPCallbacks(ClangTidyCheck &Check,
27+
const SourceManager &SM)
28+
: Check(Check), SM(SM) {}
29+
30+
void InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok,
31+
StringRef FileName, bool IsAngled,
32+
CharSourceRange FileNameRange, const FileEntry *File,
33+
StringRef SearchPath, StringRef RelativePath,
34+
const Module *Imported,
35+
SrcMgr::CharacteristicKind FileType) override;
36+
37+
void EndOfMainFile() override;
38+
39+
private:
40+
/// Returns true if the name of the file with path FilePath is 'kernel.cl',
41+
/// 'verilog.cl', or 'vhdl.cl'. The file name check is case insensitive.
42+
bool FileNameIsRestricted(StringRef FilePath);
43+
44+
struct IncludeDirective {
45+
SourceLocation Loc; // Location in the include directive.
46+
StringRef FileName; // Filename as a string.
47+
};
48+
49+
std::vector<IncludeDirective> IncludeDirectives;
50+
ClangTidyCheck &Check;
51+
const SourceManager &SM;
52+
};
53+
54+
} // namespace
55+
56+
void KernelNameRestrictionCheck::registerPPCallbacks(const SourceManager &SM,
57+
Preprocessor *PP,
58+
Preprocessor *) {
59+
PP->addPPCallbacks(
60+
std::make_unique<KernelNameRestrictionPPCallbacks>(*this, SM));
61+
}
62+
63+
void KernelNameRestrictionPPCallbacks::InclusionDirective(
64+
SourceLocation HashLoc, const Token &, StringRef FileName, bool,
65+
CharSourceRange, const FileEntry *, StringRef, StringRef, const Module *,
66+
SrcMgr::CharacteristicKind) {
67+
IncludeDirective ID = {HashLoc, FileName};
68+
IncludeDirectives.push_back(std::move(ID));
69+
}
70+
71+
bool KernelNameRestrictionPPCallbacks::FileNameIsRestricted(
72+
StringRef FileName) {
73+
return FileName.equals_lower("kernel.cl") ||
74+
FileName.equals_lower("verilog.cl") ||
75+
FileName.equals_lower("vhdl.cl");
76+
}
77+
78+
void KernelNameRestrictionPPCallbacks::EndOfMainFile() {
79+
80+
// Check main file for restricted names.
81+
const FileEntry *Entry = SM.getFileEntryForID(SM.getMainFileID());
82+
StringRef FileName = llvm::sys::path::filename(Entry->getName());
83+
if (FileNameIsRestricted(FileName))
84+
Check.diag(SM.getLocForStartOfFile(SM.getMainFileID()),
85+
"compiling '%0' may cause additional compilation errors due "
86+
"to the name of the kernel source file; consider renaming the "
87+
"included kernel source file")
88+
<< FileName;
89+
90+
if (IncludeDirectives.empty())
91+
return;
92+
93+
// Check included files for restricted names.
94+
for (const IncludeDirective &ID : IncludeDirectives) {
95+
StringRef FileName = llvm::sys::path::filename(ID.FileName);
96+
if (FileNameIsRestricted(FileName))
97+
Check.diag(ID.Loc,
98+
"including '%0' may cause additional compilation errors due "
99+
"to the name of the kernel source file; consider renaming the "
100+
"included kernel source file")
101+
<< FileName;
102+
}
103+
}
104+
105+
} // namespace altera
106+
} // namespace tidy
107+
} // namespace clang
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//===--- KernelNameRestrictionCheck.h - clang-tidy --------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ALTERA_KERNEL_NAME_RESTRICTION_CHECK_H
10+
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ALTERA_KERNEL_NAME_RESTRICTION_CHECK_H
11+
12+
#include "../ClangTidyCheck.h"
13+
14+
namespace clang {
15+
namespace tidy {
16+
namespace altera {
17+
18+
/// Finds kernel files and include directives whose filename is `kernel.cl`,
19+
/// `Verilog.cl`, or `VHDL.cl`.
20+
///
21+
/// For the user-facing documentation see:
22+
/// http://clang.llvm.org/extra/clang-tidy/checks/altera-kernel-name-restriction.html
23+
class KernelNameRestrictionCheck : public ClangTidyCheck {
24+
public:
25+
KernelNameRestrictionCheck(StringRef Name, ClangTidyContext *Context)
26+
: ClangTidyCheck(Name, Context) {}
27+
void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
28+
Preprocessor *) override;
29+
};
30+
31+
} // namespace altera
32+
} // namespace tidy
33+
} // namespace clang
34+
35+
#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ALTERA_KERNEL_NAME_RESTRICTION_CHECK_H

clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@ static StringRef const StyleNames[] = {
122122
#undef NAMING_KEYS
123123
// clang-format on
124124

125-
static std::vector<llvm::Optional<IdentifierNamingCheck::NamingStyle>>
126-
getNamingStyles(const ClangTidyCheck::OptionsView &Options) {
127-
std::vector<llvm::Optional<IdentifierNamingCheck::NamingStyle>> Styles(
125+
static IdentifierNamingCheck::FileStyle
126+
getFileStyleFromOptions(const ClangTidyCheck::OptionsView &Options) {
127+
SmallVector<llvm::Optional<IdentifierNamingCheck::NamingStyle>, 0> Styles(
128128
SK_Count);
129129
SmallString<64> StyleString;
130130
for (unsigned I = 0; I < SK_Count; ++I) {
@@ -145,50 +145,52 @@ getNamingStyles(const ClangTidyCheck::OptionsView &Options) {
145145
Styles[I].emplace(std::move(CaseOptional), std::move(Prefix),
146146
std::move(Postfix));
147147
}
148-
return Styles;
148+
bool IgnoreMainLike = Options.get("IgnoreMainLikeFunctions", false);
149+
return {std::move(Styles), IgnoreMainLike};
149150
}
150151

151152
IdentifierNamingCheck::IdentifierNamingCheck(StringRef Name,
152153
ClangTidyContext *Context)
153154
: RenamerClangTidyCheck(Name, Context), Context(Context), CheckName(Name),
154155
GetConfigPerFile(Options.get("GetConfigPerFile", true)),
155-
IgnoreFailedSplit(Options.get("IgnoreFailedSplit", false)),
156-
IgnoreMainLikeFunctions(Options.get("IgnoreMainLikeFunctions", false)) {
156+
IgnoreFailedSplit(Options.get("IgnoreFailedSplit", false)) {
157157

158158
auto IterAndInserted = NamingStylesCache.try_emplace(
159159
llvm::sys::path::parent_path(Context->getCurrentFile()),
160-
getNamingStyles(Options));
160+
getFileStyleFromOptions(Options));
161161
assert(IterAndInserted.second && "Couldn't insert Style");
162162
// Holding a reference to the data in the vector is safe as it should never
163163
// move.
164-
MainFileStyle = IterAndInserted.first->getValue();
164+
MainFileStyle = &IterAndInserted.first->getValue();
165165
}
166166

167167
IdentifierNamingCheck::~IdentifierNamingCheck() = default;
168168

169169
void IdentifierNamingCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
170170
RenamerClangTidyCheck::storeOptions(Opts);
171171
SmallString<64> StyleString;
172+
ArrayRef<llvm::Optional<NamingStyle>> Styles = MainFileStyle->getStyles();
172173
for (size_t I = 0; I < SK_Count; ++I) {
173-
if (!MainFileStyle[I])
174+
if (!Styles[I])
174175
continue;
175176
StyleString = StyleNames[I];
176177
size_t StyleSize = StyleString.size();
177178
StyleString.append("Prefix");
178-
Options.store(Opts, StyleString, MainFileStyle[I]->Prefix);
179+
Options.store(Opts, StyleString, Styles[I]->Prefix);
179180
// Fast replacement of [Pre]fix -> [Suf]fix.
180181
memcpy(&StyleString[StyleSize], "Suf", 3);
181-
Options.store(Opts, StyleString, MainFileStyle[I]->Suffix);
182-
if (MainFileStyle[I]->Case) {
182+
Options.store(Opts, StyleString, Styles[I]->Suffix);
183+
if (Styles[I]->Case) {
183184
memcpy(&StyleString[StyleSize], "Case", 4);
184185
StyleString.pop_back();
185186
StyleString.pop_back();
186-
Options.store(Opts, StyleString, *MainFileStyle[I]->Case);
187+
Options.store(Opts, StyleString, *Styles[I]->Case);
187188
}
188189
}
189190
Options.store(Opts, "GetConfigPerFile", GetConfigPerFile);
190191
Options.store(Opts, "IgnoreFailedSplit", IgnoreFailedSplit);
191-
Options.store(Opts, "IgnoreMainLikeFunctions", IgnoreMainLikeFunctions);
192+
Options.store(Opts, "IgnoreMainLikeFunctions",
193+
MainFileStyle->isIgnoringMainLikeFunction());
192194
}
193195

194196
static bool matchesStyle(StringRef Name,
@@ -704,23 +706,27 @@ llvm::Optional<RenamerClangTidyCheck::FailureInfo>
704706
IdentifierNamingCheck::GetDeclFailureInfo(const NamedDecl *Decl,
705707
const SourceManager &SM) const {
706708
SourceLocation Loc = Decl->getLocation();
707-
ArrayRef<llvm::Optional<NamingStyle>> NamingStyles =
708-
getStyleForFile(SM.getFilename(Loc));
709-
710-
return getFailureInfo(
711-
Decl->getName(), Loc, NamingStyles,
712-
findStyleKind(Decl, NamingStyles, IgnoreMainLikeFunctions), SM,
713-
IgnoreFailedSplit);
709+
const FileStyle &FileStyle = getStyleForFile(SM.getFilename(Loc));
710+
if (!FileStyle.isActive())
711+
return llvm::None;
712+
713+
return getFailureInfo(Decl->getName(), Loc, FileStyle.getStyles(),
714+
findStyleKind(Decl, FileStyle.getStyles(),
715+
FileStyle.isIgnoringMainLikeFunction()),
716+
SM, IgnoreFailedSplit);
714717
}
715718

716719
llvm::Optional<RenamerClangTidyCheck::FailureInfo>
717720
IdentifierNamingCheck::GetMacroFailureInfo(const Token &MacroNameTok,
718721
const SourceManager &SM) const {
719722
SourceLocation Loc = MacroNameTok.getLocation();
723+
const FileStyle &Style = getStyleForFile(SM.getFilename(Loc));
724+
if (!Style.isActive())
725+
return llvm::None;
720726

721727
return getFailureInfo(MacroNameTok.getIdentifierInfo()->getName(), Loc,
722-
getStyleForFile(SM.getFilename(Loc)),
723-
SK_MacroDefinition, SM, IgnoreFailedSplit);
728+
Style.getStyles(), SK_MacroDefinition, SM,
729+
IgnoreFailedSplit);
724730
}
725731

726732
RenamerClangTidyCheck::DiagInfo
@@ -732,19 +738,26 @@ IdentifierNamingCheck::GetDiagInfo(const NamingCheckId &ID,
732738
}};
733739
}
734740

735-
ArrayRef<llvm::Optional<IdentifierNamingCheck::NamingStyle>>
741+
const IdentifierNamingCheck::FileStyle &
736742
IdentifierNamingCheck::getStyleForFile(StringRef FileName) const {
737743
if (!GetConfigPerFile)
738-
return MainFileStyle;
739-
auto &Styles = NamingStylesCache[llvm::sys::path::parent_path(FileName)];
740-
if (Styles.empty()) {
741-
ClangTidyOptions Options = Context->getOptionsForFile(FileName);
742-
if (Options.Checks && GlobList(*Options.Checks).contains(CheckName))
743-
Styles = getNamingStyles({CheckName, Options.CheckOptions});
744-
else
745-
Styles.resize(SK_Count, None);
744+
return *MainFileStyle;
745+
StringRef Parent = llvm::sys::path::parent_path(FileName);
746+
auto Iter = NamingStylesCache.find(Parent);
747+
if (Iter != NamingStylesCache.end())
748+
return Iter->getValue();
749+
750+
ClangTidyOptions Options = Context->getOptionsForFile(FileName);
751+
if (Options.Checks && GlobList(*Options.Checks).contains(CheckName)) {
752+
auto It = NamingStylesCache.try_emplace(
753+
Parent, getFileStyleFromOptions({CheckName, Options.CheckOptions}));
754+
assert(It.second);
755+
return It.first->getValue();
746756
}
747-
return Styles;
757+
// Default construction gives an empty style.
758+
auto It = NamingStylesCache.try_emplace(Parent);
759+
assert(It.second);
760+
return It.first->getValue();
748761
}
749762

750763
} // namespace readability

0 commit comments

Comments
 (0)