[llvm] r205360 - DebugInfo: Split DebugLocEntry into its own file.
Adrian Prantl
aprantl at apple.com
Tue Apr 1 15:21:12 PDT 2014
On Apr 1, 2014, at 3:14 PM, David Blaikie <dblaikie at gmail.com> wrote:
> 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?)
>
My problem was not with the early return, but the case were the test fails and falls through, especially in the first case statement.
>>
>> /// \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