//===--- NoSanitizeList.h - List of ignored entities for sanitizers --*- C++
//-*-===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// User-provided list of ignored entities used to disable/alter
// instrumentation done in sanitizers.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_BASIC_NOSANITIZELIST_H
#define LLVM_CLANG_BASIC_NOSANITIZELIST_H

#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/StringRef.h"
#include <memory>
#include <vector>

namespace clang {

class SanitizerMask;
class SourceManager;
class SanitizerSpecialCaseList;

class NoSanitizeList {
  std::unique_ptr<SanitizerSpecialCaseList> SSCL;
  SourceManager &SM;

public:
  NoSanitizeList(const std::vector<std::string> &NoSanitizeListPaths,
                 SourceManager &SM);
  ~NoSanitizeList();
  bool containsGlobal(SanitizerMask Mask, StringRef GlobalName,
                      StringRef Category = StringRef()) const;
  bool containsType(SanitizerMask Mask, StringRef MangledTypeName,
                    StringRef Category = StringRef()) const;
  bool containsFunction(SanitizerMask Mask, StringRef FunctionName) const;
  bool containsFile(SanitizerMask Mask, StringRef FileName,
                    StringRef Category = StringRef()) const;
  bool containsLocation(SanitizerMask Mask, SourceLocation Loc,
                        StringRef Category = StringRef()) const;
};

} // end namespace clang

#endif
