LCOV - code coverage report
Current view: top level - lib/CodeGen/AsmPrinter - ARMException.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 63 65 96.9 %
Date: 2017-09-14 15:23:50 Functions: 5 7 71.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- CodeGen/AsmPrinter/ARMException.cpp - ARM EHABI 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 DWARF exception info into asm files.
      11             : //
      12             : //===----------------------------------------------------------------------===//
      13             : 
      14             : #include "DwarfException.h"
      15             : #include "llvm/ADT/StringExtras.h"
      16             : #include "llvm/ADT/Twine.h"
      17             : #include "llvm/BinaryFormat/Dwarf.h"
      18             : #include "llvm/CodeGen/AsmPrinter.h"
      19             : #include "llvm/CodeGen/MachineFrameInfo.h"
      20             : #include "llvm/CodeGen/MachineFunction.h"
      21             : #include "llvm/CodeGen/MachineModuleInfo.h"
      22             : #include "llvm/IR/DataLayout.h"
      23             : #include "llvm/IR/Mangler.h"
      24             : #include "llvm/IR/Module.h"
      25             : #include "llvm/MC/MCAsmInfo.h"
      26             : #include "llvm/MC/MCContext.h"
      27             : #include "llvm/MC/MCExpr.h"
      28             : #include "llvm/MC/MCSection.h"
      29             : #include "llvm/MC/MCStreamer.h"
      30             : #include "llvm/MC/MCSymbol.h"
      31             : #include "llvm/Support/FormattedStream.h"
      32             : #include "llvm/Target/TargetFrameLowering.h"
      33             : #include "llvm/Target/TargetOptions.h"
      34             : #include "llvm/Target/TargetRegisterInfo.h"
      35             : using namespace llvm;
      36             : 
      37        1742 : ARMException::ARMException(AsmPrinter *A) : DwarfCFIExceptionBase(A) {}
      38             : 
      39        3434 : ARMException::~ARMException() {}
      40             : 
      41           0 : ARMTargetStreamer &ARMException::getTargetStreamer() {
      42       55728 :   MCTargetStreamer &TS = *Asm->OutStreamer->getTargetStreamer();
      43           0 :   return static_cast<ARMTargetStreamer &>(TS);
      44             : }
      45             : 
      46        9288 : void ARMException::beginFunction(const MachineFunction *MF) {
      47        9288 :   if (Asm->MAI->getExceptionHandlingType() == ExceptionHandling::ARM)
      48        9288 :     getTargetStreamer().emitFnStart();
      49             :   // See if we need call frame info.
      50        9288 :   AsmPrinter::CFIMoveType MoveType = Asm->needsCFIMoves();
      51             :   assert(MoveType != AsmPrinter::CFI_M_EH &&
      52             :          "non-EH CFI not yet supported in prologue with EHABI lowering");
      53             : 
      54        9288 :   if (MoveType == AsmPrinter::CFI_M_Debug) {
      55          59 :     if (!hasEmittedCFISections) {
      56          31 :       if (Asm->needsOnlyDebugCFIMoves())
      57          62 :         Asm->OutStreamer->EmitCFISections(false, true);
      58          31 :       hasEmittedCFISections = true;
      59             :     }
      60             : 
      61          59 :     shouldEmitCFI = true;
      62         118 :     Asm->OutStreamer->EmitCFIStartProc(false);
      63             :   }
      64        9288 : }
      65             : 
      66             : /// endFunction - Gather and emit post-function exception information.
      67             : ///
      68        9288 : void ARMException::endFunction(const MachineFunction *MF) {
      69        9288 :   ARMTargetStreamer &ATS = getTargetStreamer();
      70        9288 :   const Function *F = MF->getFunction();
      71        9288 :   const Function *Per = nullptr;
      72        9288 :   if (F->hasPersonalityFn())
      73          60 :     Per = dyn_cast<Function>(F->getPersonalityFn()->stripPointerCasts());
      74             :   bool forceEmitPersonality =
      75        9288 :     F->hasPersonalityFn() && !isNoOpWithoutInvoke(classifyEHPersonality(Per)) &&
      76        9288 :     F->needsUnwindTableEntry();
      77        9288 :   bool shouldEmitPersonality = forceEmitPersonality ||
      78       27864 :     !MF->getLandingPads().empty();
      79        9288 :   if (!Asm->MF->getFunction()->needsUnwindTableEntry() &&
      80             :       !shouldEmitPersonality)
      81        3643 :     ATS.emitCantUnwind();
      82        5645 :   else if (shouldEmitPersonality) {
      83             :     // Emit references to personality.
      84          30 :     if (Per) {
      85          30 :       MCSymbol *PerSym = Asm->getSymbol(Per);
      86          60 :       Asm->OutStreamer->EmitSymbolAttribute(PerSym, MCSA_Global);
      87          30 :       ATS.emitPersonality(PerSym);
      88             :     }
      89             : 
      90             :     // Emit .handlerdata directive.
      91          30 :     ATS.emitHandlerData();
      92             : 
      93             :     // Emit actual exception table
      94          30 :     emitExceptionTable();
      95             :   }
      96             : 
      97        9288 :   if (Asm->MAI->getExceptionHandlingType() == ExceptionHandling::ARM)
      98        9288 :     ATS.emitFnEnd();
      99        9288 : }
     100             : 
     101          30 : void ARMException::emitTypeInfos(unsigned TTypeEncoding) {
     102          30 :   const MachineFunction *MF = Asm->MF;
     103          30 :   const std::vector<const GlobalValue *> &TypeInfos = MF->getTypeInfos();
     104          30 :   const std::vector<unsigned> &FilterIds = MF->getFilterIds();
     105             : 
     106          60 :   bool VerboseAsm = Asm->OutStreamer->isVerboseAsm();
     107             : 
     108          30 :   int Entry = 0;
     109             :   // Emit the Catch TypeInfos.
     110          59 :   if (VerboseAsm && !TypeInfos.empty()) {
     111          87 :     Asm->OutStreamer->AddComment(">> Catch TypeInfos <<");
     112          58 :     Asm->OutStreamer->AddBlankLine();
     113          29 :     Entry = TypeInfos.size();
     114             :   }
     115             : 
     116         180 :   for (const GlobalValue *GV : reverse(TypeInfos)) {
     117          30 :     if (VerboseAsm)
     118         145 :       Asm->OutStreamer->AddComment("TypeInfo " + Twine(Entry--));
     119          30 :     Asm->EmitTTypeReference(GV, TTypeEncoding);
     120             :   }
     121             : 
     122             :   // Emit the Exception Specifications.
     123          59 :   if (VerboseAsm && !FilterIds.empty()) {
     124           3 :     Asm->OutStreamer->AddComment(">> Filter TypeInfos <<");
     125           2 :     Asm->OutStreamer->AddBlankLine();
     126           1 :     Entry = 0;
     127             :   }
     128             :   for (std::vector<unsigned>::const_iterator
     129          92 :          I = FilterIds.begin(), E = FilterIds.end(); I < E; ++I) {
     130           2 :     unsigned TypeID = *I;
     131           2 :     if (VerboseAsm) {
     132           2 :       --Entry;
     133           2 :       if (TypeID != 0)
     134           5 :         Asm->OutStreamer->AddComment("FilterInfo " + Twine(Entry));
     135             :     }
     136             : 
     137           3 :     Asm->EmitTTypeReference((TypeID == 0 ? nullptr : TypeInfos[TypeID - 1]),
     138             :                             TTypeEncoding);
     139             :   }
     140          30 : }

Generated by: LCOV version 1.13