This is an archive of the discontinued LLVM Phabricator instance.

[clang-tidy] Add skip-headers; use skipLocation and setTraversalScope
AbandonedPublic

Authored by chh on Aug 2 2021, 9:15 PM.

Details

Reviewers
None
Summary

[clang-tidy] Add skip-headers; use skipLocation and setTraversalScope

  • This depends on https://reviews.llvm.org/D104071.
  • This new feature has impacts similar to --header-filter and --system-headers.
    • Clang-tidy by default checks header files, reports the number of warnings found in header files but not those warning messages.
    • With --header-filter, clang-tidy shows warnings in selected header files, but not system header files.
    • With --system-headers, clang-tidy shows also warnings in system header files.
    • With --skip-headers, clang-tidy does not check header files, and does not know or count warnings in header files. However, if --header-filter or --system-headers are used, those header files will be checked and warnings be counted and displayed.
  • For users who do not need to know the number of not-shown warnings in header files, this feature saves maybe 60% to 80% of clang-tidy run-time, by skipping checks of header files. When building Android system with clang-tidy, repeated checks on commonly included header files in multiple compilation units took significant part of build time, which could be saved by this new feature.
  • Note that this is not the same as PCH, which usually saves parsing time, but not semantic checks or code generation time.
  • This part 1 implementation only affects the MatchFinder-based checks, not the PPCallback-based or the static analyzer checks. Follow up changes could make the other checks to skip header files and save more time.
  • Add a --show-all-warnings flag. It is hidden, not shown by --help. When it is used, ClangTidyDiagnosticConsumer::checkFilters will not suppress any diagnostic message. This is useful to find tidy checks that have not yet handled the --skip-headers flag.
  • Implementation Methods:
    • Factor out LocationFilter in ClangTidyDiagnosticConsumer
      • The skipLocation checks if a location should not be checked.
      • Use simple cache of the last skipped/accepted FileID to minimize the overhead of skipLocation.
    • Add a LocFilter to Tidy's MatchFinderOptions. In MatchASTVisitor::TraverseDecl and TraverseStmt, skip a sub-tree if the MatchFinderOptions has a LocFilter that decides to skip the location.
    • Add an AllFileFinder for checks that need to match all source files.
      • ForwardDeclarationNamespaceCheck is registered as an AllFileCheck, to avoid missing valid warnings on main source files.
      • UnusedUsingDeclsCheck is registered as an AllFileCheck, to avoid incorrect warnings on main source files.
      • Their diag functions call ClangTidyCheck::skipLocation to skip diagnostics on header files.
    • Depending on new changes to set/getTraversalScope in https://reviews.llvm.org/D104071, the AST was modified to exclude header file top-level Decls during the call to MatchFinder's ASTConsumer's HandleTranslationUnit.
      • AllFileFinder's and static analyzer's AST consumers are still called with the unmodified full AST.
      • ClangTidyASTConsumer overrides two member functions of MultiplexConsumer and accesses the Consumers data member.
        • in HandleTopLevelDecl to collect filtered Decls.
        • in HandleTranslationUnit to call get/setTraversalScope before calling the Finder ASTConcumser, which calls matchAST.
  • Tests:
    • Add skip-headers*.cpp tests to show the effects of new flags.
    • Add bugprone-forward-declaration-namespace-header.cpp test to show how AllFileMatchFinder-based checks can depend on header Decls.
    • Add new test cases into misc-unused-using-decls.cpp.
    • Extend some clang-tidy checker tests to make sure that --skip-headers skips checks/warnings in the header files: google-namespaces.cpp modernize-pass-by-value-header.cpp
    • Add runs with --skip-headers in some clang-tidy checker tests to make sure that the option does not hide warnings in the main file:
      • about 18 other clang-tools-extra/test/clang-tidy/checkers/*.cpp
    • Some tests were added --skip-headers=0 flag to get expected warning messages in test header files: checkers/abseil-no-internal-dependencies.cpp checkers/abseil-upgrade-duration-conversions.cpp checkers/google-namespaces.cpp infrastructure/file-filter-symlinks.cpp infrastructure/file-filter.cpp infrastructure/line-filter.cpp
    • Some expected no-output lines in skip-headers-1 have FIXME, so they will pass test before the related PPCallbacks checks support the skip-headers option.

Diff Detail

Event Timeline

chh created this revision.Aug 2 2021, 9:15 PM
chh requested review of this revision.Aug 2 2021, 9:15 PM
Herald added a project: Restricted Project. · View Herald TranscriptAug 2 2021, 9:15 PM
Herald added a subscriber: cfe-commits. · View Herald Transcript
MTC added a subscriber: MTC.Aug 16 2021, 6:43 PM
chh updated this revision to Diff 367120.Aug 17 2021, 11:09 PM
chh edited the summary of this revision. (Show Details)

Factor out LocationFilter; improve more tests.

chh updated this revision to Diff 367331.Aug 18 2021, 2:55 PM

fix windows test failure

chh abandoned this revision.Sep 14 2022, 1:10 PM
Herald added a project: Restricted Project. · View Herald TranscriptSep 14 2022, 1:10 PM