1// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_ARM64_UNWINDING_INFO_WRITER_H_
6#define V8_COMPILER_ARM64_UNWINDING_INFO_WRITER_H_
7
8#include "src/eh-frame.h"
9
10namespace v8 {
11namespace internal {
12namespace compiler {
13
14class InstructionBlock;
15
16class UnwindingInfoWriter {
17 public:
18  explicit UnwindingInfoWriter(Zone* zone)
19      : zone_(zone),
20        eh_frame_writer_(zone),
21        saved_lr_(false),
22        block_will_exit_(false),
23        block_initial_states_(zone) {
24    if (enabled()) eh_frame_writer_.Initialize();
25  }
26
27  void SetNumberOfInstructionBlocks(int number) {
28    if (enabled()) block_initial_states_.resize(number);
29  }
30
31  void BeginInstructionBlock(int pc_offset, const InstructionBlock* block);
32  void EndInstructionBlock(const InstructionBlock* block);
33
34  void MarkLinkRegisterOnTopOfStack(int pc_offset, const Register& sp);
35  void MarkPopLinkRegisterFromTopOfStack(int pc_offset);
36
37  void MarkFrameConstructed(int at_pc);
38  void MarkFrameDeconstructed(int at_pc);
39
40  void MarkBlockWillExit() { block_will_exit_ = true; }
41
42  void Finish(int code_size) {
43    if (enabled()) eh_frame_writer_.Finish(code_size);
44  }
45
46  EhFrameWriter* eh_frame_writer() {
47    return enabled() ? &eh_frame_writer_ : nullptr;
48  }
49
50 private:
51  bool enabled() const { return FLAG_perf_prof_unwinding_info; }
52
53  class BlockInitialState : public ZoneObject {
54   public:
55    explicit BlockInitialState(bool saved_lr) : saved_lr_(saved_lr) {}
56
57    bool saved_lr_;
58  };
59
60  Zone* zone_;
61  EhFrameWriter eh_frame_writer_;
62  bool saved_lr_;
63  bool block_will_exit_;
64
65  ZoneVector<const BlockInitialState*> block_initial_states_;
66};
67
68}  // namespace compiler
69}  // namespace internal
70}  // namespace v8
71
72#endif
73