diff --git a/llvm/test/tools/llvm-readobj/ELF/llvm-vs-json-format.test b/llvm/test/tools/llvm-readobj/ELF/llvm-vs-json-format.test --- a/llvm/test/tools/llvm-readobj/ELF/llvm-vs-json-format.test +++ b/llvm/test/tools/llvm-readobj/ELF/llvm-vs-json-format.test @@ -15,15 +15,15 @@ # LLVM: Other: 0 # JSON: "Name": { -# JSON-NEXT: "Value": "", +# JSON-NEXT: "Name": "", # JSON: "Other": { -# JSON-NEXT: "RawFlags": 0, +# JSON-NEXT: "Value": 0, # JSON-NEXT: "Flags": [] # JSON-NEXT: }, # JSON: "Name": { -# JSON-NEXT: "Value": "foo", +# JSON-NEXT: "Name": "foo", # JSON: "Other": { -# JSON-NEXT: "RawFlags": 128, +# JSON-NEXT: "Value": 128, # JSON-NEXT: "Flags": [ # JSON-NEXT: { # JSON-NEXT: "Name": "STO_AARCH64_VARIANT_PCS", @@ -33,9 +33,9 @@ # JSON-NEXT: }, # JSON: "Name": { -# JSON-NEXT: "Value": "bar", +# JSON-NEXT: "Name": "bar", # JSON: "Other": { -# JSON-NEXT: "RawFlags": 0, +# JSON-NEXT: "Value": 0, # JSON-NEXT: "Flags": [] # JSON-NEXT: }, @@ -76,17 +76,20 @@ # LLVM-64-NEXT: } # LLVM-64-NEXT:] -# JSON-64: "Relocations": [Section (2) .rel.text { -# JSON-64: { -# JSON-64-NEXT: "Relocation": { +# JSON-64: "Relocations": [ +# JSON-64-NEXT: { +# JSON-64-NEXT: "SectionIdx": 2, +# JSON-64-NEXT: "Relocs": [ +# JSON-64-NEXT: { +# JSON-64-NEXT: "Relocation": { # JSON-64-NEXT: "Offset": 0, # JSON-64-NEXT: "Type": { -# JSON-64-NEXT: "Value": "R_X86_64_NONE", -# JSON-64-NEXT: "RawValue": 0 +# JSON-64-NEXT: "Name": "R_X86_64_NONE", +# JSON-64-NEXT: "Value": 0 # JSON-64-NEXT: }, # JSON-64-NEXT: "Symbol": { -# JSON-64-NEXT: "Value": "rel_0", -# JSON-64-NEXT: "RawValue": 1 +# JSON-64-NEXT: "Name": "rel_0", +# JSON-64-NEXT: "Value": 1 # JSON-64-NEXT: } # JSON-64-NEXT: } # JSON-64-NEXT: }, @@ -94,12 +97,12 @@ # JSON-64-NEXT: "Relocation": { # JSON-64-NEXT: "Offset": 1, # JSON-64-NEXT: "Type": { -# JSON-64-NEXT: "Value": "R_X86_64_PC32", -# JSON-64-NEXT: "RawValue": 2 +# JSON-64-NEXT: "Name": "R_X86_64_PC32", +# JSON-64-NEXT: "Value": 2 # JSON-64-NEXT: }, # JSON-64-NEXT: "Symbol": { -# JSON-64-NEXT: "Value": "rel_neg", -# JSON-64-NEXT: "RawValue": 2 +# JSON-64-NEXT: "Name": "rel_neg", +# JSON-64-NEXT: "Value": 2 # JSON-64-NEXT: } # JSON-64-NEXT: } # JSON-64-NEXT: }, @@ -107,12 +110,12 @@ # JSON-64-NEXT: "Relocation": { # JSON-64-NEXT: "Offset": 5, # JSON-64-NEXT: "Type": { -# JSON-64-NEXT: "Value": "R_X86_64_PLT32", -# JSON-64-NEXT: "RawValue": 4 +# JSON-64-NEXT: "Name": "R_X86_64_PLT32", +# JSON-64-NEXT: "Value": 4 # JSON-64-NEXT: }, # JSON-64-NEXT: "Symbol": { -# JSON-64-NEXT: "Value": "rel_pos", -# JSON-64-NEXT: "RawValue": 3 +# JSON-64-NEXT: "Name": "rel_pos", +# JSON-64-NEXT: "Value": 3 # JSON-64-NEXT: } # JSON-64-NEXT: } # JSON-64-NEXT: }, @@ -120,27 +123,30 @@ # JSON-64-NEXT: "Relocation": { # JSON-64-NEXT: "Offset": 9, # JSON-64-NEXT: "Type": { -# JSON-64-NEXT: "Value": "R_X86_64_64", -# JSON-64-NEXT: "RawValue": 1 +# JSON-64-NEXT: "Name": "R_X86_64_64", +# JSON-64-NEXT: "Value": 1 # JSON-64-NEXT: }, # JSON-64-NEXT: "Symbol": { -# JSON-64-NEXT: "Value": "rel_64", -# JSON-64-NEXT: "RawValue": 4 +# JSON-64-NEXT: "Name": "rel_64", +# JSON-64-NEXT: "Value": 4 # JSON-64-NEXT: } # JSON-64-NEXT: } -# JSON-64-NEXT: }} -# JSON-64-NEXT: Section (3) .rela.text { -# JSON-64-NEXT: , -# JSON-64-NEXT: { +# JSON-64-NEXT: } +# JSON-64-NEXT: ] +# JSON-64-NEXT: }, +# JSON-64-NEXT: { +# JSON-64-NEXT: "SectionIdx": 3, +# JSON-64-NEXT: "Relocs": [ +# JSON-64-NEXT: { # JSON-64-NEXT: "Relocation": { # JSON-64-NEXT: "Offset": 0, # JSON-64-NEXT: "Type": { -# JSON-64-NEXT: "Value": "R_X86_64_NONE", -# JSON-64-NEXT: "RawValue": 0 +# JSON-64-NEXT: "Name": "R_X86_64_NONE", +# JSON-64-NEXT: "Value": 0 # JSON-64-NEXT: }, # JSON-64-NEXT: "Symbol": { -# JSON-64-NEXT: "Value": "rela_0", -# JSON-64-NEXT: "RawValue": 5 +# JSON-64-NEXT: "Name": "rela_0", +# JSON-64-NEXT: "Value": 5 # JSON-64-NEXT: }, # JSON-64-NEXT: "Addend": 0 # JSON-64-NEXT: } @@ -149,12 +155,12 @@ # JSON-64-NEXT: "Relocation": { # JSON-64-NEXT: "Offset": 1, # JSON-64-NEXT: "Type": { -# JSON-64-NEXT: "Value": "R_X86_64_PC32", -# JSON-64-NEXT: "RawValue": 2 +# JSON-64-NEXT: "Name": "R_X86_64_PC32", +# JSON-64-NEXT: "Value": 2 # JSON-64-NEXT: }, # JSON-64-NEXT: "Symbol": { -# JSON-64-NEXT: "Value": "rela_neg", -# JSON-64-NEXT: "RawValue": 6 +# JSON-64-NEXT: "Name": "rela_neg", +# JSON-64-NEXT: "Value": 6 # JSON-64-NEXT: }, # JSON-64-NEXT: "Addend": 18446744073709551615 # JSON-64-NEXT: } @@ -163,12 +169,12 @@ # JSON-64-NEXT: "Relocation": { # JSON-64-NEXT: "Offset": 5, # JSON-64-NEXT: "Type": { -# JSON-64-NEXT: "Value": "R_X86_64_PLT32", -# JSON-64-NEXT: "RawValue": 4 +# JSON-64-NEXT: "Name": "R_X86_64_PLT32", +# JSON-64-NEXT: "Value": 4 # JSON-64-NEXT: }, # JSON-64-NEXT: "Symbol": { -# JSON-64-NEXT: "Value": "rela_pos", -# JSON-64-NEXT: "RawValue": 7 +# JSON-64-NEXT: "Name": "rela_pos", +# JSON-64-NEXT: "Value": 7 # JSON-64-NEXT: }, # JSON-64-NEXT: "Addend": 2 # JSON-64-NEXT: } @@ -177,12 +183,12 @@ # JSON-64-NEXT: "Relocation": { # JSON-64-NEXT: "Offset": 18446744073709551615, # JSON-64-NEXT: "Type": { -# JSON-64-NEXT: "Value": "R_X86_64_64", -# JSON-64-NEXT: "RawValue": 1 +# JSON-64-NEXT: "Name": "R_X86_64_64", +# JSON-64-NEXT: "Value": 1 # JSON-64-NEXT: }, # JSON-64-NEXT: "Symbol": { -# JSON-64-NEXT: "Value": "rela_minneg", -# JSON-64-NEXT: "RawValue": 8 +# JSON-64-NEXT: "Name": "rela_minneg", +# JSON-64-NEXT: "Value": 8 # JSON-64-NEXT: }, # JSON-64-NEXT: "Addend": 9223372036854775808 # JSON-64-NEXT: } @@ -191,17 +197,19 @@ # JSON-64-NEXT: "Relocation": { # JSON-64-NEXT: "Offset": 9, # JSON-64-NEXT: "Type": { -# JSON-64-NEXT: "Value": "R_X86_64_32S", -# JSON-64-NEXT: "RawValue": 11 +# JSON-64-NEXT: "Name": "R_X86_64_32S", +# JSON-64-NEXT: "Value": 11 # JSON-64-NEXT: }, # JSON-64-NEXT: "Symbol": { -# JSON-64-NEXT: "Value": "rela_maxpos", -# JSON-64-NEXT: "RawValue": 9 +# JSON-64-NEXT: "Name": "rela_maxpos", +# JSON-64-NEXT: "Value": 9 # JSON-64-NEXT: }, # JSON-64-NEXT: "Addend": 9223372036854775807 # JSON-64-NEXT: } -# JSON-64-NEXT: }} -# JSON-64: ] +# JSON-64-NEXT: } +# JSON-64-NEXT: ] +# JSON-64-NEXT: } +# JSON-64-NEXT: ] ## Show that --expand-relocs expands the relocation dump for LLVM style but ## the JSON output is always expanded diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -714,6 +714,8 @@ virtual void printDefaultRelRelaReloc(const Relocation &R, const StringRef SymbolName, const StringRef RelocName); + virtual void printRelocationInfo(const Elf_Shdr &Sec, const StringRef Name, + const unsigned SecNdx); ScopedPrinter &W; }; @@ -736,6 +738,9 @@ const StringRef SymbolName, const StringRef RelocName) override; + void printRelocationInfo(const Elf_Shdr &Sec, const StringRef Name, + const unsigned SecNdx) override; + private: std::unique_ptr FileScope; }; @@ -6670,11 +6675,7 @@ StringRef Name = this->getPrintableSectionName(Sec); unsigned SecNdx = &Sec - &cantFail(this->Obj.sections()).front(); - W.startLine() << "Section (" << SecNdx << ") " << Name << " {\n"; - W.indent(); - this->printRelocationsHelper(Sec); - W.unindent(); - W.startLine() << "}\n"; + printRelocationInfo(Sec, Name, SecNdx); } } @@ -6707,6 +6708,17 @@ OS << "\n"; } +template +void LLVMELFDumper::printRelocationInfo(const Elf_Shdr &Sec, + const StringRef Name, + const unsigned SecNdx) { + W.startLine() << "Section (" << SecNdx << ") " << Name << " {\n"; + W.indent(); + this->printRelocationsHelper(Sec); + W.unindent(); + W.startLine() << "}\n"; +} + template void LLVMELFDumper::printRelRelaReloc(const Relocation &R, const RelSymbol &RelSym) { @@ -7604,3 +7616,13 @@ const StringRef RelocName) { this->printExpandedRelRelaReloc(R, SymbolName, RelocName); } + +template +void JSONELFDumper::printRelocationInfo(const Elf_Shdr &Sec, + const StringRef Name, + const unsigned SecNdx) { + DictScope Group(this->W); + this->W.printNumber("SectionIdx", SecNdx); + ListScope D(this->W, "Relocs"); + this->printRelocationsHelper(Sec); +}