mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-25 15:00:45 -08:00
Reverting to assembler method of saving callee-save registers for stack scan on w3i3mv to avoid c run-time dependency that breaks open dylan bootstrap.
Copied from Perforce Change: 179439 ServerID: perforce.ravenbrook.com
This commit is contained in:
parent
c4d25ec6e6
commit
a9bcf5293b
1 changed files with 76 additions and 20 deletions
|
|
@ -1,35 +1,91 @@
|
|||
/* ssw3mv.c: STACK SCANNING FOR WIN32 WITH MICROSOFT C
|
||||
/* ssw3i3.c: WIN32/INTEL STACK SCANNING
|
||||
*
|
||||
* $Id$
|
||||
* Copyright (c) 2001 Ravenbrook Limited. See end of file for license.
|
||||
*
|
||||
* This scans the stack and fixes the registers which may contain roots.
|
||||
* See <design/thread-manager/>.
|
||||
* This scans the stack and fixes the registers which may contain
|
||||
* roots. See <design/thread-manager/>.
|
||||
*
|
||||
* The registers edi, esi, ebx are the registers defined to be preserved
|
||||
* across function calls and therefore may contain roots.
|
||||
* These are pushed on the stack for scanning.
|
||||
*
|
||||
* ASSUMPTIONS
|
||||
*
|
||||
* .align: The stack pointer is assumed to be aligned on a word
|
||||
* boundary.
|
||||
*/
|
||||
|
||||
#include "mpm.h"
|
||||
#include <setjmp.h>
|
||||
|
||||
SRCID(ssw3mv, "$Id$");
|
||||
#include "mpm.h"
|
||||
|
||||
SRCID(ssw3i3, "$Id$");
|
||||
|
||||
|
||||
Res StackScan(ScanState ss, Addr *stackBot)
|
||||
{
|
||||
jmp_buf jb;
|
||||
Addr *stackTop;
|
||||
Res res;
|
||||
|
||||
/* NOTE: We would like to use the same `setjmp` trick as ssw3i6mv.c here,
|
||||
to avoid assembler, but this introduces a dependency on the C run-time
|
||||
in Open Dylan on Windows, probably because of ancient build tools. So
|
||||
I have reverted to the assembler method for now. RB 2012-09-12 */
|
||||
|
||||
/* We rely on the fact that Microsoft C's setjmp stores the callee-save
|
||||
registers in the jmp_buf. */
|
||||
(void)setjmp(jb);
|
||||
__asm {
|
||||
push edi /* these registers are the save registers */
|
||||
push esi /* and so may contain roots. They are pushed */
|
||||
push ebx /* for scanning */
|
||||
mov stackTop, esp /* stack pointer */
|
||||
}
|
||||
|
||||
res = StackScanInner(ss, stackBot, stackTop, 3);
|
||||
|
||||
/* These checks will just serve to warn us at compile-time if the
|
||||
setjmp.h header changes to indicate that the registers we want aren't
|
||||
saved any more. */
|
||||
AVER(sizeof(((_JUMP_BUFFER *)jb)->Edi) == sizeof(Addr));
|
||||
AVER(sizeof(((_JUMP_BUFFER *)jb)->Esi) == sizeof(Addr));
|
||||
AVER(sizeof(((_JUMP_BUFFER *)jb)->Ebx) == sizeof(Addr));
|
||||
__asm {
|
||||
add esp, 0xc /* pop 3 registers to restore the stack pointer */
|
||||
}
|
||||
|
||||
AVER(offsetof(_JUMP_BUFFER, Edi) == offsetof(_JUMP_BUFFER, Ebx) + 4);
|
||||
AVER(offsetof(_JUMP_BUFFER, Esi) == offsetof(_JUMP_BUFFER, Ebx) + 8);
|
||||
|
||||
return StackScanInner(ss, stackBot, (Addr *)&((_JUMP_BUFFER *)jb)->Ebx, 3);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/* C. COPYRIGHT AND LICENSE
|
||||
*
|
||||
* Copyright (C) 2001-2002 Ravenbrook Limited <http://www.ravenbrook.com/>.
|
||||
* All rights reserved. This is an open source license. Contact
|
||||
* Ravenbrook for commercial licensing options.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Redistributions in any form must be accompanied by information on how
|
||||
* to obtain complete source code for this software and any accompanying
|
||||
* software that uses this software. The source code must either be
|
||||
* included in the distribution or be available for no more than the cost
|
||||
* of distribution plus a nominal fee, and must be freely redistributable
|
||||
* under reasonable conditions. For an executable file, complete source
|
||||
* code means the source code for all modules it contains. It does not
|
||||
* include source code for modules or files that typically accompany the
|
||||
* major components of the operating system on which the executable file
|
||||
* runs.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
* PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue