summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2017-02-23 06:22:28 +0000
committerPetr Hosek <phosek@chromium.org>2017-02-23 06:22:28 +0000
commitb27bb59a5db3e533a5abb80451848bb49d8e9837 (patch)
tree92694100c6c2f7a6d4bcc09d5d3eec0662a41bc0
parent0d6592a899954772f45a951cb3a48df0268d736d (diff)
downloadbcm5719-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.cpp6
-rw-r--r--lld/ELF/Relocations.cpp9
-rw-r--r--lld/ELF/Relocations.h1
-rw-r--r--lld/ELF/Target.cpp6
-rw-r--r--lld/test/ELF/Inputs/relocatable-non-alloc.s6
-rw-r--r--lld/test/ELF/relocatable-non-alloc.s10
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:
OpenPOWER on IntegriCloud