diff options
| author | George Rimar <grimar@accesssoftek.com> | 2017-02-07 09:58:27 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2017-02-07 09:58:27 +0000 |
| commit | 89108cc1c6dd3b58523f088f0d8de73ce5720dc9 (patch) | |
| tree | 14f03b3ffdf247602571fc8c468ed2356d7e5fd1 | |
| parent | 84b3cc394d117ee5fed10fe1c0b9e76ad89ff2c9 (diff) | |
| download | bcm5719-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.cpp | 6 | ||||
| -rw-r--r-- | lld/test/ELF/i386-pc8-pc16-addend.s | 17 |
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: |

