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_X64_H_
6 #define V8_COMPILER_X64_UNWINDING_INFO_WRITER_X64_H_
7 
8 #include "src/eh-frame.h"
9 
10 namespace v8 {
11 namespace internal {
12 namespace compiler {
13 
14 class InstructionBlock;
15 
16 class UnwindingInfoWriter {
17  public:
UnwindingInfoWriter(Zone * zone)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 
MaybeIncreaseBaseOffsetAt(int pc_offset,int base_delta)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 
SetNumberOfInstructionBlocks(int number)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 
MarkBlockWillExit()44   void MarkBlockWillExit() { block_will_exit_ = true; }
45 
Finish(int code_size)46   void Finish(int code_size) {
47     if (enabled()) eh_frame_writer_.Finish(code_size);
48   }
49 
eh_frame_writer()50   EhFrameWriter* eh_frame_writer() {
51     return enabled() ? &eh_frame_writer_ : nullptr;
52   }
53 
54  private:
enabled()55   bool enabled() const { return FLAG_perf_prof_unwinding_info; }
56 
57   class BlockInitialState : public ZoneObject {
58    public:
BlockInitialState(Register reg,int offset,bool tracking_fp)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  // V8_COMPILER_X64_UNWINDING_INFO_WRITER_X64_H_
80