mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
86 lines
3.2 KiB
C++
86 lines
3.2 KiB
C++
//===-- 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
|