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