[PATCH] D29663: [ELF] - Added partial support for --emit-relocs (no --gc-section case, no /DISCARD/ support) #3

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 8 03:16:51 PST 2017


>> Index: test/ELF/linkerscript/emit-reloc-discard.s
>> ===================================================================
>> --- test/ELF/linkerscript/emit-reloc-discard.s
>> +++ test/ELF/linkerscript/emit-reloc-discard.s
>> @@ -0,0 +1,12 @@
>> +# REQUIRES: x86
>> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
>> +# RUN: echo "SECTIONS { /DISCARD/ : { *(.bbb) } }" > %t.script
>> +# RUN: not ld.lld --emit-relocs --script %t.script %t.o -o %t1 2>&1 | FileCheck %s
>> +
>> +# CHECK: can not discard target section .bbb due to an implementation limitation of --emit-relocs
>
>Leave this out. The idea is to split the patch so that the first one is
>simple. No point adding an error that will be immediately removed on
>the next patch.
>
>> Index: test/ELF/emit-relocs.s
>> ===================================================================
>> --- test/ELF/emit-relocs.s
>> +++ test/ELF/emit-relocs.s
>> @@ -0,0 +1,98 @@
>> +# REQUIRES: x86
>> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
.> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/emit-relocs.s -o %t2.o
>
>Why do you need two files?
>
>> Index: test/ELF/emit-relocs-gc.s
>> ===================================================================
>> --- test/ELF/emit-relocs-gc.s
>> +++ test/ELF/emit-relocs-gc.s
.> @@ -0,0 +1,5 @@
>> +# REQUIRES: x86
>> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
>> +# RUN: not ld.lld --gc-sections --emit-relocs %t1.o -o %t 2>&1 \
>> +# RUN:    | FileCheck -check-prefix=ERR %s
>> +# ERR: --emit-relocs and --gc-sections may not be used together
>
>Leave this out.
>
>> Index: ELF/OutputSections.cpp
>> ===================================================================
>> --- ELF/OutputSections.cpp
>> +++ ELF/OutputSections.cpp
>> @@ -116,7 +116,8 @@
>>    }
>>
>>    uint32_t Type = this->Type;
>> -  if (!Config->Relocatable || (Type != SHT_RELA && Type != SHT_REL))
>> +  if ((!Config->Relocatable && !Config->EmitRelocs) ||
>> +      (Type != SHT_RELA && Type != SHT_REL))
>>      return;
>
>It does look like a Config->copyRelocs() that return
>Config->Relocatable || Config->EmitRelocs would be nice.
>
>> Index: ELF/LinkerScript.cpp
>> ===================================================================
>> --- ELF/LinkerScript.cpp
>> +++ ELF/LinkerScript.cpp
>> @@ -263,11 +263,19 @@
>>    }
>>  }
>>
>> +template <class ELFT> static bool hasRelocs(InputSectionBase<ELFT> *S) {
>> +  return S->AreRelocsRela ? !S->relas().empty() : !S->relas().empty();
>> +}
>> +
>>  template <class ELFT>
>>  void LinkerScript<ELFT>::discard(ArrayRef<InputSectionBase<ELFT> *> V) {
>>    for (InputSectionBase<ELFT> *S : V) {
>>      S->Live = false;
>>      reportDiscarded(S);
>> +
>> +    if (Config->EmitRelocs && hasRelocs(S))
>> +      error("can not discard target section " + S->Name +
>> +            " due to an implementation limitation of --emit-relocs");
>
>Leave this out.
>
>
>>  template <class ELFT>
>>  template <class RelTy>
>>  void InputSection<ELFT>::copyRelocations(uint8_t *Buf, ArrayRef<RelTy> Rels) {
>> @@ -235,7 +235,11 @@
>>
>>      if (Config->Rela)
>>        P->r_addend = getAddend<ELFT>(Rel);
>> -    P->r_offset = RelocatedSection->getOffset(Rel.r_offset);
>> +
>> +    // Output section VA is zero for -r, so r_offset is an offset within the
>> +    // section, but for --emit-relocs it is an absolute address.
>> +    P->r_offset = RelocatedSection->OutSec->Addr +
>> +                  RelocatedSection->getOffset(Rel.r_offset);
>
>s/absolute/virtual/
>
>
>> Index: ELF/Driver.cpp
>> ===================================================================
>> --- ELF/Driver.cpp
>> +++ ELF/Driver.cpp
>> @@ -234,6 +234,11 @@
>>      if (Config->Pie)
>>        error("-r and -pie may not be used together");
>>    }
>> +
>> +  // -emit-relocs and -gc-sections don't conflict in theory, but LLD currently
>> +  // does not support the combination due to an implementation limitation.
>> +  if (Config->EmitRelocs && Config->GcSections)
>> +    error("--emit-relocs and --gc-sections may not be used together");
>
>Leave this out.
>
>Almost there :-)
>
>Cheers,
>Rafael

Thanks for review, all comments addressed in the latest diff.

George.


More information about the llvm-commits mailing list