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