blob: dfca8f47c96d53779083c489479157a51cc072aa [file] [log] [blame]
// Copyright (c) 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_STARSCAN_STACK_STACK_H_
#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_STARSCAN_STACK_STACK_H_
#include <cstdint>
#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h"
#include "base/allocator/partition_allocator/partition_alloc_base/component_export.h"
namespace partition_alloc::internal {
// Returns the current stack pointer.
// TODO(bikineev,1202644): Remove this once base/stack_util.h lands.
PA_COMPONENT_EXPORT(PARTITION_ALLOC) PA_NOINLINE uintptr_t* GetStackPointer();
// Returns the top of the stack using system API.
PA_COMPONENT_EXPORT(PARTITION_ALLOC) void* GetStackTop();
// Interface for stack visitation.
class StackVisitor {
public:
virtual void VisitStack(uintptr_t* stack_ptr, uintptr_t* stack_top) = 0;
};
// Abstraction over the stack. Supports handling of:
// - native stack;
// - SafeStack: https://releases.llvm.org/10.0.0/tools/clang/docs/SafeStack.html
class PA_COMPONENT_EXPORT(PARTITION_ALLOC) Stack final {
public:
// Sets start of the stack.
explicit Stack(void* stack_top);
// Word-aligned iteration of the stack. Flushes callee saved registers and
// passes the range of the stack on to |visitor|.
void IteratePointers(StackVisitor* visitor) const;
// Returns the top of the stack.
void* stack_top() const { return stack_top_; }
private:
void* stack_top_;
};
} // namespace partition_alloc::internal
#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_STARSCAN_STACK_STACK_H_