ARMException.cpp revision 249423
1221337Sdim//===-- CodeGen/AsmPrinter/ARMException.cpp - ARM EHABI Exception Impl ----===// 2221337Sdim// 3221337Sdim// The LLVM Compiler Infrastructure 4221337Sdim// 5221337Sdim// This file is distributed under the University of Illinois Open Source 6221337Sdim// License. See LICENSE.TXT for details. 7221337Sdim// 8221337Sdim//===----------------------------------------------------------------------===// 9221337Sdim// 10221337Sdim// This file contains support for writing DWARF exception info into asm files. 11221337Sdim// 12221337Sdim//===----------------------------------------------------------------------===// 13221337Sdim 14221337Sdim#include "DwarfException.h" 15249423Sdim#include "llvm/ADT/SmallString.h" 16249423Sdim#include "llvm/ADT/StringExtras.h" 17249423Sdim#include "llvm/ADT/Twine.h" 18221337Sdim#include "llvm/CodeGen/AsmPrinter.h" 19221337Sdim#include "llvm/CodeGen/MachineFrameInfo.h" 20221337Sdim#include "llvm/CodeGen/MachineFunction.h" 21249423Sdim#include "llvm/CodeGen/MachineModuleInfo.h" 22249423Sdim#include "llvm/IR/DataLayout.h" 23249423Sdim#include "llvm/IR/Module.h" 24221337Sdim#include "llvm/MC/MCAsmInfo.h" 25221337Sdim#include "llvm/MC/MCContext.h" 26221337Sdim#include "llvm/MC/MCExpr.h" 27221337Sdim#include "llvm/MC/MCSection.h" 28221337Sdim#include "llvm/MC/MCStreamer.h" 29221337Sdim#include "llvm/MC/MCSymbol.h" 30249423Sdim#include "llvm/Support/CommandLine.h" 31249423Sdim#include "llvm/Support/Dwarf.h" 32249423Sdim#include "llvm/Support/FormattedStream.h" 33221337Sdim#include "llvm/Target/Mangler.h" 34221337Sdim#include "llvm/Target/TargetFrameLowering.h" 35221337Sdim#include "llvm/Target/TargetOptions.h" 36221337Sdim#include "llvm/Target/TargetRegisterInfo.h" 37221337Sdimusing namespace llvm; 38221337Sdim 39249423Sdimstatic cl::opt<bool> 40234353SdimEnableARMEHABIDescriptors("arm-enable-ehabi-descriptors", cl::Hidden, 41234353Sdim cl::desc("Generate ARM EHABI tables with unwinding descriptors"), 42234353Sdim cl::init(false)); 43234353Sdim 44234353Sdim 45221337SdimARMException::ARMException(AsmPrinter *A) 46239462Sdim : DwarfException(A) {} 47221337Sdim 48221337SdimARMException::~ARMException() {} 49221337Sdim 50221337Sdimvoid ARMException::EndModule() { 51221337Sdim} 52221337Sdim 53221337Sdim/// BeginFunction - Gather pre-function exception information. Assumes it's 54221337Sdim/// being emitted immediately after the function entry point. 55221337Sdimvoid ARMException::BeginFunction(const MachineFunction *MF) { 56221337Sdim Asm->OutStreamer.EmitFnStart(); 57223017Sdim if (Asm->MF->getFunction()->needsUnwindTableEntry()) 58221337Sdim Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_begin", 59221337Sdim Asm->getFunctionNumber())); 60221337Sdim} 61221337Sdim 62221337Sdim/// EndFunction - Gather and emit post-function exception information. 63221337Sdim/// 64221337Sdimvoid ARMException::EndFunction() { 65223017Sdim if (!Asm->MF->getFunction()->needsUnwindTableEntry()) 66221337Sdim Asm->OutStreamer.EmitCantUnwind(); 67221337Sdim else { 68221337Sdim Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("eh_func_end", 69221337Sdim Asm->getFunctionNumber())); 70221337Sdim 71234353Sdim if (EnableARMEHABIDescriptors) { 72234353Sdim // Map all labels and get rid of any dead landing pads. 73234353Sdim MMI->TidyLandingPads(); 74221337Sdim 75249423Sdim if (!MMI->getLandingPads().empty()) { 76249423Sdim // Emit references to personality. 77249423Sdim if (const Function * Personality = 78249423Sdim MMI->getPersonalities()[MMI->getPersonalityIndex()]) { 79249423Sdim MCSymbol *PerSym = Asm->Mang->getSymbol(Personality); 80249423Sdim Asm->OutStreamer.EmitSymbolAttribute(PerSym, MCSA_Global); 81249423Sdim Asm->OutStreamer.EmitPersonality(PerSym); 82249423Sdim } 83221337Sdim 84249423Sdim // Emit .handlerdata directive. 85249423Sdim Asm->OutStreamer.EmitHandlerData(); 86249423Sdim 87249423Sdim // Emit actual exception table 88249423Sdim EmitExceptionTable(); 89249423Sdim } 90234353Sdim } 91221337Sdim } 92221337Sdim 93221337Sdim Asm->OutStreamer.EmitFnEnd(); 94221337Sdim} 95249423Sdim 96249423Sdimvoid ARMException::EmitTypeInfos(unsigned TTypeEncoding) { 97249423Sdim const std::vector<const GlobalVariable *> &TypeInfos = MMI->getTypeInfos(); 98249423Sdim const std::vector<unsigned> &FilterIds = MMI->getFilterIds(); 99249423Sdim 100249423Sdim bool VerboseAsm = Asm->OutStreamer.isVerboseAsm(); 101249423Sdim 102249423Sdim int Entry = 0; 103249423Sdim // Emit the Catch TypeInfos. 104249423Sdim if (VerboseAsm && !TypeInfos.empty()) { 105249423Sdim Asm->OutStreamer.AddComment(">> Catch TypeInfos <<"); 106249423Sdim Asm->OutStreamer.AddBlankLine(); 107249423Sdim Entry = TypeInfos.size(); 108249423Sdim } 109249423Sdim 110249423Sdim for (std::vector<const GlobalVariable *>::const_reverse_iterator 111249423Sdim I = TypeInfos.rbegin(), E = TypeInfos.rend(); I != E; ++I) { 112249423Sdim const GlobalVariable *GV = *I; 113249423Sdim if (VerboseAsm) 114249423Sdim Asm->OutStreamer.AddComment("TypeInfo " + Twine(Entry--)); 115249423Sdim Asm->EmitTTypeReference(GV, TTypeEncoding); 116249423Sdim } 117249423Sdim 118249423Sdim // Emit the Exception Specifications. 119249423Sdim if (VerboseAsm && !FilterIds.empty()) { 120249423Sdim Asm->OutStreamer.AddComment(">> Filter TypeInfos <<"); 121249423Sdim Asm->OutStreamer.AddBlankLine(); 122249423Sdim Entry = 0; 123249423Sdim } 124249423Sdim for (std::vector<unsigned>::const_iterator 125249423Sdim I = FilterIds.begin(), E = FilterIds.end(); I < E; ++I) { 126249423Sdim unsigned TypeID = *I; 127249423Sdim if (VerboseAsm) { 128249423Sdim --Entry; 129249423Sdim if (TypeID != 0) 130249423Sdim Asm->OutStreamer.AddComment("FilterInfo " + Twine(Entry)); 131249423Sdim } 132249423Sdim 133249423Sdim Asm->EmitTTypeReference((TypeID == 0 ? 0 : TypeInfos[TypeID - 1]), 134249423Sdim TTypeEncoding); 135249423Sdim } 136249423Sdim} 137