1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- //===--- SanitizerSpecialCaseList.cpp - SCL for sanitizers ----------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // An extension of SpecialCaseList to allowing querying sections by
- // SanitizerMask.
- //
- //===----------------------------------------------------------------------===//
- #include "clang/Basic/SanitizerSpecialCaseList.h"
- using namespace clang;
- std::unique_ptr<SanitizerSpecialCaseList>
- SanitizerSpecialCaseList::create(const std::vector<std::string> &Paths,
- llvm::vfs::FileSystem &VFS,
- std::string &Error) {
- std::unique_ptr<clang::SanitizerSpecialCaseList> SSCL(
- new SanitizerSpecialCaseList());
- if (SSCL->createInternal(Paths, VFS, Error)) {
- SSCL->createSanitizerSections();
- return SSCL;
- }
- return nullptr;
- }
- std::unique_ptr<SanitizerSpecialCaseList>
- SanitizerSpecialCaseList::createOrDie(const std::vector<std::string> &Paths,
- llvm::vfs::FileSystem &VFS) {
- std::string Error;
- if (auto SSCL = create(Paths, VFS, Error))
- return SSCL;
- llvm::report_fatal_error(Error);
- }
- void SanitizerSpecialCaseList::createSanitizerSections() {
- for (auto &S : Sections) {
- SanitizerMask Mask;
- #define SANITIZER(NAME, ID) \
- if (S.SectionMatcher->match(NAME)) \
- Mask |= SanitizerKind::ID;
- #define SANITIZER_GROUP(NAME, ID, ALIAS) SANITIZER(NAME, ID)
- #include "clang/Basic/Sanitizers.def"
- #undef SANITIZER
- #undef SANITIZER_GROUP
- SanitizerSections.emplace_back(Mask, S.Entries);
- }
- }
- bool SanitizerSpecialCaseList::inSection(SanitizerMask Mask, StringRef Prefix,
- StringRef Query,
- StringRef Category) const {
- for (auto &S : SanitizerSections)
- if ((S.Mask & Mask) &&
- SpecialCaseList::inSectionBlame(S.Entries, Prefix, Query, Category))
- return true;
- return false;
- }
|