From b6b7f515e2b90c9f9b6cdd5b9648121f6ad2b3a1 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Tue, 13 Sep 2011 17:59:19 +0000 Subject: [PATCH] Teach the Thumb ASM parser that BKPT is allowed in IT blocks, even though it is always executed unconditionally. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139610 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 5 ++++- test/MC/ARM/basic-thumb2-instructions.s | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index df5e0c9cdee..08a42f12483 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -3532,7 +3532,10 @@ validateInstruction(MCInst &Inst, MCInstrDesc &MCID = getInstDesc(Inst.getOpcode()); SMLoc Loc = Operands[0]->getStartLoc(); // Check the IT block state first. - if (inITBlock()) { + // NOTE: In Thumb mode, the BKPT instruction has the interesting property of + // being allowed in IT blocks, but not being predicable. It just always + // executes. + if (inITBlock() && Inst.getOpcode() != ARM::tBKPT) { unsigned bit = 1; if (ITState.FirstCond) ITState.FirstCond = false; diff --git a/test/MC/ARM/basic-thumb2-instructions.s b/test/MC/ARM/basic-thumb2-instructions.s index 8293d4c01c8..5da74024bbd 100644 --- a/test/MC/ARM/basic-thumb2-instructions.s +++ b/test/MC/ARM/basic-thumb2-instructions.s @@ -259,6 +259,14 @@ _func: @ CHECK: bic.w r8, r8, r5, asr #15 @ encoding: [0x28,0xea,0xe5,0x38] @ CHECK: bic.w r12, r12, r6, ror #29 @ encoding: [0x2c,0xea,0x76,0x7c] +@------------------------------------------------------------------------------ +@ BKPT +@------------------------------------------------------------------------------ + it pl + bkpt #234 + +@ CHECK: it pl @ encoding: [0x58,0xbf] +@ CHECK: bkpt #234 @ encoding: [0xea,0xbe] @------------------------------------------------------------------------------ @ BXJ