|
From: <sv...@va...> - 2011-11-01 07:15:22
|
Author: sewardj
Date: 2011-11-01 07:10:37 +0000 (Tue, 01 Nov 2011)
New Revision: 2231
Log:
Merge from trunk, r2229 and 2230 (lame workaround for the fact that
VEX doesn't keep the stack properly aligned for function calls on Darwin)
Modified:
branches/VEX_3_7_BRANCH/priv/guest_x86_helpers.c
Modified: branches/VEX_3_7_BRANCH/priv/guest_x86_helpers.c
===================================================================
--- branches/VEX_3_7_BRANCH/priv/guest_x86_helpers.c 2011-10-31 15:25:55 UTC (rev 2230)
+++ branches/VEX_3_7_BRANCH/priv/guest_x86_helpers.c 2011-11-01 07:10:37 UTC (rev 2231)
@@ -1787,7 +1787,20 @@
/* Copy the x87 registers out of the image, into a temporary
Fpu_State struct. */
- for (i = 0; i < 14; i++) tmp.env[i] = 0;
+
+ /* LLVM on Darwin turns the following loop into a movaps plus a
+ handful of scalar stores. This would work fine except for the
+ fact that VEX doesn't keep the stack correctly (16-) aligned for
+ the call, so it segfaults. Hence, split the loop into two
+ pieces (and pray LLVM doesn't merely glue them back together) so
+ it's composed only of scalar stores and so is alignment
+ insensitive. Of course this is a kludge of the lamest kind --
+ VEX should be fixed properly. */
+ /* Code that seems to trigger the problem:
+ for (i = 0; i < 14; i++) tmp.env[i] = 0; */
+ for (i = 0; i < 7; i++) tmp.env[i+0] = 0;
+ for (i = 0; i < 7; i++) tmp.env[i+7] = 0;
+
for (i = 0; i < 80; i++) tmp.reg[i] = 0;
/* fill in tmp.reg[0..7] */
for (stno = 0; stno < 8; stno++) {
|