[llvm] r196288 - Reland 196270 "Generalize debug info / EH emission in AsmPrinter"

Timur Iskhodzhanov timurrrr at google.com
Tue Dec 3 07:18:57 PST 2013


For your convenience, attached is the patch against r196270, so the "fix"
is more obvious.


2013/12/3 Timur Iskhodzhanov <timurrrr at google.com>

> Author: timurrrr
> Date: Tue Dec  3 09:10:23 2013
> New Revision: 196288
>
> URL: http://llvm.org/viewvc/llvm-project?rev=196288&view=rev
> Log:
> Reland 196270 "Generalize debug info / EH emission in AsmPrinter"
>
> Addressing the existense AMDGPUAsmPrinter and other subclasses of
> AsmPrinter
>
> Added:
>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterHandler.h
> Modified:
>     llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Tue Dec  3 09:10:23 2013
> @@ -22,6 +22,7 @@
>  #include "llvm/Support/ErrorHandling.h"
>
>  namespace llvm {
> +  class AsmPrinterHandler;
>    class BlockAddress;
>    class GCStrategy;
>    class Constant;
> @@ -110,13 +111,21 @@ namespace llvm {
>      /// function.
>      MachineLoopInfo *LI;
>
> +    struct HandlerInfo {
> +      AsmPrinterHandler *Handler;
> +      const char *TimerName, *TimerGroupName;
> +      HandlerInfo(AsmPrinterHandler *Handler, const char *TimerName,
> +                  const char *TimerGroupName)
> +          : Handler(Handler), TimerName(TimerName),
> +            TimerGroupName(TimerGroupName) {}
> +    };
> +    /// Handlers - a vector of all debug/EH info emitters we should use.
> +    /// This vector maintains ownership of the emitters.
> +    SmallVector<HandlerInfo, 1> Handlers;
> +
>      /// DD - If the target supports dwarf debug info, this pointer is
> non-null.
>      DwarfDebug *DD;
>
> -    /// DE - If the target supports dwarf exception info, this pointer is
> -    /// non-null.
> -    DwarfException *DE;
> -
>    protected:
>      explicit AsmPrinter(TargetMachine &TM, MCStreamer &Streamer);
>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/ARMException.cpp Tue Dec  3 09:10:23
> 2013
> @@ -66,7 +66,7 @@ void ARMException::beginFunction(const M
>
>  /// endFunction - Gather and emit post-function exception information.
>  ///
> -void ARMException::endFunction() {
> +void ARMException::endFunction(const MachineFunction *) {
>    ARMTargetStreamer &ATS = getTargetStreamer();
>    if (!Asm->MF->getFunction()->needsUnwindTableEntry())
>      ATS.emitCantUnwind();
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Tue Dec  3 09:10:23
> 2013
> @@ -99,14 +99,14 @@ AsmPrinter::AsmPrinter(TargetMachine &tm
>      OutContext(Streamer.getContext()),
>      OutStreamer(Streamer),
>      LastMI(0), LastFn(0), Counter(~0U), SetCounter(0) {
> -  DD = 0; DE = 0; MMI = 0; LI = 0; MF = 0;
> +  DD = 0; MMI = 0; LI = 0; MF = 0;
>    CurrentFnSym = CurrentFnSymForSize = 0;
>    GCMetadataPrinters = 0;
>    VerboseAsm = Streamer.isVerboseAsm();
>  }
>
>  AsmPrinter::~AsmPrinter() {
> -  assert(DD == 0 && DE == 0 && "Debug/EH info didn't get finalized");
> +  assert(DD == 0 && Handlers.empty() && "Debug/EH info didn't get
> finalized");
>
>    if (GCMetadataPrinters != 0) {
>      gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
> @@ -192,25 +192,29 @@ bool AsmPrinter::doInitialization(Module
>      OutStreamer.AddBlankLine();
>    }
>
> -  if (MAI->doesSupportDebugInformation())
> +  if (MAI->doesSupportDebugInformation()) {
>      DD = new DwarfDebug(this, &M);
> +    Handlers.push_back(HandlerInfo(DD, DbgTimerName, DWARFGroupName));
> +  }
>
> +  DwarfException *DE = 0;
>    switch (MAI->getExceptionHandlingType()) {
>    case ExceptionHandling::None:
> -    return false;
> +    break;
>    case ExceptionHandling::SjLj:
>    case ExceptionHandling::DwarfCFI:
>      DE = new DwarfCFIException(this);
> -    return false;
> +    break;
>    case ExceptionHandling::ARM:
>      DE = new ARMException(this);
> -    return false;
> +    break;
>    case ExceptionHandling::Win64:
>      DE = new Win64Exception(this);
> -    return false;
> +    break;
>    }
> -
> -  llvm_unreachable("Unknown exception type.");
> +  if (DE)
> +    Handlers.push_back(HandlerInfo(DE, EHTimerName, DWARFGroupName));
> +  return false;
>  }
>
>  void AsmPrinter::EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym)
> const {
> @@ -311,8 +315,11 @@ void AsmPrinter::EmitGlobalVariable(cons
>    // sections and expected to be contiguous (e.g. ObjC metadata).
>    unsigned AlignLog = getGVAlignmentLog2(GV, *DL);
>
> -  if (DD)
> -    DD->setSymbolSize(GVSym, Size);
> +  for (unsigned I = 0, E = Handlers.size(); I != E; ++I) {
> +    const HandlerInfo &OI = Handlers[I];
> +    NamedRegionTimer T(OI.TimerName, OI.TimerGroupName,
> TimePassesIsEnabled);
> +    OI.Handler->setSymbolSize(GVSym, Size);
> +  }
>
>    // Handle common and BSS local symbols (.lcomm).
>    if (GVKind.isCommon() || GVKind.isBSSLocal()) {
> @@ -482,13 +489,10 @@ void AsmPrinter::EmitFunctionHeader() {
>    }
>
>    // Emit pre-function debug and/or EH information.
> -  if (DE) {
> -    NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled);
> -    DE->beginFunction(MF);
> -  }
> -  if (DD) {
> -    NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
> -    DD->beginFunction(MF);
> +  for (unsigned I = 0, E = Handlers.size(); I != E; ++I) {
> +    const HandlerInfo &OI = Handlers[I];
> +    NamedRegionTimer T(OI.TimerName, OI.TimerGroupName,
> TimePassesIsEnabled);
> +    OI.Handler->beginFunction(MF);
>    }
>
>    // Emit the prefix data.
> @@ -693,7 +697,7 @@ void AsmPrinter::EmitFunctionBody() {
>    // Emit target-specific gunk before the function body.
>    EmitFunctionBodyStart();
>
> -  bool ShouldPrintDebugScopes = DD && MMI->hasDebugInfo();
> +  bool ShouldPrintDebugScopes = MMI->hasDebugInfo();
>
>    // Print out code for the function.
>    bool HasAnyRealCode = false;
> @@ -714,8 +718,12 @@ void AsmPrinter::EmitFunctionBody() {
>        }
>
>        if (ShouldPrintDebugScopes) {
> -        NamedRegionTimer T(DbgTimerName, DWARFGroupName,
> TimePassesIsEnabled);
> -        DD->beginInstruction(II);
> +        for (unsigned III = 0, EEE = Handlers.size(); III != EEE; ++III) {
> +          const HandlerInfo &OI = Handlers[III];
> +          NamedRegionTimer T(OI.TimerName, OI.TimerGroupName,
> +                             TimePassesIsEnabled);
> +          OI.Handler->beginInstruction(II);
> +        }
>        }
>
>        if (isVerbose())
> @@ -754,8 +762,12 @@ void AsmPrinter::EmitFunctionBody() {
>        }
>
>        if (ShouldPrintDebugScopes) {
> -        NamedRegionTimer T(DbgTimerName, DWARFGroupName,
> TimePassesIsEnabled);
> -        DD->endInstruction(II);
> +        for (unsigned III = 0, EEE = Handlers.size(); III != EEE; ++III) {
> +          const HandlerInfo &OI = Handlers[III];
> +          NamedRegionTimer T(OI.TimerName, OI.TimerGroupName,
> +                             TimePassesIsEnabled);
> +          OI.Handler->endInstruction();
> +        }
>        }
>      }
>    }
> @@ -811,14 +823,11 @@ void AsmPrinter::EmitFunctionBody() {
>      OutStreamer.EmitELFSize(CurrentFnSym, SizeExp);
>    }
>
> -  // Emit post-function debug information.
> -  if (DD) {
> -    NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
> -    DD->endFunction(MF);
> -  }
> -  if (DE) {
> -    NamedRegionTimer T(EHTimerName, DWARFGroupName, TimePassesIsEnabled);
> -    DE->endFunction();
> +  // Emit post-function debug and/or EH information.
> +  for (unsigned I = 0, E = Handlers.size(); I != E; ++I) {
> +    const HandlerInfo &OI = Handlers[I];
> +    NamedRegionTimer T(OI.TimerName, OI.TimerGroupName,
> TimePassesIsEnabled);
> +    OI.Handler->endFunction(MF);
>    }
>    MMI->EndFunction();
>
> @@ -907,20 +916,15 @@ bool AsmPrinter::doFinalization(Module &
>    OutStreamer.Flush();
>
>    // Finalize debug and EH information.
> -  if (DE) {
> -    {
> -      NamedRegionTimer T(EHTimerName, DWARFGroupName,
> TimePassesIsEnabled);
> -      DE->endModule();
> -    }
> -    delete DE; DE = 0;
> -  }
> -  if (DD) {
> -    {
> -      NamedRegionTimer T(DbgTimerName, DWARFGroupName,
> TimePassesIsEnabled);
> -      DD->endModule();
> -    }
> -    delete DD; DD = 0;
> +  for (unsigned I = 0, E = Handlers.size(); I != E; ++I) {
> +    const HandlerInfo &OI = Handlers[I];
> +    NamedRegionTimer T(OI.TimerName, OI.TimerGroupName,
> +                       TimePassesIsEnabled);
> +    OI.Handler->endModule();
> +    delete OI.Handler;
>    }
> +  Handlers.clear();
> +  DD = 0;
>
>    // If the target wants to know about weak references, print them all.
>    if (MAI->getWeakRefDirective()) {
>
> Added: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterHandler.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterHandler.h?rev=196288&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterHandler.h (added)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterHandler.h Tue Dec  3
> 09:10:23 2013
> @@ -0,0 +1,56 @@
> +//===-- lib/CodeGen/AsmPrinter/AsmPrinterHandler.h -------------*- C++
> -*--===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file contains a generic interface for AsmPrinter handlers,
> +// like debug and EH info emitters.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef CODEGEN_ASMPRINTER_ASMPRINTERHANDLER_H__
> +#define CODEGEN_ASMPRINTER_ASMPRINTERHANDLER_H__
> +
> +#include "llvm/Support/DataTypes.h"
> +
> +namespace llvm {
> +
> +class MachineFunction;
> +class MachineInstr;
> +class MCSymbol;
> +
> +/// \brief Collects and handles AsmPrinter objects required to build debug
> +/// or EH information.
> +class AsmPrinterHandler {
> +public:
> +  virtual ~AsmPrinterHandler() {}
> +
> +  /// \brief For symbols that have a size designated (e.g. common
> symbols),
> +  /// this tracks that size.
> +  virtual void setSymbolSize(const MCSymbol *Sym, uint64_t Size) = 0;
> +
> +  /// \brief Emit all sections that should come after the content.
> +  virtual void endModule() = 0;
> +
> +  /// \brief Gather pre-function debug information.
> +  /// Every beginFunction(MF) call should be followed by an
> endFunction(MF) call.
> +  virtual void beginFunction(const MachineFunction *MF) = 0;
> +
> +  /// \brief Gather post-function debug information.
> +  /// Please note that some AsmPrinter implementationss may not call
> +  /// beginFunction at all.
> +  virtual void endFunction(const MachineFunction *MF) = 0;
> +
> +  /// \brief Process beginning of an instruction.
> +  virtual void beginInstruction(const MachineInstr *MI) = 0;
> +
> +  /// \brief Process end of an instruction.
> +  virtual void endInstruction() = 0;
> +};
> +} // End of namespace llvm
> +
> +#endif
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Tue Dec  3 09:10:23 2013
> @@ -390,7 +390,9 @@ unsigned DIEEntry::getRefAddrSize(AsmPri
>    // specified to be four bytes in the DWARF 32-bit format and eight bytes
>    // in the DWARF 64-bit format, while DWARF Version 2 specifies that such
>    // references have the same size as an address on the target system.
> -  if (AP->getDwarfDebug()->getDwarfVersion() == 2)
> +  const DwarfDebug *DD = AP->getDwarfDebug();
> +  assert(DD && "Expected Dwarf Debug info to be available");
> +  if (DD->getDwarfVersion() == 2)
>      return AP->getDataLayout().getPointerSize();
>    return sizeof(int32_t);
>  }
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp Tue Dec  3
> 09:10:23 2013
> @@ -137,7 +137,7 @@ void DwarfCFIException::beginFunction(co
>
>  /// endFunction - Gather and emit post-function exception information.
>  ///
> -void DwarfCFIException::endFunction() {
> +void DwarfCFIException::endFunction(const MachineFunction *) {
>    if (!shouldEmitPersonality && !shouldEmitMoves)
>      return;
>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Dec  3 09:10:23
> 2013
> @@ -197,6 +197,7 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Mo
>    DwarfAddrSectionSym = 0;
>    DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0;
>    FunctionBeginSym = FunctionEndSym = 0;
> +  CurFn = 0; CurMI = 0;
>
>    // Turn on accelerator tables for Darwin by default, pubnames by
>    // default for non-Darwin, and handle split dwarf.
> @@ -1144,6 +1145,8 @@ void DwarfDebug::endSections() {
>
>  // Emit all Dwarf sections that should come after the content.
>  void DwarfDebug::endModule() {
> +  assert(CurFn == 0);
> +  assert(CurMI == 0);
>
>    if (!FirstCU)
>      return;
> @@ -1225,8 +1228,7 @@ DbgVariable *DwarfDebug::findAbstractVar
>  }
>
>  // If Var is a current function argument then add it to
> CurrentFnArguments list.
> -bool DwarfDebug::addCurrentFnArgument(const MachineFunction *MF,
> -                                      DbgVariable *Var, LexicalScope
> *Scope) {
> +bool DwarfDebug::addCurrentFnArgument(DbgVariable *Var, LexicalScope
> *Scope) {
>    if (!LScopes.isCurrentFunctionScope(Scope))
>      return false;
>    DIVariable DV = Var->getVariable();
> @@ -1238,7 +1240,7 @@ bool DwarfDebug::addCurrentFnArgument(co
>
>    size_t Size = CurrentFnArguments.size();
>    if (Size == 0)
> -    CurrentFnArguments.resize(MF->getFunction()->arg_size());
> +    CurrentFnArguments.resize(CurFn->getFunction()->arg_size());
>    // llvm::Function argument size is not good indicator of how many
>    // arguments does the function have at source level.
>    if (ArgNo > Size)
> @@ -1249,7 +1251,7 @@ bool DwarfDebug::addCurrentFnArgument(co
>
>  // Collect variable information from side table maintained by MMI.
>  void DwarfDebug::collectVariableInfoFromMMITable(
> -    const MachineFunction *MF, SmallPtrSet<const MDNode *, 16>
> &Processed) {
> +    SmallPtrSet<const MDNode *, 16> &Processed) {
>    MachineModuleInfo::VariableDbgInfoMapTy &VMap =
> MMI->getVariableDbgInfo();
>    for (MachineModuleInfo::VariableDbgInfoMapTy::iterator VI =
> VMap.begin(),
>                                                           VE = VMap.end();
> @@ -1270,7 +1272,7 @@ void DwarfDebug::collectVariableInfoFrom
>      DbgVariable *AbsDbgVariable = findAbstractVariable(DV, VP.second);
>      DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
>      RegVar->setFrameIndex(VP.first);
> -    if (!addCurrentFnArgument(MF, RegVar, Scope))
> +    if (!addCurrentFnArgument(RegVar, Scope))
>        addScopeVariable(Scope, RegVar);
>      if (AbsDbgVariable)
>        AbsDbgVariable->setFrameIndex(VP.first);
> @@ -1317,11 +1319,10 @@ static DotDebugLocEntry getDebugLocEntry
>
>  // Find variables for each lexical scope.
>  void
> -DwarfDebug::collectVariableInfo(const MachineFunction *MF,
> -                                SmallPtrSet<const MDNode *, 16>
> &Processed) {
> +DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16>
> &Processed) {
>
>    // Grab the variable info that was squirreled away in the MMI
> side-table.
> -  collectVariableInfoFromMMITable(MF, Processed);
> +  collectVariableInfoFromMMITable(Processed);
>
>    for (SmallVectorImpl<const MDNode *>::const_iterator
>             UVI = UserVariables.begin(),
> @@ -1341,7 +1342,7 @@ DwarfDebug::collectVariableInfo(const Ma
>      DIVariable DV(Var);
>      LexicalScope *Scope = NULL;
>      if (DV.getTag() == dwarf::DW_TAG_arg_variable &&
> -        DISubprogram(DV.getContext()).describes(MF->getFunction()))
> +        DISubprogram(DV.getContext()).describes(CurFn->getFunction()))
>        Scope = LScopes.getCurrentFunctionScope();
>      else if (MDNode *IA = DV.getInlinedAt())
>        Scope = LScopes.findInlinedScope(DebugLoc::getFromDILocation(IA));
> @@ -1355,7 +1356,7 @@ DwarfDebug::collectVariableInfo(const Ma
>      assert(MInsn->isDebugValue() && "History must begin with debug
> value");
>      DbgVariable *AbsVar = findAbstractVariable(DV, MInsn->getDebugLoc());
>      DbgVariable *RegVar = new DbgVariable(DV, AbsVar, this);
> -    if (!addCurrentFnArgument(MF, RegVar, Scope))
> +    if (!addCurrentFnArgument(RegVar, Scope))
>        addScopeVariable(Scope, RegVar);
>      if (AbsVar)
>        AbsVar->setMInsn(MInsn);
> @@ -1437,6 +1438,8 @@ MCSymbol *DwarfDebug::getLabelAfterInsn(
>
>  // Process beginning of an instruction.
>  void DwarfDebug::beginInstruction(const MachineInstr *MI) {
> +  assert(CurMI == 0);
> +  CurMI = MI;
>    // Check if source location changes, but ignore DBG_VALUE locations.
>    if (!MI->isDebugValue()) {
>      DebugLoc DL = MI->getDebugLoc();
> @@ -1478,14 +1481,16 @@ void DwarfDebug::beginInstruction(const
>  }
>
>  // Process end of an instruction.
> -void DwarfDebug::endInstruction(const MachineInstr *MI) {
> +void DwarfDebug::endInstruction() {
> +  assert(CurMI != 0);
>    // Don't create a new label after DBG_VALUE instructions.
>    // They don't generate code.
> -  if (!MI->isDebugValue())
> +  if (!CurMI->isDebugValue())
>      PrevLabel = 0;
>
>    DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
> -      LabelsAfterInsn.find(MI);
> +      LabelsAfterInsn.find(CurMI);
> +  CurMI = 0;
>
>    // No label needed.
>    if (I == LabelsAfterInsn.end())
> @@ -1565,6 +1570,7 @@ static DebugLoc getFnDebugLoc(DebugLoc D
>  // Gather pre-function debug information.  Assumes being called
> immediately
>  // after the function entry point has been emitted.
>  void DwarfDebug::beginFunction(const MachineFunction *MF) {
> +  CurFn = MF;
>
>    // If there's no debug info for the function we're not going to do
> anything.
>    if (!MMI->hasDebugInfo())
> @@ -1792,8 +1798,19 @@ void DwarfDebug::addScopeVariable(Lexica
>
>  // Gather and emit post-function debug information.
>  void DwarfDebug::endFunction(const MachineFunction *MF) {
> -  if (!MMI->hasDebugInfo() || LScopes.empty())
> +  // Every beginFunction(MF) call should be followed by an
> endFunction(MF) call,
> +  // though the beginFunction may not be called at all.
> +  // We should handle both cases.
> +  if (CurFn == 0)
> +    CurFn = MF;
> +  else
> +    assert(CurFn == MF);
> +  assert(CurFn != 0);
> +
> +  if (!MMI->hasDebugInfo() || LScopes.empty()) {
> +    CurFn = 0;
>      return;
> +  }
>
>    // Define end label for subprogram.
>    FunctionEndSym = Asm->GetTempSymbol("func_end",
> Asm->getFunctionNumber());
> @@ -1803,7 +1820,7 @@ void DwarfDebug::endFunction(const Machi
>    Asm->OutStreamer.getContext().setDwarfCompileUnitID(0);
>
>    SmallPtrSet<const MDNode *, 16> ProcessedVars;
> -  collectVariableInfo(MF, ProcessedVars);
> +  collectVariableInfo(ProcessedVars);
>
>    LexicalScope *FnScope = LScopes.getCurrentFunctionScope();
>    CompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode());
> @@ -1837,7 +1854,7 @@ void DwarfDebug::endFunction(const Machi
>
>    DIE *CurFnDIE = constructScopeDIE(TheCU, FnScope);
>
> -  if (!MF->getTarget().Options.DisableFramePointerElim(*MF))
> +  if (!CurFn->getTarget().Options.DisableFramePointerElim(*CurFn))
>      TheCU->addFlag(CurFnDIE, dwarf::DW_AT_APPLE_omit_frame_ptr);
>
>    // Clear debug info
> @@ -1853,6 +1870,7 @@ void DwarfDebug::endFunction(const Machi
>    LabelsBeforeInsn.clear();
>    LabelsAfterInsn.clear();
>    PrevLabel = NULL;
> +  CurFn = 0;
>  }
>
>  // Register a source line with debug info. Returns the  unique label that
> was
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Dec  3 09:10:23 2013
> @@ -14,6 +14,7 @@
>  #ifndef CODEGEN_ASMPRINTER_DWARFDEBUG_H__
>  #define CODEGEN_ASMPRINTER_DWARFDEBUG_H__
>
> +#include "AsmPrinterHandler.h"
>  #include "DIE.h"
>  #include "llvm/ADT/DenseMap.h"
>  #include "llvm/ADT/FoldingSet.h"
> @@ -316,7 +317,7 @@ struct SymbolCU {
>  };
>
>  /// \brief Collects and handles dwarf debug information.
> -class DwarfDebug {
> +class DwarfDebug : public AsmPrinterHandler {
>    // Target of Dwarf emission.
>    AsmPrinter *Asm;
>
> @@ -418,6 +419,12 @@ class DwarfDebug {
>    // body.
>    DebugLoc PrologEndLoc;
>
> +  // If nonnull, stores the current machine function we're processing.
> +  const MachineFunction *CurFn;
> +
> +  // If nonnull, stores the current machine instruction we're processing.
> +  const MachineInstr *CurMI;
> +
>    // Section Symbols: these are assembler temporary labels that are
> emitted at
>    // the beginning of each supported dwarf section.  These are used to
> form
>    // section offsets and are created by EmitSectionLabels.
> @@ -648,17 +655,14 @@ class DwarfDebug {
>
>    /// \brief If Var is an current function argument that add it in
>    /// CurrentFnArguments list.
> -  bool addCurrentFnArgument(const MachineFunction *MF,
> -                            DbgVariable *Var, LexicalScope *Scope);
> +  bool addCurrentFnArgument(DbgVariable *Var, LexicalScope *Scope);
>
>    /// \brief Populate LexicalScope entries with variables' info.
> -  void collectVariableInfo(const MachineFunction *,
> -                           SmallPtrSet<const MDNode *, 16>
> &ProcessedVars);
> +  void collectVariableInfo(SmallPtrSet<const MDNode *, 16>
> &ProcessedVars);
>
>    /// \brief Collect variable information from the side table maintained
>    /// by MMI.
> -  void collectVariableInfoFromMMITable(const MachineFunction * MF,
> -                                       SmallPtrSet<const MDNode *, 16>
> &P);
> +  void collectVariableInfoFromMMITable(SmallPtrSet<const MDNode *, 16>
> &P);
>
>    /// \brief Ensure that a label will be emitted before MI.
>    void requestLabelBeforeInsn(const MachineInstr *MI) {
> @@ -706,7 +710,7 @@ public:
>    void beginInstruction(const MachineInstr *MI);
>
>    /// \brief Process end of an instruction.
> -  void endInstruction(const MachineInstr *MI);
> +  void endInstruction();
>
>    /// \brief Add a DIE to the set of types that we're going to pull into
>    /// type units.
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.cpp Tue Dec  3
> 09:10:23 2013
> @@ -730,7 +730,6 @@ void DwarfException::beginFunction(const
>  }
>
>  /// endFunction - Gather and emit post-function exception information.
> -///
> -void DwarfException::endFunction() {
> +void DwarfException::endFunction(const MachineFunction *) {
>    llvm_unreachable("Should be implemented");
>  }
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfException.h Tue Dec  3 09:10:23
> 2013
> @@ -14,6 +14,7 @@
>  #ifndef LLVM_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
>  #define LLVM_CODEGEN_ASMPRINTER_DWARFEXCEPTION_H
>
> +#include "AsmPrinterHandler.h"
>  #include "llvm/ADT/DenseMap.h"
>  #include "llvm/CodeGen/AsmPrinter.h"
>  #include <vector>
> @@ -35,7 +36,7 @@ class AsmPrinter;
>
>  //===----------------------------------------------------------------------===//
>  /// DwarfException - Emits Dwarf exception handling directives.
>  ///
> -class DwarfException {
> +class DwarfException : public AsmPrinterHandler {
>  protected:
>    /// Asm - Target of Dwarf emission.
>    AsmPrinter *Asm;
> @@ -139,7 +140,12 @@ public:
>    virtual void beginFunction(const MachineFunction *MF);
>
>    /// endFunction - Gather and emit post-function exception information.
> -  virtual void endFunction();
> +  virtual void endFunction(const MachineFunction *);
> +
> +  // We don't need these.
> +  virtual void setSymbolSize(const MCSymbol *Sym, uint64_t Size) {}
> +  virtual void beginInstruction(const MachineInstr *MI) {}
> +  virtual void endInstruction() {}
>  };
>
>  class DwarfCFIException : public DwarfException {
> @@ -173,7 +179,7 @@ public:
>    virtual void beginFunction(const MachineFunction *MF);
>
>    /// endFunction - Gather and emit post-function exception information.
> -  virtual void endFunction();
> +  virtual void endFunction(const MachineFunction *);
>  };
>
>  class ARMException : public DwarfException {
> @@ -196,7 +202,7 @@ public:
>    virtual void beginFunction(const MachineFunction *MF);
>
>    /// endFunction - Gather and emit post-function exception information.
> -  virtual void endFunction();
> +  virtual void endFunction(const MachineFunction *);
>  };
>
>  class Win64Exception : public DwarfException {
> @@ -228,7 +234,7 @@ public:
>    virtual void beginFunction(const MachineFunction *MF);
>
>    /// endFunction - Gather and emit post-function exception information.
> -  virtual void endFunction();
> +  virtual void endFunction(const MachineFunction *);
>  };
>
>  } // End of namespace llvm
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp?rev=196288&r1=196287&r2=196288&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp Tue Dec  3
> 09:10:23 2013
> @@ -88,7 +88,7 @@ void Win64Exception::beginFunction(const
>
>  /// endFunction - Gather and emit post-function exception information.
>  ///
> -void Win64Exception::endFunction() {
> +void Win64Exception::endFunction(const MachineFunction *) {
>    if (!shouldEmitPersonality && !shouldEmitMoves)
>      return;
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131203/8e77cb03/attachment.html>
-------------- next part --------------
Index: lib/CodeGen/AsmPrinter/AsmPrinterHandler.h
===================================================================
--- lib/CodeGen/AsmPrinter/AsmPrinterHandler.h	(revision 196270)
+++ lib/CodeGen/AsmPrinter/AsmPrinterHandler.h	(working copy)
@@ -37,10 +37,13 @@
   virtual void endModule() = 0;
 
   /// \brief Gather pre-function debug information.
+  /// Every beginFunction(MF) call should be followed by an endFunction(MF) call.
   virtual void beginFunction(const MachineFunction *MF) = 0;
 
   /// \brief Gather post-function debug information.
-  virtual void endFunction() = 0;
+  /// Please note that some AsmPrinter implementationss may not call
+  /// beginFunction at all.
+  virtual void endFunction(const MachineFunction *MF) = 0;
 
   /// \brief Process beginning of an instruction.
   virtual void beginInstruction(const MachineInstr *MI) = 0;
Index: lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/DwarfCFIException.cpp	(revision 196270)
+++ lib/CodeGen/AsmPrinter/DwarfCFIException.cpp	(working copy)
@@ -137,7 +137,7 @@
 
 /// endFunction - Gather and emit post-function exception information.
 ///
-void DwarfCFIException::endFunction() {
+void DwarfCFIException::endFunction(const MachineFunction *) {
   if (!shouldEmitPersonality && !shouldEmitMoves)
     return;
 
Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/DwarfDebug.cpp	(revision 196270)
+++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp	(working copy)
@@ -1146,6 +1146,7 @@
 // Emit all Dwarf sections that should come after the content.
 void DwarfDebug::endModule() {
   assert(CurFn == 0);
+  assert(CurMI == 0);
 
   if (!FirstCU)
     return;
@@ -1796,7 +1797,14 @@
 }
 
 // Gather and emit post-function debug information.
-void DwarfDebug::endFunction() {
+void DwarfDebug::endFunction(const MachineFunction *MF) {
+  // Every beginFunction(MF) call should be followed by an endFunction(MF) call,
+  // though the beginFunction may not be called at all.
+  // We should handle both cases.
+  if (CurFn == 0)
+    CurFn = MF;
+  else
+    assert(CurFn == MF);
   assert(CurFn != 0);
 
   if (!MMI->hasDebugInfo() || LScopes.empty()) {
Index: lib/CodeGen/AsmPrinter/DwarfDebug.h
===================================================================
--- lib/CodeGen/AsmPrinter/DwarfDebug.h	(revision 196270)
+++ lib/CodeGen/AsmPrinter/DwarfDebug.h	(working copy)
@@ -704,7 +704,7 @@
   void beginFunction(const MachineFunction *MF);
 
   /// \brief Gather and emit post-function debug information.
-  void endFunction();
+  void endFunction(const MachineFunction *MF);
 
   /// \brief Process beginning of an instruction.
   void beginInstruction(const MachineInstr *MI);
Index: lib/CodeGen/AsmPrinter/DwarfException.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/DwarfException.cpp	(revision 196270)
+++ lib/CodeGen/AsmPrinter/DwarfException.cpp	(working copy)
@@ -730,7 +730,6 @@
 }
 
 /// endFunction - Gather and emit post-function exception information.
-///
-void DwarfException::endFunction() {
+void DwarfException::endFunction(const MachineFunction *) {
   llvm_unreachable("Should be implemented");
 }
Index: lib/CodeGen/AsmPrinter/AsmPrinter.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/AsmPrinter.cpp	(revision 196270)
+++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp	(working copy)
@@ -827,7 +827,7 @@
   for (unsigned I = 0, E = Handlers.size(); I != E; ++I) {
     const HandlerInfo &OI = Handlers[I];
     NamedRegionTimer T(OI.TimerName, OI.TimerGroupName, TimePassesIsEnabled);
-    OI.Handler->endFunction();
+    OI.Handler->endFunction(MF);
   }
   MMI->EndFunction();
 
Index: lib/CodeGen/AsmPrinter/Win64Exception.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/Win64Exception.cpp	(revision 196270)
+++ lib/CodeGen/AsmPrinter/Win64Exception.cpp	(working copy)
@@ -88,7 +88,7 @@
 
 /// endFunction - Gather and emit post-function exception information.
 ///
-void Win64Exception::endFunction() {
+void Win64Exception::endFunction(const MachineFunction *) {
   if (!shouldEmitPersonality && !shouldEmitMoves)
     return;
 
Index: lib/CodeGen/AsmPrinter/DwarfException.h
===================================================================
--- lib/CodeGen/AsmPrinter/DwarfException.h	(revision 196270)
+++ lib/CodeGen/AsmPrinter/DwarfException.h	(working copy)
@@ -140,7 +140,7 @@
   virtual void beginFunction(const MachineFunction *MF);
 
   /// endFunction - Gather and emit post-function exception information.
-  virtual void endFunction();
+  virtual void endFunction(const MachineFunction *);
 
   // We don't need these.
   virtual void setSymbolSize(const MCSymbol *Sym, uint64_t Size) {}
@@ -179,7 +179,7 @@
   virtual void beginFunction(const MachineFunction *MF);
 
   /// endFunction - Gather and emit post-function exception information.
-  virtual void endFunction();
+  virtual void endFunction(const MachineFunction *);
 };
 
 class ARMException : public DwarfException {
@@ -202,7 +202,7 @@
   virtual void beginFunction(const MachineFunction *MF);
 
   /// endFunction - Gather and emit post-function exception information.
-  virtual void endFunction();
+  virtual void endFunction(const MachineFunction *);
 };
 
 class Win64Exception : public DwarfException {
@@ -234,7 +234,7 @@
   virtual void beginFunction(const MachineFunction *MF);
 
   /// endFunction - Gather and emit post-function exception information.
-  virtual void endFunction();
+  virtual void endFunction(const MachineFunction *);
 };
 
 } // End of namespace llvm
Index: lib/CodeGen/AsmPrinter/ARMException.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/ARMException.cpp	(revision 196270)
+++ lib/CodeGen/AsmPrinter/ARMException.cpp	(working copy)
@@ -66,7 +66,7 @@
 
 /// endFunction - Gather and emit post-function exception information.
 ///
-void ARMException::endFunction() {
+void ARMException::endFunction(const MachineFunction *) {
   ARMTargetStreamer &ATS = getTargetStreamer();
   if (!Asm->MF->getFunction()->needsUnwindTableEntry())
     ATS.emitCantUnwind();


More information about the llvm-commits mailing list