LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DIE.h
Go to the documentation of this file.
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.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef CODEGEN_ASMPRINTER_DIE_H__
15 #define CODEGEN_ASMPRINTER_DIE_H__
16 
17 #include "llvm/ADT/FoldingSet.h"
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/Support/Compiler.h"
20 #include "llvm/Support/Dwarf.h"
21 #include "llvm/MC/MCExpr.h"
22 #include <vector>
23 
24 namespace llvm {
25  class AsmPrinter;
26  class MCSymbol;
27  class MCSymbolRefExpr;
28  class raw_ostream;
29 
30  //===--------------------------------------------------------------------===//
31  /// DIEAbbrevData - Dwarf abbreviation data, describes one attribute of a
32  /// Dwarf abbreviation.
33  class DIEAbbrevData {
34  /// Attribute - Dwarf attribute code.
35  ///
36  dwarf::Attribute Attribute;
37 
38  /// Form - Dwarf form code.
39  ///
40  dwarf::Form Form;
41  public:
42  DIEAbbrevData(dwarf::Attribute A, dwarf::Form F) : Attribute(A), Form(F) {}
43 
44  // Accessors.
45  dwarf::Attribute getAttribute() const { return Attribute; }
46  dwarf::Form getForm() const { return Form; }
47 
48  /// Profile - Used to gather unique data for the abbreviation folding set.
49  ///
50  void Profile(FoldingSetNodeID &ID) const;
51  };
52 
53  //===--------------------------------------------------------------------===//
54  /// DIEAbbrev - Dwarf abbreviation, describes the organization of a debug
55  /// information object.
56  class DIEAbbrev : public FoldingSetNode {
57  /// Tag - Dwarf tag code.
58  ///
59  dwarf::Tag Tag;
60 
61  /// ChildrenFlag - Dwarf children flag.
62  ///
63  uint16_t ChildrenFlag;
64 
65  /// Unique number for node.
66  ///
67  unsigned Number;
68 
69  /// Data - Raw data bytes for abbreviation.
70  ///
72 
73  public:
74  DIEAbbrev(dwarf::Tag T, uint16_t C) : Tag(T), ChildrenFlag(C), Data() {}
75 
76  // Accessors.
77  dwarf::Tag getTag() const { return Tag; }
78  unsigned getNumber() const { return Number; }
79  uint16_t getChildrenFlag() const { return ChildrenFlag; }
80  const SmallVectorImpl<DIEAbbrevData> &getData() const { return Data; }
81  void setChildrenFlag(uint16_t CF) { ChildrenFlag = CF; }
82  void setNumber(unsigned N) { Number = N; }
83 
84  /// AddAttribute - Adds another set of attribute information to the
85  /// abbreviation.
86  void AddAttribute(dwarf::Attribute Attribute, dwarf::Form Form) {
87  Data.push_back(DIEAbbrevData(Attribute, Form));
88  }
89 
90  /// Profile - Used to gather unique data for the abbreviation folding set.
91  ///
92  void Profile(FoldingSetNodeID &ID) const;
93 
94  /// Emit - Print the abbreviation using the specified asm printer.
95  ///
96  void Emit(AsmPrinter *AP) const;
97 
98 #ifndef NDEBUG
99  void print(raw_ostream &O);
100  void dump();
101 #endif
102  };
103 
104  //===--------------------------------------------------------------------===//
105  /// DIE - A structured debug information entry. Has an abbreviation which
106  /// describes its organization.
107  class DIEValue;
108 
109  class DIE {
110  protected:
111  /// Offset - Offset in debug info section.
112  ///
113  unsigned Offset;
114 
115  /// Size - Size of instance + children.
116  ///
117  unsigned Size;
118 
119  /// Abbrev - Buffer for constructing abbreviation.
120  ///
122 
123  /// Children DIEs.
124  ///
125  std::vector<DIE *> Children;
126 
128 
129  /// Attribute values.
130  ///
132 
133  public:
134  explicit DIE(unsigned Tag)
135  : Offset(0), Size(0), Abbrev((dwarf::Tag)Tag, dwarf::DW_CHILDREN_no),
136  Parent(0) {}
137  virtual ~DIE();
138 
139  // Accessors.
140  DIEAbbrev &getAbbrev() { return Abbrev; }
141  const DIEAbbrev &getAbbrev() const { return Abbrev; }
142  unsigned getAbbrevNumber() const { return Abbrev.getNumber(); }
143  dwarf::Tag getTag() const { return Abbrev.getTag(); }
144  unsigned getOffset() const { return Offset; }
145  unsigned getSize() const { return Size; }
146  const std::vector<DIE *> &getChildren() const { return Children; }
147  const SmallVectorImpl<DIEValue*> &getValues() const { return Values; }
148  DIE *getParent() const { return Parent; }
149  /// Climb up the parent chain to get the compile unit DIE this DIE belongs
150  /// to.
151  const DIE *getCompileUnit() const;
152  /// Similar to getCompileUnit, returns null when DIE is not added to an
153  /// owner yet.
154  const DIE *getCompileUnitOrNull() const;
155  void setOffset(unsigned O) { Offset = O; }
156  void setSize(unsigned S) { Size = S; }
157 
158  /// addValue - Add a value and attributes to a DIE.
159  ///
160  void addValue(dwarf::Attribute Attribute, dwarf::Form Form,
161  DIEValue *Value) {
162  Abbrev.AddAttribute(Attribute, Form);
163  Values.push_back(Value);
164  }
165 
166  /// addChild - Add a child to the DIE.
167  ///
168  void addChild(DIE *Child) {
169  assert(!Child->getParent());
171  Children.push_back(Child);
172  Child->Parent = this;
173  }
174 
175  /// findAttribute - Find a value in the DIE with the attribute given, returns NULL
176  /// if no such attribute exists.
177  DIEValue *findAttribute(uint16_t Attribute);
178 
179 #ifndef NDEBUG
180  void print(raw_ostream &O, unsigned IndentCount = 0) const;
181  void dump();
182 #endif
183  };
184 
185  //===--------------------------------------------------------------------===//
186  /// DIEValue - A debug information entry value.
187  ///
188  class DIEValue {
189  virtual void anchor();
190  public:
191  enum {
199  };
200  protected:
201  /// Type - Type of data stored in the value.
202  ///
203  unsigned Type;
204  public:
205  explicit DIEValue(unsigned T) : Type(T) {}
206  virtual ~DIEValue() {}
207 
208  // Accessors
209  unsigned getType() const { return Type; }
210 
211  /// EmitValue - Emit value via the Dwarf writer.
212  ///
213  virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const = 0;
214 
215  /// SizeOf - Return the size of a value in bytes.
216  ///
217  virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const = 0;
218 
219 #ifndef NDEBUG
220  virtual void print(raw_ostream &O) const = 0;
221  void dump() const;
222 #endif
223  };
224 
225  //===--------------------------------------------------------------------===//
226  /// DIEInteger - An integer value DIE.
227  ///
228  class DIEInteger : public DIEValue {
229  uint64_t Integer;
230  public:
231  explicit DIEInteger(uint64_t I) : DIEValue(isInteger), Integer(I) {}
232 
233  /// BestForm - Choose the best form for integer.
234  ///
235  static dwarf::Form BestForm(bool IsSigned, uint64_t Int) {
236  if (IsSigned) {
237  const int64_t SignedInt = Int;
238  if ((char)Int == SignedInt) return dwarf::DW_FORM_data1;
239  if ((short)Int == SignedInt) return dwarf::DW_FORM_data2;
240  if ((int)Int == SignedInt) return dwarf::DW_FORM_data4;
241  } else {
242  if ((unsigned char)Int == Int) return dwarf::DW_FORM_data1;
243  if ((unsigned short)Int == Int) return dwarf::DW_FORM_data2;
244  if ((unsigned int)Int == Int) return dwarf::DW_FORM_data4;
245  }
246  return dwarf::DW_FORM_data8;
247  }
248 
249  /// EmitValue - Emit integer of appropriate size.
250  ///
251  virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
252 
253  uint64_t getValue() const { return Integer; }
254 
255  /// SizeOf - Determine size of integer value in bytes.
256  ///
257  virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
258 
259  // Implement isa/cast/dyncast.
260  static bool classof(const DIEValue *I) { return I->getType() == isInteger; }
261 
262 #ifndef NDEBUG
263  virtual void print(raw_ostream &O) const;
264 #endif
265  };
266 
267  //===--------------------------------------------------------------------===//
268  /// DIEExpr - An expression DIE.
269  //
270  class DIEExpr : public DIEValue {
271  const MCExpr *Expr;
272  public:
273  explicit DIEExpr(const MCExpr *E) : DIEValue(isExpr), Expr(E) {}
274 
275  /// EmitValue - Emit expression value.
276  ///
277  virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
278 
279  /// getValue - Get MCExpr.
280  ///
281  const MCExpr *getValue() const { return Expr; }
282 
283  /// SizeOf - Determine size of expression value in bytes.
284  ///
285  virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
286 
287  // Implement isa/cast/dyncast.
288  static bool classof(const DIEValue *E) { return E->getType() == isExpr; }
289 
290 #ifndef NDEBUG
291  virtual void print(raw_ostream &O) const;
292 #endif
293  };
294 
295  //===--------------------------------------------------------------------===//
296  /// DIELabel - A label DIE.
297  //
298  class DIELabel : public DIEValue {
299  const MCSymbol *Label;
300  public:
301  explicit DIELabel(const MCSymbol *L) : DIEValue(isLabel), Label(L) {}
302 
303  /// EmitValue - Emit label value.
304  ///
305  virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
306 
307  /// getValue - Get MCSymbol.
308  ///
309  const MCSymbol *getValue() const { return Label; }
310 
311  /// SizeOf - Determine size of label value in bytes.
312  ///
313  virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
314 
315  // Implement isa/cast/dyncast.
316  static bool classof(const DIEValue *L) { return L->getType() == isLabel; }
317 
318 #ifndef NDEBUG
319  virtual void print(raw_ostream &O) const;
320 #endif
321  };
322 
323  //===--------------------------------------------------------------------===//
324  /// DIEDelta - A simple label difference DIE.
325  ///
326  class DIEDelta : public DIEValue {
327  const MCSymbol *LabelHi;
328  const MCSymbol *LabelLo;
329  public:
330  DIEDelta(const MCSymbol *Hi, const MCSymbol *Lo)
331  : DIEValue(isDelta), LabelHi(Hi), LabelLo(Lo) {}
332 
333  /// EmitValue - Emit delta value.
334  ///
335  virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
336 
337  /// SizeOf - Determine size of delta value in bytes.
338  ///
339  virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
340 
341  // Implement isa/cast/dyncast.
342  static bool classof(const DIEValue *D) { return D->getType() == isDelta; }
343 
344 #ifndef NDEBUG
345  virtual void print(raw_ostream &O) const;
346 #endif
347  };
348 
349  //===--------------------------------------------------------------------===//
350  /// DIEString - A container for string values.
351  ///
352  class DIEString : public DIEValue {
353  const DIEValue *Access;
354  const StringRef Str;
355 
356  public:
357  DIEString(const DIEValue *Acc, const StringRef S)
358  : DIEValue(isString), Access(Acc), Str(S) {}
359 
360  /// getString - Grab the string out of the object.
361  StringRef getString() const { return Str; }
362 
363  /// EmitValue - Emit delta value.
364  ///
365  virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
366 
367  /// SizeOf - Determine size of delta value in bytes.
368  ///
369  virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
370 
371  // Implement isa/cast/dyncast.
372  static bool classof(const DIEValue *D) { return D->getType() == isString; }
373 
374  #ifndef NDEBUG
375  virtual void print(raw_ostream &O) const;
376  #endif
377  };
378 
379  //===--------------------------------------------------------------------===//
380  /// DIEEntry - A pointer to another debug information entry. An instance of
381  /// this class can also be used as a proxy for a debug information entry not
382  /// yet defined (ie. types.)
383  class DIEEntry : public DIEValue {
384  DIE *const Entry;
385  public:
386  explicit DIEEntry(DIE *E) : DIEValue(isEntry), Entry(E) {
387  assert(E && "Cannot construct a DIEEntry with a null DIE");
388  }
389 
390  DIE *getEntry() const { return Entry; }
391 
392  /// EmitValue - Emit debug information entry offset.
393  ///
394  virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
395 
396  /// SizeOf - Determine size of debug information entry in bytes.
397  ///
398  virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
399  return Form == dwarf::DW_FORM_ref_addr ? getRefAddrSize(AP)
400  : sizeof(int32_t);
401  }
402 
403  /// Returns size of a ref_addr entry.
404  static unsigned getRefAddrSize(AsmPrinter *AP);
405 
406  // Implement isa/cast/dyncast.
407  static bool classof(const DIEValue *E) { return E->getType() == isEntry; }
408 
409 #ifndef NDEBUG
410  virtual void print(raw_ostream &O) const;
411 #endif
412  };
413 
414  //===--------------------------------------------------------------------===//
415  /// DIEBlock - A block of values. Primarily used for location expressions.
416  //
417  class DIEBlock : public DIEValue, public DIE {
418  unsigned Size; // Size in bytes excluding size header.
419  public:
420  DIEBlock() : DIEValue(isBlock), DIE(0), Size(0) {}
421 
422  /// ComputeSize - calculate the size of the block.
423  ///
424  unsigned ComputeSize(AsmPrinter *AP);
425 
426  /// BestForm - Choose the best form for data.
427  ///
428  dwarf::Form BestForm() const {
429  if ((unsigned char)Size == Size) return dwarf::DW_FORM_block1;
430  if ((unsigned short)Size == Size) return dwarf::DW_FORM_block2;
431  if ((unsigned int)Size == Size) return dwarf::DW_FORM_block4;
432  return dwarf::DW_FORM_block;
433  }
434 
435  /// EmitValue - Emit block data.
436  ///
437  virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const;
438 
439  /// SizeOf - Determine size of block data in bytes.
440  ///
441  virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const;
442 
443  // Implement isa/cast/dyncast.
444  static bool classof(const DIEValue *E) { return E->getType() == isBlock; }
445 
446 #ifndef NDEBUG
447  virtual void print(raw_ostream &O) const;
448 #endif
449  };
450 
451 } // end llvm namespace
452 
453 #endif
std::vector< DIE * > Children
Definition: DIE.h:125
virtual ~DIE()
Definition: DIE.cpp:110
void setSize(unsigned S)
Definition: DIE.h:156
unsigned Type
Definition: DIE.h:203
static bool classof(const DIEValue *I)
Definition: DIE.h:260
static bool classof(const DIEValue *D)
Definition: DIE.h:372
DIELabel(const MCSymbol *L)
Definition: DIE.h:301
virtual void print(raw_ostream &O) const
Definition: DIE.cpp:293
virtual void print(raw_ostream &O) const
Definition: DIE.cpp:322
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:339
DIEValue * findAttribute(uint16_t Attribute)
Definition: DIE.cpp:135
F(f)
const DIE * getCompileUnitOrNull() const
Definition: DIE.cpp:125
void AddAttribute(dwarf::Attribute Attribute, dwarf::Form Form)
Definition: DIE.h:86
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:363
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:418
void print(raw_ostream &O, unsigned IndentCount=0) const
Definition: DIE.cpp:148
void Profile(FoldingSetNodeID &ID) const
Definition: DIE.cpp:49
static bool classof(const DIEValue *D)
Definition: DIE.h:342
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:357
DIEDelta(const MCSymbol *Hi, const MCSymbol *Lo)
Definition: DIE.h:330
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.h:398
dwarf::Form getForm() const
Definition: DIE.h:46
void dump() const
Definition: DIE.cpp:201
unsigned Offset
Definition: DIE.h:113
void dump()
Definition: DIE.cpp:193
ID
LLVM Calling Convention Representation.
Definition: CallingConv.h:26
static bool classof(const DIEValue *E)
Definition: DIE.h:444
void addValue(dwarf::Attribute Attribute, dwarf::Form Form, DIEValue *Value)
Definition: DIE.h:160
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:279
void setNumber(unsigned N)
Definition: DIE.h:82
DIE * getEntry() const
Definition: DIE.h:390
const MCSymbol * getValue() const
Definition: DIE.h:309
virtual void print(raw_ostream &O) const
Definition: DIE.cpp:445
DIEValue(unsigned T)
Definition: DIE.h:205
DIEAbbrev & getAbbrev()
Definition: DIE.h:140
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:380
unsigned Size
Definition: DIE.h:117
const DIEAbbrev & getAbbrev() const
Definition: DIE.h:141
dwarf::Tag getTag() const
Definition: DIE.h:143
DIEEntry(DIE *E)
Definition: DIE.h:386
unsigned getAbbrevNumber() const
Definition: DIE.h:142
Definition: DIE.h:109
static dwarf::Form BestForm(bool IsSigned, uint64_t Int)
Definition: DIE.h:235
DIEExpr - An expression DIE.
Definition: DIE.h:270
DIEAbbrev Abbrev
Definition: DIE.h:121
unsigned getSize() const
Definition: DIE.h:145
DIELabel - A label DIE.
Definition: DIE.h:298
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const =0
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const =0
void addChild(DIE *Child)
Definition: DIE.h:168
virtual void print(raw_ostream &O) const
Definition: DIE.cpp:346
uint64_t getValue() const
Definition: DIE.h:253
DIEAbbrev(dwarf::Tag T, uint16_t C)
Definition: DIE.h:74
DIE * getParent() const
Definition: DIE.h:148
const std::vector< DIE * > & getChildren() const
Definition: DIE.h:146
dwarf::Attribute getAttribute() const
Definition: DIE.h:45
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:285
const DIE * getCompileUnit() const
Definition: DIE.cpp:117
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:212
static bool classof(const DIEValue *L)
Definition: DIE.h:316
DIEInteger(uint64_t I)
Definition: DIE.h:231
StringRef getString() const
getString - Grab the string out of the object.
Definition: DIE.h:361
unsigned getOffset() const
Definition: DIE.h:144
virtual void print(raw_ostream &O) const
Definition: DIE.cpp:368
const SmallVectorImpl< DIEValue * > & getValues() const
Definition: DIE.h:147
SmallVector< DIEValue *, 12 > Values
Definition: DIE.h:131
void Profile(FoldingSetNodeID &ID) const
Definition: DIE.cpp:36
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:305
DIE(unsigned Tag)
Definition: DIE.h:134
DIEExpr(const MCExpr *E)
Definition: DIE.h:273
dwarf::Form BestForm() const
Definition: DIE.h:428
unsigned getType() const
Definition: DIE.h:209
virtual ~DIEValue()
Definition: DIE.h:206
DIEString(const DIEValue *Acc, const StringRef S)
Definition: DIE.h:357
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:314
void setOffset(unsigned O)
Definition: DIE.h:155
virtual void print(raw_ostream &O) const
Definition: DIE.cpp:267
#define I(x, y, z)
Definition: MD5.cpp:54
#define N
virtual void print(raw_ostream &O) const =0
void print(raw_ostream &O)
Definition: DIE.cpp:86
const MCExpr * getValue() const
Definition: DIE.h:281
const SmallVectorImpl< DIEAbbrevData > & getData() const
Definition: DIE.h:80
virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:333
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:244
unsigned ComputeSize(AsmPrinter *AP)
Definition: DIE.cpp:406
dwarf::Tag getTag() const
Definition: DIE.h:77
LLVM Value Representation.
Definition: Value.h:66
static bool classof(const DIEValue *E)
Definition: DIE.h:407
uint16_t getChildrenFlag() const
Definition: DIE.h:79
void Emit(AsmPrinter *AP) const
Definition: DIE.cpp:60
DIE * Parent
Definition: DIE.h:127
DIEAbbrevData(dwarf::Attribute A, dwarf::Form F)
Definition: DIE.h:42
DIEBlock - A block of values. Primarily used for location expressions.
Definition: DIE.h:417
void setChildrenFlag(uint16_t CF)
Definition: DIE.h:81
static bool classof(const DIEValue *E)
Definition: DIE.h:288
static unsigned getRefAddrSize(AsmPrinter *AP)
Returns size of a ref_addr entry.
Definition: DIE.cpp:384
virtual void print(raw_ostream &O) const
Definition: DIE.cpp:395
void dump()
Definition: DIE.cpp:103
DIEBlock()
Definition: DIE.h:420
unsigned getNumber() const
Definition: DIE.h:78
virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const
Definition: DIE.cpp:434