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