[vm] Update workaround for Android Kernel bug (b089d4f).
Previous workaround was only compilable by GCC - new one is compilable
with both but is less robust because theoretically compiler can simply
use registers r0-r2 as temporaries whenever it desires.
Bug: https://github.com/flutter/flutter/issues/22172
Change-Id: Ic73fde8d3342c1455ab01ed8b7d4b267aebda136
Reviewed-on: https://dart-review.googlesource.com/76021
Reviewed-by: Zach Anderson <zra@google.com>
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
diff --git a/runtime/vm/signal_handler.h b/runtime/vm/signal_handler.h
index 69e897a..41eea90 100644
--- a/runtime/vm/signal_handler.h
+++ b/runtime/vm/signal_handler.h
@@ -94,19 +94,26 @@
void* context_) {
// IT (If-Then) instruction makes up to four instructions that follow it
// conditional.
- asm volatile("nop; nop; nop; nop" : : : "memory");
+ // Note: clobber all register so that compiler does not attempt to hoist
+ // anything from the next assembly block past this one.
+ asm volatile("nop; nop; nop; nop;"
+ :
+ :
+ : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
+ "r10", "r11", "r12", "r13", "r14", "memory");
// Tail-call into the actual signal handler.
+ //
// Note: this code is split into a separate inline assembly block because
// any code that compiler generates to satisfy register constraints must
// be generated after four NOPs.
- register int arg0 asm("r0") = signal;
- register siginfo_t* arg1 asm("r1") = info;
- register void* arg2 asm("r2") = context_;
- asm volatile("bx %3"
- :
- : "r"(arg0), "r"(arg1), "r"(arg2), "r"(action)
- : "memory");
+ //
+ // Note: there is no portable way to specify that we want to have
+ // signal, info and context_ in r0 - r2 respectively. So we just mark them
+ // as clobbered and hope that compiler does not emit any code that uses
+ // these registers to satisfy action constraint (we tested on clang and
+ // the generated code looks like one would expect).
+ asm volatile("bx %0;" : : "r"(action) : "r0", "r1", "r2", "memory");
}
#endif // defined(USE_SIGNAL_HANDLER_TRAMPOLINE)
};