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