aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/ARM
diff options
context:
space:
mode:
authorJohnny Chen <johnny.chen@apple.com>2011-04-13 21:59:01 +0000
committerJohnny Chen <johnny.chen@apple.com>2011-04-13 21:59:01 +0000
commite8d087ad351258f3db39f41dc595fae4ddb4f318 (patch)
treed7cc56d6dd8abd01c63836b07d61c3cf63aa21eb /lib/Target/ARM
parentbe0761c8202405cdd33f1103d262c0aa97895a8e (diff)
downloadexternal_llvm-e8d087ad351258f3db39f41dc595fae4ddb4f318.zip
external_llvm-e8d087ad351258f3db39f41dc595fae4ddb4f318.tar.gz
external_llvm-e8d087ad351258f3db39f41dc595fae4ddb4f318.tar.bz2
Thumb disassembler did not handle tBRIND (indirect branch) properly.
rdar://problem/9280370 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129480 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM')
-rw-r--r--lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h16
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h b/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
index ec80056..aded43b 100644
--- a/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
+++ b/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
@@ -479,6 +479,7 @@ static bool DisassembleThumb1DP(MCInst &MI, unsigned Opcode, uint32_t insn,
// tBX_RET: 0 operand
// tBX_RET_vararg: Rm
// tBLXr_r9: Rm
+// tBRIND: Rm
static bool DisassembleThumb1Special(MCInst &MI, unsigned Opcode, uint32_t insn,
unsigned short NumOps, unsigned &NumOpsAdded, BO B) {
@@ -486,14 +487,17 @@ static bool DisassembleThumb1Special(MCInst &MI, unsigned Opcode, uint32_t insn,
if (NumOps == 0)
return true;
- // BX/BLX has 1 reg operand: Rm.
- if (Opcode == ARM::tBLXr_r9 || Opcode == ARM::tBX_Rm) {
- // Handling the two predicate operands before the reg operand.
- if (!B->DoPredicateOperands(MI, Opcode, insn, NumOps))
- return false;
+ // BX/BLX/tBRIND (indirect branch, i.e, mov pc, Rm) has 1 reg operand: Rm.
+ if (Opcode==ARM::tBLXr_r9 || Opcode==ARM::tBX_Rm || Opcode==ARM::tBRIND) {
+ if (Opcode != ARM::tBRIND) {
+ // Handling the two predicate operands before the reg operand.
+ if (!B->DoPredicateOperands(MI, Opcode, insn, NumOps))
+ return false;
+ NumOpsAdded += 2;
+ }
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
getT1Rm(insn))));
- NumOpsAdded = 3;
+ NumOpsAdded += 1;
return true;
}