diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.cpp index 8db321051e1a0..88f186b9c20c1 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.cpp @@ -12,6 +12,7 @@ #include "sanitizer_stacktrace_printer.h" +#include "sanitizer_common.h" #include "sanitizer_file.h" #include "sanitizer_flags.h" #include "sanitizer_fuchsia.h" @@ -25,15 +26,13 @@ StackTracePrinter *StackTracePrinter::GetOrInit() { if (stacktrace_printer) return stacktrace_printer; - stacktrace_printer = - new (GetGlobalLowLevelAllocator()) FormattedStackTracePrinter(); + stacktrace_printer = StackTracePrinter::NewStackTracePrinter(); CHECK(stacktrace_printer); return stacktrace_printer; } -const char *FormattedStackTracePrinter::StripFunctionName( - const char *function) { +const char *StackTracePrinter::StripFunctionName(const char *function) { if (!common_flags()->demangle) return function; if (!function) @@ -62,6 +61,10 @@ const char *FormattedStackTracePrinter::StripFunctionName( // sanitizer_symbolizer_markup.cpp implements these differently. #if !SANITIZER_SYMBOLIZER_MARKUP +StackTracePrinter *StackTracePrinter::NewStackTracePrinter() { + return new (GetGlobalLowLevelAllocator()) FormattedStackTracePrinter(); +} + static const char *DemangleFunctionName(const char *function) { if (!common_flags()->demangle) return function; @@ -324,9 +327,10 @@ void FormattedStackTracePrinter::RenderData(InternalScopedString *buffer, #endif // !SANITIZER_SYMBOLIZER_MARKUP -void FormattedStackTracePrinter::RenderSourceLocation( - InternalScopedString *buffer, const char *file, int line, int column, - bool vs_style, const char *strip_path_prefix) { +void StackTracePrinter::RenderSourceLocation(InternalScopedString *buffer, + const char *file, int line, + int column, bool vs_style, + const char *strip_path_prefix) { if (vs_style && line > 0) { buffer->AppendF("%s(%d", StripPathPrefix(file, strip_path_prefix), line); if (column > 0) @@ -343,9 +347,10 @@ void FormattedStackTracePrinter::RenderSourceLocation( } } -void FormattedStackTracePrinter::RenderModuleLocation( - InternalScopedString *buffer, const char *module, uptr offset, - ModuleArch arch, const char *strip_path_prefix) { +void StackTracePrinter::RenderModuleLocation(InternalScopedString *buffer, + const char *module, uptr offset, + ModuleArch arch, + const char *strip_path_prefix) { buffer->AppendF("(%s", StripPathPrefix(module, strip_path_prefix)); if (arch != kModuleArchUnknown) { buffer->AppendF(":%s", ModuleArchToString(arch)); diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.h b/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.h index 3e02333a8c8d5..10361a3203445 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_stacktrace_printer.h @@ -25,7 +25,8 @@ class StackTracePrinter { public: static StackTracePrinter *GetOrInit(); - virtual const char *StripFunctionName(const char *function) = 0; + // Strip interceptor prefixes from function name. + const char *StripFunctionName(const char *function); virtual void RenderFrame(InternalScopedString *buffer, const char *format, int frame_no, uptr address, const AddressInfo *info, @@ -34,28 +35,27 @@ class StackTracePrinter { virtual bool RenderNeedsSymbolization(const char *format) = 0; - virtual void RenderSourceLocation(InternalScopedString *buffer, - const char *file, int line, int column, - bool vs_style, - const char *strip_path_prefix) = 0; + void RenderSourceLocation(InternalScopedString *buffer, const char *file, + int line, int column, bool vs_style, + const char *strip_path_prefix); - virtual void RenderModuleLocation(InternalScopedString *buffer, - const char *module, uptr offset, - ModuleArch arch, - const char *strip_path_prefix) = 0; + void RenderModuleLocation(InternalScopedString *buffer, const char *module, + uptr offset, ModuleArch arch, + const char *strip_path_prefix); virtual void RenderData(InternalScopedString *buffer, const char *format, const DataInfo *DI, const char *strip_path_prefix = "") = 0; + private: + // To be called from StackTracePrinter::GetOrInit + static StackTracePrinter *NewStackTracePrinter(); + protected: ~StackTracePrinter() {} }; class FormattedStackTracePrinter : public StackTracePrinter { public: - // Strip interceptor prefixes from function name. - const char *StripFunctionName(const char *function) override; - // Render the contents of "info" structure, which represents the contents of // stack frame "frame_no" and appends it to the "buffer". "format" is a // string with placeholders, which is copied to the output with @@ -90,14 +90,6 @@ class FormattedStackTracePrinter : public StackTracePrinter { bool RenderNeedsSymbolization(const char *format) override; - void RenderSourceLocation(InternalScopedString *buffer, const char *file, - int line, int column, bool vs_style, - const char *strip_path_prefix) override; - - void RenderModuleLocation(InternalScopedString *buffer, const char *module, - uptr offset, ModuleArch arch, - const char *strip_path_prefix) override; - // Same as RenderFrame, but for data section (global variables). // Accepts %s, %l from above. // Also accepts: diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp index 6402cfd7c36e4..c7332af7d9efd 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp @@ -76,27 +76,29 @@ bool Symbolizer::SymbolizeData(uptr addr, DataInfo *info) { return true; } -// We ignore the format argument to __sanitizer_symbolize_global. -void FormattedStackTracePrinter::RenderData(InternalScopedString *buffer, - const char *format, - const DataInfo *DI, - const char *strip_path_prefix) { - buffer->AppendF(kFormatData, DI->start); -} - -bool FormattedStackTracePrinter::RenderNeedsSymbolization(const char *format) { - return false; -} - -// We don't support the stack_trace_format flag at all. -void FormattedStackTracePrinter::RenderFrame(InternalScopedString *buffer, - const char *format, int frame_no, - uptr address, - const AddressInfo *info, - bool vs_style, - const char *strip_path_prefix) { - CHECK(!RenderNeedsSymbolization(format)); - buffer->AppendF(kFormatFrame, frame_no, address); +class MarkupStackTracePrinter : public StackTracePrinter { + // We ignore the format argument to __sanitizer_symbolize_global. + void RenderData(InternalScopedString *buffer, const char *format, + const DataInfo *DI, const char *strip_path_prefix) override { + buffer->AppendF(kFormatData, DI->start); + } + + bool RenderNeedsSymbolization(const char *format) override { return false; } + + // We don't support the stack_trace_format flag at all. + void RenderFrame(InternalScopedString *buffer, const char *format, + int frame_no, uptr address, const AddressInfo *info, + bool vs_style, const char *strip_path_prefix) override { + CHECK(!RenderNeedsSymbolization(format)); + buffer->AppendF(kFormatFrame, frame_no, address); + } + + protected: + ~MarkupStackTracePrinter(); +}; + +StackTracePrinter *StackTracePrinter::NewStackTracePrinter() { + return new (GetGlobalLowLevelAllocator()) MarkupStackTracePrinter(); } Symbolizer *Symbolizer::PlatformInit() {