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