51488
|
1 /*
|
|
2 * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
|
|
3 *
|
|
4 * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
|
|
5 * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
|
|
6 *
|
|
7 * Permission is hereby granted to use or copy this program
|
|
8 * for any purpose, provided the above notices are retained on all copies.
|
|
9 * Permission to modify the code and to distribute modified code is granted,
|
|
10 * provided the above notices are retained, and a notice that the code was
|
|
11 * modified is included with the above copyright notice.
|
|
12 */
|
|
13
|
|
14 /* Check whether setjmp actually saves registers in jmp_buf. */
|
|
15 /* If it doesn't, the generic mark_regs code won't work. */
|
|
16 /* Compilers vary as to whether they will put x in a */
|
|
17 /* (callee-save) register without -O. The code is */
|
|
18 /* contrived such that any decent compiler should put x in */
|
|
19 /* a callee-save register with -O. Thus it is is */
|
|
20 /* recommended that this be run optimized. (If the machine */
|
|
21 /* has no callee-save registers, then the generic code is */
|
|
22 /* safe, but this will not be noticed by this piece of */
|
|
23 /* code.) This test appears to be far from perfect. */
|
|
24 #include <stdio.h>
|
|
25 #include <setjmp.h>
|
|
26 #include <string.h>
|
|
27 #include "private/gcconfig.h"
|
|
28
|
|
29 #ifdef OS2
|
|
30 /* GETPAGESIZE() is set to getpagesize() by default, but that */
|
|
31 /* doesn't really exist, and the collector doesn't need it. */
|
|
32 #define INCL_DOSFILEMGR
|
|
33 #define INCL_DOSMISC
|
|
34 #define INCL_DOSERRORS
|
|
35 #include <os2.h>
|
|
36
|
|
37 int
|
|
38 getpagesize()
|
|
39 {
|
|
40 ULONG result[1];
|
|
41
|
|
42 if (DosQuerySysInfo(QSV_PAGE_SIZE, QSV_PAGE_SIZE,
|
|
43 (void *)result, sizeof(ULONG)) != NO_ERROR) {
|
|
44 fprintf(stderr, "DosQuerySysInfo failed\n");
|
|
45 result[0] = 4096;
|
|
46 }
|
|
47 return((int)(result[0]));
|
|
48 }
|
|
49 #endif
|
|
50
|
|
51 struct {char a_a; char * a_b;} a;
|
|
52
|
|
53 int * nested_sp()
|
|
54 {
|
|
55 int dummy;
|
|
56
|
|
57 return(&dummy);
|
|
58 }
|
|
59
|
|
60 main()
|
|
61 {
|
|
62 int dummy;
|
|
63 long ps = GETPAGESIZE();
|
|
64 jmp_buf b;
|
|
65 register int x = (int)strlen("a"); /* 1, slightly disguised */
|
|
66 static int y = 0;
|
|
67
|
|
68 printf("This appears to be a %s running %s\n", MACH_TYPE, OS_TYPE);
|
|
69 if (nested_sp() < &dummy) {
|
|
70 printf("Stack appears to grow down, which is the default.\n");
|
|
71 printf("A good guess for STACKBOTTOM on this machine is 0x%lx.\n",
|
|
72 ((unsigned long)(&dummy) + ps) & ~(ps-1));
|
|
73 } else {
|
|
74 printf("Stack appears to grow up.\n");
|
|
75 printf("Define STACK_GROWS_UP in gc_private.h\n");
|
|
76 printf("A good guess for STACKBOTTOM on this machine is 0x%lx.\n",
|
|
77 ((unsigned long)(&dummy) + ps) & ~(ps-1));
|
|
78 }
|
|
79 printf("Note that this may vary between machines of ostensibly\n");
|
|
80 printf("the same architecture (e.g. Sun 3/50s and 3/80s).\n");
|
|
81 printf("On many machines the value is not fixed.\n");
|
|
82 printf("A good guess for ALIGNMENT on this machine is %ld.\n",
|
|
83 (unsigned long)(&(a.a_b))-(unsigned long)(&a));
|
|
84
|
|
85 /* Encourage the compiler to keep x in a callee-save register */
|
|
86 x = 2*x-1;
|
|
87 printf("");
|
|
88 x = 2*x-1;
|
|
89 setjmp(b);
|
|
90 if (y == 1) {
|
|
91 if (x == 2) {
|
|
92 printf("Generic mark_regs code probably wont work\n");
|
|
93 # if defined(SPARC) || defined(RS6000) || defined(VAX) || defined(MIPS) || defined(M68K) || defined(I386) || defined(NS32K) || defined(RT)
|
|
94 printf("Assembly code supplied\n");
|
|
95 # else
|
|
96 printf("Need assembly code\n");
|
|
97 # endif
|
|
98 } else if (x == 1) {
|
|
99 printf("Generic mark_regs code may work\n");
|
|
100 } else {
|
|
101 printf("Very strange setjmp implementation\n");
|
|
102 }
|
|
103 }
|
|
104 y++;
|
|
105 x = 2;
|
|
106 if (y == 1) longjmp(b,1);
|
|
107 return(0);
|
|
108 }
|
|
109
|
|
110 int g(x)
|
|
111 int x;
|
|
112 {
|
|
113 return(x);
|
|
114 }
|