[PATCH] [mips] Don't emit redundant mask instructions if the mask is already present.
Mark Seaborn
mseaborn at chromium.org
Thu Dec 18 15:11:40 PST 2014
On 18 December 2014 at 13:50, Sasa Stankovic <Sasa.Stankovic at imgtec.com>
wrote:
> Yes. Currently two tests fail because of the redundant sandboxing -
> syscall_return_sandboxing_test and exception_test. For
> syscall_return_sandboxing_test, to make the test pass we can either remove
> sandboxing from the assembly, or apply this patch.
In that case, removing the sandboxing from the assembly makes sense.
That's the reason for implementing auto-sandboxing: assembly code
shouldn't need any explicit sandboxing instructions.
> For exception test, neither removing the sandboxing nor applying the patch
> will work. Here is the problematic inline assembly from exception_test.c
> file:
>
> crash_at_known_address:
> and $zero, $zero, $t7
> prog_ctr_at_crash:
> sw $t0, 0($zero)
>
Incidentally, it's funny that the MIPS validator allows that instruction
sequence. The "and" is a no-op, because modifying $zero has no effect.
The validator could safely allow "sw ..., 0($zero)" on its own as a "crash
instruction". (BTW, I am not recommending changing the validator to do
that!)
> exception_test works by crashing when executing instruction labeled by
> "prog_ctr_at_crash", and then checking whether the saved program counter is
> identical to the value of "prog_ctr_at_crash". Test currently fails because
> sandboxing will add mask before "sw", moving the "sw" to the address
> prog_ctr_at_crash + 4. Removing the mask in the assembly obviously wouldn't
> make the test pass. But even with the patch applied this test would still
> fail. That's because patch is implemented so that it first saves the mask,
> and then emits it when emitting next instruction, surrounded by
> BundleLock() and BundleUnlock(). So patch would first save mask, then emit
> label "prog_ctr_at_crash", and then emit mask and "sw", placing "sw" at
> address prog_ctr_at_crash + 4.
>
OK, the key point is that the LLVM patch doesn't fix this test case. :-)
> The only way to make exception_test pass is either to add #ifdef for MIPS
> that would check that program counter has value prog_ctr_at_crash + 4,
That would be reasonable.
> or find instruction that doesn't require masking and that can cause
> program to crash.
>
That would be better. Is there a MIPS breakpoint/trap instruction that
would work here? (ARM's breakpoints/traps are complicated under NaCl. I
can't remember how MIPS compares.)
Alternatively you can do memory accesses via sp without a mask, because sp
is pre-masked. Something like this should work:
mov $sp, $zero
prog_ctr_at_crash:
sw $t0, ($sp)
Cheers,
Mark
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141218/5e375527/attachment.html>
More information about the llvm-commits
mailing list