summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael J. Spencer <bigcheesegs@gmail.com>2015-09-16 02:02:04 +0000
committerMichael J. Spencer <bigcheesegs@gmail.com>2015-09-16 02:02:04 +0000
commit141dd91ac5d089c3ff3c8f8cd050c88c6ba50fc9 (patch)
treee53d18adac1397dea55b64f2a0f55f1923cf91fe
parentf3695c87cd17d4e108c668c6759523aa80abcbc4 (diff)
downloadbcm5719-llvm-141dd91ac5d089c3ff3c8f8cd050c88c6ba50fc9.tar.gz
bcm5719-llvm-141dd91ac5d089c3ff3c8f8cd050c88c6ba50fc9.zip
[elf2] Simplify overflow checks.
llvm-svn: 247768
-rw-r--r--lld/ELF/Writer.cpp20
-rw-r--r--lld/test/elf2/relocation-errors.s2
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
OpenPOWER on IntegriCloud