[llvm] r205360 - DebugInfo: Split DebugLocEntry into its own file.
David Blaikie
dblaikie at gmail.com
Tue Apr 1 15:14:53 PDT 2014
On Tue, Apr 1, 2014 at 3:12 PM, Adrian Prantl <aprantl at apple.com> wrote:
>
> 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:
We early return from switches pretty regularly - I kind of prefer it
over adding extra variables and more non-linear control flow (at least
"leaving the function" is simpler than "jump to the end of the switch
and continue" maybe?)
>
> /// \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;
OK, so the fact that I completely dropped the "End = Next.End" and
didn't cause any tests to fail is... bad.
I'll see what test coverage we're missing here.
>
> 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