aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_common.h3
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_report.cpp20
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_report.cpp17
3 files changed, 25 insertions, 15 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h
index 6b327a4..7d9d61d 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h
@@ -32,6 +32,7 @@ struct AddressInfo;
struct BufferedStackTrace;
struct SignalContext;
struct StackTrace;
+struct SymbolizedStack;
// Constants.
const uptr kWordSize = SANITIZER_WORDSIZE / 8;
@@ -393,6 +394,8 @@ void ReportErrorSummary(const char *error_type, const AddressInfo &info,
// Same as above, but obtains AddressInfo by symbolizing top stack trace frame.
void ReportErrorSummary(const char *error_type, const StackTrace *trace,
const char *alt_tool_name = nullptr);
+// Skips frames which we consider internal and not usefull to the users.
+SymbolizedStack *SkipInternalFrames(SymbolizedStack *frames);
void ReportMmapWriteExec(int prot, int mflags);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_report.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_report.cpp
index 3e4417a..ec60dd3 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_report.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_report.cpp
@@ -28,6 +28,26 @@
namespace __sanitizer {
#if !SANITIZER_GO
+
+static bool FrameIsInternal(const SymbolizedStack *frame) {
+ if (!frame)
+ return true;
+ const char *file = frame->info.file;
+ const char *module = frame->info.module;
+ if (file && (internal_strstr(file, "/compiler-rt/lib/")))
+ return true;
+ if (module && (internal_strstr(module, "libclang_rt.")))
+ return true;
+ return false;
+}
+
+SymbolizedStack *SkipInternalFrames(SymbolizedStack *frames) {
+ for (SymbolizedStack *f = frames; f; f = f->next)
+ if (!FrameIsInternal(f))
+ return f;
+ return nullptr;
+}
+
void ReportErrorSummary(const char *error_type, const AddressInfo &info,
const char *alt_tool_name) {
if (!common_flags()->print_summary) return;
diff --git a/compiler-rt/lib/tsan/rtl/tsan_report.cpp b/compiler-rt/lib/tsan/rtl/tsan_report.cpp
index c6b764b..b1cee7ac 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_report.cpp
+++ b/compiler-rt/lib/tsan/rtl/tsan_report.cpp
@@ -273,22 +273,9 @@ static ReportStack *ChooseSummaryStack(const ReportDesc *rep) {
return 0;
}
-static bool FrameIsInternal(const SymbolizedStack *frame) {
- if (!frame)
- return true;
- const char *file = frame->info.file;
- const char *module = frame->info.module;
- if (file && (internal_strstr(file, "/compiler-rt/lib/")))
- return true;
- if (module && (internal_strstr(module, "libclang_rt.")))
- return true;
- return false;
-}
-
static SymbolizedStack *SkipTsanInternalFrames(SymbolizedStack *frames) {
- for (SymbolizedStack *f = frames; f; f = f->next)
- if (!FrameIsInternal(f))
- return f;
+ if (SymbolizedStack *f = SkipInternalFrames(frames))
+ return f;
return frames; // Fallback to the top frame.
}