DebugInfo: Split DebugLocEntry into its own file.
[oota-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 //===----------------------------------------------------------------------===//
9
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"
15
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;
25
26   // Type of entry that this represents.
27   enum EntryType { E_Location, E_Integer, E_ConstantFP, E_ConstantInt };
28   enum EntryType EntryKind;
29
30   union {
31     int64_t Int;
32     const ConstantFP *CFP;
33     const ConstantInt *CIP;
34   } Constants;
35
36   // The location in the machine frame.
37   MachineLocation Loc;
38
39   // The variable to which this location entry corresponds.
40   const MDNode *Variable;
41
42   // The compile unit to which this location entry is referenced by.
43   const DwarfCompileUnit *Unit;
44
45 public:
46   DebugLocEntry() : Begin(0), End(0), Variable(0), Unit(0) {
47     Constants.Int = 0;
48   }
49   DebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L,
50                 const MDNode *V, const DwarfCompileUnit *U)
51       : Begin(B), End(E), Loc(L), Variable(V), Unit(U) {
52     Constants.Int = 0;
53     EntryKind = E_Location;
54   }
55   DebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i,
56                 const DwarfCompileUnit *U)
57       : Begin(B), End(E), Variable(0), Unit(U) {
58     Constants.Int = i;
59     EntryKind = E_Integer;
60   }
61   DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr,
62                 const DwarfCompileUnit *U)
63       : Begin(B), End(E), Variable(0), Unit(U) {
64     Constants.CFP = FPtr;
65     EntryKind = E_ConstantFP;
66   }
67   DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantInt *IPtr,
68                 const DwarfCompileUnit *U)
69       : Begin(B), End(E), Variable(0), Unit(U) {
70     Constants.CIP = IPtr;
71     EntryKind = E_ConstantInt;
72   }
73
74   /// \brief Empty entries are also used as a trigger to emit temp label. Such
75   /// labels are referenced is used to find debug_loc offset for a given DIE.
76   bool isEmpty() const { return Begin == 0 && End == 0; }
77   bool Merge(const DebugLocEntry &Next) {
78     if (End != Next.Begin)
79       return false;
80
81     if (EntryKind != Next.EntryKind)
82       return false;
83
84     switch (EntryKind) {
85     case E_Location:
86       if (Loc != Next.Loc) return false;
87     case E_Integer:
88       if (Constants.Int != Next.Constants.Int) return false;
89     case E_ConstantFP:
90       if (Constants.CFP != Next.Constants.CFP) return false;
91     case E_ConstantInt:
92       if (Constants.CIP != Next.Constants.CIP) return false;
93     }
94
95     return true;
96   }
97   bool isLocation() const { return EntryKind == E_Location; }
98   bool isInt() const { return EntryKind == E_Integer; }
99   bool isConstantFP() const { return EntryKind == E_ConstantFP; }
100   bool isConstantInt() const { return EntryKind == E_ConstantInt; }
101   int64_t getInt() const { return Constants.Int; }
102   const ConstantFP *getConstantFP() const { return Constants.CFP; }
103   const ConstantInt *getConstantInt() const { return Constants.CIP; }
104   const MDNode *getVariable() const { return Variable; }
105   const MCSymbol *getBeginSym() const { return Begin; }
106   const MCSymbol *getEndSym() const { return End; }
107   const DwarfCompileUnit *getCU() const { return Unit; }
108   MachineLocation getLoc() const { return Loc; }
109 };
110
111 }
112 #endif