Fixup for r167558: Store raw pointer (instead of reference) to RelocMap in DIContext...
authorAlexey Samsonov <samsonov@google.com>
Mon, 12 Nov 2012 14:25:36 +0000 (14:25 +0000)
committerAlexey Samsonov <samsonov@google.com>
Mon, 12 Nov 2012 14:25:36 +0000 (14:25 +0000)
llvm-svn: 167728

llvm/include/llvm/DebugInfo/DIContext.h
llvm/lib/DebugInfo/DIContext.cpp
llvm/lib/DebugInfo/DWARFContext.h
llvm/lib/DebugInfo/DWARFFormValue.cpp
llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp

index 26bd1f6..2322341 100644 (file)
@@ -109,7 +109,7 @@ public:
                                     StringRef lineSection = StringRef(),
                                     StringRef stringSection = StringRef(),
                                     StringRef rangeSection = StringRef(),
-                                    const RelocAddrMap &Map = RelocAddrMap());
+                                    const RelocAddrMap *Map = 0);
 
   virtual void dump(raw_ostream &OS) = 0;
 
index 691a92c..6484abc 100644 (file)
@@ -20,7 +20,7 @@ DIContext *DIContext::getDWARFContext(bool isLittleEndian,
                                       StringRef lineSection,
                                       StringRef stringSection,
                                       StringRef rangeSection,
-                                      const RelocAddrMap &Map) {
+                                      const RelocAddrMap *Map) {
   return new DWARFContextInMemory(isLittleEndian, infoSection, abbrevSection,
                                   aRangeSection, lineSection, stringSection,
                                   rangeSection, Map);
index 4001792..d3e9470 100644 (file)
@@ -26,7 +26,7 @@ namespace llvm {
 /// methods that a concrete implementation provides.
 class DWARFContext : public DIContext {
   bool IsLittleEndian;
-  const RelocAddrMap &RelocMap;
+  const RelocAddrMap *RelocMap;
 
   SmallVector<DWARFCompileUnit, 1> CUs;
   OwningPtr<DWARFDebugAbbrev> Abbrev;
@@ -39,7 +39,7 @@ class DWARFContext : public DIContext {
   /// Read compile units from the debug_info section and store them in CUs.
   void parseCompileUnits();
 protected:
-  DWARFContext(bool isLittleEndian, const RelocAddrMap &Map) :
+  DWARFContext(bool isLittleEndian, const RelocAddrMap *Map) :
     IsLittleEndian(isLittleEndian), RelocMap(Map) {}
 public:
   virtual void dump(raw_ostream &OS);
@@ -73,7 +73,7 @@ public:
       DILineInfoSpecifier Specifier = DILineInfoSpecifier());
 
   bool isLittleEndian() const { return IsLittleEndian; }
-  const RelocAddrMap &relocMap() const { return RelocMap; }
+  const RelocAddrMap *relocMap() const { return RelocMap; }
 
   virtual StringRef getInfoSection() = 0;
   virtual StringRef getAbbrevSection() = 0;
@@ -113,7 +113,7 @@ public:
                        StringRef lineSection,
                        StringRef stringSection,
                        StringRef rangeSection,
-                       const RelocAddrMap &Map = RelocAddrMap())
+                       const RelocAddrMap *Map = 0)
     : DWARFContext(isLittleEndian, Map),
       InfoSection(infoSection),
       AbbrevSection(abbrevSection),
index fea9fd7..b75b0c1 100644 (file)
@@ -100,16 +100,20 @@ DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr,
     switch (Form) {
     case DW_FORM_addr:
     case DW_FORM_ref_addr: {
-      RelocAddrMap::const_iterator AI
-        = cu->getContext().relocMap().find(*offset_ptr);
-      if (AI != cu->getContext().relocMap().end()) {
-        const std::pair<uint8_t, int64_t> &R = AI->second;
-        Value.uval = R.second;
-        *offset_ptr += R.first;
-      } else
+      bool InRelocMap = false;
+      if (const RelocAddrMap *RelocMap = cu->getContext().relocMap()) {
+        RelocAddrMap::const_iterator AI = RelocMap->find(*offset_ptr);
+        if (AI != RelocMap->end()) {
+          const std::pair<uint8_t, int64_t> &R = AI->second;
+          Value.uval = R.second;
+          *offset_ptr += R.first;
+          InRelocMap = true;
+        }
+      }
+      if (!InRelocMap)
         Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize());
-    }
       break;
+    }
     case DW_FORM_exprloc:
     case DW_FORM_block:
       Value.uval = data.getULEB128(offset_ptr);
@@ -148,13 +152,17 @@ DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr,
       Value.sval = data.getSLEB128(offset_ptr);
       break;
     case DW_FORM_strp: {
-      RelocAddrMap::const_iterator AI
-        = cu->getContext().relocMap().find(*offset_ptr);
-      if (AI != cu->getContext().relocMap().end()) {
-        const std::pair<uint8_t, int64_t> &R = AI->second;
-        Value.uval = R.second;
-        *offset_ptr += R.first;
-      } else
+      bool InRelocMap = false;
+      if (const RelocAddrMap *RelocMap = cu->getContext().relocMap()) {
+        RelocAddrMap::const_iterator AI = RelocMap->find(*offset_ptr);
+        if (AI != RelocMap->end()) {
+          const std::pair<uint8_t, int64_t> &R = AI->second;
+          Value.uval = R.second;
+          *offset_ptr += R.first;
+          InRelocMap = true;
+        }
+      }
+      if (!InRelocMap)
         Value.uval = data.getU32(offset_ptr);
       break;
     }
index e73300a..c0e3491 100644 (file)
@@ -162,7 +162,7 @@ static void DumpInput(const StringRef &Filename) {
                                                         DebugLineSection,
                                                         DebugStringSection,
                                                         DebugRangesSection,
-                                                        RelocMap));
+                                                        &RelocMap));
   if (Address == -1ULL) {
     outs() << Filename
            << ":\tfile format " << Obj->getFileFormatName() << "\n\n";