forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			66 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===--- 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;
 | |
| }
 |