12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- //===-- sanitizer_symbolizer_markup_fuchsia.cpp ---------------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file is shared between various sanitizers' runtime libraries.
- //
- // Fuchsia specific implementation of offline markup symbolizer.
- //===----------------------------------------------------------------------===//
- #include "sanitizer_platform.h"
- #if SANITIZER_SYMBOLIZER_MARKUP
- # include "sanitizer_common.h"
- # include "sanitizer_stacktrace_printer.h"
- # include "sanitizer_symbolizer.h"
- # include "sanitizer_symbolizer_markup.h"
- # include "sanitizer_symbolizer_markup_constants.h"
- namespace __sanitizer {
- // This is used by UBSan for type names, and by ASan for global variable names.
- // It's expected to return a static buffer that will be reused on each call.
- const char *Symbolizer::Demangle(const char *name) {
- static char buffer[kFormatDemangleMax];
- internal_snprintf(buffer, sizeof(buffer), kFormatDemangle, name);
- return buffer;
- }
- // This is used mostly for suppression matching. Making it work
- // would enable "interceptor_via_lib" suppressions. It's also used
- // once in UBSan to say "in module ..." in a message that also
- // includes an address in the module, so post-processing can already
- // pretty-print that so as to indicate the module.
- bool Symbolizer::GetModuleNameAndOffsetForPC(uptr pc, const char **module_name,
- uptr *module_address) {
- return false;
- }
- // This is mainly used by hwasan for online symbolization. This isn't needed
- // since hwasan can always just dump stack frames for offline symbolization.
- bool Symbolizer::SymbolizeFrame(uptr addr, FrameInfo *info) { return false; }
- // This is used in some places for suppression checking, which we
- // don't really support for Fuchsia. It's also used in UBSan to
- // identify a PC location to a function name, so we always fill in
- // the function member with a string containing markup around the PC
- // value.
- // TODO(mcgrathr): Under SANITIZER_GO, it's currently used by TSan
- // to render stack frames, but that should be changed to use
- // RenderStackFrame.
- SymbolizedStack *Symbolizer::SymbolizePC(uptr addr) {
- SymbolizedStack *s = SymbolizedStack::New(addr);
- char buffer[kFormatFunctionMax];
- internal_snprintf(buffer, sizeof(buffer), kFormatFunction, addr);
- s->info.function = internal_strdup(buffer);
- return s;
- }
- // Always claim we succeeded, so that RenderDataInfo will be called.
- bool Symbolizer::SymbolizeData(uptr addr, DataInfo *info) {
- info->Clear();
- info->start = addr;
- return true;
- }
- // Fuchsia only uses MarkupStackTracePrinter
- StackTracePrinter *StackTracePrinter::NewStackTracePrinter() {
- return new (GetGlobalLowLevelAllocator()) MarkupStackTracePrinter();
- }
- void MarkupStackTracePrinter::RenderContext(InternalScopedString *) {}
- Symbolizer *Symbolizer::PlatformInit() {
- return new (symbolizer_allocator_) Symbolizer({});
- }
- void Symbolizer::LateInitialize() { Symbolizer::GetOrInit(); }
- } // namespace __sanitizer
- #endif // SANITIZER_SYMBOLIZER_MARKUP
|