xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/AsmPrinter/DwarfException.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric //===-- DwarfException.h - Dwarf Exception Framework -----------*- C++ -*--===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file contains support for writing dwarf exception info into asm files.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
140b57cec5SDimitry Andric #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "EHStreamer.h"
170b57cec5SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h"
180b57cec5SDimitry Andric #include "llvm/MC/MCDwarf.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric namespace llvm {
210b57cec5SDimitry Andric class MachineFunction;
220b57cec5SDimitry Andric class ARMTargetStreamer;
230b57cec5SDimitry Andric 
24*bdd1243dSDimitry Andric class LLVM_LIBRARY_VISIBILITY DwarfCFIException : public EHStreamer {
250b57cec5SDimitry Andric   /// Per-function flag to indicate if .cfi_personality should be emitted.
261fd87a68SDimitry Andric   bool shouldEmitPersonality = false;
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric   /// Per-function flag to indicate if .cfi_personality must be emitted.
291fd87a68SDimitry Andric   bool forceEmitPersonality = false;
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric   /// Per-function flag to indicate if .cfi_lsda should be emitted.
321fd87a68SDimitry Andric   bool shouldEmitLSDA = false;
330b57cec5SDimitry Andric 
34*bdd1243dSDimitry Andric   /// Per-function flag to indicate if frame CFI info should be emitted.
35*bdd1243dSDimitry Andric   bool shouldEmitCFI = false;
36*bdd1243dSDimitry Andric 
37*bdd1243dSDimitry Andric   /// Per-module flag to indicate if .cfi_section has beeen emitted.
38*bdd1243dSDimitry Andric   bool hasEmittedCFISections = false;
39*bdd1243dSDimitry Andric 
40*bdd1243dSDimitry Andric   /// Vector of all personality functions seen so far in the module.
41*bdd1243dSDimitry Andric   std::vector<const GlobalValue *> Personalities;
42*bdd1243dSDimitry Andric 
43*bdd1243dSDimitry Andric   void addPersonality(const GlobalValue *Personality);
44*bdd1243dSDimitry Andric 
450b57cec5SDimitry Andric public:
460b57cec5SDimitry Andric   //===--------------------------------------------------------------------===//
470b57cec5SDimitry Andric   // Main entry points.
480b57cec5SDimitry Andric   //
490b57cec5SDimitry Andric   DwarfCFIException(AsmPrinter *A);
500b57cec5SDimitry Andric   ~DwarfCFIException() override;
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric   /// Emit all exception information that should come after the content.
530b57cec5SDimitry Andric   void endModule() override;
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric   /// Gather pre-function exception information.  Assumes being emitted
560b57cec5SDimitry Andric   /// immediately after the function entry point.
570b57cec5SDimitry Andric   void beginFunction(const MachineFunction *MF) override;
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric   /// Gather and emit post-function exception information.
600b57cec5SDimitry Andric   void endFunction(const MachineFunction *) override;
610b57cec5SDimitry Andric 
62*bdd1243dSDimitry Andric   void beginBasicBlockSection(const MachineBasicBlock &MBB) override;
63*bdd1243dSDimitry Andric   void endBasicBlockSection(const MachineBasicBlock &MBB) override;
640b57cec5SDimitry Andric };
650b57cec5SDimitry Andric 
66*bdd1243dSDimitry Andric class LLVM_LIBRARY_VISIBILITY ARMException : public EHStreamer {
67*bdd1243dSDimitry Andric   /// Per-function flag to indicate if frame CFI info should be emitted.
68*bdd1243dSDimitry Andric   bool shouldEmitCFI = false;
69*bdd1243dSDimitry Andric 
70*bdd1243dSDimitry Andric   /// Per-module flag to indicate if .cfi_section has beeen emitted.
71*bdd1243dSDimitry Andric   bool hasEmittedCFISections = false;
72*bdd1243dSDimitry Andric 
730b57cec5SDimitry Andric   void emitTypeInfos(unsigned TTypeEncoding, MCSymbol *TTBaseLabel) override;
740b57cec5SDimitry Andric   ARMTargetStreamer &getTargetStreamer();
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric public:
770b57cec5SDimitry Andric   //===--------------------------------------------------------------------===//
780b57cec5SDimitry Andric   // Main entry points.
790b57cec5SDimitry Andric   //
800b57cec5SDimitry Andric   ARMException(AsmPrinter *A);
810b57cec5SDimitry Andric   ~ARMException() override;
820b57cec5SDimitry Andric 
830b57cec5SDimitry Andric   /// Emit all exception information that should come after the content.
endModule()840b57cec5SDimitry Andric   void endModule() override {}
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric   /// Gather pre-function exception information.  Assumes being emitted
870b57cec5SDimitry Andric   /// immediately after the function entry point.
880b57cec5SDimitry Andric   void beginFunction(const MachineFunction *MF) override;
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric   /// Gather and emit post-function exception information.
910b57cec5SDimitry Andric   void endFunction(const MachineFunction *) override;
92*bdd1243dSDimitry Andric 
93*bdd1243dSDimitry Andric   void markFunctionEnd() override;
940b57cec5SDimitry Andric };
95e8d8bef9SDimitry Andric 
96*bdd1243dSDimitry Andric class LLVM_LIBRARY_VISIBILITY AIXException : public EHStreamer {
97e8d8bef9SDimitry Andric   /// This is AIX's compat unwind section, which unwinder would use
98e8d8bef9SDimitry Andric   /// to find the location of LSDA area and personality rountine.
99e8d8bef9SDimitry Andric   void emitExceptionInfoTable(const MCSymbol *LSDA, const MCSymbol *PerSym);
100e8d8bef9SDimitry Andric 
101e8d8bef9SDimitry Andric public:
102e8d8bef9SDimitry Andric   AIXException(AsmPrinter *A);
103e8d8bef9SDimitry Andric 
endModule()104e8d8bef9SDimitry Andric   void endModule() override {}
beginFunction(const MachineFunction * MF)105e8d8bef9SDimitry Andric   void beginFunction(const MachineFunction *MF) override {}
106e8d8bef9SDimitry Andric   void endFunction(const MachineFunction *MF) override;
107e8d8bef9SDimitry Andric };
1080b57cec5SDimitry Andric } // End of namespace llvm
1090b57cec5SDimitry Andric 
1100b57cec5SDimitry Andric #endif
111