1eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling//===-- DwarfException.h - Dwarf Exception Framework -----------*- C++ -*--===//
2eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling//
3eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling//                     The LLVM Compiler Infrastructure
4eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling//
5eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling// This file is distributed under the University of Illinois Open Source
6eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling// License. See LICENSE.TXT for details.
7eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling//
8eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling//===----------------------------------------------------------------------===//
9eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling//
10eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling// This file contains support for writing dwarf exception info into asm files.
11eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling//
12eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling//===----------------------------------------------------------------------===//
13eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling
146f37f8f9c3174f7a09344ed25e095b1d6b1ff024Chris Lattner#ifndef LLVM_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
156f37f8f9c3174f7a09344ed25e095b1d6b1ff024Chris Lattner#define LLVM_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
16eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling
17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "EHStreamer.h"
18e29887b4ee42ae78790a8c1886a7babee9ef18e5Rafael Espindola#include "llvm/CodeGen/AsmPrinter.h"
19eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling
20eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendlingnamespace llvm {
216d7337896f1bcdfbdee90c9c33371c2a373f422aChris Lattnerclass MachineFunction;
22320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindolaclass ARMTargetStreamer;
23d7e8ddc5012d22398eba6b8094e2fd7821bac9ccAnton Korobeynikov
24cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass DwarfCFIException : public EHStreamer {
257b11a4cbdc613c768871a0e4aad4ad3ae7cab5deRafael Espindola  /// shouldEmitPersonality - Per-function flag to indicate if .cfi_personality
267b11a4cbdc613c768871a0e4aad4ad3ae7cab5deRafael Espindola  /// should be emitted.
277b11a4cbdc613c768871a0e4aad4ad3ae7cab5deRafael Espindola  bool shouldEmitPersonality;
287b11a4cbdc613c768871a0e4aad4ad3ae7cab5deRafael Espindola
297b11a4cbdc613c768871a0e4aad4ad3ae7cab5deRafael Espindola  /// shouldEmitLSDA - Per-function flag to indicate if .cfi_lsda
307b11a4cbdc613c768871a0e4aad4ad3ae7cab5deRafael Espindola  /// should be emitted.
317b11a4cbdc613c768871a0e4aad4ad3ae7cab5deRafael Espindola  bool shouldEmitLSDA;
329a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov
339a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov  /// shouldEmitMoves - Per-function flag to indicate if frame moves info
349a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov  /// should be emitted.
359a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov  bool shouldEmitMoves;
369a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov
37e29887b4ee42ae78790a8c1886a7babee9ef18e5Rafael Espindola  AsmPrinter::CFIMoveType moveTypeModule;
38e29887b4ee42ae78790a8c1886a7babee9ef18e5Rafael Espindola
399a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikovpublic:
409a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov  //===--------------------------------------------------------------------===//
419a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov  // Main entry points.
429a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov  //
439a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov  DwarfCFIException(AsmPrinter *A);
449a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov  virtual ~DwarfCFIException();
459a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// endModule - Emit all exception information that should come after the
479a1ef4ef36cfa2d8d9ebd52d601283ae6e7466cdAnton Korobeynikov  /// content.
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void endModule() override;
49eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// beginFunction - Gather pre-function exception information.  Assumes being
51eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling  /// emitted immediately after the function entry point.
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void beginFunction(const MachineFunction *MF) override;
53eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// endFunction - Gather and emit post-function exception information.
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void endFunction(const MachineFunction *) override;
56eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling};
57eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling
58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass ARMException : public EHStreamer {
59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  void emitTypeInfos(unsigned TTypeEncoding) override;
60320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola  ARMTargetStreamer &getTargetStreamer();
61320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// shouldEmitCFI - Per-function flag to indicate if frame CFI info
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// should be emitted.
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool shouldEmitCFI;
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
66b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikovpublic:
67b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  //===--------------------------------------------------------------------===//
68b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  // Main entry points.
69b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  //
70b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  ARMException(AsmPrinter *A);
71b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  virtual ~ARMException();
72b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// endModule - Emit all exception information that should come after the
74b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  /// content.
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void endModule() override;
76b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// beginFunction - Gather pre-function exception information.  Assumes being
78b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  /// emitted immediately after the function entry point.
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void beginFunction(const MachineFunction *MF) override;
80b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// endFunction - Gather and emit post-function exception information.
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void endFunction(const MachineFunction *) override;
83b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov};
84b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass Win64Exception : public EHStreamer {
86d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  /// shouldEmitPersonality - Per-function flag to indicate if personality
87d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  /// info should be emitted.
88d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  bool shouldEmitPersonality;
89d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis
90d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  /// shouldEmitLSDA - Per-function flag to indicate if the LSDA
91d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  /// should be emitted.
92d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  bool shouldEmitLSDA;
93d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis
94d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  /// shouldEmitMoves - Per-function flag to indicate if frame moves info
95d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  /// should be emitted.
96d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  bool shouldEmitMoves;
97d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis
98d652b1368b1e381382951f450e5eeca870d91dd6Charles Davispublic:
99d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  //===--------------------------------------------------------------------===//
100d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  // Main entry points.
101d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  //
102d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  Win64Exception(AsmPrinter *A);
103d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  virtual ~Win64Exception();
104d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// endModule - Emit all exception information that should come after the
106d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  /// content.
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void endModule() override;
108d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// beginFunction - Gather pre-function exception information.  Assumes being
110d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis  /// emitted immediately after the function entry point.
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void beginFunction(const MachineFunction *MF) override;
112d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// endFunction - Gather and emit post-function exception information.
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void endFunction(const MachineFunction *) override;
115d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis};
116d652b1368b1e381382951f450e5eeca870d91dd6Charles Davis
117eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling} // End of namespace llvm
118eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling
119eb9072195ca7d777a71194dcaaaa369d82f24f53Bill Wendling#endif
120