-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[NFC sanitizer_symbolizer] Move Fuchsia specific code.
Moves sanitizer symbolizer code that is specific for fuchsia into its own _fuchsia.cpp file. This is preparation to enable symbolizer markup in linux. Reviewers: PiJoules, petrhosek, vitalybuka Reviewed By: PiJoules, vitalybuka Pull Request: #73192
- Loading branch information
Showing
4 changed files
with
153 additions
and
87 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
45 changes: 45 additions & 0 deletions
45
compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
//===-- sanitizer_symbolizer_markup.h -----------------------------------===// | ||
// | ||
// 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. | ||
// | ||
// Header for the offline markup symbolizer. | ||
//===----------------------------------------------------------------------===// | ||
#ifndef SANITIZER_SYMBOLIZER_MARKUP_H | ||
#define SANITIZER_SYMBOLIZER_MARKUP_H | ||
|
||
#include "sanitizer_common.h" | ||
#include "sanitizer_stacktrace_printer.h" | ||
#include "sanitizer_symbolizer.h" | ||
|
||
namespace __sanitizer { | ||
|
||
class MarkupStackTracePrinter : public StackTracePrinter { | ||
public: | ||
// We don't support the stack_trace_format flag at all. | ||
void RenderFrame(InternalScopedString *buffer, const char *format, | ||
int frame_no, uptr address, const AddressInfo *info, | ||
bool vs_style, const char *strip_path_prefix = "") override; | ||
|
||
bool RenderNeedsSymbolization(const char *format) override; | ||
|
||
// We ignore the format argument to __sanitizer_symbolize_global. | ||
void RenderData(InternalScopedString *buffer, const char *format, | ||
const DataInfo *DI, | ||
const char *strip_path_prefix = "") override; | ||
|
||
private: | ||
void RenderContext(InternalScopedString *buffer); | ||
|
||
protected: | ||
~MarkupStackTracePrinter() {} | ||
}; | ||
|
||
} // namespace __sanitizer | ||
|
||
#endif // SANITIZER_SYMBOLIZER_MARKUP_H |
83 changes: 83 additions & 0 deletions
83
compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_markup_fuchsia.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
//===-- 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(); | ||
} | ||
|
||
Symbolizer *Symbolizer::PlatformInit() { | ||
return new (symbolizer_allocator_) Symbolizer({}); | ||
} | ||
|
||
void Symbolizer::LateInitialize() { Symbolizer::GetOrInit(); } | ||
|
||
} // namespace __sanitizer | ||
|
||
#endif // SANITIZER_SYMBOLIZER_MARKUP |