Index: llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h =================================================================== --- llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h +++ llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h @@ -161,7 +161,7 @@ llvm::yaml::Hex64 Offset; int64_t Addend; ELF_REL Type; - StringRef Symbol; + Optional Symbol; }; struct RelocationSection : Section { Index: llvm/trunk/lib/ObjectYAML/ELFYAML.cpp =================================================================== --- llvm/trunk/lib/ObjectYAML/ELFYAML.cpp +++ llvm/trunk/lib/ObjectYAML/ELFYAML.cpp @@ -853,7 +853,7 @@ assert(Object && "The IO context is not initialized"); IO.mapRequired("Offset", Rel.Offset); - IO.mapRequired("Symbol", Rel.Symbol); + IO.mapOptional("Symbol", Rel.Symbol); if (Object->Header.Machine == ELFYAML::ELF_EM(ELF::EM_MIPS) && Object->Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64)) { Index: llvm/trunk/test/tools/yaml2obj/invalid-symboless-relocation.yaml =================================================================== --- llvm/trunk/test/tools/yaml2obj/invalid-symboless-relocation.yaml +++ llvm/trunk/test/tools/yaml2obj/invalid-symboless-relocation.yaml @@ -0,0 +1,29 @@ +# This test succeeds but produces an invalid relocation. This test +# documents this behavoir. +# RUN: yaml2obj %s > %t +# RUN: llvm-readobj -relocations %t | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Content: "00000000" + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + Relocations: + - Offset: 0x1000 + Type: R_X86_64_PC32 + +#CHECK: Relocations [ +#CHECK-NEXT: Section (2) .rel.text { +#CHECK-NEXT: 0x1000 R_X86_64_PC32 - 0x0 +#CHECK-NEXT: } +#CHECK-NEXT:] Index: llvm/trunk/test/tools/yaml2obj/symboless-relocation.yaml =================================================================== --- llvm/trunk/test/tools/yaml2obj/symboless-relocation.yaml +++ llvm/trunk/test/tools/yaml2obj/symboless-relocation.yaml @@ -0,0 +1,21 @@ +# Just make sure this isn't an error even though it has no Symbol +# RUN: yaml2obj %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Content: "00000000" + - Name: .rel.text + Type: SHT_REL + Link: .symtab + Info: .text + Relocations: + - Offset: 0x1000 + Type: R_X86_64_RELATIVE Index: llvm/trunk/tools/yaml2obj/yaml2elf.cpp =================================================================== --- llvm/trunk/tools/yaml2obj/yaml2elf.cpp +++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp @@ -459,7 +459,8 @@ // Some special relocation, R_ARM_v4BX for instance, does not have // an external reference. So it ignores the return value of lookup() // here. - SymN2I.lookup(Rel.Symbol, SymIdx); + if (Rel.Symbol) + SymN2I.lookup(*Rel.Symbol, SymIdx); if (IsRela) { Elf_Rela REntry;