diff options
Diffstat (limited to 'deps/v8/src/compiler/arm64/unwinding-info-writer-arm64.h')
-rw-r--r-- | deps/v8/src/compiler/arm64/unwinding-info-writer-arm64.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/deps/v8/src/compiler/arm64/unwinding-info-writer-arm64.h b/deps/v8/src/compiler/arm64/unwinding-info-writer-arm64.h new file mode 100644 index 0000000000..a532851d84 --- /dev/null +++ b/deps/v8/src/compiler/arm64/unwinding-info-writer-arm64.h @@ -0,0 +1,72 @@ +// Copyright 2016 the V8 project 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 V8_COMPILER_ARM64_UNWINDING_INFO_WRITER_H_ +#define V8_COMPILER_ARM64_UNWINDING_INFO_WRITER_H_ + +#include "src/eh-frame.h" + +namespace v8 { +namespace internal { +namespace compiler { + +class InstructionBlock; + +class UnwindingInfoWriter { + public: + explicit UnwindingInfoWriter(Zone* zone) + : zone_(zone), + eh_frame_writer_(zone), + saved_lr_(false), + block_will_exit_(false), + block_initial_states_(zone) { + if (enabled()) eh_frame_writer_.Initialize(); + } + + void SetNumberOfInstructionBlocks(int number) { + if (enabled()) block_initial_states_.resize(number); + } + + void BeginInstructionBlock(int pc_offset, const InstructionBlock* block); + void EndInstructionBlock(const InstructionBlock* block); + + void MarkLinkRegisterOnTopOfStack(int pc_offset, const Register& sp); + void MarkPopLinkRegisterFromTopOfStack(int pc_offset); + + void MarkFrameConstructed(int at_pc); + void MarkFrameDeconstructed(int at_pc); + + void MarkBlockWillExit() { block_will_exit_ = true; } + + void Finish(int code_size) { + if (enabled()) eh_frame_writer_.Finish(code_size); + } + + EhFrameWriter* eh_frame_writer() { + return enabled() ? &eh_frame_writer_ : nullptr; + } + + private: + bool enabled() const { return FLAG_perf_prof_unwinding_info; } + + class BlockInitialState : public ZoneObject { + public: + explicit BlockInitialState(bool saved_lr) : saved_lr_(saved_lr) {} + + bool saved_lr_; + }; + + Zone* zone_; + EhFrameWriter eh_frame_writer_; + bool saved_lr_; + bool block_will_exit_; + + ZoneVector<const BlockInitialState*> block_initial_states_; +}; + +} // namespace compiler +} // namespace internal +} // namespace v8 + +#endif |