summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/MCDisassembler
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2011-04-20 00:43:34 +0000
committerSean Callanan <scallanan@apple.com>2011-04-20 00:43:34 +0000
commitd897f39797f6339f31ccc57b3eb37467ab54ee45 (patch)
tree96c9fdea82a724689cf893fdd60d127b30b2033d /llvm/lib/MC/MCDisassembler
parent49f754f423ada6aba2e19ea6a6e8f2659778512c (diff)
downloadbcm5719-llvm-d897f39797f6339f31ccc57b3eb37467ab54ee45.tar.gz
bcm5719-llvm-d897f39797f6339f31ccc57b3eb37467ab54ee45.zip
Made the MC disassembler check before accessing
MCInst operands for ARM. This allows it to be more tolerant of malformed MCInsts or incorrect instruction metadata. llvm-svn: 129840
Diffstat (limited to 'llvm/lib/MC/MCDisassembler')
-rw-r--r--llvm/lib/MC/MCDisassembler/EDOperand.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCDisassembler/EDOperand.cpp b/llvm/lib/MC/MCDisassembler/EDOperand.cpp
index 04b21cb3592..492bb08f336 100644
--- a/llvm/lib/MC/MCDisassembler/EDOperand.cpp
+++ b/llvm/lib/MC/MCDisassembler/EDOperand.cpp
@@ -198,15 +198,24 @@ int EDOperand::evaluate(uint64_t &result,
default:
return -1;
case kOperandTypeImmediate:
+ if (!Inst.Inst->getOperand(MCOpIndex).isImm())
+ return -1;
+
result = Inst.Inst->getOperand(MCOpIndex).getImm();
return 0;
case kOperandTypeRegister:
{
+ if (!Inst.Inst->getOperand(MCOpIndex).isReg())
+ return -1;
+
unsigned reg = Inst.Inst->getOperand(MCOpIndex).getReg();
return callback(&result, reg, arg);
}
case kOperandTypeARMBranchTarget:
{
+ if (!Inst.Inst->getOperand(MCOpIndex).isImm())
+ return -1;
+
int64_t displacement = Inst.Inst->getOperand(MCOpIndex).getImm();
uint64_t pcVal;
OpenPOWER on IntegriCloud