summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2017-02-07 09:58:27 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2017-02-07 09:58:27 +0000
commit89108cc1c6dd3b58523f088f0d8de73ce5720dc9 (patch)
tree14f03b3ffdf247602571fc8c468ed2356d7e5fd1
parent84b3cc394d117ee5fed10fe1c0b9e76ad89ff2c9 (diff)
downloadbcm5719-llvm-89108cc1c6dd3b58523f088f0d8de73ce5720dc9.tar.gz
bcm5719-llvm-89108cc1c6dd3b58523f088f0d8de73ce5720dc9.zip
[ELF] - Use SignExtend when reading R_386_PC8, R_386_PC16 addends.
Previously we did not do that. For example, for R_386_PC8, 0xFF addend was not treated as 0xFFFFFFFF(-1), but was 0x000000FF. Recently added checks for R_386_PC8/R_386_PC16 failed because of calculation overflow as a result. Differential revision: https://reviews.llvm.org/D29490 llvm-svn: 294289
-rw-r--r--lld/ELF/Target.cpp6
-rw-r--r--lld/test/ELF/i386-pc8-pc16-addend.s17
2 files changed, 21 insertions, 2 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp
index 4cc8a43b708..8a28f4debe3 100644
--- a/lld/ELF/Target.cpp
+++ b/lld/ELF/Target.cpp
@@ -491,11 +491,13 @@ int64_t X86TargetInfo::getImplicitAddend(const uint8_t *Buf,
default:
return 0;
case R_386_8:
- case R_386_PC8:
return *Buf;
+ case R_386_PC8:
+ return SignExtend64<8>(*Buf);
case R_386_16:
- case R_386_PC16:
return read16le(Buf);
+ case R_386_PC16:
+ return SignExtend64<16>(read16le(Buf));
case R_386_32:
case R_386_GOT32:
case R_386_GOT32X:
diff --git a/lld/test/ELF/i386-pc8-pc16-addend.s b/lld/test/ELF/i386-pc8-pc16-addend.s
new file mode 100644
index 00000000000..9d6424df360
--- /dev/null
+++ b/lld/test/ELF/i386-pc8-pc16-addend.s
@@ -0,0 +1,17 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux-gnu %s -o %t1.o
+
+# RUN: ld.lld %t1.o -o %t.out
+# RUN: llvm-objdump -s -t %t.out | FileCheck %s
+# CHECK: Contents of section .text:
+# CHECK-NEXT: 11000 020000
+## 0x11003 - 0x11000 + addend(-1) = 0x02
+## 0x11003 - 0x11001 + addend(-2) = 0x0000
+# CHECK: SYMBOL TABLE:
+# CHECK: 00011003 .und
+
+.byte und-.-1
+.short und-.-2
+
+.section .und, "ax"
+und:
OpenPOWER on IntegriCloud