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_X64_UNWINDING_INFO_WRITER_H_
6#define V8_COMPILER_X64_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        tracking_fp_(false),
22        block_will_exit_(false),
23        block_initial_states_(zone) {
24    if (enabled()) eh_frame_writer_.Initialize();
25  }
26
27  void MaybeIncreaseBaseOffsetAt(int pc_offset, int base_delta) {
28    if (enabled() && !tracking_fp_) {
29      eh_frame_writer_.AdvanceLocation(pc_offset);
30      eh_frame_writer_.IncreaseBaseAddressOffset(base_delta);
31    }
32  }
33
34  void SetNumberOfInstructionBlocks(int number) {
35    if (enabled()) block_initial_states_.resize(number);
36  }
37
38  void BeginInstructionBlock(int pc_offset, const InstructionBlock* block);
39  void EndInstructionBlock(const InstructionBlock* block);
40
41  void MarkFrameConstructed(int pc_base);
42  void MarkFrameDeconstructed(int pc_base);
43
44  void MarkBlockWillExit() { block_will_exit_ = true; }
45
46  void Finish(int code_size) {
47    if (enabled()) eh_frame_writer_.Finish(code_size);
48  }
49
50  EhFrameWriter* eh_frame_writer() {
51    return enabled() ? &eh_frame_writer_ : nullptr;
52  }
53
54 private:
55  bool enabled() const { return FLAG_perf_prof_unwinding_info; }
56
57  class BlockInitialState : public ZoneObject {
58   public:
59    BlockInitialState(Register reg, int offset, bool tracking_fp)
60        : register_(reg), offset_(offset), tracking_fp_(tracking_fp) {}
61
62    Register register_;
63    int offset_;
64    bool tracking_fp_;
65  };
66
67  Zone* zone_;
68  EhFrameWriter eh_frame_writer_;
69  bool tracking_fp_;
70  bool block_will_exit_;
71
72  ZoneVector<const BlockInitialState*> block_initial_states_;
73};
74
75}  // namespace compiler
76}  // namespace internal
77}  // namespace v8
78
79#endif
80