136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- llvm/CodeGen/DwarfUnit.h - Dwarf Compile Unit ---*- C++ -*--===// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file contains support for writing dwarf compile unit. 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "DIE.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "DwarfDebug.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/DenseMap.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/Optional.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/StringMap.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/CodeGen/AsmPrinter.h" 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DIBuilder.h" 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DebugInfo.h" 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCExpr.h" 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCSection.h" 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCDwarf.h" 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm { 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MachineLocation; 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MachineOperand; 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass ConstantInt; 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass ConstantFP; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DbgVariable; 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DwarfCompileUnit; 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Data structure to hold a range for range lists. 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass RangeSpan { 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RangeSpan(MCSymbol *S, MCSymbol *E) : Start(S), End(E) {} 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *getStart() const { return Start; } 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *getEnd() const { return End; } 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setEnd(const MCSymbol *E) { End = E; } 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate: 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *Start, *End; 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass RangeSpanList { 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate: 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Index for locating within the debug_range section this particular span. 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *RangeSym; 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // List of ranges. 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVector<RangeSpan, 2> Ranges; 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RangeSpanList(MCSymbol *Sym) : RangeSym(Sym) {} 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *getSym() const { return RangeSym; } 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<RangeSpan> &getRanges() const { return Ranges; } 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addRange(RangeSpan Range) { Ranges.push_back(Range); } 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Unit - This dwarf writer support class manages information associated 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// with a source file. 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DwarfUnit { 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprotected: 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// UniqueID - a numeric ID unique among all CUs in the module 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned UniqueID; 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Node - MDNode for the compile unit. 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DICompileUnit CUNode; 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Unit debug information entry. 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE UnitDie; 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Offset of the UnitDie from beginning of debug info section. 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned DebugInfoOffset; 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Asm - Target of Dwarf emission. 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AsmPrinter *Asm; 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Holders for some common dwarf information. 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfDebug *DD; 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfFile *DU; 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// IndexTyDie - An anonymous type for index type. Owned by UnitDie. 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *IndexTyDie; 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// MDNodeToDieMap - Tracks the mapping of unit level debug information 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// variables to debug information entries. 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DenseMap<const MDNode *, DIE *> MDNodeToDieMap; 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// MDNodeToDIEEntryMap - Tracks the mapping of unit level debug information 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// descriptors to debug information entries using a DIEEntry proxy. 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap; 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// GlobalNames - A map of globally visible named entities for this unit. 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringMap<const DIE *> GlobalNames; 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// GlobalTypes - A map of globally visible types for this unit. 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringMap<const DIE *> GlobalTypes; 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// DIEBlocks - A list of all the DIEBlocks in use. 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::vector<DIEBlock *> DIEBlocks; 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// DIELocs - A list of all the DIELocs in use. 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::vector<DIELoc *> DIELocs; 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// ContainingTypeMap - This map is used to keep track of subprogram DIEs that 11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// need DW_AT_containing_type attribute. This attribute points to a DIE that 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// corresponds to the MDNode mapped with the subprogram DIE. 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DenseMap<DIE *, const MDNode *> ContainingTypeMap; 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // List of ranges for a given compile unit. 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVector<RangeSpan, 1> CURanges; 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // List of range lists for a given compile unit, separate from the ranges for 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // the CU itself. 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVector<RangeSpanList, 1> CURangeLists; 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // DIEValueAllocator - All DIEValues are allocated through this allocator. 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines BumpPtrAllocator DIEValueAllocator; 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // DIEIntegerOne - A preallocated DIEValue because 1 is used frequently. 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEInteger *DIEIntegerOne; 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// The section this unit will be emitted in. 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSection *Section; 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// A label at the start of the non-dwo section related to this unit. 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *SectionSym; 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// The start of the unit within its section. 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *LabelBegin; 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// The end of the unit within its section. 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *LabelEnd; 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Skeleton unit associated with this unit. 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfUnit *Skeleton; 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 144dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DwarfUnit(unsigned UID, dwarf::Tag, DICompileUnit CU, AsmPrinter *A, 14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfDebug *DW, DwarfFile *DWU); 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual ~DwarfUnit(); 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Set the skeleton unit associated with this unit. 151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setSkeleton(DwarfUnit &Skel) { Skeleton = &Skel; } 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Get the skeleton unit associated with this unit. 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfUnit *getSkeleton() const { return Skeleton; } 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Pass in the SectionSym even though we could recreate it in every compile 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// unit (type units will have actually distinct symbols once they're in 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// comdat sections). 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void initSection(const MCSection *Section, MCSymbol *SectionSym) { 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(!this->Section); 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines this->Section = Section; 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines this->SectionSym = SectionSym; 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines this->LabelBegin = 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Asm->GetTempSymbol(Section->getLabelBeginName(), getUniqueID()); 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines this->LabelEnd = 16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Asm->GetTempSymbol(Section->getLabelEndName(), getUniqueID()); 16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSection *getSection() const { 17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Section); 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Section; 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// If there's a skeleton then return the section symbol for the skeleton 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// unit, otherwise return the section symbol for this unit. 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *getLocalSectionSym() const { 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Skeleton) 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Skeleton->getSectionSym(); 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return getSectionSym(); 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *getSectionSym() const { 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Section); 18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return SectionSym; 18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// If there's a skeleton then return the begin label for the skeleton unit, 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// otherwise return the local label for this unit. 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *getLocalLabelBegin() const { 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Skeleton) 19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Skeleton->getLabelBegin(); 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return getLabelBegin(); 19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *getLabelBegin() const { 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Section); 19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return LabelBegin; 19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *getLabelEnd() const { 20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Section); 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return LabelEnd; 20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Accessors. 20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getUniqueID() const { return UniqueID; } 20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint16_t getLanguage() const { return CUNode.getLanguage(); } 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DICompileUnit getCUNode() const { return CUNode; } 209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &getUnitDie() { return UnitDie; } 21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const StringMap<const DIE *> &getGlobalNames() const { return GlobalNames; } 21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const StringMap<const DIE *> &getGlobalTypes() const { return GlobalTypes; } 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getDebugInfoOffset() const { return DebugInfoOffset; } 21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setDebugInfoOffset(unsigned DbgInfoOff) { DebugInfoOffset = DbgInfoOff; } 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// hasContent - Return true if this compile unit has something to write out. 217dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool hasContent() const { return !UnitDie.getChildren().empty(); } 21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addRange - Add an address range to the list of ranges for this unit. 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addRange(RangeSpan Range); 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getRanges - Get the list of ranges for this unit. 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<RangeSpan> &getRanges() const { return CURanges; } 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<RangeSpan> &getRanges() { return CURanges; } 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addRangeList - Add an address range list to the list of range lists. 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addRangeList(RangeSpanList Ranges) { CURangeLists.push_back(Ranges); } 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getRangeLists - Get the vector of range lists. 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const SmallVectorImpl<RangeSpanList> &getRangeLists() const { 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return CURangeLists; 23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVectorImpl<RangeSpanList> &getRangeLists() { return CURangeLists; } 23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getParentContextString - Get a string containing the language specific 23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// context for a global name. 23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string getParentContextString(DIScope Context) const; 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addGlobalName - Add a new global entity to the compile unit. 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// 241dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addGlobalName(StringRef Name, DIE &Die, DIScope Context); 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addAccelNamespace - Add a new name to the namespace accelerator table. 244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addAccelNamespace(StringRef Name, const DIE &Die); 24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getDIE - Returns the debug information entry map slot for the 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// specified debug variable. We delegate the request to DwarfDebug 24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// when the MDNode can be part of the type system, since DIEs for 24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// the type system can be shared across CUs and the mappings are 25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// kept in DwarfDebug. 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *getDIE(DIDescriptor D) const; 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getDIELoc - Returns a fresh newly allocated DIELoc. 25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIELoc *getDIELoc() { return new (DIEValueAllocator) DIELoc(); } 25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// when the MDNode can be part of the type system, since DIEs for 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// the type system can be shared across CUs and the mappings are 25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// kept in DwarfDebug. 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void insertDIE(DIDescriptor Desc, DIE *D); 26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addFlag - Add a flag that is true to the DIE. 263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addFlag(DIE &Die, dwarf::Attribute Attribute); 26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addUInt - Add an unsigned integer attribute data and value. 266dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addUInt(DIE &Die, dwarf::Attribute Attribute, Optional<dwarf::Form> Form, 26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Integer); 26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 269dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer); 27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addSInt - Add an signed integer attribute data and value. 272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSInt(DIE &Die, dwarf::Attribute Attribute, Optional<dwarf::Form> Form, 27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int64_t Integer); 27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 275dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSInt(DIELoc &Die, Optional<dwarf::Form> Form, int64_t Integer); 27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addString - Add a string attribute data and value. 278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addString(DIE &Die, dwarf::Attribute Attribute, const StringRef Str); 27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addLocalString - Add a string attribute data and value. 281dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addLocalString(DIE &Die, dwarf::Attribute Attribute, 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const StringRef Str); 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addExpr - Add a Dwarf expression attribute data and value. 285dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addExpr(DIELoc &Die, dwarf::Form Form, const MCExpr *Expr); 28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addLabel - Add a Dwarf label attribute data and value. 288dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addLabel(DIE &Die, dwarf::Attribute Attribute, dwarf::Form Form, 28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *Label); 29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 291dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label); 29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addLocationList - Add a Dwarf loclistptr attribute data and value. 294dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addLocationList(DIE &Die, dwarf::Attribute Attribute, unsigned Index); 29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addSectionLabel - Add a Dwarf section label attribute data and value. 29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// 298dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSectionLabel(DIE &Die, dwarf::Attribute Attribute, 29936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *Label); 30036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addSectionOffset - Add an offset into a section attribute data and value. 30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// 303dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSectionOffset(DIE &Die, dwarf::Attribute Attribute, uint64_t Integer); 30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addOpAddress - Add a dwarf op address data and value using the 30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index. 307dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addOpAddress(DIELoc &Die, const MCSymbol *Label); 30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 30936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addSectionDelta - Add a label delta attribute data and value. 310dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSectionDelta(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, 31136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *Lo); 31236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 31336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addLabelDelta - Add a label delta attribute data and value. 314dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addLabelDelta(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Hi, 31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *Lo); 31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addDIEEntry - Add a DIE attribute data and value. 318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry); 31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addDIEEntry - Add a DIE attribute data and value. 321dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIEEntry *Entry); 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 323dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type); 32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addBlock - Add block data. 326dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Block); 32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addBlock - Add block data. 329dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addBlock(DIE &Die, dwarf::Attribute Attribute, DIEBlock *Block); 33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addSourceLine - Add location information to specified debug information 33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// entry. 333dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSourceLine(DIE &Die, unsigned Line, StringRef File, 33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef Directory); 335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSourceLine(DIE &Die, DIVariable V); 336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSourceLine(DIE &Die, DIGlobalVariable G); 337dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSourceLine(DIE &Die, DISubprogram SP); 338dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSourceLine(DIE &Die, DIType Ty); 339dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSourceLine(DIE &Die, DINameSpace NS); 340dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addSourceLine(DIE &Die, DIObjCProperty Ty); 34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addAddress - Add an address attribute to a die based on the location 34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// provided. 344dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addAddress(DIE &Die, dwarf::Attribute Attribute, 34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MachineLocation &Location, bool Indirect = false); 34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addConstantValue - Add constant value entry in variable DIE. 348dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addConstantValue(DIE &Die, const MachineOperand &MO, DIType Ty); 349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty); 350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addConstantValue(DIE &Die, const APInt &Val, DIType Ty); 351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addConstantValue(DIE &Die, const APInt &Val, bool Unsigned); 352dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addConstantValue(DIE &Die, bool Unsigned, uint64_t Val); 35336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addConstantFPValue - Add constant value entry in variable DIE. 355dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addConstantFPValue(DIE &Die, const MachineOperand &MO); 356dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addConstantFPValue(DIE &Die, const ConstantFP *CFP); 35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addTemplateParams - Add template parameters in buffer. 35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void addTemplateParams(DIE &Buffer, DIArray TParams); 36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addRegisterOp - Add register operand. 362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addRegisterOp(DIELoc &TheDie, unsigned Reg); 36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addRegisterOffset - Add register offset. 365dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addRegisterOffset(DIELoc &TheDie, unsigned Reg, int64_t Offset); 36636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addComplexAddress - Start with the address based on the location provided, 36836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// and generate the DWARF information necessary to find the actual variable 36936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// (navigating the extra location information encoded in the type) based on 37036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// the starting location. Add the DWARF information to the die. 371dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addComplexAddress(const DbgVariable &DV, DIE &Die, 37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dwarf::Attribute Attribute, 37336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MachineLocation &Location); 37436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 37536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: Should be reformulated in terms of addComplexAddress. 37636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addBlockByrefAddress - Start with the address based on the location 37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// provided, and generate the DWARF information necessary to find the 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// actual Block variable (navigating the Block struct) based on the 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// starting location. Add the DWARF information to the die. Obsolete, 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// please use addComplexAddress instead. 381dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addBlockByrefAddress(const DbgVariable &DV, DIE &Die, 38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dwarf::Attribute Attribute, 38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MachineLocation &Location); 38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addVariableAddress - Add DW_AT_location attribute for a 38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// DbgVariable based on provided MachineLocation. 387dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addVariableAddress(const DbgVariable &DV, DIE &Die, 38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineLocation Location); 38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addType - Add a new type attribute to the specified entity. This takes 39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// and attribute parameter because DW_AT_friend attributes are also 39236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// type references. 393dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addType(DIE &Entity, DIType Ty, 39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dwarf::Attribute Attribute = dwarf::DW_AT_type); 39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getOrCreateNameSpace - Create a DIE for DINameSpace. 39736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *getOrCreateNameSpace(DINameSpace NS); 39836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getOrCreateSubprogramDIE - Create new DIE using SP. 40036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *getOrCreateSubprogramDIE(DISubprogram SP); 40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 402dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void applySubprogramAttributes(DISubprogram SP, DIE &SPDie); 403cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines void applySubprogramAttributesToDefinition(DISubprogram SP, DIE &SPDie); 404cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines void applyVariableAttributes(const DbgVariable &Var, DIE &VariableDie); 405dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 40636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// given DIType. 40836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *getOrCreateTypeDIE(const MDNode *N); 40936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getOrCreateContextDIE - Get context owner's DIE. 41136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *createTypeDIE(DICompositeType Ty); 41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getOrCreateContextDIE - Get context owner's DIE. 41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *getOrCreateContextDIE(DIScope Context); 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructContainingTypeDIEs - Construct DIEs for types that contain 41736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// vtables. 41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructContainingTypeDIEs(); 41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructVariableDIE - Construct a DIE for the given DbgVariable. 421dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::unique_ptr<DIE> constructVariableDIE(DbgVariable &DV, 422dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool Abstract = false); 42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructSubprogramArguments - Construct function argument DIEs. 42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructSubprogramArguments(DIE &Buffer, DIArray Args); 42636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Create a DIE with the given Tag, add the DIE to its parent, and 42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// call insertDIE if MD is not null. 429dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIE &createAndAddDIE(unsigned Tag, DIE &Parent, 43036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIDescriptor N = DIDescriptor()); 43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 43236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Compute the size of a header for this unit, not including the initial 43336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// length field. 43436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual unsigned getHeaderSize() const { 43536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return sizeof(int16_t) + // DWARF version number 43636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines sizeof(int32_t) + // Offset Into Abbrev. Section 43736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines sizeof(int8_t); // Pointer Size (in bytes) 43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Emit the header for this unit, not including the initial length field. 44136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void emitHeader(const MCSymbol *ASectionSym) const; 44236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual DwarfCompileUnit &getCU() = 0; 44436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 445dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// constructTypeDIE - Construct type DIE from DICompositeType. 446dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void constructTypeDIE(DIE &Buffer, DICompositeType CTy); 447dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprotected: 44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getOrCreateStaticMemberDIE - Create new static data member DIE. 45036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *getOrCreateStaticMemberDIE(DIDerivedType DT); 45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Look up the source ID with the given directory and source file names. If 45336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// none currently exists, create a new ID and insert it in the line table. 45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual unsigned getOrCreateSourceID(StringRef File, StringRef Directory) = 0; 45536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 45636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate: 457dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Construct a DIE for the given DbgVariable without initializing the 458dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// DbgVariable's DIE reference. 459dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::unique_ptr<DIE> constructVariableDIEImpl(const DbgVariable &DV, 460dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool Abstract); 461dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 46236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructTypeDIE - Construct basic type die from DIBasicType. 46336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructTypeDIE(DIE &Buffer, DIBasicType BTy); 46436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 46536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructTypeDIE - Construct derived type die from DIDerivedType. 46636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructTypeDIE(DIE &Buffer, DIDerivedType DTy); 46736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 46836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructSubrangeDIE - Construct subrange DIE from DISubrange. 46936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy); 47036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 47136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy); 47336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 47436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator. 47536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy); 47636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 47736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructMemberDIE - Construct member DIE from DIDerivedType. 47836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructMemberDIE(DIE &Buffer, DIDerivedType DT); 47936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 48036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructTemplateTypeParameterDIE - Construct new DIE for the given 48136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// DITemplateTypeParameter. 48236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructTemplateTypeParameterDIE(DIE &Buffer, 48336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DITemplateTypeParameter TP); 48436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// constructTemplateValueParameterDIE - Construct new DIE for the given 48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// DITemplateValueParameter. 48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void constructTemplateValueParameterDIE(DIE &Buffer, 48836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DITemplateValueParameter TVP); 48936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getLowerBoundDefault - Return the default lower bound for an array. If the 49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// DWARF version doesn't handle the language, return -1. 49236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int64_t getDefaultLowerBound() const; 49336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 49436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getDIEEntry - Returns the debug information entry for the specified 49536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// debug variable. 49636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIEEntry *getDIEEntry(const MDNode *N) const { 49736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MDNodeToDIEEntryMap.lookup(N); 49836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 49936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 50036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// insertDIEEntry - Insert debug information entry into the map. 50136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void insertDIEEntry(const MDNode *N, DIEEntry *E) { 50236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MDNodeToDIEEntryMap.insert(std::make_pair(N, E)); 50336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 50436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 50536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // getIndexTyDie - Get an anonymous type for index type. 50636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DIE *getIndexTyDie() { return IndexTyDie; } 50736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 50836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // setIndexTyDie - Set D as anonymous type for index which can be reused 50936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // later. 51036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setIndexTyDie(DIE *D) { IndexTyDie = D; } 51136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 51236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug 51336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// information entry. 514dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DIEEntry *createDIEEntry(DIE &Entry); 51536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 51636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// resolve - Look in the DwarfDebug map for the MDNode that 51736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// corresponds to the reference. 51836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines template <typename T> T resolve(DIRef<T> Ref) const { 51936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return DD->resolve(Ref); 52036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 52136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 52236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// If this is a named finished type then include it in the list of types for 52336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// the accelerator tables. 524dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void updateAcceleratorTables(DIScope Context, DIType Ty, const DIE &TyDIE); 52536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 52636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 52736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DwarfCompileUnit : public DwarfUnit { 52836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// The attribute index of DW_AT_stmt_list in the compile unit DIE, avoiding 52936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// the need to search for it in applyStmtList. 53036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned stmtListIndex; 53136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 53236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 533dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DwarfCompileUnit(unsigned UID, DICompileUnit Node, AsmPrinter *A, 53436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfDebug *DW, DwarfFile *DWU); 53536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 53636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void initStmtList(MCSymbol *DwarfLineSectionSym); 53736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 53836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Apply the DW_AT_stmt_list from this compile unit to the specified DIE. 53936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void applyStmtList(DIE &D); 54036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 54136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// createGlobalVariableDIE - create global variable DIE. 54236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void createGlobalVariableDIE(DIGlobalVariable GV); 54336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 54436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addLabelAddress - Add a dwarf label attribute data and value using 54536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// either DW_FORM_addr or DW_FORM_GNU_addr_index. 546dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addLabelAddress(DIE &Die, dwarf::Attribute Attribute, 54736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *Label); 54836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 54936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// addLocalLabelAddress - Add a dwarf label attribute data and value using 55036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// DW_FORM_addr only. 551dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addLocalLabelAddress(DIE &Die, dwarf::Attribute Attribute, 55236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSymbol *Label); 55336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 55436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfCompileUnit &getCU() override { return *this; } 55536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 55636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getOrCreateSourceID(StringRef FileName, StringRef DirName) override; 55736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 55836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 55936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DwarfTypeUnit : public DwarfUnit { 56036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate: 56136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t TypeSignature; 56236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const DIE *Ty; 56336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfCompileUnit &CU; 56436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCDwarfDwoLineTable *SplitLineTable; 56536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 56636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 567dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A, 56836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfDebug *DW, DwarfFile *DWU, 56936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCDwarfDwoLineTable *SplitLineTable = nullptr); 57036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 57136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setTypeSignature(uint64_t Signature) { TypeSignature = Signature; } 57236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t getTypeSignature() const { return TypeSignature; } 57336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setType(const DIE *Ty) { this->Ty = Ty; } 57436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 57536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Emit the header for this unit, not including the initial length field. 57636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void emitHeader(const MCSymbol *ASectionSym) const override; 57736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getHeaderSize() const override { 57836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return DwarfUnit::getHeaderSize() + sizeof(uint64_t) + // Type Signature 57936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines sizeof(uint32_t); // Type DIE Offset 58036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 58136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void initSection(const MCSection *Section); 58236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DwarfCompileUnit &getCU() override { return CU; } 58336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 58436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprotected: 58536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getOrCreateSourceID(StringRef File, StringRef Directory) override; 58636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 58736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end llvm namespace 58836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif 589