diff options
author | Petr Hosek <phosek@chromium.org> | 2017-02-23 06:22:28 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2017-02-23 06:22:28 +0000 |
commit | b27bb59a5db3e533a5abb80451848bb49d8e9837 (patch) | |
tree | 92694100c6c2f7a6d4bcc09d5d3eec0662a41bc0 | |
parent | 0d6592a899954772f45a951cb3a48df0268d736d (diff) | |
download | bcm5719-llvm-b27bb59a5db3e533a5abb80451848bb49d8e9837.tar.gz bcm5719-llvm-b27bb59a5db3e533a5abb80451848bb49d8e9837.zip |
[ELF] Ignore R_*_NONE relocs when relocating non-alloc sections
We shouldn't report an error for R_*_NONE relocs since we're emitting
them when writing relocations to discarded sections.
Differential Revision: https://reviews.llvm.org/D30279
llvm-svn: 295936
-rw-r--r-- | lld/ELF/InputSection.cpp | 6 | ||||
-rw-r--r-- | lld/ELF/Relocations.cpp | 9 | ||||
-rw-r--r-- | lld/ELF/Relocations.h | 1 | ||||
-rw-r--r-- | lld/ELF/Target.cpp | 6 | ||||
-rw-r--r-- | lld/test/ELF/Inputs/relocatable-non-alloc.s | 6 | ||||
-rw-r--r-- | lld/test/ELF/relocatable-non-alloc.s | 10 |
6 files changed, 31 insertions, 7 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 66405f1d2a5..4fae7dd0d3b 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -308,6 +308,7 @@ getRelocTargetVA(uint32_t Type, int64_t A, typename ELFT::uint P, const SymbolBody &Body, RelExpr Expr) { switch (Expr) { case R_HINT: + case R_NONE: case R_TLSDESC_CALL: llvm_unreachable("cannot relocate hint relocs"); case R_TLSLD: @@ -459,7 +460,10 @@ void InputSection<ELFT>::relocateNonAlloc(uint8_t *Buf, ArrayRef<RelTy> Rels) { Addend += Target->getImplicitAddend(BufLoc, Type); SymbolBody &Sym = this->getFile<ELFT>()->getRelocTargetSym(Rel); - if (Target->getRelExpr(Type, Sym) != R_ABS) { + RelExpr Expr = Target->getRelExpr(Type, Sym); + if (Expr == R_NONE) + continue; + if (Expr != R_ABS) { error(this->getLocation<ELFT>(Offset) + ": has non-ABS reloc"); return; } diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index 731023dc244..871b1b0d37f 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -694,6 +694,11 @@ static void scanRelocs(InputSectionBase &C, ArrayRef<RelTy> Rels) { reportUndefined<ELFT>(Body, C, RI.r_offset); RelExpr Expr = Target->getRelExpr(Type, Body); + + // Ignore "hint" relocations because they are only markers for relaxation. + if (isRelExprOneOf<R_HINT, R_NONE>(Expr)) + continue; + bool Preemptible = isPreemptible(Body, Type); Expr = adjustExpr(*File, Body, IsWrite, Expr, Type, Buf + RI.r_offset, C, RI.r_offset); @@ -732,9 +737,7 @@ static void scanRelocs(InputSectionBase &C, ArrayRef<RelTy> Rels) { continue; } - // Ignore "hint" and TLS Descriptor call relocation because they are - // only markers for relaxation. - if (isRelExprOneOf<R_HINT, R_TLSDESC_CALL>(Expr)) + if (Expr == R_TLSDESC_CALL) continue; if (needsPlt(Expr) || diff --git a/lld/ELF/Relocations.h b/lld/ELF/Relocations.h index 1512a674480..f531b99f1b9 100644 --- a/lld/ELF/Relocations.h +++ b/lld/ELF/Relocations.h @@ -42,6 +42,7 @@ enum RelExpr { R_MIPS_TLSGD, R_MIPS_TLSLD, R_NEG_TLS, + R_NONE, R_PAGE_PC, R_PC, R_PLT, diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 08ef75d1665..a05ff79a6d9 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -389,7 +389,7 @@ RelExpr X86TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { case R_386_TLS_LE_32: return R_NEG_TLS; case R_386_NONE: - return R_HINT; + return R_NONE; default: error(toString(S.File) + ": unknown relocation type: " + toString(Type)); return R_HINT; @@ -684,7 +684,7 @@ RelExpr X86_64TargetInfo<ELFT>::getRelExpr(uint32_t Type, case R_X86_64_GOTTPOFF: return R_GOT_PC; case R_X86_64_NONE: - return R_HINT; + return R_NONE; default: error(toString(S.File) + ": unknown relocation type: " + toString(Type)); return R_HINT; @@ -1715,7 +1715,7 @@ RelExpr ARMTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { case R_ARM_THM_MOVT_PREL: return R_PC; case R_ARM_NONE: - return R_HINT; + return R_NONE; case R_ARM_TLS_LE32: return R_TLS; } diff --git a/lld/test/ELF/Inputs/relocatable-non-alloc.s b/lld/test/ELF/Inputs/relocatable-non-alloc.s new file mode 100644 index 00000000000..26a9d87db75 --- /dev/null +++ b/lld/test/ELF/Inputs/relocatable-non-alloc.s @@ -0,0 +1,6 @@ +.section .text.foo,"axG",@progbits,foo,comdat,unique,0 +foo: + nop + +.section .debug_info +.long .text.foo diff --git a/lld/test/ELF/relocatable-non-alloc.s b/lld/test/ELF/relocatable-non-alloc.s new file mode 100644 index 00000000000..f1915800c77 --- /dev/null +++ b/lld/test/ELF/relocatable-non-alloc.s @@ -0,0 +1,10 @@ +# 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 %S/Inputs/relocatable-non-alloc.s -o %t2.o +# RUN: ld.lld %t2.o %t2.o -r -o %t3.o +# RUN: ld.lld %t1.o %t3.o -o %t.o | FileCheck -allow-empty %s + +# CHECK-NOT: has non-ABS reloc + +.globl _start +_start: |