18b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel//===-- llvm/CodeGen/DwarfCompileUnit.h - Dwarf Compile Unit ---*- C++ -*--===// 28b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel// 38b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel// The LLVM Compiler Infrastructure 48b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel// 58b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel// This file is distributed under the University of Illinois Open Source 68b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel// License. See LICENSE.TXT for details. 78b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel// 88b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel//===----------------------------------------------------------------------===// 98b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel// 108b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel// This file contains support for writing dwarf compile unit. 118b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel// 128b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel//===----------------------------------------------------------------------===// 138b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 148b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel#ifndef CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H 158b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel#define CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H 168b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 178b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel#include "DIE.h" 180bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/DebugInfo.h" 198b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel#include "llvm/ADT/DenseMap.h" 208b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel#include "llvm/ADT/StringMap.h" 218b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel#include "llvm/ADT/OwningPtr.h" 228b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 238b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patelnamespace llvm { 248b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 253cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelclass DwarfDebug; 263cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelclass MachineLocation; 273cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelclass MachineOperand; 283cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelclass ConstantInt; 293cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelclass DbgVariable; 303cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 318b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel//===----------------------------------------------------------------------===// 3233aa20f737e9ebb3c29c93508da0c041a6a772c7Eric Christopher/// CompileUnit - This dwarf writer support class manages information associated 338b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel/// with a source file. 348b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patelclass CompileUnit { 358b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// ID - File identifier for source. 368b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// 378b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel unsigned ID; 388b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 39438b092a4bba8d766316542ced10b7b028bad82cEric Christopher /// Language - The DW_AT_language of the compile unit 40438b092a4bba8d766316542ced10b7b028bad82cEric Christopher /// 41438b092a4bba8d766316542ced10b7b028bad82cEric Christopher unsigned Language; 42438b092a4bba8d766316542ced10b7b028bad82cEric Christopher 438b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// Die - Compile unit debug information entry. 448b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// 458b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel const OwningPtr<DIE> CUDie; 468b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 473cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// Asm - Target of Dwarf emission. 483cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel AsmPrinter *Asm; 493cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 503cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DwarfDebug *DD; 513cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 528b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// IndexTyDie - An anonymous type for index type. Owned by CUDie. 538b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel DIE *IndexTyDie; 548b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 558b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// MDNodeToDieMap - Tracks the mapping of unit level debug informaton 568b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// variables to debug information entries. 578b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel DenseMap<const MDNode *, DIE *> MDNodeToDieMap; 588b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 598b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// MDNodeToDIEEntryMap - Tracks the mapping of unit level debug informaton 608b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// descriptors to debug information entries using a DIEEntry proxy. 618b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap; 628b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 638b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// GlobalTypes - A map of globally visible types for this unit. 648b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// 658b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel StringMap<DIE*> GlobalTypes; 668b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 6709ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// AccelNames - A map of names for the name accelerator table. 6809ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// 690ffe2b4dd6f26fa19827f85bf9e4a766539a859cEric Christopher StringMap<std::vector<DIE*> > AccelNames; 7009ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher StringMap<std::vector<DIE*> > AccelObjC; 718bd36eafca6992754006cbace5ba471884631d08Eric Christopher StringMap<std::vector<DIE*> > AccelNamespace; 72c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher StringMap<std::vector<std::pair<DIE*, unsigned> > > AccelTypes; 7309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher 743cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// DIEBlocks - A list of all the DIEBlocks in use. 753cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel std::vector<DIEBlock *> DIEBlocks; 763cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 77dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel /// ContainingTypeMap - This map is used to keep track of subprogram DIEs that 78dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel /// need DW_AT_containing_type attribute. This attribute points to a DIE that 79dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel /// corresponds to the MDNode mapped with the subprogram DIE. 80dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DenseMap<DIE *, const MDNode *> ContainingTypeMap; 81dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 828b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patelpublic: 83438b092a4bba8d766316542ced10b7b028bad82cEric Christopher CompileUnit(unsigned I, unsigned L, DIE *D, AsmPrinter *A, DwarfDebug *DW); 843cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel ~CompileUnit(); 858b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 868b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel // Accessors. 878b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel unsigned getID() const { return ID; } 88438b092a4bba8d766316542ced10b7b028bad82cEric Christopher unsigned getLanguage() const { return Language; } 898b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel DIE* getCUDie() const { return CUDie.get(); } 908b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; } 918b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 920ffe2b4dd6f26fa19827f85bf9e4a766539a859cEric Christopher const StringMap<std::vector<DIE*> > &getAccelNames() const { 930ffe2b4dd6f26fa19827f85bf9e4a766539a859cEric Christopher return AccelNames; 940ffe2b4dd6f26fa19827f85bf9e4a766539a859cEric Christopher } 9509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher const StringMap<std::vector<DIE*> > &getAccelObjC() const { 9609ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher return AccelObjC; 9709ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher } 988bd36eafca6992754006cbace5ba471884631d08Eric Christopher const StringMap<std::vector<DIE*> > &getAccelNamespace() const { 998bd36eafca6992754006cbace5ba471884631d08Eric Christopher return AccelNamespace; 1008bd36eafca6992754006cbace5ba471884631d08Eric Christopher } 101c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher const StringMap<std::vector<std::pair<DIE*, unsigned > > > 102c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher &getAccelTypes() const { 1038bd36eafca6992754006cbace5ba471884631d08Eric Christopher return AccelTypes; 1048bd36eafca6992754006cbace5ba471884631d08Eric Christopher } 10509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher 1068b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// hasContent - Return true if this compile unit has something to write out. 1078b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// 1088b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel bool hasContent() const { return !CUDie->getChildren().empty(); } 1098b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 1108b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// addGlobalType - Add a new global type to the compile unit. 1118b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// 112c20bdf194ad4c824ee6a5f163410d73513ae5c81Devang Patel void addGlobalType(DIType Ty); 1138b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 11409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher 11509ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher /// addAccelName - Add a new name to the name accelerator table. 1160ffe2b4dd6f26fa19827f85bf9e4a766539a859cEric Christopher void addAccelName(StringRef Name, DIE *Die) { 1170ffe2b4dd6f26fa19827f85bf9e4a766539a859cEric Christopher std::vector<DIE*> &DIEs = AccelNames[Name]; 1180ffe2b4dd6f26fa19827f85bf9e4a766539a859cEric Christopher DIEs.push_back(Die); 1190ffe2b4dd6f26fa19827f85bf9e4a766539a859cEric Christopher } 12009ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher void addAccelObjC(StringRef Name, DIE *Die) { 12109ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher std::vector<DIE*> &DIEs = AccelObjC[Name]; 12209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher DIEs.push_back(Die); 12309ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher } 12409ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher void addAccelNamespace(StringRef Name, DIE *Die) { 1258bd36eafca6992754006cbace5ba471884631d08Eric Christopher std::vector<DIE*> &DIEs = AccelNamespace[Name]; 1268bd36eafca6992754006cbace5ba471884631d08Eric Christopher DIEs.push_back(Die); 12709ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher } 128c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher void addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) { 129c36145f19c1e164f7d630b813e9970600d8f2976Eric Christopher std::vector<std::pair<DIE*, unsigned > > &DIEs = AccelTypes[Name]; 1308bd36eafca6992754006cbace5ba471884631d08Eric Christopher DIEs.push_back(Die); 13109ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher } 13209ac3d841367d5d56328eade506c951e0dc3a72dEric Christopher 1338b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// getDIE - Returns the debug information entry map slot for the 1348b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// specified debug variable. 1358b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel DIE *getDIE(const MDNode *N) { return MDNodeToDieMap.lookup(N); } 1368b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 1373cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIEBlock *getDIEBlock() { 1383cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel return new (DIEValueAllocator) DIEBlock(); 1393cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel } 1403cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 1418b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// insertDIE - Insert DIE into the map. 1428b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel void insertDIE(const MDNode *N, DIE *D) { 1438b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel MDNodeToDieMap.insert(std::make_pair(N, D)); 1448b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel } 1458b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 1461585ce7e8c1bd1b3521a9ef4406dbac728685e70Jim Grosbach /// getDIEEntry - Returns the debug information entry for the specified 1478b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// debug variable. 1488b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel DIEEntry *getDIEEntry(const MDNode *N) { 1498b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel DenseMap<const MDNode *, DIEEntry *>::iterator I = 1508b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel MDNodeToDIEEntryMap.find(N); 1518b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel if (I == MDNodeToDIEEntryMap.end()) 1528b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel return NULL; 1538b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel return I->second; 1548b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel } 1558b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 1568b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// insertDIEEntry - Insert debug information entry into the map. 1578b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel void insertDIEEntry(const MDNode *N, DIEEntry *E) { 1588b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel MDNodeToDIEEntryMap.insert(std::make_pair(N, E)); 1598b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel } 1608b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 1618b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// addDie - Adds or interns the DIE to the compile unit. 1628b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel /// 1638b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel void addDie(DIE *Buffer) { 1648b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel this->CUDie->addChild(Buffer); 1658b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel } 1668b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 1678b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel // getIndexTyDie - Get an anonymous type for index type. 1688b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel DIE *getIndexTyDie() { 1698b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel return IndexTyDie; 1708b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel } 1718b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 1728b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel // setIndexTyDie - Set D as anonymous type for index which can be reused 1738b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel // later. 1748b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel void setIndexTyDie(DIE *D) { 1758b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel IndexTyDie = D; 1768b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel } 1773cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelpublic: 1783cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 179873cf0a0d7906083578d9b793008348750636138Eric Christopher /// addFlag - Add a flag that is true to the DIE. 180873cf0a0d7906083578d9b793008348750636138Eric Christopher void addFlag(DIE *Die, unsigned Attribute); 181873cf0a0d7906083578d9b793008348750636138Eric Christopher 1823cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addUInt - Add an unsigned integer attribute data and value. 1833cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// 1843cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addUInt(DIE *Die, unsigned Attribute, unsigned Form, uint64_t Integer); 1853cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 1863cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addSInt - Add an signed integer attribute data and value. 1873cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// 1883cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addSInt(DIE *Die, unsigned Attribute, unsigned Form, int64_t Integer); 1893cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 1903cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addString - Add a string attribute data and value. 1913cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// 192390c40d96adb2eb4a778a0890c6c8743057e289eNick Lewycky void addString(DIE *Die, unsigned Attribute, const StringRef Str); 1933cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 1943cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addLabel - Add a Dwarf label attribute data and value. 1953cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// 1963cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addLabel(DIE *Die, unsigned Attribute, unsigned Form, 1973cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel const MCSymbol *Label); 1983cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 1993cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addDelta - Add a label delta attribute data and value. 2003cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// 2013cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addDelta(DIE *Die, unsigned Attribute, unsigned Form, 2023cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel const MCSymbol *Hi, const MCSymbol *Lo); 2033cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2043cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addDIEEntry - Add a DIE attribute data and value. 2053cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// 2063cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form, DIE *Entry); 2073cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2083cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addBlock - Add block data. 2093cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// 2103cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addBlock(DIE *Die, unsigned Attribute, unsigned Form, DIEBlock *Block); 2113cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2123cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addSourceLine - Add location information to specified debug information 2133cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// entry. 2143cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addSourceLine(DIE *Die, DIVariable V); 2153cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addSourceLine(DIE *Die, DIGlobalVariable G); 2163cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addSourceLine(DIE *Die, DISubprogram SP); 2173cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addSourceLine(DIE *Die, DIType Ty); 2183cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addSourceLine(DIE *Die, DINameSpace NS); 219b8ca98874316bfe8e46b27e7a034a8a764c92e08Eric Christopher void addSourceLine(DIE *Die, DIObjCProperty Ty); 2203cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2213cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addAddress - Add an address attribute to a die based on the location 2223cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// provided. 2233cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addAddress(DIE *Die, unsigned Attribute, 2243cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel const MachineLocation &Location); 2253cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2263cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addConstantValue - Add constant value entry in variable DIE. 227b58128e2b2375173aafb07905bd53014d622e4baDevang Patel bool addConstantValue(DIE *Die, const MachineOperand &MO, DIType Ty); 2288594d429e02c688d428036f8563f09572da3fbffDevang Patel bool addConstantValue(DIE *Die, const ConstantInt *CI, bool Unsigned); 2293cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2303cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addConstantFPValue - Add constant value entry in variable DIE. 2313cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel bool addConstantFPValue(DIE *Die, const MachineOperand &MO); 2323cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2333cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addTemplateParams - Add template parameters in buffer. 2343cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addTemplateParams(DIE &Buffer, DIArray TParams); 2353cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 236116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel /// addRegisterOp - Add register operand. 237116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel void addRegisterOp(DIE *TheDie, unsigned Reg); 238116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel 239116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel /// addRegisterOffset - Add register offset. 240116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel void addRegisterOffset(DIE *TheDie, unsigned Reg, int64_t Offset); 241116da2fbe93861bb60ffff26dce1d0e76d9ccf15Devang Patel 2423cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addComplexAddress - Start with the address based on the location provided, 2433cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// and generate the DWARF information necessary to find the actual variable 2443cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// (navigating the extra location information encoded in the type) based on 2453cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// the starting location. Add the DWARF information to the die. 2463cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// 2473cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addComplexAddress(DbgVariable *&DV, DIE *Die, unsigned Attribute, 2483cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel const MachineLocation &Location); 2493cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2503cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel // FIXME: Should be reformulated in terms of addComplexAddress. 2513cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addBlockByrefAddress - Start with the address based on the location 2523cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// provided, and generate the DWARF information necessary to find the 2533cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// actual Block variable (navigating the Block struct) based on the 2543cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// starting location. Add the DWARF information to the die. Obsolete, 2553cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// please use addComplexAddress instead. 2563cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// 2573cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addBlockByrefAddress(DbgVariable *&DV, DIE *Die, unsigned Attribute, 2583cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel const MachineLocation &Location); 2593cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 260e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel /// addVariableAddress - Add DW_AT_location attribute for a 261e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel /// DbgVariable based on provided MachineLocation. 262e1cdf84ee5ca72a38f4dedd6b12cce21cf83e415Devang Patel void addVariableAddress(DbgVariable *&DV, DIE *Die, MachineLocation Location); 2633cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2643cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// addToContextOwner - Add Die into the list of its context owner's children. 2653cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addToContextOwner(DIE *Die, DIDescriptor Context); 2663cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 267663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher /// addType - Add a new type attribute to the specified entity. This takes 268663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher /// and attribute parameter because DW_AT_friend attributes are also 269663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher /// type references. 270663e0cf73dcf2bfbbfc22b49c739d54916652d1cEric Christopher void addType(DIE *Entity, DIType Ty, unsigned Attribute = dwarf::DW_AT_type); 2713cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2723cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// getOrCreateNameSpace - Create a DIE for DINameSpace. 2733cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *getOrCreateNameSpace(DINameSpace NS); 2743cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 275dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel /// getOrCreateSubprogramDIE - Create new DIE using SP. 276dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel DIE *getOrCreateSubprogramDIE(DISubprogram SP); 277dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 2783cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 2793cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// given DIType. 28094c7ddb6f52a5200983fed0ce74dc602a7737879Devang Patel DIE *getOrCreateTypeDIE(const MDNode *N); 2813cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2823cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE 2833cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// for the given DITemplateTypeParameter. 2843cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP); 2853cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2863cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE 2873cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// for the given DITemplateValueParameter. 2883cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TVP); 2893cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2903cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug 2913cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// information entry. 2923cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIEEntry *createDIEEntry(DIE *Entry); 2933cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2946f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel /// createGlobalVariableDIE - create global variable DIE. 2956f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel void createGlobalVariableDIE(const MDNode *N); 2966f9d8ffe5e47e3d11176298e849cc8545c2169a2Devang Patel 2973cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void addPubTypes(DISubprogram SP); 2983cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 2993cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// constructTypeDIE - Construct basic type die from DIBasicType. 3003cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void constructTypeDIE(DIE &Buffer, 3013cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIBasicType BTy); 3023cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 3033cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// constructTypeDIE - Construct derived type die from DIDerivedType. 3043cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void constructTypeDIE(DIE &Buffer, 3053cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIDerivedType DTy); 3063cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 3073cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// constructTypeDIE - Construct type DIE from DICompositeType. 3083cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void constructTypeDIE(DIE &Buffer, 3093cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DICompositeType CTy); 3103cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 3113cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// constructSubrangeDIE - Construct subrange DIE from DISubrange. 3123cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy); 3133cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 3143cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 3153cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel void constructArrayTypeDIE(DIE &Buffer, 3163cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DICompositeType *CTy); 3173cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 3183cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator. 3193cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *constructEnumTypeDIE(DIEnumerator ETy); 3203cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 321dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel /// constructContainingTypeDIEs - Construct DIEs for types that contain 322dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel /// vtables. 323dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel void constructContainingTypeDIEs(); 324dbc64af76d769596903485668a1dfc2d6640c4fbDevang Patel 325d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel /// constructVariableDIE - Construct a DIE for the given DbgVariable. 326d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel DIE *constructVariableDIE(DbgVariable *DV, bool isScopeAbstract); 327d0b5a5ece4f6bf1a29bacefcdd07eaa7ba83e316Devang Patel 3283cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel /// createMemberDIE - Create new member DIE. 3293cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIE *createMemberDIE(DIDerivedType DT); 3303cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel 3313cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patelprivate: 3328b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 3333cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel // DIEValueAllocator - All DIEValues are allocated through this allocator. 3343cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel BumpPtrAllocator DIEValueAllocator; 3353cbee30eacd5d918a00f21c08dbd10ee9ae73925Devang Patel DIEInteger *DIEIntegerOne; 3368b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel}; 3378b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel 3388b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel} // end llvm namespace 3398b9df62d0227beab8c7adb487fb909e67bbc7237Devang Patel#endif 340