]> git.proxmox.com Git - rustc.git/blame - src/llvm/include/llvm/Support/SpecialCaseList.h
Imported Upstream version 1.0.0+dfsg1
[rustc.git] / src / llvm / include / llvm / Support / SpecialCaseList.h
CommitLineData
1a4d82fc
JJ
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 {
59public:
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 std::unique_ptr<SpecialCaseList> create(StringRef Path,
64 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 std::unique_ptr<SpecialCaseList> create(const MemoryBuffer *MB,
68 std::string &Error);
69 /// Parses the special case list from a file. On failure, reports a fatal
70 /// error.
71 static std::unique_ptr<SpecialCaseList> createOrDie(StringRef Path);
72
73 ~SpecialCaseList();
74
75 /// Returns true, if special case list contains a line
76 /// \code
77 /// @Section:<E>=@Category
78 /// \endcode
79 /// and @Query satisfies a wildcard expression <E>.
80 bool inSection(StringRef Section, StringRef Query,
81 StringRef Category = StringRef()) const;
82
83private:
84 SpecialCaseList(SpecialCaseList const &) LLVM_DELETED_FUNCTION;
85 SpecialCaseList &operator=(SpecialCaseList const &) LLVM_DELETED_FUNCTION;
86
87 struct Entry;
88 StringMap<StringMap<Entry> > Entries;
89
90 SpecialCaseList();
91 /// Parses just-constructed SpecialCaseList entries from a memory buffer.
92 bool parse(const MemoryBuffer *MB, std::string &Error);
93};
94
95} // namespace llvm
96
97#endif // LLVM_SUPPORT_SPECIALCASELIST_H
98