25#ifdef V8_USE_ADDRESS_SANITIZER
27 if (__asan_addr_is_in_fake_stack(__asan_get_current_fake_stack(),
28 const_cast<void*
>(slot),
nullptr,
nullptr)) {
34#ifdef V8_USE_SAFE_STACK
35 if (__builtin___get_unsafe_stack_ptr() <= slot &&
36 slot <= __builtin___get_unsafe_stack_top()) {
46#ifdef V8_USE_ADDRESS_SANITIZER
57void IterateAsanFakeFrameIfNecessary(
StackVisitor* visitor,
59 const void* address) {
64 if (!segment.asan_fake_stack)
return;
65 void* fake_frame_begin;
67 void* real_stack_frame = __asan_addr_is_in_fake_stack(
68 const_cast<void*
>(segment.asan_fake_stack),
const_cast<void*
>(address),
69 &fake_frame_begin, &fake_frame_end);
70 if (real_stack_frame) {
73 if (segment.
start >= real_stack_frame && real_stack_frame >= segment.
top) {
75 for (
const void*
const* current =
76 reinterpret_cast<const void* const*
>(fake_frame_begin);
77 current < fake_frame_end; ++
current) {
78 const void* address_curr = *
current;
79 if (address_curr ==
nullptr)
continue;
86void IterateAsanFakeFrameIfNecessary(StackVisitor* visitor,
87 const Stack::Segment& segment,
88 const void* address) {}
91void IteratePointersInUnsafeStackIfNecessary(StackVisitor* visitor,
92 const Stack::Segment& segment) {
93#ifdef V8_USE_SAFE_STACK
98 constexpr size_t kSafeStackAlignmentBytes = 16;
99 CHECK_GE(segment.unsafe_stack_start, segment.unsafe_stack_top);
100 CHECK_EQ(0u,
reinterpret_cast<uintptr_t
>(segment.unsafe_stack_top) &
101 (kSafeStackAlignmentBytes - 1));
102 CHECK_EQ(0u,
reinterpret_cast<uintptr_t
>(segment.unsafe_stack_start) &
103 (kSafeStackAlignmentBytes - 1));
105 for (
const void*
const* current =
106 reinterpret_cast<const void* const*
>(segment.unsafe_stack_top);
107 current < segment.unsafe_stack_start; ++current) {
108 const void* address_curr = *
current;
109 if (address_curr ==
nullptr)
continue;
110 visitor->VisitPointer(address_curr);
127void IteratePointersInStack(StackVisitor* visitor,
128 const Stack::Segment& segment) {
131 CHECK_GE(segment.start, segment.top);
134 constexpr size_t kMinStackAlignment =
sizeof(
void*);
136 reinterpret_cast<uintptr_t
>(segment.top) & (kMinStackAlignment - 1));
137 CHECK_EQ(0u,
reinterpret_cast<uintptr_t
>(segment.start) &
138 (kMinStackAlignment - 1));
140 for (
const void*
const* current =
141 reinterpret_cast<const void* const*
>(segment.top);
142 current < segment.start; ++current) {
145 const void* address = *
current;
147 if (address ==
nullptr) {
150 visitor->VisitPointer(address);
151 IterateAsanFakeFrameIfNecessary(visitor, segment, address);
182 constexpr size_t kMinStackAlignment =
sizeof(
void*);
183 CHECK_EQ(0u,
reinterpret_cast<uintptr_t
>(segment.top) &
184 (kMinStackAlignment - 1));
185 IteratePointersInStack(visitor, segment);
186 IteratePointersInUnsafeStackIfNecessary(visitor, segment);
192bool Stack::IsOnCurrentStack(
const void* ptr) {
196 return ptr <= current_stack_start && ptr >= current_stack_top;
virtual void VisitPointer(const void *address)=0
void IteratePointersUntilMarker(StackVisitor *visitor) const
static bool IsOnStack(const void *slot)
void(*)(Stack *, void *, const void *) IterateStackCallback
StackVisitorCallback scan_simulator_callback_
V8_NOINLINE void TrampolineCallbackHelper(void *argument, IterateStackCallback callback)
void IteratePointers(StackVisitor *visitor) const
void IterateBackgroundStacks(StackVisitor *visitor) const
void IteratePointersForTesting(StackVisitor *visitor)
V8_INLINE void SetMarkerAndCallback(Callback callback)
std::map< ThreadId, Segment > background_stacks_
static StackSlot GetStackStartUnchecked()
static V8_NOINLINE StackSlot GetCurrentStackPosition()
#define MSAN_MEMORY_IS_INITIALIZED(start, size)
void PushAllRegistersAndIterateStack(const Stack *sp, StackVisitor *sv, IterateStackCallback callback)
#define CHECK_GE(lhs, rhs)
#define DCHECK_NOT_NULL(val)
#define CHECK_NOT_NULL(val)
#define CHECK_EQ(lhs, rhs)