1//===-- SpecialCaseList.h - special case list for sanitizers ----*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//===----------------------------------------------------------------------===//
8//
9// This is a utility class used to parse user-provided text files with
10// "special case lists" for code sanitizers. Such files are used to
11// define "ABI list" for DataFlowSanitizer and blacklists for another sanitizers
12// like AddressSanitizer or UndefinedBehaviorSanitizer.
13//
14// Empty lines and lines starting with "#" are ignored. All the rest lines
15// should have the form:
16//   section:wildcard_expression[=category]
17// If category is not specified, it is assumed to be empty string.
18// Definitions of "section" and "category" are sanitizer-specific. For example,
19// sanitizer blacklists support sections "src", "fun" and "global".
20// Wildcard expressions define, respectively, source files, functions or
21// globals which shouldn't be instrumented.
22// Examples of categories:
23//   "functional": used in DFSan to list functions with pure functional
24//                 semantics.
25//   "init": used in ASan blacklist to disable initialization-order bugs
26//           detection for certain globals or source files.
27// Full special case list file example:
28// ---
29// # Blacklisted items:
30// fun:*_ZN4base6subtle*
31// global:*global_with_bad_access_or_initialization*
32// global:*global_with_initialization_issues*=init
33// type:*Namespace::ClassName*=init
34// src:file_with_tricky_code.cc
35// src:ignore-global-initializers-issues.cc=init
36//
37// # Functions with pure functional semantics:
38// fun:cos=functional
39// fun:sin=functional
40// ---
41// Note that the wild card is in fact an llvm::Regex, but * is automatically
42// replaced with .*
43// This is similar to the "ignore" feature of ThreadSanitizer.
44// http://code.google.com/p/data-race-test/wiki/ThreadSanitizerIgnores
45//
46//===----------------------------------------------------------------------===//
47
48#ifndef LLVM_SUPPORT_SPECIALCASELIST_H
49#define LLVM_SUPPORT_SPECIALCASELIST_H
50
51#include "llvm/ADT/StringMap.h"
52
53namespace llvm {
54class MemoryBuffer;
55class Regex;
56class StringRef;
57
58class SpecialCaseList {
59 public:
60  /// Parses the special case list from a file. If Path is empty, returns
61  /// an empty special case list. On failure, returns 0 and writes an error
62  /// message to string.
63  static SpecialCaseList *create(const StringRef Path, std::string &Error);
64  /// Parses the special case list from a memory buffer. On failure, returns
65  /// 0 and writes an error message to string.
66  static SpecialCaseList *create(const MemoryBuffer *MB, std::string &Error);
67  /// Parses the special case list from a file. On failure, reports a fatal
68  /// error.
69  static SpecialCaseList *createOrDie(const StringRef Path);
70
71  ~SpecialCaseList();
72
73  /// Returns true, if special case list contains a line
74  /// \code
75  ///   @Section:<E>=@Category
76  /// \endcode
77  /// and @Query satisfies a wildcard expression <E>.
78  bool inSection(const StringRef Section, const StringRef Query,
79                 const StringRef Category = StringRef()) const;
80
81 private:
82  SpecialCaseList(SpecialCaseList const &) LLVM_DELETED_FUNCTION;
83  SpecialCaseList &operator=(SpecialCaseList const &) LLVM_DELETED_FUNCTION;
84
85  struct Entry;
86  StringMap<StringMap<Entry> > Entries;
87
88  SpecialCaseList();
89  /// Parses just-constructed SpecialCaseList entries from a memory buffer.
90  bool parse(const MemoryBuffer *MB, std::string &Error);
91};
92
93}  // namespace llvm
94
95#endif  // LLVM_SUPPORT_SPECIALCASELIST_H
96
97