| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 1 | //===--- lib/CodeGen/DIE.h - DWARF Info Entries -----------------*- 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 | // Data structures for DWARF info entries. | 
| Eric Christopher | b800ff7 | 2013-01-07 22:40:45 +0000 | [diff] [blame] | 11 | // | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
| Bill Wendling | 2f921f8 | 2009-05-15 09:23:25 +0000 | [diff] [blame] | 14 | #ifndef CODEGEN_ASMPRINTER_DIE_H__ | 
|  | 15 | #define CODEGEN_ASMPRINTER_DIE_H__ | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 16 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 17 | #include "llvm/ADT/FoldingSet.h" | 
|  | 18 | #include "llvm/ADT/SmallVector.h" | 
|  | 19 | #include "llvm/Support/Compiler.h" | 
|  | 20 | #include "llvm/Support/Dwarf.h" | 
| Chris Lattner | 7472571 | 2009-08-23 01:01:17 +0000 | [diff] [blame] | 21 | #include <vector> | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 22 |  | 
|  | 23 | namespace llvm { | 
|  | 24 | class AsmPrinter; | 
| Chris Lattner | 06d45f6 | 2010-01-16 18:50:28 +0000 | [diff] [blame] | 25 | class MCSymbol; | 
| Chris Lattner | bc9210c | 2010-03-08 22:23:36 +0000 | [diff] [blame] | 26 | class raw_ostream; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 27 |  | 
|  | 28 | //===--------------------------------------------------------------------===// | 
|  | 29 | /// DIEAbbrevData - Dwarf abbreviation data, describes the one attribute of a | 
|  | 30 | /// Dwarf abbreviation. | 
| Nick Lewycky | a1c09d6 | 2009-11-17 09:17:08 +0000 | [diff] [blame] | 31 | class DIEAbbrevData { | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 32 | /// Attribute - Dwarf attribute code. | 
|  | 33 | /// | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 34 | uint16_t Attribute; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 35 |  | 
|  | 36 | /// Form - Dwarf form code. | 
|  | 37 | /// | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 38 | uint16_t Form; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 39 | public: | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 40 | DIEAbbrevData(uint16_t A, uint16_t F) : Attribute(A), Form(F) {} | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 41 |  | 
|  | 42 | // Accessors. | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 43 | uint16_t getAttribute() const { return Attribute; } | 
|  | 44 | uint16_t getForm()      const { return Form; } | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 45 |  | 
|  | 46 | /// Profile - Used to gather unique data for the abbreviation folding set. | 
|  | 47 | /// | 
|  | 48 | void Profile(FoldingSetNodeID &ID) const; | 
|  | 49 | }; | 
|  | 50 |  | 
|  | 51 | //===--------------------------------------------------------------------===// | 
|  | 52 | /// DIEAbbrev - Dwarf abbreviation, describes the organization of a debug | 
|  | 53 | /// information object. | 
| Nick Lewycky | a1c09d6 | 2009-11-17 09:17:08 +0000 | [diff] [blame] | 54 | class DIEAbbrev : public FoldingSetNode { | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 55 | /// Tag - Dwarf tag code. | 
|  | 56 | /// | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 57 | uint16_t Tag; | 
|  | 58 |  | 
|  | 59 | /// ChildrenFlag - Dwarf children flag. | 
|  | 60 | /// | 
|  | 61 | uint16_t ChildrenFlag; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 62 |  | 
|  | 63 | /// Unique number for node. | 
|  | 64 | /// | 
|  | 65 | unsigned Number; | 
|  | 66 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 67 | /// Data - Raw data bytes for abbreviation. | 
|  | 68 | /// | 
|  | 69 | SmallVector<DIEAbbrevData, 8> Data; | 
| Devang Patel | 1f4690c | 2009-12-15 19:16:48 +0000 | [diff] [blame] | 70 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 71 | public: | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 72 | DIEAbbrev(uint16_t T, uint16_t C) : Tag(T), ChildrenFlag(C), Data() {} | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 73 |  | 
|  | 74 | // Accessors. | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 75 | uint16_t getTag() const { return Tag; } | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 76 | unsigned getNumber() const { return Number; } | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 77 | uint16_t getChildrenFlag() const { return ChildrenFlag; } | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 78 | const SmallVector<DIEAbbrevData, 8> &getData() const { return Data; } | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 79 | void setTag(uint16_t T) { Tag = T; } | 
|  | 80 | void setChildrenFlag(uint16_t CF) { ChildrenFlag = CF; } | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 81 | void setNumber(unsigned N) { Number = N; } | 
|  | 82 |  | 
|  | 83 | /// AddAttribute - Adds another set of attribute information to the | 
|  | 84 | /// abbreviation. | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 85 | void AddAttribute(uint16_t Attribute, uint16_t Form) { | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 86 | Data.push_back(DIEAbbrevData(Attribute, Form)); | 
|  | 87 | } | 
|  | 88 |  | 
|  | 89 | /// AddFirstAttribute - Adds a set of attribute information to the front | 
|  | 90 | /// of the abbreviation. | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 91 | void AddFirstAttribute(uint16_t Attribute, uint16_t Form) { | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 92 | Data.insert(Data.begin(), DIEAbbrevData(Attribute, Form)); | 
|  | 93 | } | 
|  | 94 |  | 
|  | 95 | /// Profile - Used to gather unique data for the abbreviation folding set. | 
|  | 96 | /// | 
|  | 97 | void Profile(FoldingSetNodeID &ID) const; | 
|  | 98 |  | 
|  | 99 | /// Emit - Print the abbreviation using the specified asm printer. | 
|  | 100 | /// | 
| Chris Lattner | 3a383cb | 2010-04-05 00:13:49 +0000 | [diff] [blame] | 101 | void Emit(AsmPrinter *AP) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 102 |  | 
|  | 103 | #ifndef NDEBUG | 
| Chris Lattner | 7472571 | 2009-08-23 01:01:17 +0000 | [diff] [blame] | 104 | void print(raw_ostream &O); | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 105 | void dump(); | 
|  | 106 | #endif | 
|  | 107 | }; | 
|  | 108 |  | 
|  | 109 | //===--------------------------------------------------------------------===// | 
|  | 110 | /// DIE - A structured debug information entry.  Has an abbreviation which | 
|  | 111 | /// describes it's organization. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 112 | class DIEValue; | 
|  | 113 |  | 
| Devang Patel | 92e8c65 | 2009-11-21 00:31:03 +0000 | [diff] [blame] | 114 | class DIE { | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 115 | protected: | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 116 | /// Offset - Offset in debug info section. | 
|  | 117 | /// | 
|  | 118 | unsigned Offset; | 
|  | 119 |  | 
|  | 120 | /// Size - Size of instance + children. | 
|  | 121 | /// | 
|  | 122 | unsigned Size; | 
|  | 123 |  | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 124 | /// Abbrev - Buffer for constructing abbreviation. | 
|  | 125 | /// | 
|  | 126 | DIEAbbrev Abbrev; | 
|  | 127 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 128 | /// Children DIEs. | 
|  | 129 | /// | 
|  | 130 | std::vector<DIE *> Children; | 
|  | 131 |  | 
| Devang Patel | 1f4690c | 2009-12-15 19:16:48 +0000 | [diff] [blame] | 132 | DIE *Parent; | 
|  | 133 |  | 
| Bill Wendling | 3d7b0b8 | 2012-12-19 07:18:57 +0000 | [diff] [blame] | 134 | /// Attribute values. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 135 | /// | 
|  | 136 | SmallVector<DIEValue*, 32> Values; | 
|  | 137 |  | 
| Owen Anderson | 19c4b66 | 2009-06-24 23:13:56 +0000 | [diff] [blame] | 138 | // Private data for print() | 
|  | 139 | mutable unsigned IndentCount; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 140 | public: | 
|  | 141 | explicit DIE(unsigned Tag) | 
| Benjamin Kramer | 8aefffc | 2012-01-24 12:08:28 +0000 | [diff] [blame] | 142 | : Offset(0), Size(0), Abbrev(Tag, dwarf::DW_CHILDREN_no), Parent(0), | 
|  | 143 | IndentCount(0) {} | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 144 | virtual ~DIE(); | 
|  | 145 |  | 
|  | 146 | // Accessors. | 
|  | 147 | DIEAbbrev &getAbbrev() { return Abbrev; } | 
|  | 148 | unsigned getAbbrevNumber() const { return Abbrev.getNumber(); } | 
|  | 149 | unsigned getTag() const { return Abbrev.getTag(); } | 
|  | 150 | unsigned getOffset() const { return Offset; } | 
|  | 151 | unsigned getSize() const { return Size; } | 
|  | 152 | const std::vector<DIE *> &getChildren() const { return Children; } | 
| Jeffrey Yasskin | 54ebc98 | 2010-03-22 18:47:14 +0000 | [diff] [blame] | 153 | const SmallVector<DIEValue*, 32> &getValues() const { return Values; } | 
| Devang Patel | 1f4690c | 2009-12-15 19:16:48 +0000 | [diff] [blame] | 154 | DIE *getParent() const { return Parent; } | 
| Manman Ren | 14a029d | 2013-03-12 18:27:15 +0000 | [diff] [blame] | 155 | /// Climb up the parent chain to get the compile unit DIE this DIE belongs | 
|  | 156 | /// to. | 
|  | 157 | DIE *getCompileUnit() const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 158 | void setTag(unsigned Tag) { Abbrev.setTag(Tag); } | 
|  | 159 | void setOffset(unsigned O) { Offset = O; } | 
|  | 160 | void setSize(unsigned S) { Size = S; } | 
| Eric Christopher | b800ff7 | 2013-01-07 22:40:45 +0000 | [diff] [blame] | 161 |  | 
| Devang Patel | 930143b | 2009-11-21 02:48:08 +0000 | [diff] [blame] | 162 | /// addValue - Add a value and attributes to a DIE. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 163 | /// | 
| Devang Patel | 930143b | 2009-11-21 02:48:08 +0000 | [diff] [blame] | 164 | void addValue(unsigned Attribute, unsigned Form, DIEValue *Value) { | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 165 | Abbrev.AddAttribute(Attribute, Form); | 
|  | 166 | Values.push_back(Value); | 
|  | 167 | } | 
|  | 168 |  | 
| Devang Patel | 930143b | 2009-11-21 02:48:08 +0000 | [diff] [blame] | 169 | /// addChild - Add a child to the DIE. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 170 | /// | 
| Devang Patel | 930143b | 2009-11-21 02:48:08 +0000 | [diff] [blame] | 171 | void addChild(DIE *Child) { | 
| Devang Patel | 1f4690c | 2009-12-15 19:16:48 +0000 | [diff] [blame] | 172 | if (Child->getParent()) { | 
|  | 173 | assert (Child->getParent() == this && "Unexpected DIE Parent!"); | 
|  | 174 | return; | 
|  | 175 | } | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 176 | Abbrev.setChildrenFlag(dwarf::DW_CHILDREN_yes); | 
|  | 177 | Children.push_back(Child); | 
| Jeffrey Yasskin | 35b4e4f | 2010-03-12 17:45:06 +0000 | [diff] [blame] | 178 | Child->Parent = this; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 179 | } | 
|  | 180 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 181 | #ifndef NDEBUG | 
| Chris Lattner | 7472571 | 2009-08-23 01:01:17 +0000 | [diff] [blame] | 182 | void print(raw_ostream &O, unsigned IncIndent = 0); | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 183 | void dump(); | 
|  | 184 | #endif | 
|  | 185 | }; | 
|  | 186 |  | 
|  | 187 | //===--------------------------------------------------------------------===// | 
|  | 188 | /// DIEValue - A debug information entry value. | 
|  | 189 | /// | 
| Devang Patel | 92e8c65 | 2009-11-21 00:31:03 +0000 | [diff] [blame] | 190 | class DIEValue { | 
| David Blaikie | a379b181 | 2011-12-20 02:50:00 +0000 | [diff] [blame] | 191 | virtual void anchor(); | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 192 | public: | 
|  | 193 | enum { | 
|  | 194 | isInteger, | 
|  | 195 | isString, | 
|  | 196 | isLabel, | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 197 | isDelta, | 
|  | 198 | isEntry, | 
|  | 199 | isBlock | 
|  | 200 | }; | 
|  | 201 | protected: | 
|  | 202 | /// Type - Type of data stored in the value. | 
|  | 203 | /// | 
|  | 204 | unsigned Type; | 
|  | 205 | public: | 
|  | 206 | explicit DIEValue(unsigned T) : Type(T) {} | 
|  | 207 | virtual ~DIEValue() {} | 
|  | 208 |  | 
|  | 209 | // Accessors | 
|  | 210 | unsigned getType()  const { return Type; } | 
|  | 211 |  | 
|  | 212 | /// EmitValue - Emit value via the Dwarf writer. | 
|  | 213 | /// | 
| Chris Lattner | 3a383cb | 2010-04-05 00:13:49 +0000 | [diff] [blame] | 214 | virtual void EmitValue(AsmPrinter *AP, unsigned Form) const = 0; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 215 |  | 
|  | 216 | /// SizeOf - Return the size of a value in bytes. | 
|  | 217 | /// | 
| Chris Lattner | 5a00dea | 2010-04-05 00:18:22 +0000 | [diff] [blame] | 218 | virtual unsigned SizeOf(AsmPrinter *AP, unsigned Form) const = 0; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 219 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 220 | #ifndef NDEBUG | 
| Chris Lattner | 7472571 | 2009-08-23 01:01:17 +0000 | [diff] [blame] | 221 | virtual void print(raw_ostream &O) = 0; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 222 | void dump(); | 
|  | 223 | #endif | 
|  | 224 | }; | 
|  | 225 |  | 
|  | 226 | //===--------------------------------------------------------------------===// | 
|  | 227 | /// DIEInteger - An integer value DIE. | 
|  | 228 | /// | 
| Nick Lewycky | a1c09d6 | 2009-11-17 09:17:08 +0000 | [diff] [blame] | 229 | class DIEInteger : public DIEValue { | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 230 | uint64_t Integer; | 
|  | 231 | public: | 
|  | 232 | explicit DIEInteger(uint64_t I) : DIEValue(isInteger), Integer(I) {} | 
|  | 233 |  | 
|  | 234 | /// BestForm - Choose the best form for integer. | 
|  | 235 | /// | 
|  | 236 | static unsigned BestForm(bool IsSigned, uint64_t Int) { | 
|  | 237 | if (IsSigned) { | 
| Hans Wennborg | 7504cef | 2013-03-18 17:03:05 +0000 | [diff] [blame^] | 238 | const int64_t SignedInt = Int; | 
|  | 239 | if ((char)Int == SignedInt)     return dwarf::DW_FORM_data1; | 
|  | 240 | if ((short)Int == SignedInt)    return dwarf::DW_FORM_data2; | 
|  | 241 | if ((int)Int == SignedInt)      return dwarf::DW_FORM_data4; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 242 | } else { | 
|  | 243 | if ((unsigned char)Int == Int)  return dwarf::DW_FORM_data1; | 
|  | 244 | if ((unsigned short)Int == Int) return dwarf::DW_FORM_data2; | 
|  | 245 | if ((unsigned int)Int == Int)   return dwarf::DW_FORM_data4; | 
|  | 246 | } | 
|  | 247 | return dwarf::DW_FORM_data8; | 
|  | 248 | } | 
|  | 249 |  | 
|  | 250 | /// EmitValue - Emit integer of appropriate size. | 
|  | 251 | /// | 
| Chris Lattner | 3a383cb | 2010-04-05 00:13:49 +0000 | [diff] [blame] | 252 | virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 253 |  | 
| Devang Patel | 12563b3 | 2010-04-16 23:33:45 +0000 | [diff] [blame] | 254 | uint64_t getValue() const { return Integer; } | 
|  | 255 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 256 | /// SizeOf - Determine size of integer value in bytes. | 
|  | 257 | /// | 
| Chris Lattner | 5a00dea | 2010-04-05 00:18:22 +0000 | [diff] [blame] | 258 | virtual unsigned SizeOf(AsmPrinter *AP, unsigned Form) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 259 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 260 | // Implement isa/cast/dyncast. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 261 | static bool classof(const DIEValue *I) { return I->getType() == isInteger; } | 
|  | 262 |  | 
|  | 263 | #ifndef NDEBUG | 
| Chris Lattner | 7472571 | 2009-08-23 01:01:17 +0000 | [diff] [blame] | 264 | virtual void print(raw_ostream &O); | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 265 | #endif | 
|  | 266 | }; | 
|  | 267 |  | 
|  | 268 | //===--------------------------------------------------------------------===// | 
| Chris Lattner | 8dcf41e | 2010-03-08 22:31:46 +0000 | [diff] [blame] | 269 | /// DIELabel - A label expression DIE. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 270 | // | 
| Chris Lattner | 8dcf41e | 2010-03-08 22:31:46 +0000 | [diff] [blame] | 271 | class DIELabel : public DIEValue { | 
| Chris Lattner | bc9210c | 2010-03-08 22:23:36 +0000 | [diff] [blame] | 272 | const MCSymbol *Label; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 273 | public: | 
| Chris Lattner | 8dcf41e | 2010-03-08 22:31:46 +0000 | [diff] [blame] | 274 | explicit DIELabel(const MCSymbol *L) : DIEValue(isLabel), Label(L) {} | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 275 |  | 
|  | 276 | /// EmitValue - Emit label value. | 
|  | 277 | /// | 
| Chris Lattner | 3a383cb | 2010-04-05 00:13:49 +0000 | [diff] [blame] | 278 | virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 279 |  | 
| Devang Patel | 9fc1170 | 2010-05-25 23:40:22 +0000 | [diff] [blame] | 280 | /// getValue - Get MCSymbol. | 
|  | 281 | /// | 
|  | 282 | const MCSymbol *getValue()       const { return Label; } | 
|  | 283 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 284 | /// SizeOf - Determine size of label value in bytes. | 
|  | 285 | /// | 
| Chris Lattner | 5a00dea | 2010-04-05 00:18:22 +0000 | [diff] [blame] | 286 | virtual unsigned SizeOf(AsmPrinter *AP, unsigned Form) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 287 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 288 | // Implement isa/cast/dyncast. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 289 | static bool classof(const DIEValue *L) { return L->getType() == isLabel; } | 
|  | 290 |  | 
|  | 291 | #ifndef NDEBUG | 
| Chris Lattner | 7472571 | 2009-08-23 01:01:17 +0000 | [diff] [blame] | 292 | virtual void print(raw_ostream &O); | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 293 | #endif | 
|  | 294 | }; | 
|  | 295 |  | 
|  | 296 | //===--------------------------------------------------------------------===// | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 297 | /// DIEDelta - A simple label difference DIE. | 
|  | 298 | /// | 
| Nick Lewycky | a1c09d6 | 2009-11-17 09:17:08 +0000 | [diff] [blame] | 299 | class DIEDelta : public DIEValue { | 
| Chris Lattner | bc9210c | 2010-03-08 22:23:36 +0000 | [diff] [blame] | 300 | const MCSymbol *LabelHi; | 
|  | 301 | const MCSymbol *LabelLo; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 302 | public: | 
| Chris Lattner | bc9210c | 2010-03-08 22:23:36 +0000 | [diff] [blame] | 303 | DIEDelta(const MCSymbol *Hi, const MCSymbol *Lo) | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 304 | : DIEValue(isDelta), LabelHi(Hi), LabelLo(Lo) {} | 
|  | 305 |  | 
|  | 306 | /// EmitValue - Emit delta value. | 
|  | 307 | /// | 
| Chris Lattner | 3a383cb | 2010-04-05 00:13:49 +0000 | [diff] [blame] | 308 | virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 309 |  | 
|  | 310 | /// SizeOf - Determine size of delta value in bytes. | 
|  | 311 | /// | 
| Chris Lattner | 5a00dea | 2010-04-05 00:18:22 +0000 | [diff] [blame] | 312 | virtual unsigned SizeOf(AsmPrinter *AP, unsigned Form) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 313 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 314 | // Implement isa/cast/dyncast. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 315 | static bool classof(const DIEValue *D) { return D->getType() == isDelta; } | 
|  | 316 |  | 
|  | 317 | #ifndef NDEBUG | 
| Chris Lattner | 7472571 | 2009-08-23 01:01:17 +0000 | [diff] [blame] | 318 | virtual void print(raw_ostream &O); | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 319 | #endif | 
|  | 320 | }; | 
|  | 321 |  | 
|  | 322 | //===--------------------------------------------------------------------===// | 
| Nick Lewycky | 5ca33ac | 2011-10-18 22:39:43 +0000 | [diff] [blame] | 323 | /// DIEEntry - A pointer to another debug information entry.  An instance of | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 324 | /// this class can also be used as a proxy for a debug information entry not | 
|  | 325 | /// yet defined (ie. types.) | 
| Nick Lewycky | a1c09d6 | 2009-11-17 09:17:08 +0000 | [diff] [blame] | 326 | class DIEEntry : public DIEValue { | 
| Jeffrey Yasskin | 35b4e4f | 2010-03-12 17:45:06 +0000 | [diff] [blame] | 327 | DIE *const Entry; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 328 | public: | 
|  | 329 | explicit DIEEntry(DIE *E) : DIEValue(isEntry), Entry(E) {} | 
|  | 330 |  | 
|  | 331 | DIE *getEntry() const { return Entry; } | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 332 |  | 
|  | 333 | /// EmitValue - Emit debug information entry offset. | 
|  | 334 | /// | 
| Chris Lattner | 3a383cb | 2010-04-05 00:13:49 +0000 | [diff] [blame] | 335 | virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 336 |  | 
|  | 337 | /// SizeOf - Determine size of debug information entry in bytes. | 
|  | 338 | /// | 
| Chris Lattner | 5a00dea | 2010-04-05 00:18:22 +0000 | [diff] [blame] | 339 | virtual unsigned SizeOf(AsmPrinter *AP, unsigned Form) const { | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 340 | return sizeof(int32_t); | 
|  | 341 | } | 
|  | 342 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 343 | // Implement isa/cast/dyncast. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 344 | static bool classof(const DIEValue *E) { return E->getType() == isEntry; } | 
|  | 345 |  | 
|  | 346 | #ifndef NDEBUG | 
| Chris Lattner | 7472571 | 2009-08-23 01:01:17 +0000 | [diff] [blame] | 347 | virtual void print(raw_ostream &O); | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 348 | #endif | 
|  | 349 | }; | 
|  | 350 |  | 
|  | 351 | //===--------------------------------------------------------------------===// | 
|  | 352 | /// DIEBlock - A block of values.  Primarily used for location expressions. | 
|  | 353 | // | 
| Nick Lewycky | a1c09d6 | 2009-11-17 09:17:08 +0000 | [diff] [blame] | 354 | class DIEBlock : public DIEValue, public DIE { | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 355 | unsigned Size;                // Size in bytes excluding size header. | 
|  | 356 | public: | 
|  | 357 | DIEBlock() | 
|  | 358 | : DIEValue(isBlock), DIE(0), Size(0) {} | 
|  | 359 | virtual ~DIEBlock() {} | 
|  | 360 |  | 
|  | 361 | /// ComputeSize - calculate the size of the block. | 
|  | 362 | /// | 
| Chris Lattner | 5a00dea | 2010-04-05 00:18:22 +0000 | [diff] [blame] | 363 | unsigned ComputeSize(AsmPrinter *AP); | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 364 |  | 
|  | 365 | /// BestForm - Choose the best form for data. | 
|  | 366 | /// | 
|  | 367 | unsigned BestForm() const { | 
|  | 368 | if ((unsigned char)Size == Size)  return dwarf::DW_FORM_block1; | 
|  | 369 | if ((unsigned short)Size == Size) return dwarf::DW_FORM_block2; | 
|  | 370 | if ((unsigned int)Size == Size)   return dwarf::DW_FORM_block4; | 
|  | 371 | return dwarf::DW_FORM_block; | 
|  | 372 | } | 
|  | 373 |  | 
|  | 374 | /// EmitValue - Emit block data. | 
|  | 375 | /// | 
| Chris Lattner | 3a383cb | 2010-04-05 00:13:49 +0000 | [diff] [blame] | 376 | virtual void EmitValue(AsmPrinter *AP, unsigned Form) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 377 |  | 
|  | 378 | /// SizeOf - Determine size of block data in bytes. | 
|  | 379 | /// | 
| Chris Lattner | 5a00dea | 2010-04-05 00:18:22 +0000 | [diff] [blame] | 380 | virtual unsigned SizeOf(AsmPrinter *AP, unsigned Form) const; | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 381 |  | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 382 | // Implement isa/cast/dyncast. | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 383 | static bool classof(const DIEValue *E) { return E->getType() == isBlock; } | 
|  | 384 |  | 
|  | 385 | #ifndef NDEBUG | 
| Chris Lattner | 7472571 | 2009-08-23 01:01:17 +0000 | [diff] [blame] | 386 | virtual void print(raw_ostream &O); | 
| Bill Wendling | 47054f3 | 2009-05-15 00:11:17 +0000 | [diff] [blame] | 387 | #endif | 
|  | 388 | }; | 
|  | 389 |  | 
|  | 390 | } // end llvm namespace | 
|  | 391 |  | 
|  | 392 | #endif |