summaryrefslogtreecommitdiffstats
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
commit29f335ae807cba2bd572120f4862ac8e3c98ca40 (patch)
treeb53828115d4d68314d18c463b368361f563cebae
parent509dab30ae5712e5c71a913c7dc770c8a1cf5e3d (diff)
downloadbcm5719-llvm-29f335ae807cba2bd572120f4862ac8e3c98ca40.tar.gz
bcm5719-llvm-29f335ae807cba2bd572120f4862ac8e3c98ca40.zip
tsan: symbolizer "flush caches" functinality
llvm-svn: 177388
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc23
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h1
2 files changed, 24 insertions, 0 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc
index 5609e91cd14..ea772b49cc1 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.cc
+++ b/compiler-rt/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/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h
index dd2037ee9fb..3aeebe9a84f 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer.h
+++ b/compiler-rt/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);
OpenPOWER on IntegriCloud