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 | }
|
---|