1a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev//===-- sanitizer_suppressions.h --------------------------------*- C++ -*-===//
2a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev//
3a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev//                     The LLVM Compiler Infrastructure
4a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev//
5a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev// This file is distributed under the University of Illinois Open Source
6a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev// License. See LICENSE.TXT for details.
7a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev//
8a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev//===----------------------------------------------------------------------===//
9a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev//
10a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev// Suppression parsing/matching code shared between TSan and LSan.
11a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev//
12a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev//===----------------------------------------------------------------------===//
13a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev#ifndef SANITIZER_SUPPRESSIONS_H
14a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev#define SANITIZER_SUPPRESSIONS_H
15a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
16a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev#include "sanitizer_common.h"
17a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev#include "sanitizer_internal_defs.h"
18a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
19a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveevnamespace __sanitizer {
20a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
21a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveevenum SuppressionType {
22a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  SuppressionNone,
23a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  SuppressionRace,
24a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  SuppressionMutex,
25a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  SuppressionThread,
26a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  SuppressionSignal,
27b33cfeb6004d3a93e6d35749c14db0190c6c2b4cSergey Matveev  SuppressionLeak,
28a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  SuppressionTypeCount
29a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev};
30a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
31a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveevstruct Suppression {
32a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  SuppressionType type;
33a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  char *templ;
34a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  unsigned hit_count;
35b33cfeb6004d3a93e6d35749c14db0190c6c2b4cSergey Matveev  uptr weight;
36a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev};
37a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
38a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveevclass SuppressionContext {
39a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev public:
40a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  SuppressionContext() : suppressions_(1), can_parse_(true) {}
41a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  void Parse(const char *str);
42a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  bool Match(const char* str, SuppressionType type, Suppression **s);
43a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  uptr SuppressionCount();
44a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  void GetMatched(InternalMmapVector<Suppression *> *matched);
45a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
46a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev private:
47a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  InternalMmapVector<Suppression> suppressions_;
48a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  bool can_parse_;
49a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
50a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  friend class SuppressionContextTest;
51a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev};
52a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
53a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveevconst char *SuppressionTypeString(SuppressionType t);
54a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
55a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev// Exposed for testing.
56a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveevbool TemplateMatch(char *templ, const char *str);
57a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
58a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev}  // namespace __sanitizer
59a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
60a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev#endif  // SANITIZER_SUPPRESSIONS_H
61