SanitizerSpecialCaseList.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //===--- SanitizerSpecialCaseList.cpp - SCL for sanitizers ----------------===//
  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. // An extension of SpecialCaseList to allowing querying sections by
  10. // SanitizerMask.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "clang/Basic/SanitizerSpecialCaseList.h"
  14. using namespace clang;
  15. std::unique_ptr<SanitizerSpecialCaseList>
  16. SanitizerSpecialCaseList::create(const std::vector<std::string> &Paths,
  17. std::string &Error) {
  18. std::unique_ptr<clang::SanitizerSpecialCaseList> SSCL(
  19. new SanitizerSpecialCaseList());
  20. if (SSCL->createInternal(Paths, Error)) {
  21. SSCL->createSanitizerSections();
  22. return SSCL;
  23. }
  24. return nullptr;
  25. }
  26. std::unique_ptr<SanitizerSpecialCaseList>
  27. SanitizerSpecialCaseList::createOrDie(const std::vector<std::string> &Paths) {
  28. std::string Error;
  29. if (auto SSCL = create(Paths, Error))
  30. return SSCL;
  31. llvm::report_fatal_error(Error);
  32. }
  33. void SanitizerSpecialCaseList::createSanitizerSections() {
  34. for (auto &S : Sections) {
  35. SanitizerMask Mask;
  36. #define SANITIZER(NAME, ID) \
  37. if (S.SectionMatcher->match(NAME)) \
  38. Mask |= SanitizerKind::ID;
  39. #define SANITIZER_GROUP(NAME, ID, ALIAS) SANITIZER(NAME, ID)
  40. #include "clang/Basic/Sanitizers.def"
  41. #undef SANITIZER
  42. #undef SANITIZER_GROUP
  43. SanitizerSections.emplace_back(Mask, S.Entries);
  44. }
  45. }
  46. bool SanitizerSpecialCaseList::inSection(SanitizerMask Mask, StringRef Prefix,
  47. StringRef Query,
  48. StringRef Category) const {
  49. for (auto &S : SanitizerSections)
  50. if ((S.Mask & Mask) &&
  51. SpecialCaseList::inSectionBlame(S.Entries, Prefix, Query, Category))
  52. return true;
  53. return false;
  54. }