• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_BACKEND_ARM64_UNWINDING_INFO_WRITER_ARM64_H_
6 #define V8_COMPILER_BACKEND_ARM64_UNWINDING_INFO_WRITER_ARM64_H_
7 
8 #include "src/diagnostics/eh-frame.h"
9 #include "src/flags/flags.h"
10 
11 namespace v8 {
12 namespace internal {
13 namespace compiler {
14 
15 class InstructionBlock;
16 
17 class UnwindingInfoWriter {
18  public:
UnwindingInfoWriter(Zone * zone)19   explicit UnwindingInfoWriter(Zone* zone)
20       : zone_(zone),
21         eh_frame_writer_(zone),
22         saved_lr_(false),
23         block_will_exit_(false),
24         block_initial_states_(zone) {
25     if (enabled()) eh_frame_writer_.Initialize();
26   }
27 
SetNumberOfInstructionBlocks(int number)28   void SetNumberOfInstructionBlocks(int number) {
29     if (enabled()) block_initial_states_.resize(number);
30   }
31 
32   void BeginInstructionBlock(int pc_offset, const InstructionBlock* block);
33   void EndInstructionBlock(const InstructionBlock* block);
34 
35   void MarkLinkRegisterOnTopOfStack(int pc_offset, const Register& sp);
36   void MarkPopLinkRegisterFromTopOfStack(int pc_offset);
37 
38   void MarkFrameConstructed(int at_pc);
39   void MarkFrameDeconstructed(int at_pc);
40 
MarkBlockWillExit()41   void MarkBlockWillExit() { block_will_exit_ = true; }
42 
Finish(int code_size)43   void Finish(int code_size) {
44     if (enabled()) eh_frame_writer_.Finish(code_size);
45   }
46 
eh_frame_writer()47   EhFrameWriter* eh_frame_writer() {
48     return enabled() ? &eh_frame_writer_ : nullptr;
49   }
50 
51  private:
enabled()52   bool enabled() const { return FLAG_perf_prof_unwinding_info; }
53 
54   class BlockInitialState : public ZoneObject {
55    public:
BlockInitialState(bool saved_lr)56     explicit BlockInitialState(bool saved_lr) : saved_lr_(saved_lr) {}
57 
58     bool saved_lr_;
59   };
60 
61   Zone* zone_;
62   EhFrameWriter eh_frame_writer_;
63   bool saved_lr_;
64   bool block_will_exit_;
65 
66   ZoneVector<const BlockInitialState*> block_initial_states_;
67 };
68 
69 }  // namespace compiler
70 }  // namespace internal
71 }  // namespace v8
72 
73 #endif  // V8_COMPILER_BACKEND_ARM64_UNWINDING_INFO_WRITER_ARM64_H_
74