diff options
| author | Michael J. Spencer <bigcheesegs@gmail.com> | 2015-09-16 02:02:04 +0000 |
|---|---|---|
| committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2015-09-16 02:02:04 +0000 |
| commit | 141dd91ac5d089c3ff3c8f8cd050c88c6ba50fc9 (patch) | |
| tree | e53d18adac1397dea55b64f2a0f55f1923cf91fe | |
| parent | f3695c87cd17d4e108c668c6759523aa80abcbc4 (diff) | |
| download | bcm5719-llvm-141dd91ac5d089c3ff3c8f8cd050c88c6ba50fc9.tar.gz bcm5719-llvm-141dd91ac5d089c3ff3c8f8cd050c88c6ba50fc9.zip | |
[elf2] Simplify overflow checks.
llvm-svn: 247768
| -rw-r--r-- | lld/ELF/Writer.cpp | 20 | ||||
| -rw-r--r-- | lld/test/elf2/relocation-errors.s | 2 |
2 files changed, 8 insertions, 14 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 5c27c418314..073f3a98d06 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -14,7 +14,6 @@ #include "Symbols.h" #include "SymbolTable.h" -#include "llvm/ADT/APInt.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/STLExtras.h" #include "llvm/MC/StringTableBuilder.h" @@ -502,18 +501,13 @@ template <class ELFT> void OutputSection<ELFT>::writeTo(uint8_t *Buf) { break; case llvm::ELF::R_X86_64_32: { case llvm::ELF::R_X86_64_32S: - APInt VA(64, SymVA); - APInt Addend(64, RI.r_addend, true); - APInt Result64 = VA + Addend; - APInt Result = Result64.trunc(32); - if (Type == llvm::ELF::R_X86_64_32) { - if (Result.zext(64) != Result64) - error("Relocation out of range"); - } else - if (Result.sext(64) != Result64) - error("R_X86_64_32S out of range"); - - support::endian::write32le(Location, Result.getZExtValue()); + uint64_t VA = SymVA + RI.r_addend; + if (Type == llvm::ELF::R_X86_64_32 && !isUInt<32>(VA)) + error("R_X86_64_32 out of range"); + else if (!isInt<32>(VA)) + error("R_X86_64_32S out of range"); + + support::endian::write32le(Location, VA); break; } default: diff --git a/lld/test/elf2/relocation-errors.s b/lld/test/elf2/relocation-errors.s index 485d5d03ade..7cdcc947f63 100644 --- a/lld/test/elf2/relocation-errors.s +++ b/lld/test/elf2/relocation-errors.s @@ -7,4 +7,4 @@ _start: movl $big, %edx -#CHECK: Relocation out of range +#CHECK: R_X86_64_32 out of range |

