Project

General

Profile

Actions

Bug #10014

closed

mir некорректно интерпретирует побитовое отрицание (~)

Added by Alexander Protsenko over 4 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
Category:
nML Translator
Target version:
Start date:
12/25/2019
Due date:
% Done:

0%

Estimated time:
Detected in build:
svn
Platform:
Published in build:
2.5.0-beta-191226

Description

В примерах ниже были убраны "~" из кода, после этого mir логировался до строки 2 531 777, до этого до 750 000.

Пример 1 (armv8.nml line: 2800+-):

    MemLoadSingle(shifted_addr<60..0>, 8, acctype, 0).action;
    temp_dword = memLoadSingleValue;
-->    mask_dword = ~((coerce(card(65), 1) << size_op * 8) - coerce(card(65), 1));
    mask_dword = mask_dword << (8 * coerce(BYTE, address<2..0>));
    temp_dword = temp_dword & coerce(DWORD, mask_dword);
    temp_dword = temp_dword | (wdata << (8 * coerce(BYTE, address<2..0>)));
    MemStoreSingle(shifted_addr<60..0>, size_op, acctype, 0, temp_dword).action;
    trace("MemStore (atomic): address=0x%x (shifted_addr=0x%x), size=%d, written data=0x%x", address, shifted_addr, size_op, temp_dword);

Пример 2:

    assert(size_op > 1, "assert size > 1");
    // TODO ConstrainUnpredictable()
    MemLoadSingle(shifted_addr<60..0>, 8, acctype, 0).action;
    temp_qword<63..0> = memLoadSingleValue;
    MemLoadSingle(shifted_addr<60..0> + 1, 8, acctype, 0).action;
    temp_qword<127..64> = memLoadSingleValue;
-->    mask_qword = ~((coerce(card(129), 1) << size_op * 8) - coerce(card(129), 1));
    temp_qword = temp_qword & coerce(QWORD, mask_qword << (8 * coerce(BYTE, address<2..0>)));
    temp_qword = temp_qword | (coerce(QWORD, wdata) << (8 * coerce(BYTE, address<2..0>)));
    MemStoreSingle(shifted_addr<60..0>, size_op, acctype, 0, temp_qword<63..0>).action;
    MemStoreSingle(shifted_addr<60..0> + 1, size_op, acctype, 0, temp_qword<127..64>).action;
    trace("MemStore (not atomic or size-16): address=0x%x (shifted_addr=0x%x), size=%d, written data=0x%x", address, shifted_addr, size_op, temp_qword);

Логи ошибок при не убранных "~".

Пример лога 1 mir (строка 750 530):

EVAL: %1626 = load i64, i64 shifted_addr
EVAL: %1627 = Extract i61 of i64 %1626 <60, 0>
EVAL: store i8 8, i8 SIZE
EVAL: store i4 %9, i4 ACCTYPE
EVAL: store i138 0, i138 AddrDesc
EVAL: %2715 = load i64, [2305843009213693952, i64] M[%1627]
EVAL: store i64 %2715, i64 memLoadSingleValue
EVAL: %2716 = load i138, i138 AddrDesc
EVAL: %2717 = Extract i5 of i138 %2716 <4, 0>
EVAL: %2718 = i1 Ne i5 %2717, 0
EVAL: br i1 %2718, label %null, label %null
EVAL: br label %null
EVAL: br label %null
EVAL: %1628 = load i64, i64 memLoadSingleValue
EVAL: store i64 %1628, i64 temp_dword
EVAL: %1629 = i8 Mul i8 %59, 8
EVAL: %1630 = i65 Shl i65 1, %1629
EVAL: %1631 = i65 Sub i65 %1630, 1
EVAL: %1632 = i65 Xor i65 %1631, -1
********************************************************************************
ATTENTION! An unexpected error has occurred:
java.lang.IllegalArgumentException: Bit vector sizes do not match: 65 != 64.

The program will be terminated. Please contact us at: 
microtesk-support@ispras.ru
We are sorry for the inconvenience.

Exception stack:

java.lang.IllegalArgumentException: Bit vector sizes do not match: 65 != 64.
    at ru.ispras.fortress.data.types.bitvector.BitVectorMath.checkEqualSize(BitVectorMath.java:926)
    at ru.ispras.fortress.data.types.bitvector.BitVectorMath.transform(BitVectorMath.java:902)
    at ru.ispras.fortress.data.types.bitvector.BitVectorMath.xor(BitVectorMath.java:364)
    at ru.ispras.microtesk.translator.mir.BvOpcode$8.evalBitVector(Instruction.java:462)
    at ru.ispras.microtesk.translator.mir.BvOpcode.evalConst(Instruction.java:512)
    at ru.ispras.microtesk.translator.mir.EvalContext.visit(EvalContext.java:77)
    at ru.ispras.microtesk.translator.mir.Instruction$Assignment.accept(Instruction.java:30)
    at ru.ispras.microtesk.translator.mir.EvalContext.eval(EvalContext.java:62)
    at ru.ispras.microtesk.translator.mir.EvalContext.evalInternal(EvalContext.java:44)
    at ru.ispras.microtesk.translator.mir.EvalContext.eval(EvalContext.java:31)
    at ru.ispras.microtesk.translator.mir.InsnRewriter.rewrite(InsnRewriter.java:22)
    at ru.ispras.microtesk.translator.mir.ForwardPass.apply(ForwardPass.java:21)
    at ru.ispras.microtesk.translator.mir.MirPassDriver.apply(MirPassDriver.java:46)
    at ru.ispras.microtesk.translator.mir.MirPassDriver.run(MirPassDriver.java:56)
    at ru.ispras.microtesk.translator.mir.MirTransHandler.processIr(MirTransHandler.java:73)
    at ru.ispras.microtesk.translator.mir.MirTransHandler.processIr(MirTransHandler.java:31)
    at ru.ispras.microtesk.translator.Translator.processIr(Translator.java:84)
    at ru.ispras.microtesk.translator.nml.NmlTranslator.start(NmlTranslator.java:133)
    at ru.ispras.microtesk.translator.Translator.translate(Translator.java:201)
    at ru.ispras.microtesk.MicroTESK.translate(MicroTESK.java:168)
    at ru.ispras.microtesk.MicroTESK.runTask(MicroTESK.java:141)
    at ru.ispras.microtesk.MicroTESK.main(MicroTESK.java:79)

Пример фрагмента лога 2 mir (строка 750 470):

EVAL: %1591 = load i64, i64 memLoadSingleValue
EVAL: %1593 = load i128, i128 temp_qword
EVAL: %1594 = Zext i64 %1591 to i128
EVAL: %1595 = i128 And i128 %1593, 18446744073709551615
EVAL: %1596 = i128 Shl i128 %1594, 64
EVAL: %1592 = i128 Or i128 %1595, %1596
EVAL: store i128 %1592, i128 temp_qword
EVAL: %1597 = i8 Mul i8 %59, 8
EVAL: %1598 = i129 Shl i129 1, %1597
EVAL: %1599 = i129 Sub i129 %1598, 1
EVAL: %1600 = i129 Xor i129 %1599, -1
********************************************************************************
ATTENTION! An unexpected error has occurred:
java.lang.IllegalArgumentException: Bit vector sizes do not match: 129 != 64.

The program will be terminated. Please contact us at: 
microtesk-support@ispras.ru
We are sorry for the inconvenience.

Exception stack:

java.lang.IllegalArgumentException: Bit vector sizes do not match: 129 != 64.
    at ru.ispras.fortress.data.types.bitvector.BitVectorMath.checkEqualSize(BitVectorMath.java:926)
    at ru.ispras.fortress.data.types.bitvector.BitVectorMath.transform(BitVectorMath.java:902)
    at ru.ispras.fortress.data.types.bitvector.BitVectorMath.xor(BitVectorMath.java:364)
    at ru.ispras.microtesk.translator.mir.BvOpcode$8.evalBitVector(Instruction.java:462)
    at ru.ispras.microtesk.translator.mir.BvOpcode.evalConst(Instruction.java:512)
    at ru.ispras.microtesk.translator.mir.EvalContext.visit(EvalContext.java:77)
    at ru.ispras.microtesk.translator.mir.Instruction$Assignment.accept(Instruction.java:30)
    at ru.ispras.microtesk.translator.mir.EvalContext.eval(EvalContext.java:62)
    at ru.ispras.microtesk.translator.mir.EvalContext.evalInternal(EvalContext.java:44)
    at ru.ispras.microtesk.translator.mir.EvalContext.eval(EvalContext.java:31)
    at ru.ispras.microtesk.translator.mir.InsnRewriter.rewrite(InsnRewriter.java:22)
    at ru.ispras.microtesk.translator.mir.ForwardPass.apply(ForwardPass.java:21)
    at ru.ispras.microtesk.translator.mir.MirPassDriver.apply(MirPassDriver.java:46)
    at ru.ispras.microtesk.translator.mir.MirPassDriver.run(MirPassDriver.java:56)
    at ru.ispras.microtesk.translator.mir.MirTransHandler.processIr(MirTransHandler.java:73)
    at ru.ispras.microtesk.translator.mir.MirTransHandler.processIr(MirTransHandler.java:31)
    at ru.ispras.microtesk.translator.Translator.processIr(Translator.java:84)
    at ru.ispras.microtesk.translator.nml.NmlTranslator.start(NmlTranslator.java:133)
    at ru.ispras.microtesk.translator.Translator.translate(Translator.java:201)
    at ru.ispras.microtesk.MicroTESK.translate(MicroTESK.java:168)
    at ru.ispras.microtesk.MicroTESK.runTask(MicroTESK.java:141)
    at ru.ispras.microtesk.MicroTESK.main(MicroTESK.java:79)

Actions

Also available in: Atom PDF