mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 05:46:06 +00:00

We have some significant amount of duplication around CheckFailed functionality. Each sanitizer copy-pasted a chunk of code. Some got random improvements like dealing with recursive failures better. These improvements could benefit all sanitizers, but they don't. Deduplicate CheckFailed logic across sanitizers and let each sanitizer only print the current stack trace. I've tried to dedup stack printing as well, but this got me into cmake hell. So let's keep this part duplicated in each sanitizer for now. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D102221
67 lines
2.9 KiB
C++
67 lines
2.9 KiB
C++
//===-- memprof_stack.h ----------------------------------------*- C++ -*-===//
|
|
//
|
|
// 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 a part of MemProfiler, a memory profiler.
|
|
//
|
|
// MemProf-private header for memprof_stack.cpp.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef MEMPROF_STACK_H
|
|
#define MEMPROF_STACK_H
|
|
|
|
#include "memprof_flags.h"
|
|
#include "memprof_thread.h"
|
|
#include "sanitizer_common/sanitizer_flags.h"
|
|
#include "sanitizer_common/sanitizer_stacktrace.h"
|
|
|
|
namespace __memprof {
|
|
|
|
static const u32 kDefaultMallocContextSize = 30;
|
|
|
|
void SetMallocContextSize(u32 size);
|
|
u32 GetMallocContextSize();
|
|
|
|
} // namespace __memprof
|
|
|
|
// NOTE: A Rule of thumb is to retrieve stack trace in the interceptors
|
|
// as early as possible (in functions exposed to the user), as we generally
|
|
// don't want stack trace to contain functions from MemProf internals.
|
|
|
|
#define GET_STACK_TRACE(max_size, fast) \
|
|
BufferedStackTrace stack; \
|
|
if (max_size <= 2) { \
|
|
stack.size = max_size; \
|
|
if (max_size > 0) { \
|
|
stack.top_frame_bp = GET_CURRENT_FRAME(); \
|
|
stack.trace_buffer[0] = StackTrace::GetCurrentPc(); \
|
|
if (max_size > 1) \
|
|
stack.trace_buffer[1] = GET_CALLER_PC(); \
|
|
} \
|
|
} else { \
|
|
stack.Unwind(StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), nullptr, \
|
|
fast, max_size); \
|
|
}
|
|
|
|
#define GET_STACK_TRACE_FATAL_HERE \
|
|
GET_STACK_TRACE(kStackTraceMax, common_flags()->fast_unwind_on_fatal)
|
|
|
|
#define GET_STACK_TRACE_THREAD GET_STACK_TRACE(kStackTraceMax, true)
|
|
|
|
#define GET_STACK_TRACE_MALLOC \
|
|
GET_STACK_TRACE(GetMallocContextSize(), common_flags()->fast_unwind_on_malloc)
|
|
|
|
#define GET_STACK_TRACE_FREE GET_STACK_TRACE_MALLOC
|
|
|
|
#define PRINT_CURRENT_STACK() \
|
|
{ \
|
|
GET_STACK_TRACE_FATAL_HERE; \
|
|
stack.Print(); \
|
|
}
|
|
|
|
#endif // MEMPROF_STACK_H
|