1326941Sdim//===--- SanitizerSpecialCaseList.cpp - SCL for sanitizers ----------------===// 2326941Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6326941Sdim// 7326941Sdim//===----------------------------------------------------------------------===// 8326941Sdim// 9326941Sdim// An extension of SpecialCaseList to allowing querying sections by 10326941Sdim// SanitizerMask. 11326941Sdim// 12326941Sdim//===----------------------------------------------------------------------===// 13326941Sdim#include "clang/Basic/SanitizerSpecialCaseList.h" 14326941Sdim 15326941Sdimusing namespace clang; 16326941Sdim 17326941Sdimstd::unique_ptr<SanitizerSpecialCaseList> 18326941SdimSanitizerSpecialCaseList::create(const std::vector<std::string> &Paths, 19360784Sdim llvm::vfs::FileSystem &VFS, 20326941Sdim std::string &Error) { 21326941Sdim std::unique_ptr<clang::SanitizerSpecialCaseList> SSCL( 22326941Sdim new SanitizerSpecialCaseList()); 23360784Sdim if (SSCL->createInternal(Paths, VFS, Error)) { 24326941Sdim SSCL->createSanitizerSections(); 25326941Sdim return SSCL; 26326941Sdim } 27326941Sdim return nullptr; 28326941Sdim} 29326941Sdim 30326941Sdimstd::unique_ptr<SanitizerSpecialCaseList> 31360784SdimSanitizerSpecialCaseList::createOrDie(const std::vector<std::string> &Paths, 32360784Sdim llvm::vfs::FileSystem &VFS) { 33326941Sdim std::string Error; 34360784Sdim if (auto SSCL = create(Paths, VFS, Error)) 35326941Sdim return SSCL; 36326941Sdim llvm::report_fatal_error(Error); 37326941Sdim} 38326941Sdim 39326941Sdimvoid SanitizerSpecialCaseList::createSanitizerSections() { 40326941Sdim for (auto &S : Sections) { 41353358Sdim SanitizerMask Mask; 42326941Sdim 43326941Sdim#define SANITIZER(NAME, ID) \ 44326941Sdim if (S.SectionMatcher->match(NAME)) \ 45326941Sdim Mask |= SanitizerKind::ID; 46326941Sdim#define SANITIZER_GROUP(NAME, ID, ALIAS) SANITIZER(NAME, ID) 47326941Sdim 48326941Sdim#include "clang/Basic/Sanitizers.def" 49326941Sdim#undef SANITIZER 50326941Sdim#undef SANITIZER_GROUP 51326941Sdim 52326941Sdim SanitizerSections.emplace_back(Mask, S.Entries); 53326941Sdim } 54326941Sdim} 55326941Sdim 56326941Sdimbool SanitizerSpecialCaseList::inSection(SanitizerMask Mask, StringRef Prefix, 57326941Sdim StringRef Query, 58326941Sdim StringRef Category) const { 59326941Sdim for (auto &S : SanitizerSections) 60326941Sdim if ((S.Mask & Mask) && 61326941Sdim SpecialCaseList::inSectionBlame(S.Entries, Prefix, Query, Category)) 62326941Sdim return true; 63326941Sdim 64326941Sdim return false; 65326941Sdim} 66