[llvm] r278659 - [Thumb] Validate branch target for CBZ/CBNZ instructions.
Matthias Braun via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 15 11:25:01 PDT 2016
I also suspect this to be the cause of this build being broken: http://lab.llvm.org:8080/green/job/clang-stage1-configure-RA_build/ <http://lab.llvm.org:8080/green/job/clang-stage1-configure-RA_build/> (I am still reproducing to confirm and extracting a testcase).
- Matthias
> On Aug 15, 2016, at 11:14 AM, Reid Kleckner via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> This is now firing on code in brotli (a compression library): http://crbug.com/637864 <http://crbug.com/637864>
>
> How can we avoid this error? Shouldn't LLVM be responsible for relaxing this into some other code sequence?
>
> On Mon, Aug 15, 2016 at 12:57 AM, Prakhar Bahuguna via llvm-commits <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
> Author: prakhar
> Date: Mon Aug 15 02:57:44 2016
> New Revision: 278659
>
> URL: http://llvm.org/viewvc/llvm-project?rev=278659&view=rev <http://llvm.org/viewvc/llvm-project?rev=278659&view=rev>
> Log:
> [Thumb] Validate branch target for CBZ/CBNZ instructions.
>
> Summary:
> The assembler currently does not check the branch target for CBZ/CBNZ
> instructions, which only permit branching forwards with a positive offset. This
> adds validation for the branch target to ensure negative PC-relative offsets are
> not encoded into the instruction, whether specified as a literal or as an
> assembler symbol.
>
> Reviewers: rengolin, t.p.northover
>
> Subscribers: llvm-commits, rengolin
>
> Differential Revision: https://reviews.llvm.org/D23312 <https://reviews.llvm.org/D23312>
>
> Added:
> llvm/trunk/test/MC/ARM/thumb-cb-negative-offsets.s
> Modified:
> llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> llvm/trunk/test/MC/ARM/thumb-diagnostics.s
>
> Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=278659&r1=278658&r2=278659&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=278659&r1=278658&r2=278659&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Mon Aug 15 02:57:44 2016
> @@ -6684,6 +6684,12 @@ bool ARMAsmParser::validateInstruction(M
> return Error(Operands[Op]->getStartLoc(), "branch target out of range");
> break;
> }
> + case ARM::tCBZ:
> + case ARM::tCBNZ: {
> + if (!static_cast<ARMOperand &>(*Operands[2]).isUnsignedOffset<6, 1>())
> + return Error(Operands[2]->getStartLoc(), "branch target out of range");
> + break;
> + }
> case ARM::MOVi16:
> case ARM::t2MOVi16:
> case ARM::t2MOVTi16:
>
> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp?rev=278659&r1=278658&r2=278659&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp?rev=278659&r1=278658&r2=278659&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp Mon Aug 15 02:57:44 2016
> @@ -578,6 +578,11 @@ unsigned ARMAsmBackend::adjustFixupValue
> // Offset by 4, and don't encode the low two bits.
> return ((Value - 4) >> 2) & 0xff;
> case ARM::fixup_arm_thumb_cb: {
> + // CB instructions can only branch to offsets in [0, 126] in multiples of 2
> + if (Ctx && ((int64_t)Value < 0 || Value > 0x3e || Value & 1)) {
> + Ctx->reportError(Fixup.getLoc(), "out of range pc-relative fixup value");
> + return 0;
> + }
> // Offset by 4 and don't encode the lower bit, which is always 0.
> // FIXME: diagnose if no Thumb2
> uint32_t Binary = (Value - 4) >> 1;
>
> Added: llvm/trunk/test/MC/ARM/thumb-cb-negative-offsets.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb-cb-negative-offsets.s?rev=278659&view=auto <http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb-cb-negative-offsets.s?rev=278659&view=auto>
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/thumb-cb-negative-offsets.s (added)
> +++ llvm/trunk/test/MC/ARM/thumb-cb-negative-offsets.s Mon Aug 15 02:57:44 2016
> @@ -0,0 +1,19 @@
> +@ RUN: not llvm-mc -triple thumbv7m-none-eabi -filetype=obj -o /dev/null %s 2>&1 | FileCheck %s
> +@ RUN: not llvm-mc -triple thumbv8m.base-none-eabi -filetype=obj -o /dev/null %s 2>&1 | FileCheck %s
> +
> +label0:
> + .word 4
> +
> +@ CHECK: out of range pc-relative fixup value
> + cbz r0, label0
> +@ CHECK: out of range pc-relative fixup value
> + cbnz r0, label0
> +
> +@ CHECK: out of range pc-relative fixup value
> + cbz r0, label1
> +@ CHECK: out of range pc-relative fixup value
> + cbnz r0, label1
> +
> + .space 1000
> +label1:
> + .word 4
>
> Modified: llvm/trunk/test/MC/ARM/thumb-diagnostics.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb-diagnostics.s?rev=278659&r1=278658&r2=278659&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/thumb-diagnostics.s?rev=278659&r1=278658&r2=278659&view=diff>
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/thumb-diagnostics.s (original)
> +++ llvm/trunk/test/MC/ARM/thumb-diagnostics.s Mon Aug 15 02:57:44 2016
> @@ -235,6 +235,23 @@ error: invalid operand for instruction
> @ CHECK-ERRORS: error: branch target out of range
>
> @------------------------------------------------------------------------------
> +@ CBZ/CBNZ - out of range immediates for branches
> + at ------------------------------------------------------------------------------
> +
> + cbz r0, #-2
> + cbz r0, #0
> + cbz r0, #17
> + cbnz r0, #126
> + cbnz r0, #128
> +
> +@ CHECK-ERRORS-V7M: error: branch target out of range
> +@ CHECK-ERRORS-V7M: error: invalid operand for instruction
> +@ CHECK-ERRORS-V7M: error: branch target out of range
> +@ CHECK-ERRORS-V8: error: branch target out of range
> +@ CHECK-ERRORS-V8: error: invalid operand for instruction
> +@ CHECK-ERRORS-V8: error: branch target out of range
> +
> + at ------------------------------------------------------------------------------
> @ SEV/WFE/WFI/YIELD - are not supported pre v6M or v6T2
> @------------------------------------------------------------------------------
> sev
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160815/0f395f86/attachment.html>
More information about the llvm-commits
mailing list