forked from OSchip/llvm-project
[mips] Fix off by one issue when applying a fixup.
The branch offset for a R_MIPS_PC16 relocation is indeed a 16-bit signed immediate. llvm-svn: 197506
This commit is contained in:
parent
93c6ba6ae8
commit
8cc8b35a73
|
@ -64,7 +64,7 @@ static unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
|
|||
// address range. Forcing a signed division because Value can be negative.
|
||||
Value = (int64_t)Value / 4;
|
||||
// We now check if Value can be encoded as a 16-bit signed immediate.
|
||||
if (!isIntN(15, Value) && Ctx)
|
||||
if (!isIntN(16, Value) && Ctx)
|
||||
Ctx->FatalError(Fixup.getLoc(), "out of range PC16 fixup");
|
||||
break;
|
||||
case Mips::fixup_Mips_26:
|
||||
|
@ -97,7 +97,7 @@ static unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
|
|||
// Forcing a signed division because Value can be negative.
|
||||
Value = (int64_t)Value / 2;
|
||||
// We now check if Value can be encoded as a 16-bit signed immediate.
|
||||
if (!isIntN(15, Value) && Ctx)
|
||||
if (!isIntN(16, Value) && Ctx)
|
||||
Ctx->FatalError(Fixup.getLoc(), "out of range PC16 fixup");
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
# RUN: llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32r2 -arch=mips -mattr=+micromips 2>&1 -filetype=obj | FileCheck %s
|
||||
#
|
||||
# CHECK-NOT: LLVM ERROR: out of range PC16 fixup
|
||||
|
||||
.text
|
||||
b foo
|
||||
.space 65536 - 8, 1 # -8 = size of b instr plus size of automatically inserted nop
|
||||
foo:
|
||||
add $0,$0,$0
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
# RUN: llvm-mc %s -triple=mips-unknown-linux -mcpu=mips32r2 -arch=mips 2>&1 -filetype=obj | FileCheck %s
|
||||
#
|
||||
# CHECK-NOT: LLVM ERROR: out of range PC16 fixup
|
||||
|
||||
.text
|
||||
b foo
|
||||
.space 131072 - 8, 1 # -8 = size of b instr plus size of automatically inserted nop
|
||||
foo:
|
||||
add $0,$0,$0
|
||||
|
Loading…
Reference in New Issue