summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-objdump/llvm-objdump.cpp
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-05-07 13:14:18 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-05-07 13:14:18 +0000
commit5c922f698847a7059e9015dcf73721af3be852a3 (patch)
tree179e98140e648ddea06b05adf55f41afe460ef01 /llvm/tools/llvm-objdump/llvm-objdump.cpp
parent7399ad31931d1e63ba81937f4128a23add3d3511 (diff)
downloadbcm5719-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.cpp34
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";
}
OpenPOWER on IntegriCloud