From 44ae2da4ece65e071ac80d935deafc71ad6425f1 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. llvm-svn: 139610 --- llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 5 ++++- llvm/test/MC/ARM/basic-thumb2-instructions.s | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index df5e0c9cdee9..08a42f12483b 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/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/llvm/test/MC/ARM/basic-thumb2-instructions.s b/llvm/test/MC/ARM/basic-thumb2-instructions.s index 8293d4c01c81..5da74024bbdb 100644 --- a/llvm/test/MC/ARM/basic-thumb2-instructions.s +++ b/llvm/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