diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2013-03-19 10:23:17 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2013-03-19 10:23:17 +0000 |
commit | 7fac284c9d3aab4c28b422315731b12a5af9fc4e (patch) | |
tree | 7b8ccda1b2c88ecfa42719dacf6c8452416042c6 | |
parent | b186c1905d471243cf2981ca754397bc16976392 (diff) | |
download | compiler-rt-7fac284c9d3aab4c28b422315731b12a5af9fc4e.tar.gz compiler-rt-7fac284c9d3aab4c28b422315731b12a5af9fc4e.tar.bz2 compiler-rt-7fac284c9d3aab4c28b422315731b12a5af9fc4e.tar.xz |
tsan: symbolizer "flush caches" functinality
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@177388 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer.cc | 23 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer.h | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_symbolizer.cc b/lib/sanitizer_common/sanitizer_symbolizer.cc index 5609e91c..ea772b49 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer.cc +++ b/lib/sanitizer_common/sanitizer_symbolizer.cc @@ -128,6 +128,9 @@ class ExternalSymbolizer { return StartSymbolizerSubprocess(path_, &input_fd_, &output_fd_); } + void Flush() { + } + private: bool readFromSymbolizer(char *buffer, uptr max_length) { if (max_length == 0) @@ -184,11 +187,14 @@ bool __sanitizer_symbolize_code(const char *ModuleName, u64 ModuleOffset, SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE bool __sanitizer_symbolize_data(const char *ModuleName, u64 ModuleOffset, char *Buffer, int MaxLength); +SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE +void __sanitizer_symbolize_flush(); } // extern "C" class InternalSymbolizer { public: typedef bool (*SanitizerSymbolizeFn)(const char*, u64, char*, int); + static InternalSymbolizer *get() { if (__sanitizer_symbolize_code != 0 && __sanitizer_symbolize_data != 0) { @@ -197,6 +203,7 @@ class InternalSymbolizer { } return 0; } + char *SendCommand(bool is_data, const char *module_name, uptr module_offset) { SanitizerSymbolizeFn symbolize_fn = is_data ? __sanitizer_symbolize_data : __sanitizer_symbolize_code; @@ -205,6 +212,11 @@ class InternalSymbolizer { return 0; } + void Flush() { + if (__sanitizer_symbolize_flush) + __sanitizer_symbolize_flush(); + } + private: InternalSymbolizer() { } @@ -321,6 +333,13 @@ class Symbolizer { return internal_symbolizer_ || external_symbolizer_; } + void Flush() { + if (internal_symbolizer_) + internal_symbolizer_->Flush(); + if (external_symbolizer_) + external_symbolizer_->Flush(); + } + private: char *SendCommand(bool is_data, const char *module_name, uptr module_offset) { // First, try to use internal symbolizer. @@ -408,4 +427,8 @@ bool IsSymbolizerAvailable() { return symbolizer.IsSymbolizerAvailable(); } +void FlushSymbolizer() { + symbolizer.Flush(); +} + } // namespace __sanitizer diff --git a/lib/sanitizer_common/sanitizer_symbolizer.h b/lib/sanitizer_common/sanitizer_symbolizer.h index dd2037ee..3aeebe9a 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer.h +++ b/lib/sanitizer_common/sanitizer_symbolizer.h @@ -70,6 +70,7 @@ uptr SymbolizeCode(uptr address, AddressInfo *frames, uptr max_frames); bool SymbolizeData(uptr address, DataInfo *info); bool IsSymbolizerAvailable(); +void FlushSymbolizer(); // releases internal caches (if any) // Attempts to demangle the provided C++ mangled name. const char *Demangle(const char *Name); |