Author: Andrés Villegas Date: 2023-11-28T21:17:10Z New Revision: a03c81be070eccb0e064af314d02216e76bab854
URL: https://github.com/llvm/llvm-project/commit/a03c81be070eccb0e064af314d02216e76bab854 DIFF: https://github.com/llvm/llvm-project/commit/a03c81be070eccb0e064af314d02216e76bab854.diff LOG: Fix review comments and squash tests Created using spr 1.3.4 Added: compiler-rt/test/sanitizer_common/TestCases/print-stack-trace-markup.cpp Modified: compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.h Removed: ################################################################################ diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp index fe9933e942eba55..cbd111e975781a3 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.cpp @@ -19,7 +19,6 @@ #include "sanitizer_symbolizer_markup.h" #include "sanitizer_common.h" -#include "sanitizer_stacktrace_printer.h" #include "sanitizer_symbolizer.h" #include "sanitizer_symbolizer_markup_constants.h" @@ -73,13 +72,6 @@ const char *MarkupSymbolizerTool::Demangle(const char *name) { // symbolization and pretty-print the markup. #if !SANITIZER_FUCHSIA -// Simplier view of a LoadedModule. It only holds information necessary to -// identify unique modules. -struct RenderedModule { - char *full_name; - uptr base_address; - u8 uuid[kModuleUUIDSize]; // BuildId -}; static bool ModulesEq(const LoadedModule &module, const RenderedModule &renderedModule) { @@ -136,39 +128,31 @@ static void RenderMmaps(InternalScopedString *buffer, } void MarkupStackTracePrinter::RenderContext(InternalScopedString *buffer) { - // Keeps track of the modules that have been rendered. - static bool initialized = false; - static InternalMmapVectorNoCtor<RenderedModule> renderedModules; - if (!initialized) { - // arbitrary initial size, counting the main module plus some important libs - // like libc. - renderedModules.Initialize(3); - initialized = true; - } - - if (renderedModules.size() == 0) + if (renderedModules_.size() == 0) buffer->Append("{{{reset}}}\n"); const auto &modules = Symbolizer::GetOrInit()->GetRefreshedListOfModules(); for (const auto &module : modules) { - if (ModuleHasBeenRendered(module, renderedModules)) + if (ModuleHasBeenRendered(module, renderedModules_)) continue; // symbolizer markup id, used to refer to this modules from other contextual // elements - uptr moduleId = renderedModules.size(); + uptr moduleId = renderedModules_.size(); RenderModule(buffer, module, moduleId); RenderMmaps(buffer, module, moduleId); - RenderedModule renderedModule{ - internal_strdup(module.full_name()), module.base_address(), {}}; + renderedModules_.push_back({ + internal_strdup(module.full_name()), + module.base_address(), + {}, + }); // kModuleUUIDSize is the size of curModule.uuid CHECK_GE(kModuleUUIDSize, module.uuid_size()); - internal_memcpy(renderedModule.uuid, module.uuid(), module.uuid_size()); - renderedModules.push_back(renderedModule); + internal_memcpy(renderedModules_.back().uuid, module.uuid(), module.uuid_size()); } } #endif // !SANITIZER_FUCHSIA diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.h b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.h index 07630d0b3bdf417..bc2ab24d625bb5a 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.h @@ -20,6 +20,14 @@ namespace __sanitizer { +// Simplier view of a LoadedModule. It only holds information necessary to +// identify unique modules. +struct RenderedModule { + char *full_name; + uptr base_address; + u8 uuid[kModuleUUIDSize]; // BuildId +}; + class MarkupStackTracePrinter : public StackTracePrinter { public: // We don't support the stack_trace_format flag at all. @@ -35,6 +43,9 @@ class MarkupStackTracePrinter : public StackTracePrinter { const char *strip_path_prefix = "") override; private: + // Keeps track of the modules that have been rendered to avoid re-rendering + // them + InternalMmapVector<RenderedModule> renderedModules_; void RenderContext(InternalScopedString *buffer); protected: diff --git a/compiler-rt/test/sanitizer_common/TestCases/print-stack-trace-markup.cpp b/compiler-rt/test/sanitizer_common/TestCases/print-stack-trace-markup.cpp new file mode 100644 index 000000000000000..15d89d091a99e33 --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/print-stack-trace-markup.cpp @@ -0,0 +1,38 @@ +// RUN: %clangxx %s -o %t +// RUN: %env_tool_opts=enable_symbolizer_markup=1 %run %t 2>&1 | FileCheck %s + +// REQUIRES: linux +#include <sanitizer/common_interface_defs.h> + +void Bar() { __sanitizer_print_stack_trace(); } + +void Foo() { + Bar(); + return; +} + +void Baz() { __sanitizer_print_stack_trace(); } + +int main() { + Foo(); + Baz(); + return 0; +} + +// COM: For element syntax see: https://llvm.org/docs/SymbolizerMarkupFormat.html +// COM: OPEN is {{{ and CLOSE is }}} + +// CHECK: [[OPEN:{{{]]reset[[CLOSE:}}}]] +// CHECK: [[OPEN]]module:[[MOD_ID:[0-9]+]]:{{.+}}:elf:{{[0-9a-fA-F]+}}[[CLOSE]] +// CHECK: [[OPEN]]mmap:{{0x[0-9a-fA-F]+:0x[0-9a-fA-F]+}}:load:[[MOD_ID]]:{{r[wx]{0,2}:0x[0-9a-fA-F]+}}[[CLOSE]] +// CHECK: [[OPEN]]bt:0:0x{{[0-9a-fA-F]+}}[[CLOSE]] +// CHECK-NEXT: [[OPEN]]bt:1:0x{{[0-9a-fA-F]+}}[[CLOSE]] +// CHECK-NEXT: [[OPEN]]bt:2:0x{{[0-9a-fA-F]+}}[[CLOSE]] + +// COM: Emitting a second backtrace should not emit contextual elements in this case. +// CHECK-NOT: [[OPEN:{{{]]reset[[CLOSE:}}}]] +// CHECK-NOT: [[OPEN]]module:[[MOD_ID:[0-9]+]]:{{.+}}:elf:{{[0-9a-fA-F]+}}[[CLOSE]] +// CHECK-NOT: [[OPEN]]mmap:{{0x[0-9a-fA-F]+:0x[0-9a-fA-F]+}}:load:[[MOD_ID]]:{{r[wx]{0,2}:0x[0-9a-fA-F]+}}[[CLOSE]] + +// CHECK: [[OPEN]]bt:0:0x{{[0-9a-fA-F]+}}[[CLOSE]] +// CHECK-NEXT: [[OPEN]]bt:1:0x{{[0-9a-fA-F]+}}[[CLOSE]] _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits