diff --git a/llvm/test/tools/obj2yaml/elf-ppc64-relocations.yaml b/llvm/test/tools/obj2yaml/elf-ppc64-relocations.yaml --- a/llvm/test/tools/obj2yaml/elf-ppc64-relocations.yaml +++ b/llvm/test/tools/obj2yaml/elf-ppc64-relocations.yaml @@ -16,280 +16,188 @@ # CHECK-NEXT: EntSize: 0x0000000000000018 # CHECK-NEXT: Relocations: # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_NONE # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR32 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR24 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_LO # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_HA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR14 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR14_BRTAKEN # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR14_BRNTAKEN # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL24 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL14 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL14_BRTAKEN # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL14_BRNTAKEN # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT16 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT16_LO # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT16_HA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GLOB_DAT # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_JMP_SLOT # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_RELATIVE # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL32 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR64 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_HIGHER # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_HIGHERA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_HIGHEST # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_HIGHESTA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL64 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TOC16 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TOC16_LO # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TOC16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TOC16_HA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TOC # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_LO_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT16_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT16_LO_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TOC16_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TOC16_LO_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TLS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPMOD64 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_LO # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_HA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL64 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_LO # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_HA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL64 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TLSGD16 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TLSGD16_LO # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TLSGD16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TLSGD16_HA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TLSLD16 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TLSLD16_LO # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TLSLD16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TLSLD16_HA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TPREL16_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TPREL16_LO_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TPREL16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_TPREL16_HA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_DTPREL16_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_DTPREL16_LO_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_DTPREL16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_GOT_DTPREL16_HA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_LO_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_HIGHER # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_HIGHERA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_HIGHEST # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_HIGHESTA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_LO_DS # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_HIGHER # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_HIGHERA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_HIGHEST # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_HIGHESTA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TLSGD # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TLSLD # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_HIGH # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_ADDR16_HIGHA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_HIGH # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_TPREL16_HIGHA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_HIGH # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_DTPREL16_HIGHA # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_IRELATIVE # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL16 # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL16_LO # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL16_HI # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_PPC64_REL16_HA --- !ELF diff --git a/llvm/test/tools/obj2yaml/no-symbol-reloc.test b/llvm/test/tools/obj2yaml/no-symbol-reloc.test --- a/llvm/test/tools/obj2yaml/no-symbol-reloc.test +++ b/llvm/test/tools/obj2yaml/no-symbol-reloc.test @@ -21,10 +21,8 @@ # CHECK-NEXT: Info: .text # CHECK-NEXT: Relocations: # CHECK-NEXT: - Offset: 0x0000000000000000 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_X86_64_NONE # CHECK-NEXT: - Offset: 0x0000000000000004 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: R_X86_64_NONE # CHECK-NEXT: Symbols: [] # CHECK-NEXT: ... diff --git a/llvm/test/tools/obj2yaml/relocation-unsupported-machine.yaml b/llvm/test/tools/obj2yaml/relocation-unsupported-machine.yaml --- a/llvm/test/tools/obj2yaml/relocation-unsupported-machine.yaml +++ b/llvm/test/tools/obj2yaml/relocation-unsupported-machine.yaml @@ -16,10 +16,8 @@ # CHECK-NEXT: EntSize: 0x0000000000000018 # CHECK-NEXT: Relocations: # CHECK-NEXT: - Offset: 0x0000000000000001 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: 0x00000002 # CHECK-NEXT: - Offset: 0x0000000000000003 -# CHECK-NEXT: Symbol: '' # CHECK-NEXT: Type: 0x00000004 --- !ELF diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -409,27 +409,25 @@ auto SymOrErr = Obj.getRelocationSymbol(Rel, SymTab); if (!SymOrErr) return SymOrErr.takeError(); + + // We have might have a relocation with symbol index 0, + // e.g. R_X86_64_NONE or R_X86_64_GOTPC32. const Elf_Sym *Sym = *SymOrErr; + if (!Sym) + return Error::success(); + auto StrTabSec = Obj.getSection(SymTab->sh_link); if (!StrTabSec) return StrTabSec.takeError(); auto StrTabOrErr = Obj.getStringTable(*StrTabSec); if (!StrTabOrErr) return StrTabOrErr.takeError(); - StringRef StrTab = *StrTabOrErr; - if (Sym) { - Expected NameOrErr = getUniquedSymbolName(Sym, StrTab, SymTab); - if (!NameOrErr) - return NameOrErr.takeError(); - R.Symbol = NameOrErr.get(); - } else { - // We have some edge cases of relocations without a symbol associated, - // e.g. an object containing the invalid (according to the System V - // ABI) R_X86_64_NONE reloc. Create a symbol with an empty name instead - // of crashing. - R.Symbol = ""; - } + Expected NameOrErr = + getUniquedSymbolName(Sym, *StrTabOrErr, SymTab); + if (!NameOrErr) + return NameOrErr.takeError(); + R.Symbol = NameOrErr.get(); return Error::success(); }