[sanitizer] Allow Fuchsia symbolizer to be reused by Myriad RTEMS
Like Fuchsia, Myriad RTEMS uses an off-line symbolizer -- we just need a custom backtrace frame string. Move this definition to sanitizer_fuchsia.h; the corresponding RTEMS one will be added when we add sanitizer_rtems.h. Differential Revision: https://reviews.llvm.org/D46462 llvm-svn: 332157
This commit is contained in:
parent
811a83d036
commit
d8f7b0b5d5
|
@ -74,10 +74,10 @@ set(SANITIZER_SYMBOLIZER_SOURCES
|
||||||
sanitizer_stacktrace_printer.cc
|
sanitizer_stacktrace_printer.cc
|
||||||
sanitizer_stacktrace_sparc.cc
|
sanitizer_stacktrace_sparc.cc
|
||||||
sanitizer_symbolizer.cc
|
sanitizer_symbolizer.cc
|
||||||
sanitizer_symbolizer_fuchsia.cc
|
|
||||||
sanitizer_symbolizer_libbacktrace.cc
|
sanitizer_symbolizer_libbacktrace.cc
|
||||||
sanitizer_symbolizer_libcdep.cc
|
sanitizer_symbolizer_libcdep.cc
|
||||||
sanitizer_symbolizer_mac.cc
|
sanitizer_symbolizer_mac.cc
|
||||||
|
sanitizer_symbolizer_markup.cc
|
||||||
sanitizer_symbolizer_posix_libcdep.cc
|
sanitizer_symbolizer_posix_libcdep.cc
|
||||||
sanitizer_symbolizer_report.cc
|
sanitizer_symbolizer_report.cc
|
||||||
sanitizer_symbolizer_win.cc
|
sanitizer_symbolizer_win.cc
|
||||||
|
@ -147,9 +147,11 @@ set(SANITIZER_HEADERS
|
||||||
sanitizer_stoptheworld.h
|
sanitizer_stoptheworld.h
|
||||||
sanitizer_suppressions.h
|
sanitizer_suppressions.h
|
||||||
sanitizer_symbolizer.h
|
sanitizer_symbolizer.h
|
||||||
|
sanitizer_symbolizer_fuchsia.h
|
||||||
sanitizer_symbolizer_internal.h
|
sanitizer_symbolizer_internal.h
|
||||||
sanitizer_symbolizer_libbacktrace.h
|
sanitizer_symbolizer_libbacktrace.h
|
||||||
sanitizer_symbolizer_mac.h
|
sanitizer_symbolizer_mac.h
|
||||||
|
sanitizer_symbolizer_rtems.h
|
||||||
sanitizer_syscall_generic.inc
|
sanitizer_syscall_generic.inc
|
||||||
sanitizer_syscall_linux_x86_64.inc
|
sanitizer_syscall_linux_x86_64.inc
|
||||||
sanitizer_syscall_linux_aarch64.inc
|
sanitizer_syscall_linux_aarch64.inc
|
||||||
|
|
|
@ -329,4 +329,11 @@
|
||||||
# define SANITIZER_CACHE_LINE_SIZE 64
|
# define SANITIZER_CACHE_LINE_SIZE 64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Enable offline markup symbolizer for Fuchsia and RTEMS.
|
||||||
|
#if SANITIZER_FUCHSIA || SANITIZER_RTEMS
|
||||||
|
#define SANITIZER_SYMBOLIZER_MARKUP 1
|
||||||
|
#else
|
||||||
|
#define SANITIZER_SYMBOLIZER_MARKUP 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // SANITIZER_PLATFORM_H
|
#endif // SANITIZER_PLATFORM_H
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
//===-- sanitizer_symbolizer_fuchsia.h -----------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file is shared between various sanitizers' runtime libraries.
|
||||||
|
//
|
||||||
|
// Define Fuchsia's string formats and limits for the markup symbolizer.
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
#ifndef SANITIZER_SYMBOLIZER_FUCHSIA_H
|
||||||
|
#define SANITIZER_SYMBOLIZER_FUCHSIA_H
|
||||||
|
|
||||||
|
#include "sanitizer_internal_defs.h"
|
||||||
|
|
||||||
|
namespace __sanitizer {
|
||||||
|
|
||||||
|
// See the spec at:
|
||||||
|
// https://fuchsia.googlesource.com/zircon/+/master/docs/symbolizer_markup.md
|
||||||
|
|
||||||
|
// This is used by UBSan for type names, and by ASan for global variable names.
|
||||||
|
constexpr const char *kFormatDemangle = "{{{symbol:%s}}}";
|
||||||
|
constexpr uptr kFormatDemangleMax = 1024; // Arbitrary.
|
||||||
|
|
||||||
|
// Function name or equivalent from PC location.
|
||||||
|
constexpr const char *kFormatFunction = "{{{pc:%p}}}";
|
||||||
|
constexpr uptr kFormatFunctionMax = 64; // More than big enough for 64-bit hex.
|
||||||
|
|
||||||
|
// Global variable name or equivalent from data memory address.
|
||||||
|
constexpr const char *kFormatData = "{{{data:%p}}}";
|
||||||
|
|
||||||
|
// One frame in a backtrace (printed on a line by itself).
|
||||||
|
constexpr const char *kFormatFrame = "{{{bt:%u:%p}}}";
|
||||||
|
|
||||||
|
} // namespace __sanitizer
|
||||||
|
|
||||||
|
#endif // SANITIZER_SYMBOLIZER_FUCHSIA_H
|
|
@ -1,4 +1,4 @@
|
||||||
//===-- sanitizer_symbolizer_fuchsia.cc -----------------------------------===//
|
//===-- sanitizer_symbolizer_markup.cc ------------------------------------===//
|
||||||
//
|
//
|
||||||
// The LLVM Compiler Infrastructure
|
// The LLVM Compiler Infrastructure
|
||||||
//
|
//
|
||||||
|
@ -9,13 +9,17 @@
|
||||||
//
|
//
|
||||||
// This file is shared between various sanitizers' runtime libraries.
|
// This file is shared between various sanitizers' runtime libraries.
|
||||||
//
|
//
|
||||||
// Implementation of Fuchsia-specific symbolizer.
|
// Implementation of offline markup symbolizer.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "sanitizer_platform.h"
|
#include "sanitizer_platform.h"
|
||||||
#if SANITIZER_FUCHSIA
|
#if SANITIZER_SYMBOLIZER_MARKUP
|
||||||
|
|
||||||
#include "sanitizer_fuchsia.h"
|
#if SANITIZER_FUCHSIA
|
||||||
|
#include "sanitizer_symbolizer_fuchsia.h"
|
||||||
|
#elif SANITIZER_RTEMS
|
||||||
|
#include "sanitizer_symbolizer_rtems.h"
|
||||||
|
#endif
|
||||||
#include "sanitizer_stacktrace.h"
|
#include "sanitizer_stacktrace.h"
|
||||||
#include "sanitizer_symbolizer.h"
|
#include "sanitizer_symbolizer.h"
|
||||||
|
|
||||||
|
@ -24,7 +28,8 @@
|
||||||
|
|
||||||
namespace __sanitizer {
|
namespace __sanitizer {
|
||||||
|
|
||||||
// For Fuchsia we don't do any actual symbolization per se.
|
// This generic support for offline symbolizing is based on the
|
||||||
|
// Fuchsia port. We don't do any actual symbolization per se.
|
||||||
// Instead, we emit text containing raw addresses and raw linkage
|
// Instead, we emit text containing raw addresses and raw linkage
|
||||||
// symbol names, embedded in Fuchsia's symbolization markup format.
|
// symbol names, embedded in Fuchsia's symbolization markup format.
|
||||||
// Fuchsia's logging infrastructure emits enough information about
|
// Fuchsia's logging infrastructure emits enough information about
|
||||||
|
@ -32,20 +37,6 @@ namespace __sanitizer {
|
||||||
// symbolization and pretty-print the markup. See the spec at:
|
// symbolization and pretty-print the markup. See the spec at:
|
||||||
// https://fuchsia.googlesource.com/zircon/+/master/docs/symbolizer_markup.md
|
// https://fuchsia.googlesource.com/zircon/+/master/docs/symbolizer_markup.md
|
||||||
|
|
||||||
// This is used by UBSan for type names, and by ASan for global variable names.
|
|
||||||
constexpr const char *kFormatDemangle = "{{{symbol:%s}}}";
|
|
||||||
constexpr uptr kFormatDemangleMax = 1024; // Arbitrary.
|
|
||||||
|
|
||||||
// Function name or equivalent from PC location.
|
|
||||||
constexpr const char *kFormatFunction = "{{{pc:%p}}}";
|
|
||||||
constexpr uptr kFormatFunctionMax = 64; // More than big enough for 64-bit hex.
|
|
||||||
|
|
||||||
// Global variable name or equivalent from data memory address.
|
|
||||||
constexpr const char *kFormatData = "{{{data:%p}}}";
|
|
||||||
|
|
||||||
// One frame in a backtrace (printed on a line by itself).
|
|
||||||
constexpr const char *kFormatFrame = "{{{bt:%u:%p}}}";
|
|
||||||
|
|
||||||
// This is used by UBSan for type names, and by ASan for global variable names.
|
// 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.
|
// It's expected to return a static buffer that will be reused on each call.
|
||||||
const char *Symbolizer::Demangle(const char *name) {
|
const char *Symbolizer::Demangle(const char *name) {
|
||||||
|
@ -111,6 +102,7 @@ void ReportDeadlySignal(const SignalContext &sig, u32 tid,
|
||||||
UnwindSignalStackCallbackType unwind,
|
UnwindSignalStackCallbackType unwind,
|
||||||
const void *unwind_context) {}
|
const void *unwind_context) {}
|
||||||
|
|
||||||
|
#if SANITIZER_CAN_SLOW_UNWIND
|
||||||
struct UnwindTraceArg {
|
struct UnwindTraceArg {
|
||||||
BufferedStackTrace *stack;
|
BufferedStackTrace *stack;
|
||||||
u32 max_depth;
|
u32 max_depth;
|
||||||
|
@ -146,7 +138,8 @@ void BufferedStackTrace::SlowUnwindStackWithContext(uptr pc, void *context,
|
||||||
CHECK_NE(context, nullptr);
|
CHECK_NE(context, nullptr);
|
||||||
UNREACHABLE("signal context doesn't exist");
|
UNREACHABLE("signal context doesn't exist");
|
||||||
}
|
}
|
||||||
|
#endif // SANITIZER_CAN_SLOW_UNWIND
|
||||||
|
|
||||||
} // namespace __sanitizer
|
} // namespace __sanitizer
|
||||||
|
|
||||||
#endif // SANITIZER_FUCHSIA
|
#endif // SANITIZER_SYMBOLIZER_MARKUP
|
|
@ -0,0 +1,41 @@
|
||||||
|
//===-- sanitizer_symbolizer_rtems.h -----------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file is shared between various sanitizers' runtime libraries.
|
||||||
|
//
|
||||||
|
// Define RTEMS's string formats and limits for the markup symbolizer.
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
#ifndef SANITIZER_SYMBOLIZER_RTEMS_H
|
||||||
|
#define SANITIZER_SYMBOLIZER_RTEMS_H
|
||||||
|
|
||||||
|
#include "sanitizer_internal_defs.h"
|
||||||
|
|
||||||
|
namespace __sanitizer {
|
||||||
|
|
||||||
|
// The Myriad RTEMS symbolizer currently only parses backtrace lines,
|
||||||
|
// so use a format that the symbolizer understands. For other
|
||||||
|
// markups, keep them the same as the Fuchsia's.
|
||||||
|
|
||||||
|
// This is used by UBSan for type names, and by ASan for global variable names.
|
||||||
|
constexpr const char *kFormatDemangle = "{{{symbol:%s}}}";
|
||||||
|
constexpr uptr kFormatDemangleMax = 1024; // Arbitrary.
|
||||||
|
|
||||||
|
// Function name or equivalent from PC location.
|
||||||
|
constexpr const char *kFormatFunction = "{{{pc:%p}}}";
|
||||||
|
constexpr uptr kFormatFunctionMax = 64; // More than big enough for 64-bit hex.
|
||||||
|
|
||||||
|
// Global variable name or equivalent from data memory address.
|
||||||
|
constexpr const char *kFormatData = "{{{data:%p}}}";
|
||||||
|
|
||||||
|
// One frame in a backtrace (printed on a line by itself).
|
||||||
|
constexpr const char *kFormatFrame = " [%u] IP: %p";
|
||||||
|
|
||||||
|
} // namespace __sanitizer
|
||||||
|
|
||||||
|
#endif // SANITIZER_SYMBOLIZER_RTEMS_H
|
Loading…
Reference in New Issue