summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_symbolizer.cc
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 /lib/sanitizer_common/sanitizer_symbolizer.cc
parentb186c1905d471243cf2981ca754397bc16976392 (diff)
tsan: symbolizer "flush caches" functinality
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@177388 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_symbolizer.cc')
-rw-r--r--lib/sanitizer_common/sanitizer_symbolizer.cc23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_symbolizer.cc b/lib/sanitizer_common/sanitizer_symbolizer.cc
index 5609e91cd..ea772b49c 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