[llvm] r205360 - DebugInfo: Split DebugLocEntry into its own file.

Adrian Prantl aprantl at apple.com
Tue Apr 1 15:12:03 PDT 2014


On Apr 1, 2014, at 2:49 PM, David Blaikie <dblaikie at gmail.com> wrote:

> Author: dblaikie
> Date: Tue Apr  1 16:49:04 2014
> New Revision: 205360
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=205360&view=rev
> Log:
> DebugInfo: Split DebugLocEntry into its own file.
> 
> It seems big enough that it deserves its own file - but it is header
> only, so there's no need for another cpp file, etc.
> 
> Added:
>    llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h
> Modified:
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> 
> Added: llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h?rev=205360&view=auto
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h (added)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocEntry.h Tue Apr  1 16:49:04 2014
> @@ -0,0 +1,112 @@
> +//===-- llvm/CodeGen/DebugLocEntry.h - Entry in debug_loc list -*- C++ -*--===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef CODEGEN_ASMPRINTER_DEBUGLOCENTRY_H__
> +#define CODEGEN_ASMPRINTER_DEBUGLOCENTRY_H__
> +#include "llvm/IR/Constants.h"
> +#include "llvm/MC/MachineLocation.h"
> +#include "llvm/MC/MCSymbol.h"
> +
> +namespace llvm {
> +class DwarfCompileUnit;
> +class MDNode;
> +/// \brief This struct describes location entries emitted in the .debug_loc
> +/// section.
> +class DebugLocEntry {
> +  // Begin and end symbols for the address range that this location is valid.
> +  const MCSymbol *Begin;
> +  const MCSymbol *End;
> +
> +  // Type of entry that this represents.
> +  enum EntryType { E_Location, E_Integer, E_ConstantFP, E_ConstantInt };
> +  enum EntryType EntryKind;
> +
> +  union {
> +    int64_t Int;
> +    const ConstantFP *CFP;
> +    const ConstantInt *CIP;
> +  } Constants;
> +
> +  // The location in the machine frame.
> +  MachineLocation Loc;
> +
> +  // The variable to which this location entry corresponds.
> +  const MDNode *Variable;
> +
> +  // The compile unit to which this location entry is referenced by.
> +  const DwarfCompileUnit *Unit;
> +
> +public:
> +  DebugLocEntry() : Begin(0), End(0), Variable(0), Unit(0) {
> +    Constants.Int = 0;
> +  }
> +  DebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L,
> +                const MDNode *V, const DwarfCompileUnit *U)
> +      : Begin(B), End(E), Loc(L), Variable(V), Unit(U) {
> +    Constants.Int = 0;
> +    EntryKind = E_Location;
> +  }
> +  DebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i,
> +                const DwarfCompileUnit *U)
> +      : Begin(B), End(E), Variable(0), Unit(U) {
> +    Constants.Int = i;
> +    EntryKind = E_Integer;
> +  }
> +  DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr,
> +                const DwarfCompileUnit *U)
> +      : Begin(B), End(E), Variable(0), Unit(U) {
> +    Constants.CFP = FPtr;
> +    EntryKind = E_ConstantFP;
> +  }
> +  DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantInt *IPtr,
> +                const DwarfCompileUnit *U)
> +      : Begin(B), End(E), Variable(0), Unit(U) {
> +    Constants.CIP = IPtr;
> +    EntryKind = E_ConstantInt;
> +  }
> +
> +  /// \brief Empty entries are also used as a trigger to emit temp label. Such
> +  /// labels are referenced is used to find debug_loc offset for a given DIE.
> +  bool isEmpty() const { return Begin == 0 && End == 0; }
> +  bool Merge(const DebugLocEntry &Next) {
> +    if (End != Next.Begin)
> +      return false;
> +
> +    if (EntryKind != Next.EntryKind)
> +      return false;
> +
> +    switch (EntryKind) {
> +    case E_Location:
> +      if (Loc != Next.Loc) return false;
> +    case E_Integer:
> +      if (Constants.Int != Next.Constants.Int) return false;
> +    case E_ConstantFP:
> +      if (Constants.CFP != Next.Constants.CFP) return false;
> +    case E_ConstantInt:
> +      if (Constants.CIP != Next.Constants.CIP) return false;
> +    }
> +
> +    return true;
> +  }


I know this is a union, but this still feels wrong without a break.. What about:

  /// \brief Attempt to merge this DebugLocEntry with Next and return
  /// true if the merge was successful. Entries can be merged if they
  /// share the same Loc/Constant and their ranges are adjacent.
  bool Merge(const DebugLocEntry &Next) {
    if (!Begin || End != Next.Begin)
      return false;
    if (EntryKind != Next.EntryKind)
      return false;
    bool CanMerge;
    switch (EntryKind) {
    case E_Location:    CanMerge =           Loc == Next.Loc;           break;
    case E_Integer:     CanMerge = Constants.Int == Next.Constants.Int; break;
    case E_ConstantFP:  CanMerge = Constants.CFP == Next.Constants.CFP; break;
    case E_ConstantInt: CanMerge = Constants.CIP == Next.Constants.CIP; break;
    }
    // Merge the entries by adjusting End.
    if (CanMerge)
      End = Next.End;

    return CanMerge;

> +  bool isLocation() const { return EntryKind == E_Location; }
> +  bool isInt() const { return EntryKind == E_Integer; }
> +  bool isConstantFP() const { return EntryKind == E_ConstantFP; }
> +  bool isConstantInt() const { return EntryKind == E_ConstantInt; }
> +  int64_t getInt() const { return Constants.Int; }
> +  const ConstantFP *getConstantFP() const { return Constants.CFP; }
> +  const ConstantInt *getConstantInt() const { return Constants.CIP; }
> +  const MDNode *getVariable() const { return Variable; }
> +  const MCSymbol *getBeginSym() const { return Begin; }
> +  const MCSymbol *getEndSym() const { return End; }
> +  const DwarfCompileUnit *getCU() const { return Unit; }
> +  MachineLocation getLoc() const { return Loc; }
> +};
> +
> +}
> +#endif
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=205360&r1=205359&r2=205360&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Apr  1 16:49:04 2014
> @@ -16,6 +16,7 @@
> 
> #include "AsmPrinterHandler.h"
> #include "DIE.h"
> +#include "DebugLocEntry.h"
> #include "llvm/ADT/DenseMap.h"
> #include "llvm/ADT/MapVector.h"
> #include "llvm/ADT/SmallPtrSet.h"
> @@ -58,91 +59,6 @@ public:
>   MCSymbol *getLabel() const { return Label; }
> };
> 
> -/// \brief This struct describes location entries emitted in the .debug_loc
> -/// section.
> -class DebugLocEntry {
> -  // Begin and end symbols for the address range that this location is valid.
> -  const MCSymbol *Begin;
> -  const MCSymbol *End;
> -
> -  // Type of entry that this represents.
> -  enum EntryType { E_Location, E_Integer, E_ConstantFP, E_ConstantInt };
> -  enum EntryType EntryKind;
> -
> -  union {
> -    int64_t Int;
> -    const ConstantFP *CFP;
> -    const ConstantInt *CIP;
> -  } Constants;
> -
> -  // The location in the machine frame.
> -  MachineLocation Loc;
> -
> -  // The variable to which this location entry corresponds.
> -  const MDNode *Variable;
> -
> -  // The compile unit to which this location entry is referenced by.
> -  const DwarfCompileUnit *Unit;
> -
> -public:
> -  DebugLocEntry() : Begin(0), End(0), Variable(0), Unit(0) {
> -    Constants.Int = 0;
> -  }
> -  DebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L,
> -                const MDNode *V, const DwarfCompileUnit *U)
> -      : Begin(B), End(E), Loc(L), Variable(V), Unit(U) {
> -    Constants.Int = 0;
> -    EntryKind = E_Location;
> -  }
> -  DebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i,
> -                const DwarfCompileUnit *U)
> -      : Begin(B), End(E), Variable(0), Unit(U) {
> -    Constants.Int = i;
> -    EntryKind = E_Integer;
> -  }
> -  DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr,
> -                const DwarfCompileUnit *U)
> -      : Begin(B), End(E), Variable(0), Unit(U) {
> -    Constants.CFP = FPtr;
> -    EntryKind = E_ConstantFP;
> -  }
> -  DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantInt *IPtr,
> -                const DwarfCompileUnit *U)
> -      : Begin(B), End(E), Variable(0), Unit(U) {
> -    Constants.CIP = IPtr;
> -    EntryKind = E_ConstantInt;
> -  }
> -
> -  /// \brief Empty entries are also used as a trigger to emit temp label. Such
> -  /// labels are referenced is used to find debug_loc offset for a given DIE.
> -  bool isEmpty() const { return Begin == 0 && End == 0; }
> -  bool Merge(const DebugLocEntry &Next) {
> -    if (Begin &&
> -	Loc == Next.Loc &&
> -	EntryKind == Next.EntryKind &&
> -	(!isInt() || getInt() == Next.getInt()) &&
> -	(!isConstantInt() || getConstantInt() == Next.getConstantInt()) &&
> -	(!isConstantFP() || getConstantFP() == Next.getConstantFP()) &&
> -	End == Next.Begin) {
> -    End = Next.End;
> -    return true;
> -  }
> -  return false;
> -  }
> -  bool isLocation() const { return EntryKind == E_Location; }
> -  bool isInt() const { return EntryKind == E_Integer; }
> -  bool isConstantFP() const { return EntryKind == E_ConstantFP; }
> -  bool isConstantInt() const { return EntryKind == E_ConstantInt; }
> -  int64_t getInt() const { return Constants.Int; }
> -  const ConstantFP *getConstantFP() const { return Constants.CFP; }
> -  const ConstantInt *getConstantInt() const { return Constants.CIP; }
> -  const MDNode *getVariable() const { return Variable; }
> -  const MCSymbol *getBeginSym() const { return Begin; }
> -  const MCSymbol *getEndSym() const { return End; }
> -  const DwarfCompileUnit *getCU() const { return Unit; }
> -  MachineLocation getLoc() const { return Loc; }
> -};
> -
> //===----------------------------------------------------------------------===//
> /// \brief This class is used to track local variable information.
> class DbgVariable {
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list