[PATCH] D38786: Fix for Bug 30718 - Failure to disassemble certain MOV with rex.R
Andrew V. Tischenko via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 17 05:14:29 PDT 2017
avt77 added inline comments.
================
Comment at: lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp:1487
+ index = regFromModRM(insn->modRM); \
if (index > 5) \
*valid = 0; \
----------------
craig.topper wrote:
> avt77 wrote:
> > craig.topper wrote:
> > > I think the correct fix is to change this to "if ((index & 0x7) > 5)" We shouldn't be resampling modRM.
> > I thought about such a variant but on the other hand all other values of modRM could fail segment index. If you insist I'll use your variant of the fix but please say it again.
> There are really two different versions of this function, one called with regFromModRM and one called with rmFromModRM. While I don't think the rmFromModRM version will ever be called with SEGMENT_REG, it feels wrong to assume which field of ModRM we should be using inside the routine.
>
> We either need to mask the index inside the method, or the caller should mask it before the call.
I tried your version but it does not work because there is the folowing code to invoke the function:
insn->reg = (Reg)fixupRegValue(insn,
(OperandType)op->type,
insn->reg - insn->regBase,
&valid);
It means we can't simply mask index here: we could check TYPE_SEGMENTREG at call time or we can use my approach. What's better? As I understand you'd prefer the caller masks the index properly, right?
https://reviews.llvm.org/D38786
More information about the llvm-commits
mailing list