Skip to content

Commit dba5b7a

Browse files
committed
Fix I->regs.read and I->regs.write bug.
Some registers were not added as expected.
1 parent c6bdc9b commit dba5b7a

3 files changed

Lines changed: 18 additions & 8 deletions

File tree

src/e9tool/e9x86_64.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -235,18 +235,25 @@ void e9frontend::getInstrInfo(const ELF *elf, const Instr *I, InstrInfo *info,
235235
switch (D->operands[i].type)
236236
{
237237
case ZYDIS_OPERAND_TYPE_REGISTER:
238-
if (read)
239-
info->regs.read[k++] = convert(D->operands[i].reg.value);
240-
if (write)
241-
info->regs.write[l++] = convert(D->operands[i].reg.value);
238+
{
239+
Register r = convert(D->operands[i].reg.value);
240+
if (read && r != REGISTER_INVALID)
241+
info->regs.read[k++] = r;
242+
if (write && r != REGISTER_INVALID)
243+
info->regs.write[l++] = r;
242244
break;
245+
}
243246
case ZYDIS_OPERAND_TYPE_MEMORY:
247+
{
244248
info->regs.read[k++] = seg;
245-
if (D->operands[i].mem.base != ZYDIS_REGISTER_NONE)
246-
info->regs.read[k++] = convert(D->operands[i].mem.base);
247-
if (D->operands[i].mem.index != ZYDIS_REGISTER_NONE)
248-
info->regs.read[k++] = convert(D->operands[i].mem.index);
249+
Register r = convert(D->operands[i].mem.base);
250+
if (r != REGISTER_INVALID)
251+
info->regs.read[k++] = r;
252+
r = convert(D->operands[i].mem.index);
253+
if (r != REGISTER_INVALID)
254+
info->regs.read[k++] = r;
249255
break;
256+
}
250257
default:
251258
break;
252259
}

test/regtest/write_bug.exp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
0000000083838383:0000000000000006:0000000000000006: 49 83 c1 06 add $0x6, %r9
2+
PASSED

test/regtest/write_bug.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
./test -M 'imm[0] == 0x6 && %r9 in writes' -A 'call entry(r9,imm[0],0x6,instr,size,asm)@inst'

0 commit comments

Comments
 (0)