diff options
author | George Rimar <grimar@accesssoftek.com> | 2019-05-07 13:14:18 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2019-05-07 13:14:18 +0000 |
commit | 5c922f698847a7059e9015dcf73721af3be852a3 (patch) | |
tree | 179e98140e648ddea06b05adf55f41afe460ef01 /llvm/tools/llvm-objdump/llvm-objdump.cpp | |
parent | 7399ad31931d1e63ba81937f4128a23add3d3511 (diff) | |
download | bcm5719-llvm-5c922f698847a7059e9015dcf73721af3be852a3.tar.gz bcm5719-llvm-5c922f698847a7059e9015dcf73721af3be852a3.zip |
[llvm-objdump] - Print relocation record in a GNU format.
This fixes the https://bugs.llvm.org/show_bug.cgi?id=41355.
Previously with -r we printed relocation section name instead of the target section name.
It was like this: "RELOCATION RECORDS FOR [.rel.text]"
Now it is: "RELOCATION RECORDS FOR [.text]"
Also when relocation target section has more than one relocation section,
we did not combine the output. Now we do.
Differential revision: https://reviews.llvm.org/D61312
llvm-svn: 360143
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 77307bf6fbb..ea3922bbbb1 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1447,22 +1447,34 @@ void printRelocations(const ObjectFile *Obj) { if (!Obj->isRelocatableObject()) return; + // Build a mapping from relocation target to a vector of relocation + // sections. Usually, there is an only one relocation section for + // each relocated section. + MapVector<SectionRef, std::vector<SectionRef>> SecToRelSec; for (const SectionRef &Section : ToolSectionFilter(*Obj)) { if (Section.relocation_begin() == Section.relocation_end()) continue; + const SectionRef TargetSec = *Section.getRelocatedSection(); + SecToRelSec[TargetSec].push_back(Section); + } + + for (std::pair<SectionRef, std::vector<SectionRef>> &P : SecToRelSec) { StringRef SecName; - error(Section.getName(SecName)); + error(P.first.getName(SecName)); outs() << "RELOCATION RECORDS FOR [" << SecName << "]:\n"; - for (const RelocationRef &Reloc : Section.relocations()) { - uint64_t Address = Reloc.getOffset(); - SmallString<32> RelocName; - SmallString<32> ValueStr; - if (Address < StartAddress || Address > StopAddress || getHidden(Reloc)) - continue; - Reloc.getTypeName(RelocName); - error(getRelocationValueString(Reloc, ValueStr)); - outs() << format(Fmt.data(), Address) << " " << RelocName << " " - << ValueStr << "\n"; + + for (SectionRef Section : P.second) { + for (const RelocationRef &Reloc : Section.relocations()) { + uint64_t Address = Reloc.getOffset(); + SmallString<32> RelocName; + SmallString<32> ValueStr; + if (Address < StartAddress || Address > StopAddress || getHidden(Reloc)) + continue; + Reloc.getTypeName(RelocName); + error(getRelocationValueString(Reloc, ValueStr)); + outs() << format(Fmt.data(), Address) << " " << RelocName << " " + << ValueStr << "\n"; + } } outs() << "\n"; } |