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//
1086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// Suppression parsing/matching code.
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 Matveevstruct Suppression {
2286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  const char *type;
23a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  char *templ;
24a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  unsigned hit_count;
25b33cfeb6004d3a93e6d35749c14db0190c6c2b4cSergey Matveev  uptr weight;
26a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev};
27a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
28a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveevclass SuppressionContext {
29a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev public:
3086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  // Create new SuppressionContext capable of parsing given suppression types.
3186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  SuppressionContext(const char *supprression_types[],
3286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines                     int suppression_types_num);
3386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
3486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  void ParseFromFile(const char *filename);
35a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  void Parse(const char *str);
3686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
3786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  bool Match(const char *str, const char *type, Suppression **s);
384af0f21c0c98950df1136dbec8824a029ed5bb8eDmitry Vyukov  uptr SuppressionCount() const;
3986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  bool HasSuppressionType(const char *type) const;
404af0f21c0c98950df1136dbec8824a029ed5bb8eDmitry Vyukov  const Suppression *SuppressionAt(uptr i) const;
41a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  void GetMatched(InternalMmapVector<Suppression *> *matched);
42a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
43a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev private:
4486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  static const int kMaxSuppressionTypes = 16;
4586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  const char **const suppression_types_;
4686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  const int suppression_types_num_;
4786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
48a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  InternalMmapVector<Suppression> suppressions_;
4986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  bool has_suppression_type_[kMaxSuppressionTypes];
50a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev  bool can_parse_;
51a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev};
52a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
53a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev}  // namespace __sanitizer
54a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev
55a52e5c6f371bcc66e89792db1219a557664aab8dSergey Matveev#endif  // SANITIZER_SUPPRESSIONS_H
56