1b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov//===-- CodeGen/AsmPrinter/ARMException.cpp - ARM EHABI Exception Impl ----===//
2b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov//
3b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov//                     The LLVM Compiler Infrastructure
4b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov//
5b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov// This file is distributed under the University of Illinois Open Source
6b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov// License. See LICENSE.TXT for details.
7b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov//
8b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov//===----------------------------------------------------------------------===//
9b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov//
10b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov// This file contains support for writing DWARF exception info into asm files.
11b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov//
12b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov//===----------------------------------------------------------------------===//
13b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
14b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "DwarfException.h"
15b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/Module.h"
16b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/CodeGen/AsmPrinter.h"
17b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/CodeGen/MachineModuleInfo.h"
18b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/CodeGen/MachineFrameInfo.h"
19b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/CodeGen/MachineFunction.h"
20b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/MC/MCAsmInfo.h"
21b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/MC/MCContext.h"
22b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/MC/MCExpr.h"
23b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/MC/MCSection.h"
24b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/MC/MCStreamer.h"
25b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/MC/MCSymbol.h"
26b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/Target/Mangler.h"
27b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/Target/TargetData.h"
28b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
29b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/Target/TargetMachine.h"
30b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/Target/TargetOptions.h"
31b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/Target/TargetRegisterInfo.h"
3253fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov#include "llvm/Support/CommandLine.h"
33b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/Support/Dwarf.h"
34b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/Support/FormattedStream.h"
35b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/ADT/SmallString.h"
36b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/ADT/StringExtras.h"
37b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov#include "llvm/ADT/Twine.h"
38b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikovusing namespace llvm;
39b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
4053fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanovcl::opt<bool>
4153fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy StepanovEnableARMEHABIDescriptors("arm-enable-ehabi-descriptors", cl::Hidden,
4253fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov  cl::desc("Generate ARM EHABI tables with unwinding descriptors"),
4353fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov  cl::init(false));
4453fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov
4553fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov
46b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton KorobeynikovARMException::ARMException(AsmPrinter *A)
47b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  : DwarfException(A),
48b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    shouldEmitTable(false), shouldEmitMoves(false), shouldEmitTableModule(false)
49b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    {}
50b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
51b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton KorobeynikovARMException::~ARMException() {}
52b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
53b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikovvoid ARMException::EndModule() {
54b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov}
55b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
56b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov/// BeginFunction - Gather pre-function exception information. Assumes it's
57b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov/// being emitted immediately after the function entry point.
58b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikovvoid ARMException::BeginFunction(const MachineFunction *MF) {
59b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  Asm->OutStreamer.EmitFnStart();
60fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola  if (Asm->MF->getFunction()->needsUnwindTableEntry())
61b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_begin",
62b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov                                                  Asm->getFunctionNumber()));
63b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov}
64b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
65b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov/// EndFunction - Gather and emit post-function exception information.
66b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov///
67b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikovvoid ARMException::EndFunction() {
68fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola  if (!Asm->MF->getFunction()->needsUnwindTableEntry())
69b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    Asm->OutStreamer.EmitCantUnwind();
70b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  else {
71b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_end",
72b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov                                                  Asm->getFunctionNumber()));
73b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
74b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    // Emit references to personality.
75b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    if (const Function * Personality =
76b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov        MMI->getPersonalities()[MMI->getPersonalityIndex()]) {
77b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov      MCSymbol *PerSym = Asm->Mang->getSymbol(Personality);
78b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov      Asm->OutStreamer.EmitSymbolAttribute(PerSym, MCSA_Global);
79b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov      Asm->OutStreamer.EmitPersonality(PerSym);
80b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov    }
81b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
8253fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov    if (EnableARMEHABIDescriptors) {
8353fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov      // Map all labels and get rid of any dead landing pads.
8453fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov      MMI->TidyLandingPads();
85b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
8653fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov      Asm->OutStreamer.EmitHandlerData();
87b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
8853fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov      // Emit actual exception table
8953fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov      EmitExceptionTable();
9053fa1ae51008d22ce5d2aa6fbf22c1afc4ec1401Evgeniy Stepanov    }
91b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  }
92b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
93b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov  Asm->OutStreamer.EmitFnEnd();
94b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov}
95