Fix "llvm-objdump -d -r" to show relocations inline for ELF files

This fixes a regression introduced by r182908, which broke
llvm-objdump's ability to display relocations inline in a disassembly
dump for ELF object files.

That change removed a SectionRelocMap from Object/ELF.h, which we
recreate in llvm-objdump.cpp.

I discovered this regression via an out-of-tree test
(test/NaCl/X86/pnacl-hides-sandbox-x86-64.ll) which used llvm-objdump.

Note that the "Unknown" string in the test output on i386 isn't quite
right, but this appears to be a pre-existing bug.

Differential Revision: http://llvm-reviews.chandlerc.com/D2559

llvm-svn: 200090
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 5efb74f..9a56bf9 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -382,7 +382,19 @@
     }
   }
 
+  // Create a mapping, RelocSecs = SectionRelocMap[S], where sections
+  // in RelocSecs contain the relocations for section S.
   error_code EC;
+  std::map<SectionRef, SmallVector<SectionRef, 1> > SectionRelocMap;
+  for (section_iterator I = Obj->begin_sections(), E = Obj->end_sections();
+       I != E; I.increment(EC)) {
+    if (error(EC))
+      break;
+    section_iterator Sec2 = I->getRelocatedSection();
+    if (Sec2 != Obj->end_sections())
+      SectionRelocMap[*Sec2].push_back(*I);
+  }
+
   for (section_iterator I = Obj->begin_sections(), E = Obj->end_sections();
        I != E; I.increment(EC)) {
     if (error(EC))
@@ -423,12 +435,17 @@
     // Make a list of all the relocations for this section.
     std::vector<RelocationRef> Rels;
     if (InlineRelocs) {
-      for (relocation_iterator RI = I->begin_relocations(),
-                               RE = I->end_relocations();
-           RI != RE; RI.increment(EC)) {
-        if (error(EC))
-          break;
-        Rels.push_back(*RI);
+      SmallVectorImpl<SectionRef> *RelocSecs = &SectionRelocMap[*I];
+      for (SmallVectorImpl<SectionRef>::iterator RelocSec = RelocSecs->begin(),
+                                                 E = RelocSecs->end();
+           RelocSec != E; ++RelocSec) {
+        for (relocation_iterator RI = RelocSec->begin_relocations(),
+                                 RE = RelocSec->end_relocations();
+             RI != RE; RI.increment(EC)) {
+          if (error(EC))
+            break;
+          Rels.push_back(*RI);
+        }
       }
     }