1 //===-- sanitizer_symbolizer_markup_fuchsia.cpp ---------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file is shared between various sanitizers' runtime libraries. 10 // 11 // Fuchsia specific implementation of offline markup symbolizer. 12 //===----------------------------------------------------------------------===// 13 #include "sanitizer_platform.h" 14 15 #if SANITIZER_SYMBOLIZER_MARKUP 16 17 # include "sanitizer_common.h" 18 # include "sanitizer_stacktrace_printer.h" 19 # include "sanitizer_symbolizer.h" 20 # include "sanitizer_symbolizer_markup.h" 21 # include "sanitizer_symbolizer_markup_constants.h" 22 23 namespace __sanitizer { 24 25 // This is used by UBSan for type names, and by ASan for global variable names. 26 // It's expected to return a static buffer that will be reused on each call. 27 const char *Symbolizer::Demangle(const char *name) { 28 static char buffer[kFormatDemangleMax]; 29 internal_snprintf(buffer, sizeof(buffer), kFormatDemangle, name); 30 return buffer; 31 } 32 33 // This is used mostly for suppression matching. Making it work 34 // would enable "interceptor_via_lib" suppressions. It's also used 35 // once in UBSan to say "in module ..." in a message that also 36 // includes an address in the module, so post-processing can already 37 // pretty-print that so as to indicate the module. 38 bool Symbolizer::GetModuleNameAndOffsetForPC(uptr pc, const char **module_name, 39 uptr *module_address) { 40 return false; 41 } 42 43 // This is mainly used by hwasan for online symbolization. This isn't needed 44 // since hwasan can always just dump stack frames for offline symbolization. 45 bool Symbolizer::SymbolizeFrame(uptr addr, FrameInfo *info) { return false; } 46 47 // This is used in some places for suppression checking, which we 48 // don't really support for Fuchsia. It's also used in UBSan to 49 // identify a PC location to a function name, so we always fill in 50 // the function member with a string containing markup around the PC 51 // value. 52 // TODO(mcgrathr): Under SANITIZER_GO, it's currently used by TSan 53 // to render stack frames, but that should be changed to use 54 // RenderStackFrame. 55 SymbolizedStack *Symbolizer::SymbolizePC(uptr addr) { 56 SymbolizedStack *s = SymbolizedStack::New(addr); 57 char buffer[kFormatFunctionMax]; 58 internal_snprintf(buffer, sizeof(buffer), kFormatFunction, addr); 59 s->info.function = internal_strdup(buffer); 60 return s; 61 } 62 63 // Always claim we succeeded, so that RenderDataInfo will be called. 64 bool Symbolizer::SymbolizeData(uptr addr, DataInfo *info) { 65 info->Clear(); 66 info->start = addr; 67 return true; 68 } 69 70 // Fuchsia only uses MarkupStackTracePrinter 71 StackTracePrinter *StackTracePrinter::NewStackTracePrinter() { 72 return new (GetGlobalLowLevelAllocator()) MarkupStackTracePrinter(); 73 } 74 75 void MarkupStackTracePrinter::RenderContext(InternalScopedString *) {} 76 77 Symbolizer *Symbolizer::PlatformInit() { 78 return new (symbolizer_allocator_) Symbolizer({}); 79 } 80 81 void Symbolizer::LateInitialize() { Symbolizer::GetOrInit(); } 82 83 } // namespace __sanitizer 84 85 #endif // SANITIZER_SYMBOLIZER_MARKUP 86