7ca9443594b2948ecdf60ce0398f8811005aac9b
[opencl/llvm.git] / lib / CodeGen / AsmPrinter / DebugLocEntry.h
1 //===-- llvm/CodeGen/DebugLocEntry.h - Entry in debug_loc list -*- C++ -*--===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
10 #ifndef CODEGEN_ASMPRINTER_DEBUGLOCENTRY_H__
11 #define CODEGEN_ASMPRINTER_DEBUGLOCENTRY_H__
12 #include "llvm/IR/Constants.h"
13 #include "llvm/MC/MachineLocation.h"
14 #include "llvm/MC/MCSymbol.h"
16 namespace llvm {
17 class DwarfCompileUnit;
18 class MDNode;
19 /// \brief This struct describes location entries emitted in the .debug_loc
20 /// section.
21 class DebugLocEntry {
22   // Begin and end symbols for the address range that this location is valid.
23   const MCSymbol *Begin;
24   const MCSymbol *End;
26   // Type of entry that this represents.
27   enum EntryType { E_Location, E_Integer, E_ConstantFP, E_ConstantInt };
28   enum EntryType EntryKind;
30   union {
31     int64_t Int;
32     const ConstantFP *CFP;
33     const ConstantInt *CIP;
34   } Constants;
36   // The location in the machine frame.
37   MachineLocation Loc;
39   // The variable to which this location entry corresponds.
40   const MDNode *Variable;
42   // The compile unit to which this location entry is referenced by.
43   const DwarfCompileUnit *Unit;
45   bool hasSameValueOrLocation(const DebugLocEntry &Next) {
46     if (EntryKind != Next.EntryKind)
47       return false;
49     bool EqualValues;
50     switch (EntryKind) {
51     case E_Location:
52       EqualValues = Loc == Next.Loc;
53       break;
54     case E_Integer:
55       EqualValues = Constants.Int == Next.Constants.Int;
56       break;
57     case E_ConstantFP:
58       EqualValues = Constants.CFP == Next.Constants.CFP;
59       break;
60     case E_ConstantInt:
61       EqualValues = Constants.CIP == Next.Constants.CIP;
62       break;
63     }
65     return EqualValues;
66   }
68 public:
69   DebugLocEntry() : Begin(0), End(0), Variable(0), Unit(0) {
70     Constants.Int = 0;
71   }
72   DebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L,
73                 const MDNode *V, const DwarfCompileUnit *U)
74       : Begin(B), End(E), Loc(L), Variable(V), Unit(U) {
75     Constants.Int = 0;
76     EntryKind = E_Location;
77   }
78   DebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i,
79                 const MDNode *V, const DwarfCompileUnit *U)
80       : Begin(B), End(E), Variable(V), Unit(U) {
81     Constants.Int = i;
82     EntryKind = E_Integer;
83   }
84   DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr,
85                 const MDNode *V, const DwarfCompileUnit *U)
86       : Begin(B), End(E), Variable(V), Unit(U) {
87     Constants.CFP = FPtr;
88     EntryKind = E_ConstantFP;
89   }
90   DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantInt *IPtr,
91                 const MDNode *V, const DwarfCompileUnit *U)
92       : Begin(B), End(E), Variable(V), Unit(U) {
93     Constants.CIP = IPtr;
94     EntryKind = E_ConstantInt;
95   }
97   /// \brief Attempt to merge this DebugLocEntry with Next and return
98   /// true if the merge was successful. Entries can be merged if they
99   /// share the same Loc/Constant and if Next immediately follows this
100   /// Entry.
101   bool Merge(const DebugLocEntry &Next) {
102     if (End == Next.Begin && hasSameValueOrLocation(Next)) {
103       End = Next.End;
104       return true;
105     }
106     return false;
107   }
108   bool isLocation() const { return EntryKind == E_Location; }
109   bool isInt() const { return EntryKind == E_Integer; }
110   bool isConstantFP() const { return EntryKind == E_ConstantFP; }
111   bool isConstantInt() const { return EntryKind == E_ConstantInt; }
112   int64_t getInt() const { return Constants.Int; }
113   const ConstantFP *getConstantFP() const { return Constants.CFP; }
114   const ConstantInt *getConstantInt() const { return Constants.CIP; }
115   const MDNode *getVariable() const { return Variable; }
116   const MCSymbol *getBeginSym() const { return Begin; }
117   const MCSymbol *getEndSym() const { return End; }
118   const DwarfCompileUnit *getCU() const { return Unit; }
119   MachineLocation getLoc() const { return Loc; }
120 };
123 #endif