clang-tools  17.0.0git
KernelNameRestrictionCheck.cpp
Go to the documentation of this file.
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 
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::tidy::altera {
19 
20 namespace {
21 
22 class KernelNameRestrictionPPCallbacks : public PPCallbacks {
23 public:
24  explicit KernelNameRestrictionPPCallbacks(ClangTidyCheck &Check,
25  const SourceManager &SM)
26  : Check(Check), SM(SM) {}
27 
28  void InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok,
29  StringRef FileName, bool IsAngled,
30  CharSourceRange FileNameRange,
31  OptionalFileEntryRef File, StringRef SearchPath,
32  StringRef RelativePath, const Module *Imported,
33  SrcMgr::CharacteristicKind FileType) override;
34 
35  void EndOfMainFile() override;
36 
37 private:
38  /// Returns true if the name of the file with path FilePath is 'kernel.cl',
39  /// 'verilog.cl', or 'vhdl.cl'. The file name check is case insensitive.
40  bool fileNameIsRestricted(StringRef FilePath);
41 
42  struct IncludeDirective {
43  SourceLocation Loc; // Location in the include directive.
44  StringRef FileName; // Filename as a string.
45  };
46 
47  std::vector<IncludeDirective> IncludeDirectives;
48  ClangTidyCheck &Check;
49  const SourceManager &SM;
50 };
51 
52 } // namespace
53 
54 void KernelNameRestrictionCheck::registerPPCallbacks(const SourceManager &SM,
55  Preprocessor *PP,
56  Preprocessor *) {
57  PP->addPPCallbacks(
58  std::make_unique<KernelNameRestrictionPPCallbacks>(*this, SM));
59 }
60 
61 void KernelNameRestrictionPPCallbacks::InclusionDirective(
62  SourceLocation HashLoc, const Token &, StringRef FileName, bool,
63  CharSourceRange, OptionalFileEntryRef, StringRef, StringRef, const Module *,
64  SrcMgr::CharacteristicKind) {
65  IncludeDirective ID = {HashLoc, FileName};
66  IncludeDirectives.push_back(std::move(ID));
67 }
68 
69 bool KernelNameRestrictionPPCallbacks::fileNameIsRestricted(
70  StringRef FileName) {
71  return FileName.equals_insensitive("kernel.cl") ||
72  FileName.equals_insensitive("verilog.cl") ||
73  FileName.equals_insensitive("vhdl.cl");
74 }
75 
76 void KernelNameRestrictionPPCallbacks::EndOfMainFile() {
77 
78  // Check main file for restricted names.
79  const FileEntry *Entry = SM.getFileEntryForID(SM.getMainFileID());
80  StringRef FileName = llvm::sys::path::filename(Entry->getName());
81  if (fileNameIsRestricted(FileName))
82  Check.diag(SM.getLocForStartOfFile(SM.getMainFileID()),
83  "compiling '%0' may cause additional compilation errors due "
84  "to the name of the kernel source file; consider renaming the "
85  "included kernel source file")
86  << FileName;
87 
88  if (IncludeDirectives.empty())
89  return;
90 
91  // Check included files for restricted names.
92  for (const IncludeDirective &ID : IncludeDirectives) {
93  StringRef FileName = llvm::sys::path::filename(ID.FileName);
94  if (fileNameIsRestricted(FileName))
95  Check.diag(ID.Loc,
96  "including '%0' may cause additional compilation errors due "
97  "to the name of the kernel source file; consider renaming the "
98  "included kernel source file")
99  << FileName;
100  }
101 }
102 
103 } // namespace clang::tidy::altera
Loc
SourceLocation Loc
Definition: KernelNameRestrictionCheck.cpp:43
clang::ast_matchers
Definition: AbseilMatcher.h:13
FileName
StringRef FileName
Definition: KernelNameRestrictionCheck.cpp:44
clang::tidy::altera
Definition: AlteraTidyModule.cpp:21
clang::tidy::bugprone::PP
static Preprocessor * PP
Definition: BadSignalToKillThreadCheck.cpp:28
Entry
Definition: Modularize.cpp:427
IsAngled
bool IsAngled
true if this was an include with angle brackets
Definition: IncludeOrderCheck.cpp:39
ID
static char ID
Definition: Logger.cpp:74
KernelNameRestrictionCheck.h