LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Win64Exception.cpp
Go to the documentation of this file.
1 //===-- CodeGen/AsmPrinter/Win64Exception.cpp - Dwarf Exception Impl ------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains support for writing Win64 exception info into asm files.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "DwarfException.h"
15 #include "llvm/ADT/SmallString.h"
16 #include "llvm/ADT/StringExtras.h"
17 #include "llvm/ADT/Twine.h"
22 #include "llvm/IR/DataLayout.h"
23 #include "llvm/IR/Module.h"
24 #include "llvm/MC/MCAsmInfo.h"
25 #include "llvm/MC/MCContext.h"
26 #include "llvm/MC/MCExpr.h"
27 #include "llvm/MC/MCSection.h"
28 #include "llvm/MC/MCStreamer.h"
29 #include "llvm/MC/MCSymbol.h"
30 #include "llvm/Support/Dwarf.h"
33 #include "llvm/Target/Mangler.h"
38 using namespace llvm;
39 
41  : DwarfException(A),
42  shouldEmitPersonality(false), shouldEmitLSDA(false), shouldEmitMoves(false)
43  {}
44 
46 
47 /// EndModule - Emit all exception information that should come after the
48 /// content.
50 }
51 
52 /// BeginFunction - Gather pre-function exception information. Assumes it's
53 /// being emitted immediately after the function entry point.
55  shouldEmitMoves = shouldEmitPersonality = shouldEmitLSDA = false;
56 
57  // If any landing pads survive, we need an EH table.
58  bool hasLandingPads = !MMI->getLandingPads().empty();
59 
60  shouldEmitMoves = Asm->needsSEHMoves();
61 
63  unsigned PerEncoding = TLOF.getPersonalityEncoding();
65 
66  shouldEmitPersonality = hasLandingPads &&
67  PerEncoding != dwarf::DW_EH_PE_omit && Per;
68 
69  unsigned LSDAEncoding = TLOF.getLSDAEncoding();
70  shouldEmitLSDA = shouldEmitPersonality &&
71  LSDAEncoding != dwarf::DW_EH_PE_omit;
72 
73  if (!shouldEmitPersonality && !shouldEmitMoves)
74  return;
75 
77 
78  if (!shouldEmitPersonality)
79  return;
80 
81  MCSymbol *GCCHandlerSym =
82  Asm->GetExternalSymbolSymbol("_GCC_specific_handler");
83  Asm->OutStreamer.EmitWin64EHHandler(GCCHandlerSym, true, true);
84 
85  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_begin",
87 }
88 
89 /// EndFunction - Gather and emit post-function exception information.
90 ///
92  if (!shouldEmitPersonality && !shouldEmitMoves)
93  return;
94 
95  Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_end",
97 
98  // Map all labels and get rid of any dead landing pads.
100 
101  if (shouldEmitPersonality) {
104  const MCSymbol *Sym = TLOF.getCFIPersonalitySymbol(Per, Asm->Mang, MMI);
105 
109  4);
112  }
114 }
MachineModuleInfo * MMI
MMI - Collected machine module information.
MCContext & OutContext
Definition: AsmPrinter.h:72
Win64Exception(AsmPrinter *A)
void PushSection()
Definition: MCStreamer.h:252
unsigned getFunctionNumber() const
Definition: AsmPrinter.cpp:125
void TidyLandingPads(DenseMap< MCSymbol *, uintptr_t > *LPMap=0)
#define false
Definition: ConvertUTF.c:64
Mangler * Mang
Definition: AsmPrinter.h:88
MCStreamer & OutStreamer
Definition: AsmPrinter.h:78
AsmPrinter * Asm
Asm - Target of Dwarf emission.
void EmitValue(const MCExpr *Value, unsigned Size)
Definition: MCStreamer.cpp:141
static const MCSymbolRefExpr * Create(const MCSymbol *Symbol, MCContext &Ctx)
Definition: MCExpr.h:270
MCSymbol * CurrentFnSym
Definition: AsmPrinter.h:93
const std::vector< const Function * > & getPersonalities() const
getPersonalities - Return array of personality functions ever seen.
virtual void EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, bool Except)
Definition: MCStreamer.cpp:469
virtual void EmitLabel(MCSymbol *Symbol)
Definition: MCStreamer.cpp:212
unsigned getLSDAEncoding() const
virtual void EndModule()
unsigned getPersonalityEncoding() const
virtual void BeginFunction(const MachineFunction *MF)
virtual void EmitWin64EHEndProc()
Definition: MCStreamer.cpp:439
virtual void EmitWin64EHHandlerData()
Definition: MCStreamer.cpp:484
virtual void EndFunction()
EndFunction - Gather and emit post-function exception information.
const std::vector< LandingPadInfo > & getLandingPads() const
unsigned getPersonalityIndex() const
const TargetLoweringObjectFile & getObjFileLowering() const
getObjFileLowering - Return information about object file lowering.
Definition: AsmPrinter.cpp:129
virtual void EmitWin64EHStartProc(const MCSymbol *Symbol)
Definition: MCStreamer.cpp:428
virtual MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, MachineModuleInfo *MMI) const
MCSymbol * GetTempSymbol(StringRef Name, unsigned ID) const
MCSymbol * GetExternalSymbolSymbol(StringRef Sym) const