summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2011-01-06 16:48:42 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2011-01-06 16:48:42 +0000
commit9f9a10691a10bea83acbb48b7a67b906efe15e6e (patch)
tree05d3b94771ead0b93c3069806e4052613618d6fc /llvm
parentae67cc13a99e65b00f5e706514e2ca4e6ea880fd (diff)
downloadbcm5719-llvm-9f9a10691a10bea83acbb48b7a67b906efe15e6e.tar.gz
bcm5719-llvm-9f9a10691a10bea83acbb48b7a67b906efe15e6e.zip
Correctly disassemble truncated asm.
Patch by Richard Simth. llvm-svn: 122962
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c6
-rw-r--r--llvm/test/MC/Disassembler/X86/truncated-input.txt4
-rw-r--r--llvm/tools/llvm-mc/Disassembler.cpp2
3 files changed, 9 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
index 1fd66853f75..0af510c4cec 100644
--- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
+++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
@@ -511,7 +511,8 @@ static int getIDWithAttrMask(uint16_t* instructionID,
insn->opcode);
if (hasModRMExtension) {
- readModRM(insn);
+ if (readModRM(insn))
+ return -1;
*instructionID = decode(insn->opcodeType,
instructionClass,
@@ -860,7 +861,8 @@ static int readModRM(struct InternalInstruction* insn) {
if (insn->consumedModRM)
return 0;
- consumeByte(insn, &insn->modRM);
+ if (consumeByte(insn, &insn->modRM))
+ return -1;
insn->consumedModRM = TRUE;
mod = modFromModRM(insn->modRM);
diff --git a/llvm/test/MC/Disassembler/X86/truncated-input.txt b/llvm/test/MC/Disassembler/X86/truncated-input.txt
new file mode 100644
index 00000000000..34cf0382a74
--- /dev/null
+++ b/llvm/test/MC/Disassembler/X86/truncated-input.txt
@@ -0,0 +1,4 @@
+# RUN: llvm-mc --disassemble %s -triple=x86_64-apple-darwin9 |& FileCheck %s
+
+# CHECK: warning
+0x00
diff --git a/llvm/tools/llvm-mc/Disassembler.cpp b/llvm/tools/llvm-mc/Disassembler.cpp
index e5c31ca598e..c29d82a2cb3 100644
--- a/llvm/tools/llvm-mc/Disassembler.cpp
+++ b/llvm/tools/llvm-mc/Disassembler.cpp
@@ -44,7 +44,7 @@ public:
uint64_t getExtent() const { return Bytes.size(); }
int readByte(uint64_t Addr, uint8_t *Byte) const {
- if (Addr > getExtent())
+ if (Addr >= getExtent())
return -1;
*Byte = Bytes[Addr].first;
return 0;
OpenPOWER on IntegriCloud