188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling//===--- lib/CodeGen/DIE.h - DWARF Info Entries -----------------*- C++ -*-===//
288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling//
388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling//                     The LLVM Compiler Infrastructure
488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling//
588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling// This file is distributed under the University of Illinois Open Source
688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling// License. See LICENSE.TXT for details.
788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling//
888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling//===----------------------------------------------------------------------===//
988423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling//
1088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling// Data structures for DWARF info entries.
11ff34845f78ec5c20ccd8b5ec715d505eba9f66afEric Christopher//
1288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling//===----------------------------------------------------------------------===//
1388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DIE_H
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_CODEGEN_ASMPRINTER_DIE_H
1688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
1788423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling#include "llvm/ADT/FoldingSet.h"
18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/ADT/PointerIntPair.h"
19f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/ADT/STLExtras.h"
2088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling#include "llvm/ADT/SmallVector.h"
216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/CodeGen/DwarfStringPoolEntry.h"
2288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling#include "llvm/Support/Dwarf.h"
2388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
2488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendlingnamespace llvm {
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass AsmPrinter;
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCExpr;
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCSymbol;
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass raw_ostream;
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DwarfTypeUnit;
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIEAbbrevData - Dwarf abbreviation data, describes one attribute of a
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Dwarf abbreviation.
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DIEAbbrevData {
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Attribute - Dwarf attribute code.
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  dwarf::Attribute Attribute;
3888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Form - Dwarf form code.
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  dwarf::Form Form;
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIEAbbrevData(dwarf::Attribute A, dwarf::Form F) : Attribute(A), Form(F) {}
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Accessors.
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  dwarf::Attribute getAttribute() const { return Attribute; }
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  dwarf::Form getForm() const { return Form; }
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Profile - Used to gather unique data for the abbreviation folding set.
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void Profile(FoldingSetNodeID &ID) const;
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIEAbbrev - Dwarf abbreviation, describes the organization of a debug
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// information object.
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DIEAbbrev : public FoldingSetNode {
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Unique number for node.
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned Number;
6288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Tag - Dwarf tag code.
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  dwarf::Tag Tag;
6688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Children - Whether or not this node has children.
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // This cheats a bit in all of the uses since the values in the standard
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // are 0 and 1 for no children and children respectively.
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool Children;
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Data - Raw data bytes for abbreviation.
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<DIEAbbrevData, 12> Data;
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DIEAbbrev(dwarf::Tag T, bool C) : Tag(T), Children(C), Data() {}
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Accessors.
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  dwarf::Tag getTag() const { return Tag; }
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned getNumber() const { return Number; }
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool hasChildren() const { return Children; }
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const SmallVectorImpl<DIEAbbrevData> &getData() const { return Data; }
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void setChildrenFlag(bool hasChild) { Children = hasChild; }
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void setNumber(unsigned N) { Number = N; }
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// AddAttribute - Adds another set of attribute information to the
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// abbreviation.
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void AddAttribute(dwarf::Attribute Attribute, dwarf::Form Form) {
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Data.push_back(DIEAbbrevData(Attribute, Form));
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Profile - Used to gather unique data for the abbreviation folding set.
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void Profile(FoldingSetNodeID &ID) const;
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// Emit - Print the abbreviation using the specified asm printer.
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
1004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void Emit(const AsmPrinter *AP) const;
10188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void print(raw_ostream &O);
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void dump();
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
10588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIEInteger - An integer value DIE.
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
1096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIEInteger {
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t Integer;
11188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
1136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  explicit DIEInteger(uint64_t I) : Integer(I) {}
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// BestForm - Choose the best form for integer.
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static dwarf::Form BestForm(bool IsSigned, uint64_t Int) {
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (IsSigned) {
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      const int64_t SignedInt = Int;
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if ((char)Int == SignedInt)
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        return dwarf::DW_FORM_data1;
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if ((short)Int == SignedInt)
12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        return dwarf::DW_FORM_data2;
12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if ((int)Int == SignedInt)
12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        return dwarf::DW_FORM_data4;
12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    } else {
12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if ((unsigned char)Int == Int)
12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        return dwarf::DW_FORM_data1;
12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if ((unsigned short)Int == Int)
13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        return dwarf::DW_FORM_data2;
13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if ((unsigned int)Int == Int)
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        return dwarf::DW_FORM_data4;
13388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling    }
13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return dwarf::DW_FORM_data8;
13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
13688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t getValue() const { return Integer; }
1384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  void setValue(uint64_t Val) { Integer = Val; }
139f2548caaa8b290aa598bf49c27dff72f7751ba5cDevang Patel
1406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
1416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
14288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
1436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
14588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIEExpr - An expression DIE.
14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIEExpr {
15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCExpr *Expr;
1511f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand
15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
1536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  explicit DIEExpr(const MCExpr *E) : Expr(E) {}
1541f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand
15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// getValue - Get MCExpr.
15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCExpr *getValue() const { return Expr; }
15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
1606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
1611f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand
1626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIELabel - A label DIE.
16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIELabel {
16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCSymbol *Label;
1701f8aacd6afdc30b4d1cf1da3bf5e41c7874f89beUlrich Weigand
17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
1726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  explicit DIELabel(const MCSymbol *L) : Label(L) {}
17388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// getValue - Get MCSymbol.
17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCSymbol *getValue() const { return Label; }
177c3f5f783a2923e7842802d5cd1a932ee56c3bb45Devang Patel
1786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
1796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
18088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
1816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
18388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIEDelta - A simple label difference DIE.
18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
1876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIEDelta {
18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCSymbol *LabelHi;
18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCSymbol *LabelLo;
19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
1926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEDelta(const MCSymbol *Hi, const MCSymbol *Lo) : LabelHi(Hi), LabelLo(Lo) {}
19388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
1946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
1956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
19688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
1976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIEString - A container for string values.
20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
2036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIEString {
2046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DwarfStringPoolEntryRef S;
20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
2076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEString(DwarfStringPoolEntryRef S) : S(S) {}
20888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// getString - Grab the string out of the object.
2106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  StringRef getString() const { return S.getString(); }
21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
2136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
2143dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher
2156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
2173dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher
21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIEEntry - A pointer to another debug information entry.  An instance of
22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// this class can also be used as a proxy for a debug information entry not
22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// yet defined (ie. types.)
2226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIE;
2236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIEEntry {
2246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIE *Entry;
2256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEEntry() = delete;
2273dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher
22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
2296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  explicit DIEEntry(DIE &E) : Entry(&E) {}
2303dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher
2316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIE &getEntry() const { return *Entry; }
2323dee575b8dfe9c3d89f581e51dd11ddd08c43cd6Eric Christopher
2336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Returns size of a ref_addr entry.
2346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  static unsigned getRefAddrSize(const AsmPrinter *AP);
23588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
2366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
2376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {
23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return Form == dwarf::DW_FORM_ref_addr ? getRefAddrSize(AP)
23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                           : sizeof(int32_t);
24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
24188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
2466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// DIELocList - Represents a pointer to a location list in the debug_loc
2476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// section.
2486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//
2496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIELocList {
2506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Index into the .debug_loc vector.
2516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  size_t Index;
2526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarpublic:
2546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIELocList(size_t I) : Index(I) {}
2556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// getValue - Grab the current index out.
2576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  size_t getValue() const { return Index; }
2586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
2606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
2616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
2636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
2646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//===--------------------------------------------------------------------===//
2666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// DIEValue - A debug information entry value. Some of these roughly correlate
2676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// to DWARF attribute classes.
2686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar///
2696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIEBlock;
2706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIELoc;
2716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass DIEValue {
2726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarpublic:
2736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  enum Type {
2746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    isNone,
2756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define HANDLE_DIEVALUE(T) is##T,
2766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/CodeGen/DIEValue.def"
2776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  };
2786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate:
2806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Ty - Type of data stored in the value.
2816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
2826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Type Ty = isNone;
2836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  dwarf::Attribute Attribute = (dwarf::Attribute)0;
2846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  dwarf::Form Form = (dwarf::Form)0;
2856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Storage for the value.
2876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
2886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// All values that aren't standard layout (or are larger than 8 bytes)
2896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// should be stored by reference instead of by value.
2906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  typedef AlignedCharArrayUnion<DIEInteger, DIEString, DIEExpr, DIELabel,
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                DIEDelta *, DIEEntry, DIEBlock *, DIELoc *,
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                DIELocList>
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      ValTy;
2946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  static_assert(sizeof(ValTy) <= sizeof(uint64_t) ||
2956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                    sizeof(ValTy) <= sizeof(void *),
2966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                "Expected all large types to be stored via pointer");
2976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Underlying stored value.
2996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ValTy Val;
3006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  template <class T> void construct(T V) {
3026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    static_assert(std::is_standard_layout<T>::value ||
3036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                      std::is_pointer<T>::value,
3046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                  "Expected standard layout or pointer");
3056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    new (reinterpret_cast<void *>(Val.buffer)) T(V);
3066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
3076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  template <class T> T *get() { return reinterpret_cast<T *>(Val.buffer); }
3096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  template <class T> const T *get() const {
3106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return reinterpret_cast<const T *>(Val.buffer);
3116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
3126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  template <class T> void destruct() { get<T>()->~T(); }
3136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Destroy the underlying value.
3156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
3166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// This should get optimized down to a no-op.  We could skip it if we could
3176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// add a static assert on \a std::is_trivially_copyable(), but we currently
3186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// support versions of GCC that don't understand that.
3196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void destroyVal() {
3206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    switch (Ty) {
3216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case isNone:
3226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return;
3236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define HANDLE_DIEVALUE_SMALL(T)                                               \
3246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case is##T:                                                                  \
3256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    destruct<DIE##T>();
3266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return;
3276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define HANDLE_DIEVALUE_LARGE(T)                                               \
3286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case is##T:                                                                  \
3296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    destruct<const DIE##T *>();
3306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return;
3316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/CodeGen/DIEValue.def"
3326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
3336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
3346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Copy the underlying value.
3366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
3376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// This should get optimized down to a simple copy.  We need to actually
3386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// construct the value, rather than calling memcpy, to satisfy strict
3396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// aliasing rules.
3406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void copyVal(const DIEValue &X) {
3416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    switch (Ty) {
3426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    case isNone:
3436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return;
3446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define HANDLE_DIEVALUE_SMALL(T)                                               \
3456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case is##T:                                                                  \
3466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    construct<DIE##T>(*X.get<DIE##T>());                                       \
3476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return;
3486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define HANDLE_DIEVALUE_LARGE(T)                                               \
3496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case is##T:                                                                  \
3506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    construct<const DIE##T *>(*X.get<const DIE##T *>());                       \
3516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return;
3526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/CodeGen/DIEValue.def"
3536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
3546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
3556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarpublic:
3576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEValue() = default;
3586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEValue(const DIEValue &X) : Ty(X.Ty), Attribute(X.Attribute), Form(X.Form) {
3596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    copyVal(X);
3606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
3616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEValue &operator=(const DIEValue &X) {
3626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    destroyVal();
3636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Ty = X.Ty;
3646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Attribute = X.Attribute;
3656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Form = X.Form;
3666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    copyVal(X);
3676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return *this;
3686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
3696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ~DIEValue() { destroyVal(); }
3706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define HANDLE_DIEVALUE_SMALL(T)                                               \
3726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEValue(dwarf::Attribute Attribute, dwarf::Form Form, const DIE##T &V)      \
3736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      : Ty(is##T), Attribute(Attribute), Form(Form) {                          \
3746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    construct<DIE##T>(V);                                                      \
3756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
3766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define HANDLE_DIEVALUE_LARGE(T)                                               \
3776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEValue(dwarf::Attribute Attribute, dwarf::Form Form, const DIE##T *V)      \
3786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      : Ty(is##T), Attribute(Attribute), Form(Form) {                          \
3796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    assert(V && "Expected valid value");                                       \
3806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    construct<const DIE##T *>(V);                                              \
38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
3826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/CodeGen/DIEValue.def"
3836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Accessors
3856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Type getType() const { return Ty; }
3866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  dwarf::Attribute getAttribute() const { return Attribute; }
3876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  dwarf::Form getForm() const { return Form; }
3886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  explicit operator bool() const { return Ty; }
3896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define HANDLE_DIEVALUE_SMALL(T)                                               \
3916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const DIE##T &getDIE##T() const {                                            \
3926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    assert(getType() == is##T && "Expected " #T);                              \
3936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return *get<DIE##T>();                                                     \
3946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
3956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define HANDLE_DIEVALUE_LARGE(T)                                               \
3966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const DIE##T &getDIE##T() const {                                            \
3976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    assert(getType() == is##T && "Expected " #T);                              \
3986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return **get<const DIE##T *>();                                            \
3996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
4006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/CodeGen/DIEValue.def"
4016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// EmitValue - Emit value via the Dwarf writer.
4036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
404f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP) const;
4056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// SizeOf - Return the size of a value in bytes.
4076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
408f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP) const;
4096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
4106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void dump() const;
412f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
413f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
414f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstruct IntrusiveBackListNode {
415f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  PointerIntPair<IntrusiveBackListNode *, 1> Next;
416f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  IntrusiveBackListNode() : Next(this, true) {}
417f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
418f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  IntrusiveBackListNode *getNext() const {
419f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return Next.getInt() ? nullptr : Next.getPointer();
420f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
421f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
422f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
423f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstruct IntrusiveBackListBase {
424f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef IntrusiveBackListNode Node;
425f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  Node *Last = nullptr;
426f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
427f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  bool empty() const { return !Last; }
428f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void push_back(Node &N) {
429f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    assert(N.Next.getPointer() == &N && "Expected unlinked node");
430f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    assert(N.Next.getInt() == true && "Expected unlinked node");
431f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
432f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (Last) {
433f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      N.Next = Last->Next;
434f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Last->Next.setPointerAndInt(&N, false);
435f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
436f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Last = &N;
437f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
438f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
439f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
440f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartemplate <class T> class IntrusiveBackList : IntrusiveBackListBase {
441f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
442f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  using IntrusiveBackListBase::empty;
443f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void push_back(T &N) { IntrusiveBackListBase::push_back(N); }
444f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  T &back() { return *static_cast<T *>(Last); }
445f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const T &back() const { return *static_cast<T *>(Last); }
446f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
447f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  class const_iterator;
448f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  class iterator
449f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      : public iterator_facade_base<iterator, std::forward_iterator_tag, T> {
450f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    friend class const_iterator;
451f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Node *N = nullptr;
452f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
453f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  public:
454f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    iterator() = default;
455f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    explicit iterator(T *N) : N(N) {}
456f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
457f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    iterator &operator++() {
458f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      N = N->getNext();
459f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return *this;
460f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
461f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
462f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    explicit operator bool() const { return N; }
463f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    T &operator*() const { return *static_cast<T *>(N); }
464f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
465f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bool operator==(const iterator &X) const { return N == X.N; }
466f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bool operator!=(const iterator &X) const { return N != X.N; }
467f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
468f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
469f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  class const_iterator
470f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      : public iterator_facade_base<const_iterator, std::forward_iterator_tag,
471f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                    const T> {
472f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const Node *N = nullptr;
473f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
474f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  public:
475f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const_iterator() = default;
476f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Placate MSVC by explicitly scoping 'iterator'.
477f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const_iterator(typename IntrusiveBackList<T>::iterator X) : N(X.N) {}
478f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    explicit const_iterator(const T *N) : N(N) {}
479f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
480f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const_iterator &operator++() {
481f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      N = N->getNext();
482f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      return *this;
483f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    }
484f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
485f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    explicit operator bool() const { return N; }
486f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const T &operator*() const { return *static_cast<const T *>(N); }
487f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
488f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bool operator==(const const_iterator &X) const { return N == X.N; }
489f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    bool operator!=(const const_iterator &X) const { return N != X.N; }
490f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
491f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
492f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  iterator begin() {
493f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return Last ? iterator(static_cast<T *>(Last->Next.getPointer())) : end();
494f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
495f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const_iterator begin() const {
496f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return const_cast<IntrusiveBackList *>(this)->begin();
497f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
498f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  iterator end() { return iterator(); }
499f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const_iterator end() const { return const_iterator(); }
500f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
501f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static iterator toIterator(T &N) { return iterator(&N); }
502f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static const_iterator toIterator(const T &N) { return const_iterator(&N); }
503f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
504f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
505f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// A list of DIE values.
506f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
507f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// This is a singly-linked list, but instead of reversing the order of
508f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// insertion, we keep a pointer to the back of the list so we can push in
509f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// order.
510f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
511f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// There are two main reasons to choose a linked list over a customized
512f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// vector-like data structure.
513f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
514f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///  1. For teardown efficiency, we want DIEs to be BumpPtrAllocated.  Using a
515f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///     linked list here makes this way easier to accomplish.
516f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///  2. Carrying an extra pointer per \a DIEValue isn't expensive.  45% of DIEs
517f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///     have 2 or fewer values, and 90% have 5 or fewer.  A vector would be
518f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///     over-allocated by 50% on average anyway, the same cost as the
519f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///     linked-list node.
520f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass DIEValueList {
521f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  struct Node : IntrusiveBackListNode {
522f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    DIEValue V;
523f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    explicit Node(DIEValue V) : V(V) {}
524f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
525f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
526f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef IntrusiveBackList<Node> ListTy;
527f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ListTy List;
528f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
529f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
530f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  class const_value_iterator;
531f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  class value_iterator
532f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      : public iterator_adaptor_base<value_iterator, ListTy::iterator,
533f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                     std::forward_iterator_tag, DIEValue> {
534f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    friend class const_value_iterator;
535f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    typedef iterator_adaptor_base<value_iterator, ListTy::iterator,
536f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                  std::forward_iterator_tag,
537f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                  DIEValue> iterator_adaptor;
538f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
539f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  public:
540f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    value_iterator() = default;
541f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    explicit value_iterator(ListTy::iterator X) : iterator_adaptor(X) {}
542f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
543f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    explicit operator bool() const { return bool(wrapped()); }
544f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    DIEValue &operator*() const { return wrapped()->V; }
545f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
546f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
547f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  class const_value_iterator : public iterator_adaptor_base<
548f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                   const_value_iterator, ListTy::const_iterator,
549f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                   std::forward_iterator_tag, const DIEValue> {
550f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    typedef iterator_adaptor_base<const_value_iterator, ListTy::const_iterator,
551f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                  std::forward_iterator_tag,
552f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                  const DIEValue> iterator_adaptor;
553f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
554f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  public:
555f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const_value_iterator() = default;
556f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const_value_iterator(DIEValueList::value_iterator X)
557f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        : iterator_adaptor(X.wrapped()) {}
558f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    explicit const_value_iterator(ListTy::const_iterator X)
559f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        : iterator_adaptor(X) {}
560f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
561f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    explicit operator bool() const { return bool(wrapped()); }
562f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const DIEValue &operator*() const { return wrapped()->V; }
563f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
564f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
565f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef iterator_range<value_iterator> value_range;
566f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef iterator_range<const_value_iterator> const_value_range;
567f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  value_iterator addValue(BumpPtrAllocator &Alloc, const DIEValue &V) {
569f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    List.push_back(*new (Alloc) Node(V));
570f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return value_iterator(ListTy::toIterator(List.back()));
571f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
572f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  template <class T>
573f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  value_iterator addValue(BumpPtrAllocator &Alloc, dwarf::Attribute Attribute,
574f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                    dwarf::Form Form, T &&Value) {
575f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return addValue(Alloc, DIEValue(Attribute, Form, std::forward<T>(Value)));
576f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
577f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
578f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  value_range values() {
579f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return llvm::make_range(value_iterator(List.begin()),
580f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                            value_iterator(List.end()));
581f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
582f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const_value_range values() const {
583f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return llvm::make_range(const_value_iterator(List.begin()),
584f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                            const_value_iterator(List.end()));
585f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
58636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
58736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
58836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
5896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// DIE - A structured debug information entry.  Has an abbreviation which
5906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// describes its organization.
591f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass DIE : IntrusiveBackListNode, public DIEValueList {
592f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  friend class IntrusiveBackList<DIE>;
593f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
5946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Offset - Offset in debug info section.
5956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
5966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned Offset;
5976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
5986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Size - Size of instance + children.
5996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
6006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned Size;
6016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned AbbrevNumber = ~0u;
6036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Tag - Dwarf tag code.
6056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
6066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  dwarf::Tag Tag = (dwarf::Tag)0;
6076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Children DIEs.
609f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  IntrusiveBackList<DIE> Children;
6106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
611f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DIE *Parent = nullptr;
6126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
613f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DIE() = delete;
614f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  explicit DIE(dwarf::Tag Tag) : Offset(0), Size(0), Tag(Tag) {}
6156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarpublic:
617f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  static DIE *get(BumpPtrAllocator &Alloc, dwarf::Tag Tag) {
618f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return new (Alloc) DIE(Tag);
619f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
6206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Accessors.
6226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned getAbbrevNumber() const { return AbbrevNumber; }
6236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  dwarf::Tag getTag() const { return Tag; }
6246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned getOffset() const { return Offset; }
6256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned getSize() const { return Size; }
6266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool hasChildren() const { return !Children.empty(); }
6276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
628f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef IntrusiveBackList<DIE>::iterator child_iterator;
629f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef IntrusiveBackList<DIE>::const_iterator const_child_iterator;
6306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  typedef iterator_range<child_iterator> child_range;
631f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef iterator_range<const_child_iterator> const_child_range;
6326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
633f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  child_range children() {
6346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return llvm::make_range(Children.begin(), Children.end());
6356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
636f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const_child_range children() const {
637f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return llvm::make_range(Children.begin(), Children.end());
6386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
6396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIE *getParent() const { return Parent; }
6416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Generate the abbreviation for this DIE.
6436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
6446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Calculate the abbreviation for this, which should be uniqued and
6456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// eventually used to call \a setAbbrevNumber().
6466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEAbbrev generateAbbrev() const;
6476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Set the abbreviation number for this DIE.
6496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void setAbbrevNumber(unsigned I) { AbbrevNumber = I; }
6506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Climb up the parent chain to get the compile or type unit DIE this DIE
6526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// belongs to.
6536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const DIE *getUnit() const;
6546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Similar to getUnit, returns null when DIE is not added to an
6556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// owner yet.
6566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const DIE *getUnitOrNull() const;
6576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void setOffset(unsigned O) { Offset = O; }
6586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void setSize(unsigned S) { Size = S; }
6596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
660f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Add a child to the DIE.
661f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  DIE &addChild(DIE *Child) {
662f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    assert(!Child->getParent() && "Child should be orphaned");
6636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Child->Parent = this;
664f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    Children.push_back(*Child);
665f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return Children.back();
6666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
6676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Find a value in the DIE with the attribute given.
6696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ///
6706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// Returns a default-constructed DIEValue (where \a DIEValue::getType()
6716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  /// gives \a DIEValue::isNone) if no such attribute exists.
6726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEValue findAttribute(dwarf::Attribute Attribute) const;
6736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O, unsigned IndentCount = 0) const;
6756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void dump();
6766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
6776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
6786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//===--------------------------------------------------------------------===//
67936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIELoc - Represents an expression location.
68036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
681f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass DIELoc : public DIEValueList {
68236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  mutable unsigned Size; // Size in bytes excluding size header.
6836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
68436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
6856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIELoc() : Size(0) {}
68688423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
68736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// ComputeSize - Calculate the size of the location expression.
68836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
6894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  unsigned ComputeSize(const AsmPrinter *AP) const;
6900e6783feed2f0f572a002bda38707fcd3267916dManman Ren
69136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// BestForm - Choose the best form for data.
69236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
69336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  dwarf::Form BestForm(unsigned DwarfVersion) const {
69436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (DwarfVersion > 3)
69536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return dwarf::DW_FORM_exprloc;
69636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Pre-DWARF4 location expressions were blocks and not exprloc.
69736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if ((unsigned char)Size == Size)
69836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return dwarf::DW_FORM_block1;
69936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if ((unsigned short)Size == Size)
70036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return dwarf::DW_FORM_block2;
70136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if ((unsigned int)Size == Size)
70236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return dwarf::DW_FORM_block4;
70336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return dwarf::DW_FORM_block;
70436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
70536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
7076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
70888423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
7096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
71036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
71188423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
71236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--------------------------------------------------------------------===//
71336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// DIEBlock - Represents a block of values.
71436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
715f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass DIEBlock : public DIEValueList {
71636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  mutable unsigned Size; // Size in bytes excluding size header.
7176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
71836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
7196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  DIEBlock() : Size(0) {}
72088423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
72136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// ComputeSize - Calculate the size of the location expression.
72236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
7234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  unsigned ComputeSize(const AsmPrinter *AP) const;
72488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
72536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  /// BestForm - Choose the best form for data.
72636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ///
72736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  dwarf::Form BestForm() const {
72836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if ((unsigned char)Size == Size)
72936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return dwarf::DW_FORM_block1;
73036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if ((unsigned short)Size == Size)
73136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return dwarf::DW_FORM_block2;
73236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if ((unsigned int)Size == Size)
73336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return dwarf::DW_FORM_block4;
73436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return dwarf::DW_FORM_block;
73536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
73636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void EmitValue(const AsmPrinter *AP, dwarf::Form Form) const;
7386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned SizeOf(const AsmPrinter *AP, dwarf::Form Form) const;
73936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  void print(raw_ostream &O) const;
74136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
74288423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
74388423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling} // end llvm namespace
74488423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling
74588423eecd0f16d3cfa89bdf92abdb72a5dc0616aBill Wendling#endif
746