1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_PROFILER_FRAME_POINTER_UNWINDER_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_PROFILER_FRAME_POINTER_UNWINDER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <vector> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/profiler/unwinder.h" 12*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE) 15*6777b538SAndroid Build Coastguard Worker #include <os/availability.h> 16*6777b538SAndroid Build Coastguard Worker #endif 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker namespace base { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // Native unwinder implementation for platforms that have frame pointers: 21*6777b538SAndroid Build Coastguard Worker // * iOS, ARM64 and X86_64, 22*6777b538SAndroid Build Coastguard Worker // * macOS 23*6777b538SAndroid Build Coastguard Worker // * ChromeOS X86_64 and ARM64 24*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT 25*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE) 26*6777b538SAndroid Build Coastguard Worker API_AVAILABLE(ios(12)) 27*6777b538SAndroid Build Coastguard Worker #endif 28*6777b538SAndroid Build Coastguard Worker FramePointerUnwinder : public Unwinder { 29*6777b538SAndroid Build Coastguard Worker public: 30*6777b538SAndroid Build Coastguard Worker FramePointerUnwinder(); 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker FramePointerUnwinder(const FramePointerUnwinder&) = delete; 33*6777b538SAndroid Build Coastguard Worker FramePointerUnwinder& operator=(const FramePointerUnwinder&) = delete; 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // Unwinder: 36*6777b538SAndroid Build Coastguard Worker bool CanUnwindFrom(const Frame& current_frame) const override; 37*6777b538SAndroid Build Coastguard Worker UnwindResult TryUnwind(RegisterContext* thread_context, 38*6777b538SAndroid Build Coastguard Worker uintptr_t stack_top, 39*6777b538SAndroid Build Coastguard Worker std::vector<Frame>* stack) override; 40*6777b538SAndroid Build Coastguard Worker }; 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker } // namespace base 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker #endif // BASE_PROFILER_FRAME_POINTER_UNWINDER_H_ 45