summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2013-03-19 10:23:17 +0000
committerDmitry Vyukov <dvyukov@google.com>2013-03-19 10:23:17 +0000
commit7fac284c9d3aab4c28b422315731b12a5af9fc4e (patch)
tree7b8ccda1b2c88ecfa42719dacf6c8452416042c6
parentb186c1905d471243cf2981ca754397bc16976392 (diff)
downloadcompiler-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.cc23
-rw-r--r--lib/sanitizer_common/sanitizer_symbolizer.h1
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);