SpecialCaseList.h revision 263508
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 for instrumentation passes (like AddressSanitizer
10// or ThreadSanitizer) to avoid instrumenting some functions or global
11// variables based on a user-supplied list.
12//
13// The list can also specify categories for specific globals, which can be used
14// to instruct an instrumentation pass to treat certain functions or global
15// variables in a specific way, such as by omitting certain aspects of
16// instrumentation while keeping others, or informing the instrumentation pass
17// that a specific uninstrumentable function has certain semantics, thus
18// allowing the pass to instrument callers according to those semantics.
19//
20// For example, AddressSanitizer uses the "init" category for globals whose
21// initializers should not be instrumented, but which in all other respects
22// should be instrumented.
23//
24// Each line contains a prefix, followed by a colon and a wild card expression,
25// followed optionally by an equals sign and an instrumentation-specific
26// category.  Empty lines and lines starting with "#" are ignored.
27// ---
28// # Blacklisted items:
29// fun:*_ZN4base6subtle*
30// global:*global_with_bad_access_or_initialization*
31// global:*global_with_initialization_issues*=init
32// type:*Namespace::ClassName*=init
33// src:file_with_tricky_code.cc
34// src:ignore-global-initializers-issues.cc=init
35//
36// # Functions with pure functional semantics:
37// fun:cos=functional
38// fun:sin=functional
39// ---
40// Note that the wild card is in fact an llvm::Regex, but * is automatically
41// replaced with .*
42// This is similar to the "ignore" feature of ThreadSanitizer.
43// http://code.google.com/p/data-race-test/wiki/ThreadSanitizerIgnores
44//
45//===----------------------------------------------------------------------===//
46//
47
48#include "llvm/ADT/StringMap.h"
49
50namespace llvm {
51class Function;
52class GlobalAlias;
53class GlobalVariable;
54class MemoryBuffer;
55class Module;
56class Regex;
57class StringRef;
58
59class SpecialCaseList {
60 public:
61  /// Parses the special case list from a file. If Path is empty, returns
62  /// an empty special case list. On failure, returns 0 and writes an error
63  /// message to string.
64  static SpecialCaseList *create(const StringRef Path, std::string &Error);
65  /// Parses the special case list from a memory buffer. On failure, returns
66  /// 0 and writes an error message to string.
67  static SpecialCaseList *create(const MemoryBuffer *MB, std::string &Error);
68  /// Parses the special case list from a file. On failure, reports a fatal
69  /// error.
70  static SpecialCaseList *createOrDie(const StringRef Path);
71
72  ~SpecialCaseList();
73
74  /// Returns whether either this function or its source file are listed in the
75  /// given category, which may be omitted to search the empty category.
76  bool isIn(const Function &F, const StringRef Category = StringRef()) const;
77
78  /// Returns whether this global, its type or its source file are listed in the
79  /// given category, which may be omitted to search the empty category.
80  bool isIn(const GlobalVariable &G,
81            const StringRef Category = StringRef()) const;
82
83  /// Returns whether this global alias is listed in the given category, which
84  /// may be omitted to search the empty category.
85  ///
86  /// If GA aliases a function, the alias's name is matched as a function name
87  /// would be.  Similarly, aliases of globals are matched like globals.
88  bool isIn(const GlobalAlias &GA,
89            const StringRef Category = StringRef()) const;
90
91  /// Returns whether this module is listed in the given category, which may be
92  /// omitted to search the empty category.
93  bool isIn(const Module &M, const StringRef Category = StringRef()) const;
94
95 private:
96  SpecialCaseList(SpecialCaseList const &) LLVM_DELETED_FUNCTION;
97  SpecialCaseList &operator=(SpecialCaseList const &) LLVM_DELETED_FUNCTION;
98
99  struct Entry;
100  StringMap<StringMap<Entry> > Entries;
101
102  SpecialCaseList();
103  /// Parses just-constructed SpecialCaseList entries from a memory buffer.
104  bool parse(const MemoryBuffer *MB, std::string &Error);
105
106  bool inSectionCategory(const StringRef Section, const StringRef Query,
107                         const StringRef Category) const;
108};
109
110}  // namespace llvm
111