diff options
| author | Peter Smith <peter.smith@linaro.org> | 2018-06-05 10:00:56 +0000 |
|---|---|---|
| committer | Peter Smith <peter.smith@linaro.org> | 2018-06-05 10:00:56 +0000 |
| commit | ef945b2240b6ade6e2549c751728983ad67c396b (patch) | |
| tree | d4a52e1f494fbd329c82b28ed14fe394ee4c865f /llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp | |
| parent | 3489b1adb3421df5f19a8c4d17d58d6005dbe89a (diff) | |
| download | bcm5719-llvm-ef945b2240b6ade6e2549c751728983ad67c396b.tar.gz bcm5719-llvm-ef945b2240b6ade6e2549c751728983ad67c396b.zip | |
[MC][ARM] Add range checking for Thumb2 resolved fixups.
When the branch target of a Thumb2 unconditional or conditonal branch is
resolved at assembly time, no range checking is performed on the result
leading to incorrect immediates. This change adds a range check:
+- 16 Megabytes for unconditional branches, +- 1 Megabyte for the
conditional branch.
Differential Revision: https://reviews.llvm.org/D46306
llvm-svn: 333997
Diffstat (limited to 'llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp index 8df49903ffe..4a7bf8cc33c 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp @@ -487,6 +487,11 @@ unsigned ARMAsmBackend::adjustFixupValue(const MCAssembler &Asm, return 0xffffff & ((Value - 8) >> 2); case ARM::fixup_t2_uncondbranch: { Value = Value - 4; + if (!isInt<25>(Value)) { + Ctx.reportError(Fixup.getLoc(), "Relocation out of range"); + return 0; + } + Value >>= 1; // Low bit is not encoded. uint32_t out = 0; @@ -506,6 +511,11 @@ unsigned ARMAsmBackend::adjustFixupValue(const MCAssembler &Asm, } case ARM::fixup_t2_condbranch: { Value = Value - 4; + if (!isInt<21>(Value)) { + Ctx.reportError(Fixup.getLoc(), "Relocation out of range"); + return 0; + } + Value >>= 1; // Low bit is not encoded. uint64_t out = 0; |

