forked from OSchip/llvm-project
Revert "[NFC][Sanitizer] Add new BufferedStackTrace::Unwind API"
This reverts commit 6112f37e75
.
llvm-svn: 355171
This commit is contained in:
parent
7cdaf1e06b
commit
e6ec6bd8e0
|
@ -35,7 +35,7 @@ static void OnStackUnwind(const SignalContext &sig,
|
|||
// corresponding code in the sanitizer_common and we use this callback to
|
||||
// print it.
|
||||
static_cast<const ScarinessScoreBase *>(callback_context)->Print();
|
||||
stack->Unwind(sig.pc, sig.bp, sig.context, fast);
|
||||
GetStackTrace(stack, kStackTraceMax, sig.pc, sig.bp, sig.context, fast);
|
||||
}
|
||||
|
||||
void ErrorDeadlySignal::Print() {
|
||||
|
|
|
@ -42,19 +42,19 @@ u32 GetMallocContextSize();
|
|||
if (max_size > 1) stack.trace_buffer[1] = GET_CALLER_PC(); \
|
||||
} \
|
||||
} else { \
|
||||
stack.Unwind(StackTrace::GetCurrentPc(), \
|
||||
GET_CURRENT_FRAME(), nullptr, fast, max_size); \
|
||||
GetStackTrace(&stack, max_size, StackTrace::GetCurrentPc(), \
|
||||
GET_CURRENT_FRAME(), 0, fast); \
|
||||
}
|
||||
|
||||
#define GET_STACK_TRACE_FATAL(pc, bp) \
|
||||
BufferedStackTrace stack; \
|
||||
stack.Unwind(pc, bp, nullptr, \
|
||||
common_flags()->fast_unwind_on_fatal)
|
||||
GetStackTrace(&stack, kStackTraceMax, pc, bp, 0, \
|
||||
common_flags()->fast_unwind_on_fatal)
|
||||
|
||||
#define GET_STACK_TRACE_SIGNAL(sig) \
|
||||
BufferedStackTrace stack; \
|
||||
stack.Unwind((sig).pc, (sig).bp, (sig).context, \
|
||||
common_flags()->fast_unwind_on_fatal)
|
||||
GetStackTrace(&stack, kStackTraceMax, (sig).pc, (sig).bp, (sig).context, \
|
||||
common_flags()->fast_unwind_on_fatal)
|
||||
|
||||
#define GET_STACK_TRACE_FATAL_HERE \
|
||||
GET_STACK_TRACE(kStackTraceMax, common_flags()->fast_unwind_on_fatal)
|
||||
|
|
|
@ -112,15 +112,16 @@ const int STACK_TRACE_TAG_POISON = StackTrace::TAG_CUSTOM + 1;
|
|||
|
||||
#define GET_MALLOC_STACK_TRACE \
|
||||
BufferedStackTrace stack; \
|
||||
if (hwasan_inited) \
|
||||
stack.Unwind(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), \
|
||||
nullptr, common_flags()->fast_unwind_on_malloc, \
|
||||
common_flags()->malloc_context_size)
|
||||
if (hwasan_inited) \
|
||||
GetStackTrace(&stack, common_flags()->malloc_context_size, \
|
||||
StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), nullptr, \
|
||||
common_flags()->fast_unwind_on_malloc)
|
||||
|
||||
#define GET_FATAL_STACK_TRACE_PC_BP(pc, bp) \
|
||||
BufferedStackTrace stack; \
|
||||
if (hwasan_inited) \
|
||||
stack.Unwind(pc, bp, nullptr, common_flags()->fast_unwind_on_fatal)
|
||||
if (hwasan_inited) \
|
||||
GetStackTrace(&stack, kStackTraceMax, pc, bp, nullptr, \
|
||||
common_flags()->fast_unwind_on_fatal)
|
||||
|
||||
#define GET_FATAL_STACK_TRACE_HERE \
|
||||
GET_FATAL_STACK_TRACE_PC_BP(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME())
|
||||
|
|
|
@ -378,7 +378,8 @@ static void HandleTagMismatch(AccessInfo ai, uptr pc, uptr frame,
|
|||
InternalMmapVector<BufferedStackTrace> stack_buffer(1);
|
||||
BufferedStackTrace *stack = stack_buffer.data();
|
||||
stack->Reset();
|
||||
stack->Unwind(pc, frame, uc, common_flags()->fast_unwind_on_fatal);
|
||||
GetStackTrace(stack, kStackTraceMax, pc, frame, uc,
|
||||
common_flags()->fast_unwind_on_fatal);
|
||||
|
||||
bool fatal = flags()->halt_on_error || !ai.recover;
|
||||
ReportTagMismatch(stack, ai.addr, ai.size, ai.is_store, fatal);
|
||||
|
@ -416,8 +417,8 @@ extern "C" SANITIZER_INTERFACE_ATTRIBUTE void __hwasan_tag_mismatch(
|
|||
|
||||
static void OnStackUnwind(const SignalContext &sig, const void *,
|
||||
BufferedStackTrace *stack) {
|
||||
stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context,
|
||||
common_flags()->fast_unwind_on_fatal);
|
||||
GetStackTrace(stack, kStackTraceMax, StackTrace::GetNextInstructionPc(sig.pc),
|
||||
sig.bp, sig.context, common_flags()->fast_unwind_on_fatal);
|
||||
}
|
||||
|
||||
void HwasanOnDeadlySignal(int signo, void *info, void *context) {
|
||||
|
|
|
@ -89,7 +89,7 @@ static void InitializeFlags() {
|
|||
|
||||
static void OnStackUnwind(const SignalContext &sig, const void *,
|
||||
BufferedStackTrace *stack) {
|
||||
stack->Unwind(sig.pc, sig.bp, sig.context,
|
||||
GetStackTrace(stack, kStackTraceMax, sig.pc, sig.bp, sig.context,
|
||||
common_flags()->fast_unwind_on_fatal);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
|
||||
#define GET_STACK_TRACE(max_size, fast) \
|
||||
__sanitizer::BufferedStackTrace stack; \
|
||||
stack.Unwind(StackTrace::GetCurrentPc(), \
|
||||
GET_CURRENT_FRAME(), nullptr, fast, max_size);
|
||||
GetStackTrace(&stack, max_size, StackTrace::GetCurrentPc(), \
|
||||
GET_CURRENT_FRAME(), nullptr, fast);
|
||||
|
||||
#define GET_STACK_TRACE_FATAL \
|
||||
GET_STACK_TRACE(kStackTraceMax, common_flags()->fast_unwind_on_fatal)
|
||||
|
|
|
@ -382,7 +382,7 @@ void __msan_warning_noreturn() {
|
|||
|
||||
static void OnStackUnwind(const SignalContext &sig, const void *,
|
||||
BufferedStackTrace *stack) {
|
||||
stack->Unwind(sig.pc, sig.bp, sig.context,
|
||||
GetStackTrace(stack, kStackTraceMax, sig.pc, sig.bp, sig.context,
|
||||
common_flags()->fast_unwind_on_fatal);
|
||||
}
|
||||
|
||||
|
|
|
@ -325,21 +325,23 @@ const int STACK_TRACE_TAG_POISON = StackTrace::TAG_CUSTOM + 1;
|
|||
#define GET_MALLOC_STACK_TRACE \
|
||||
BufferedStackTrace stack; \
|
||||
if (__msan_get_track_origins() && msan_inited) \
|
||||
stack.Unwind(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), \
|
||||
nullptr, common_flags()->fast_unwind_on_malloc, \
|
||||
common_flags()->malloc_context_size)
|
||||
GetStackTrace(&stack, common_flags()->malloc_context_size, \
|
||||
StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), nullptr, \
|
||||
common_flags()->fast_unwind_on_malloc)
|
||||
|
||||
// For platforms which support slow unwinder only, we restrict the store context
|
||||
// size to 1, basically only storing the current pc. We do this because the slow
|
||||
// unwinder which is based on libunwind is not async signal safe and causes
|
||||
// random freezes in forking applications as well as in signal handlers.
|
||||
#define GET_STORE_STACK_TRACE_PC_BP(pc, bp) \
|
||||
BufferedStackTrace stack; \
|
||||
if (__msan_get_track_origins() > 1 && msan_inited) { \
|
||||
int size = flags()->store_context_size; \
|
||||
if (!SANITIZER_CAN_FAST_UNWIND) \
|
||||
size = Min(size, 1); \
|
||||
stack.Unwind(pc, bp, nullptr, common_flags()->fast_unwind_on_malloc, size);\
|
||||
#define GET_STORE_STACK_TRACE_PC_BP(pc, bp) \
|
||||
BufferedStackTrace stack; \
|
||||
if (__msan_get_track_origins() > 1 && msan_inited) { \
|
||||
if (!SANITIZER_CAN_FAST_UNWIND) \
|
||||
GetStackTrace(&stack, Min(1, flags()->store_context_size), pc, bp, \
|
||||
nullptr, false); \
|
||||
else \
|
||||
GetStackTrace(&stack, flags()->store_context_size, pc, bp, nullptr, \
|
||||
common_flags()->fast_unwind_on_malloc); \
|
||||
}
|
||||
|
||||
#define GET_STORE_STACK_TRACE \
|
||||
|
@ -348,7 +350,8 @@ const int STACK_TRACE_TAG_POISON = StackTrace::TAG_CUSTOM + 1;
|
|||
#define GET_FATAL_STACK_TRACE_PC_BP(pc, bp) \
|
||||
BufferedStackTrace stack; \
|
||||
if (msan_inited) \
|
||||
stack.Unwind(pc, bp, nullptr, common_flags()->fast_unwind_on_fatal)
|
||||
GetStackTrace(&stack, kStackTraceMax, pc, bp, nullptr, \
|
||||
common_flags()->fast_unwind_on_fatal)
|
||||
|
||||
#define GET_FATAL_STACK_TRACE_HERE \
|
||||
GET_FATAL_STACK_TRACE_PC_BP(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME())
|
||||
|
|
|
@ -16,13 +16,6 @@
|
|||
|
||||
namespace __sanitizer {
|
||||
|
||||
struct BufferedStackTrace;
|
||||
// Get the stack trace with the given pc and bp.
|
||||
// The pc will be in the position 0 of the resulting stack trace.
|
||||
// The bp may refer to the current frame or to the caller's frame.
|
||||
void GetStackTrace(BufferedStackTrace *stack, uptr max_depth, uptr pc, uptr bp,
|
||||
void *context, bool request_fast_unwind);
|
||||
|
||||
static const u32 kStackTraceMax = 256;
|
||||
|
||||
#if defined(__sparc__) || (SANITIZER_LINUX && defined(__mips__))
|
||||
|
@ -103,20 +96,6 @@ struct BufferedStackTrace : public StackTrace {
|
|||
BufferedStackTrace() : StackTrace(trace_buffer, 0), top_frame_bp(0) {}
|
||||
|
||||
void Init(const uptr *pcs, uptr cnt, uptr extra_top_pc = 0);
|
||||
|
||||
void Unwind(uptr pc, uptr bp, void *context, bool request_fast,
|
||||
u32 max_depth = kStackTraceMax) {
|
||||
top_frame_bp = (max_depth > 0) ? bp : 0;
|
||||
// Small max_depth optimization
|
||||
if (max_depth <= 1) {
|
||||
if (max_depth == 1)
|
||||
trace_buffer[0] = pc;
|
||||
size = max_depth;
|
||||
return;
|
||||
}
|
||||
GetStackTrace(this, max_depth, pc, bp, context, request_fast);
|
||||
}
|
||||
|
||||
void Unwind(u32 max_depth, uptr pc, uptr bp, void *context, uptr stack_top,
|
||||
uptr stack_bottom, bool request_fast_unwind);
|
||||
|
||||
|
@ -142,27 +121,31 @@ static inline bool IsValidFrame(uptr frame, uptr stack_top, uptr stack_bottom) {
|
|||
return frame > stack_bottom && frame < stack_top - 2 * sizeof (uhwptr);
|
||||
}
|
||||
|
||||
// Get the stack trace with the given pc and bp.
|
||||
// The pc will be in the position 0 of the resulting stack trace.
|
||||
// The bp may refer to the current frame or to the caller's frame.
|
||||
void GetStackTrace(BufferedStackTrace *stack, uptr max_depth, uptr pc, uptr bp,
|
||||
void *context, bool request_fast_unwind);
|
||||
|
||||
} // namespace __sanitizer
|
||||
|
||||
// Use this macro if you want to print stack trace with the caller
|
||||
// of the current function in the top frame.
|
||||
#define GET_CALLER_PC_BP_SP \
|
||||
uptr bp = GET_CURRENT_FRAME(); \
|
||||
uptr pc = GET_CALLER_PC(); \
|
||||
uptr local_stack; \
|
||||
uptr sp = (uptr)&local_stack
|
||||
|
||||
#define GET_CALLER_PC_BP \
|
||||
uptr bp = GET_CURRENT_FRAME(); \
|
||||
uptr pc = GET_CALLER_PC();
|
||||
|
||||
#define GET_CALLER_PC_BP_SP \
|
||||
GET_CALLER_PC_BP; \
|
||||
uptr local_stack; \
|
||||
uptr sp = (uptr)&local_stack
|
||||
|
||||
// Use this macro if you want to print stack trace with the current
|
||||
// function in the top frame.
|
||||
#define GET_CURRENT_PC_BP \
|
||||
uptr bp = GET_CURRENT_FRAME(); \
|
||||
uptr pc = StackTrace::GetCurrentPc()
|
||||
|
||||
#define GET_CURRENT_PC_BP_SP \
|
||||
GET_CURRENT_PC_BP; \
|
||||
uptr bp = GET_CURRENT_FRAME(); \
|
||||
uptr pc = StackTrace::GetCurrentPc(); \
|
||||
uptr local_stack; \
|
||||
uptr sp = (uptr)&local_stack
|
||||
|
||||
|
|
|
@ -98,9 +98,16 @@ void ReportMmapWriteExec(int prot) {
|
|||
InternalMmapVector<BufferedStackTrace> stack_buffer(1);
|
||||
BufferedStackTrace *stack = stack_buffer.data();
|
||||
stack->Reset();
|
||||
|
||||
GET_CALLER_PC_BP;
|
||||
stack->Unwind(pc, bp, nullptr, common_flags()->fast_unwind_on_fatal);
|
||||
uptr top = 0;
|
||||
uptr bottom = 0;
|
||||
GET_CALLER_PC_BP_SP;
|
||||
(void)sp;
|
||||
bool fast = common_flags()->fast_unwind_on_fatal;
|
||||
if (StackTrace::WillUseFastUnwind(fast)) {
|
||||
GetThreadStackTopAndBottom(false, &top, &bottom);
|
||||
stack->Unwind(kStackTraceMax, pc, bp, nullptr, top, bottom, true);
|
||||
} else
|
||||
stack->Unwind(kStackTraceMax, pc, 0, nullptr, 0, 0, false);
|
||||
|
||||
Printf("%s", d.Warning());
|
||||
Report("WARNING: %s: writable-executable page usage\n", SanitizerToolName);
|
||||
|
|
|
@ -328,8 +328,14 @@ static void CheckShadowMapping() {
|
|||
#if !SANITIZER_GO
|
||||
static void OnStackUnwind(const SignalContext &sig, const void *,
|
||||
BufferedStackTrace *stack) {
|
||||
stack->Unwind(sig.pc, sig.bp, sig.context,
|
||||
common_flags()->fast_unwind_on_fatal);
|
||||
uptr top = 0;
|
||||
uptr bottom = 0;
|
||||
bool fast = common_flags()->fast_unwind_on_fatal;
|
||||
if (StackTrace::WillUseFastUnwind(fast)) {
|
||||
GetThreadStackTopAndBottom(false, &top, &bottom);
|
||||
stack->Unwind(kStackTraceMax, sig.pc, sig.bp, nullptr, top, bottom, true);
|
||||
} else
|
||||
stack->Unwind(kStackTraceMax, sig.pc, 0, sig.context, 0, 0, false);
|
||||
}
|
||||
|
||||
static void TsanOnDeadlySignal(int signo, void *siginfo, void *context) {
|
||||
|
|
|
@ -729,12 +729,18 @@ void PrintCurrentStack(ThreadState *thr, uptr pc) {
|
|||
ALWAYS_INLINE
|
||||
void PrintCurrentStackSlow(uptr pc) {
|
||||
#if !SANITIZER_GO
|
||||
uptr bp = GET_CURRENT_FRAME();
|
||||
uptr bp = 0;
|
||||
uptr top = 0;
|
||||
uptr bottom = 0;
|
||||
BufferedStackTrace *ptrace =
|
||||
new(internal_alloc(MBlockStackTrace, sizeof(BufferedStackTrace)))
|
||||
BufferedStackTrace();
|
||||
ptrace->Unwind(pc, bp, nullptr, false);
|
||||
|
||||
if (__sanitizer::StackTrace::WillUseFastUnwind(false)) {
|
||||
bp = GET_CURRENT_FRAME();
|
||||
__sanitizer::GetThreadStackTopAndBottom(false, &top, &bottom);
|
||||
ptrace->Unwind(kStackTraceMax, pc, bp, nullptr, top, bottom, true);
|
||||
} else
|
||||
ptrace->Unwind(kStackTraceMax, pc, 0, nullptr, 0, 0, false);
|
||||
for (uptr i = 0; i < ptrace->size / 2; i++) {
|
||||
uptr tmp = ptrace->trace_buffer[i];
|
||||
ptrace->trace_buffer[i] = ptrace->trace_buffer[ptrace->size - i - 1];
|
||||
|
|
|
@ -16,23 +16,21 @@
|
|||
|
||||
using namespace __ubsan;
|
||||
|
||||
void __sanitizer::GetStackTrace(BufferedStackTrace *stack, uptr max_depth,
|
||||
uptr pc, uptr bp, void *context, bool fast) {
|
||||
uptr top = 0;
|
||||
uptr bottom = 0;
|
||||
if (StackTrace::WillUseFastUnwind(fast)) {
|
||||
GetThreadStackTopAndBottom(false, &top, &bottom);
|
||||
stack->Unwind(max_depth, pc, bp, nullptr, top, bottom, true);
|
||||
} else
|
||||
stack->Unwind(max_depth, pc, bp, context, 0, 0, false);
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __sanitizer_print_stack_trace() {
|
||||
GET_CURRENT_PC_BP;
|
||||
uptr top = 0;
|
||||
uptr bottom = 0;
|
||||
bool request_fast_unwind = common_flags()->fast_unwind_on_fatal;
|
||||
GET_CURRENT_PC_BP_SP;
|
||||
(void)sp;
|
||||
BufferedStackTrace stack;
|
||||
stack.Unwind(pc, bp, nullptr, common_flags()->fast_unwind_on_fatal);
|
||||
if (__sanitizer::StackTrace::WillUseFastUnwind(request_fast_unwind)) {
|
||||
__sanitizer::GetThreadStackTopAndBottom(false, &top, &bottom);
|
||||
stack.Unwind(kStackTraceMax, pc, bp, nullptr, top, bottom, true);
|
||||
} else {
|
||||
stack.Unwind(kStackTraceMax, pc, 0, nullptr, 0, 0, false);
|
||||
}
|
||||
stack.Print();
|
||||
}
|
||||
} // extern "C"
|
||||
|
|
Loading…
Reference in New Issue