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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200090 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mark Seaborn
2014-01-25 17:38:19 +00:00
parent 858594edb0
commit 2effd6cdc1
2 changed files with 58 additions and 6 deletions

View File

@@ -382,7 +382,19 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
}
}
// 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 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
// 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);
}
}
}