From 24c63679d7e82da13157d538cee27fbca66d645e Mon Sep 17 00:00:00 2001 From: Matheus Almeida Date: Tue, 17 Dec 2013 17:10:00 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197506 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp | 4 ++-- test/MC/Mips/micromips-pc16-fixup.s | 10 ++++++++++ test/MC/Mips/mips-pc16-fixup.s | 10 ++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 test/MC/Mips/micromips-pc16-fixup.s create mode 100644 test/MC/Mips/mips-pc16-fixup.s diff --git a/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp b/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp index 81d976a34cd..25ce9c7365c 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp @@ -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; } diff --git a/test/MC/Mips/micromips-pc16-fixup.s b/test/MC/Mips/micromips-pc16-fixup.s new file mode 100644 index 00000000000..146a1550b49 --- /dev/null +++ b/test/MC/Mips/micromips-pc16-fixup.s @@ -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 + diff --git a/test/MC/Mips/mips-pc16-fixup.s b/test/MC/Mips/mips-pc16-fixup.s new file mode 100644 index 00000000000..5443532d612 --- /dev/null +++ b/test/MC/Mips/mips-pc16-fixup.s @@ -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 + -- 2.34.1