ARM IAS: support .personalityindex
[oota-llvm.git] / lib / DebugInfo / DWARFContext.h
index 44311b8e842bc168b88b3d03563154d52ac67a4b..9bac69d6e5225ccada077d2cec1334f131f20c13 100644 (file)
@@ -17,6 +17,7 @@
 #include "DWARFDebugLoc.h"
 #include "DWARFDebugRangeList.h"
 #include "DWARFTypeUnit.h"
+#include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/OwningPtr.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/DebugInfo/DIContext.h"
@@ -37,6 +38,7 @@ class DWARFContext : public DIContext {
   OwningPtr<DWARFDebugFrame> DebugFrame;
 
   SmallVector<DWARFCompileUnit *, 1> DWOCUs;
+  SmallVector<DWARFTypeUnit *, 1> DWOTUs;
   OwningPtr<DWARFDebugAbbrev> AbbrevDWO;
 
   DWARFContext(DWARFContext &) LLVM_DELETED_FUNCTION;
@@ -52,6 +54,10 @@ class DWARFContext : public DIContext {
   /// DWOCUs.
   void parseDWOCompileUnits();
 
+  /// Read type units from the debug_types.dwo section and store them in
+  /// DWOTUs.
+  void parseDWOTypeUnits();
+
 public:
   struct Section {
     StringRef Data;
@@ -88,6 +94,13 @@ public:
     return DWOCUs.size();
   }
 
+  /// Get the number of compile units in the DWO context.
+  unsigned getNumDWOTypeUnits() {
+    if (DWOTUs.empty())
+      parseDWOTypeUnits();
+    return DWOTUs.size();
+  }
+
   /// Get the compile unit at the specified index for this compile unit.
   DWARFCompileUnit *getCompileUnitAtIndex(unsigned index) {
     if (CUs.empty())
@@ -109,6 +122,13 @@ public:
     return DWOCUs[index];
   }
 
+  /// Get the type unit at the specified index for the DWO type units.
+  DWARFTypeUnit *getDWOTypeUnitAtIndex(unsigned index) {
+    if (DWOTUs.empty())
+      parseDWOTypeUnits();
+    return DWOTUs[index];
+  }
+
   /// Get a pointer to the parsed DebugAbbrev object.
   const DWARFDebugAbbrev *getDebugAbbrev();
 
@@ -138,7 +158,9 @@ public:
   virtual bool isLittleEndian() const = 0;
   virtual uint8_t getAddressSize() const = 0;
   virtual const Section &getInfoSection() = 0;
-  virtual const std::map<object::SectionRef, Section> &getTypesSections() = 0;
+  typedef MapVector<object::SectionRef, Section,
+                    std::map<object::SectionRef, unsigned> > TypeSectionMap;
+  virtual const TypeSectionMap &getTypesSections() = 0;
   virtual StringRef getAbbrevSection() = 0;
   virtual const Section &getLocSection() = 0;
   virtual StringRef getARangeSection() = 0;
@@ -147,11 +169,13 @@ public:
   virtual StringRef getStringSection() = 0;
   virtual StringRef getRangeSection() = 0;
   virtual StringRef getPubNamesSection() = 0;
+  virtual StringRef getPubTypesSection() = 0;
   virtual StringRef getGnuPubNamesSection() = 0;
   virtual StringRef getGnuPubTypesSection() = 0;
 
   // Sections for DWARF5 split dwarf proposal.
   virtual const Section &getInfoDWOSection() = 0;
+  virtual const TypeSectionMap &getTypesDWOSections() = 0;
   virtual StringRef getAbbrevDWOSection() = 0;
   virtual StringRef getStringDWOSection() = 0;
   virtual StringRef getStringOffsetDWOSection() = 0;
@@ -178,7 +202,7 @@ class DWARFContextInMemory : public DWARFContext {
   bool IsLittleEndian;
   uint8_t AddressSize;
   Section InfoSection;
-  std::map<object::SectionRef, Section> TypesSections;
+  TypeSectionMap TypesSections;
   StringRef AbbrevSection;
   Section LocSection;
   StringRef ARangeSection;
@@ -187,11 +211,13 @@ class DWARFContextInMemory : public DWARFContext {
   StringRef StringSection;
   StringRef RangeSection;
   StringRef PubNamesSection;
+  StringRef PubTypesSection;
   StringRef GnuPubNamesSection;
   StringRef GnuPubTypesSection;
 
   // Sections for DWARF5 split dwarf proposal.
   Section InfoDWOSection;
+  TypeSectionMap TypesDWOSections;
   StringRef AbbrevDWOSection;
   StringRef StringDWOSection;
   StringRef StringOffsetDWOSection;
@@ -206,9 +232,7 @@ public:
   virtual bool isLittleEndian() const { return IsLittleEndian; }
   virtual uint8_t getAddressSize() const { return AddressSize; }
   virtual const Section &getInfoSection() { return InfoSection; }
-  virtual const std::map<object::SectionRef, Section> &getTypesSections() {
-    return TypesSections;
-  }
+  virtual const TypeSectionMap &getTypesSections() { return TypesSections; }
   virtual StringRef getAbbrevSection() { return AbbrevSection; }
   virtual const Section &getLocSection() { return LocSection; }
   virtual StringRef getARangeSection() { return ARangeSection; }
@@ -217,11 +241,15 @@ public:
   virtual StringRef getStringSection() { return StringSection; }
   virtual StringRef getRangeSection() { return RangeSection; }
   virtual StringRef getPubNamesSection() { return PubNamesSection; }
+  virtual StringRef getPubTypesSection() { return PubTypesSection; }
   virtual StringRef getGnuPubNamesSection() { return GnuPubNamesSection; }
   virtual StringRef getGnuPubTypesSection() { return GnuPubTypesSection; }
 
   // Sections for DWARF5 split dwarf proposal.
   virtual const Section &getInfoDWOSection() { return InfoDWOSection; }
+  virtual const TypeSectionMap &getTypesDWOSections() {
+    return TypesDWOSections;
+  }
   virtual StringRef getAbbrevDWOSection() { return AbbrevDWOSection; }
   virtual StringRef getStringDWOSection() { return StringDWOSection; }
   virtual StringRef getStringOffsetDWOSection() {