[llvm] r205360 - DebugInfo: Split DebugLocEntry into its own file.
David Blaikie
dblaikie at gmail.com
Tue Apr 1 15:31:54 PDT 2014
On Tue, Apr 1, 2014 at 3:21 PM, Adrian Prantl <aprantl at apple.com> wrote:
>
> 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.
Oh, right! Thanks!
Fixed in r205367
>
>>>
>>> /// \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