sanitizer_libignore.h revision 4af0f21c0c98950df1136dbec8824a029ed5bb8e
1//===-- sanitizer_libignore.h -----------------------------------*- 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// 10// LibIgnore allows to ignore all interceptors called from a particular set 11// of dynamic libraries. LibIgnore remembers all "called_from_lib" suppressions 12// from the provided SuppressionContext; finds code ranges for the libraries; 13// and checks whether the provided PC value belongs to the code ranges. 14// 15//===----------------------------------------------------------------------===// 16 17#ifndef SANITIZER_LIBIGNORE_H 18#define SANITIZER_LIBIGNORE_H 19 20#include "sanitizer_internal_defs.h" 21#include "sanitizer_common.h" 22#include "sanitizer_suppressions.h" 23#include "sanitizer_atomic.h" 24#include "sanitizer_mutex.h" 25 26namespace __sanitizer { 27 28class LibIgnore { 29 public: 30 explicit LibIgnore(LinkerInitialized); 31 32 // Fetches all "called_from_lib" suppressions from the SuppressionContext. 33 void Init(const SuppressionContext &supp); 34 35 // Must be called after a new dynamic library is loaded. 36 void OnLibraryLoaded(); 37 38 // Must be called after a dynamic library is unloaded. 39 void OnLibraryUnloaded(); 40 41 // Checks whether the provided PC belongs to one of the ignored libraries. 42 bool IsIgnored(uptr pc) const; 43 44 private: 45 struct Lib { 46 char *templ; 47 char *name; 48 bool loaded; 49 }; 50 51 struct LibCodeRange { 52 uptr begin; 53 uptr end; 54 }; 55 56 static const uptr kMaxLibs = 128; 57 58 // Hot part: 59 atomic_uintptr_t loaded_count_; 60 LibCodeRange code_ranges_[kMaxLibs]; 61 62 // Cold part: 63 BlockingMutex mutex_; 64 uptr count_; 65 Lib libs_[kMaxLibs]; 66 67 // Disallow copying of LibIgnore objects. 68 LibIgnore(const LibIgnore&); // not implemented 69 void operator = (const LibIgnore&); // not implemented 70}; 71 72inline bool LibIgnore::IsIgnored(uptr pc) const { 73 const uptr n = atomic_load(&loaded_count_, memory_order_acquire); 74 for (uptr i = 0; i < n; i++) { 75 if (pc >= code_ranges_[i].begin && pc < code_ranges_[i].end) 76 return true; 77 } 78 return false; 79} 80 81} // namespace __sanitizer 82 83#endif // SANITIZER_LIBIGNORE_H 84