[clang-tools-extra] [include-cleaner] Handle symbols from system headers. (PR #66089)

kadir çetinkaya via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 18 03:21:01 PDT 2023


================
@@ -176,6 +180,104 @@ headersForSpecialSymbol(const Symbol &S, const SourceManager &SM,
   return std::nullopt;
 }
 
+// A hand-mainained list of include mappings for system headers.
+// The first element is the suffix of the physical file path for the system
+// header, the second element is the final verbatim header spelling.
+const std::pair<llvm::StringRef, llvm::StringRef> IncludeMappings[] = {
+    {"bits/types/struct_timeval.h", "<sys/time.h>"},
+    {"bits/pthreadtypes.h", "<pthread.h>"},
+    {"bits/types/struct_iovec.h", "<sys/uio.h>"},
+    {"linux/limits.h", "<limits.h>"},
+    {"bits/getopt_core.h", "<getopt.h>"},
+    {"asm-generic/socket.h", "<sys/socket.h>"},
+    {"bits/posix1_lim.h", "<limits.h>"},
+    {"bits/time.h", "time.h"},
+    {"bits/getopt_ext.h", "<getopt.h>"},
+    {"bits/types/sigset_t.h", "<signal.h>"},
+    {"bits/types/siginfo_t.h", "<signal.h>"},
+    {"bits/types/FILE.h", "<stdio.h>"},
+    {"asm/unistd_64.h", "<asm/unistd.h>"},
+    {"bits/stat.h", "<sys/stat.h>"},
+    {"asm-generic/ioctls.h", "<sys/ioctls.h>"},
+    {"asm-generic/errno.h", "<errno.h>"},
+    {"asm-generic/int-ll64.h", "<asm/types.h>"},
+    {"bits/sigaction.h", "<signal.h>"},
+    {"bits/types/struct_rusage.h", "<sys/resource.h>"},
+    {"sys/syscall.h", "<syscall.h>"},
+    {"linux/prctl.h", "<sys/prctl.h>"},
+    {"sys/ucontext.h", "<ucontext.h>"},
+    {"bits/types/clockid_t.h", "<time.h>"},
+    {"bits/types/mbstate_t.h", "<uchar.h>"},
+    {"bits/types/mbstate_t.h", "<wchar.h>"},
+    {"bits/types/struct_itimerspec.h", "<time.h>"},
+    {"bits/types/time_t.h", "<time.h>"},
+    {"bits/sockaddr.h", "<time.h>"},
+};
+// The maximum number of path components in a key from SuffixHeaderMapping.
+// Used to minimize the number of lookups in suffix path mappings.
+constexpr int MaxSuffixComponents = 3;
+
+// A mapping for system headers based on a set of filename rules.
+class SystemIncludeMap {
+public:
+  static const SystemIncludeMap &get() {
+    static SystemIncludeMap Instance;
+    static const auto *SystemHeaderMap = [] {
+      const size_t Size = sizeof(IncludeMappings) / sizeof(IncludeMappings[0]);
+      auto *HeaderMap = new std::multimap<llvm::StringRef, llvm::StringRef>();
+      for (size_t I = 0; I < Size; I++) {
+        HeaderMap->insert(IncludeMappings[I]);
+      }
+      return HeaderMap;
+    }();
+
+    // // Check MaxSuffixComponents constant is correct.
+    assert(llvm::all_of(*SystemHeaderMap, [](const auto &KeyAndValue) {
+      return std::distance(
+                 llvm::sys::path::begin(KeyAndValue.first,
+                                        llvm::sys::path::Style::posix),
+                 llvm::sys::path::end(KeyAndValue.first)) <=
+             MaxSuffixComponents;
+    }));
+    // ... and precise.
+    assert(llvm::any_of(*SystemHeaderMap, [](const auto &KeyAndValue) {
+      return std::distance(
+                 llvm::sys::path::begin(KeyAndValue.first,
+                                        llvm::sys::path::Style::posix),
+                 llvm::sys::path::end(KeyAndValue.first)) ==
+             MaxSuffixComponents;
+    }));
+
+    Instance.SuffixHeaderMapping = SystemHeaderMap;
+    return Instance;
+  }
+
+  // Returns the overridden verbatim spellings for HeaderPath that can be
+  // directly included.
+  llvm::SmallVector<llvm::StringRef>
+  mapHeader(llvm::StringRef HeaderPath) const {
+    if (!SuffixHeaderMapping)
+      return {};
+
+    int Components = 1;
+    llvm::SmallVector<llvm::StringRef> Headers;
+    for (auto It = llvm::sys::path::rbegin(HeaderPath),
+              End = llvm::sys::path::rend(HeaderPath);
+         It != End && Components <= MaxSuffixComponents; ++It, ++Components) {
+      auto SubPath = HeaderPath.substr(It->data() - HeaderPath.begin());
+      auto FoundRange = SuffixHeaderMapping->equal_range(SubPath);
+      for (auto It = FoundRange.first; It != FoundRange.second; ++It)
+        Headers.push_back(It->second);
+    }
+    return Headers;;
----------------
kadircet wrote:

extra `;`

https://github.com/llvm/llvm-project/pull/66089


More information about the cfe-commits mailing list