annotate src/alloca.c @ 4413:5a00cec8e9b0

(fill-region-as-paragraph): When we take one word after the fill column, don't stop at period with just one space. When checking whether at beginning of line, if no fill prefix, ignore intervening whitespace.
author Richard M. Stallman <rms@gnu.org>
date Mon, 02 Aug 1993 05:55:56 +0000
parents c476d93af94b
children 8c4835a24aca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2746
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
1 /* alloca.c -- allocate automatically reclaimed memory
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
2 (Mostly) portable public-domain implementation -- D A Gwyn
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4 This implementation of the PWB library alloca function,
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5 which is used to allocate space off the run-time stack so
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 that it is automatically reclaimed upon procedure exit,
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 was inspired by discussions with J. Q. Johnson of Cornell.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8 J.Otto Tennant <jot@cray.com> contributed the Cray support.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 There are some preprocessor constants that can
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 be defined when compiling for your specific system, for
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 improved efficiency; however, the defaults should be okay.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 The general concept of this implementation is to keep
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 track of all alloca-allocated blocks, and reclaim any
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 that are found to be deeper in the stack than the current
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17 invocation. This heuristic does not reclaim storage as
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 soon as it becomes invalid, but it will do so eventually.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20 As a special case, alloca(0) reclaims storage without
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
21 allocating any. It is a good idea to use alloca(0) in
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
22 your main control loop, etc. to force garbage collection. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
23
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
25 #include "config.h"
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
26 #endif
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
27
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 /* If compiling with GCC, this file's not needed. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
29 #ifndef alloca
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
31 #ifdef emacs
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
32 #ifdef static
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
33 /* actually, only want this if static is defined as ""
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34 -- this is for usg, in which emacs must undefine static
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 in order to make unexec workable
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
36 */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 #ifndef STACK_DIRECTION
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
38 you
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
39 lose
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40 -- must know STACK_DIRECTION at compile-time
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
41 #endif /* STACK_DIRECTION undefined */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
42 #endif /* static */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
43 #endif /* emacs */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
44
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
45 /* If your stack is a linked list of frames, you have to
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
46 provide an "address metric" ADDRESS_FUNCTION macro. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47
4073
c476d93af94b *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 3044
diff changeset
48 #if defined (CRAY) && defined (CRAY_STACKSEG_END)
2746
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
49 long i00afunc ();
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
50 #define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
51 #else
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
52 #define ADDRESS_FUNCTION(arg) &(arg)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
53 #endif
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
54
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
55 #if __STDC__
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
56 typedef void *pointer;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57 #else
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 typedef char *pointer;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
59 #endif
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61 #define NULL 0
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
62
3019
6261c371091e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2941
diff changeset
63 /* Different portions of Emacs need to call different versions of
6261c371091e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2941
diff changeset
64 malloc. The Emacs executable needs alloca to call xmalloc, because
6261c371091e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2941
diff changeset
65 ordinary malloc isn't protected from input signals. On the other
6261c371091e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2941
diff changeset
66 hand, the utilities in lib-src need alloca to call malloc; some of
6261c371091e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2941
diff changeset
67 them are very simple, and don't have an xmalloc routine.
6261c371091e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2941
diff changeset
68
3044
81c1ecaafd88 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 3019
diff changeset
69 Non-Emacs programs expect this to call use xmalloc.
81c1ecaafd88 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 3019
diff changeset
70
81c1ecaafd88 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 3019
diff changeset
71 Callers below should use malloc. */
81c1ecaafd88 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 3019
diff changeset
72
3019
6261c371091e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2941
diff changeset
73 #ifndef emacs
3044
81c1ecaafd88 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 3019
diff changeset
74 #define malloc xmalloc
81c1ecaafd88 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 3019
diff changeset
75 extern pointer xmalloc ();
3019
6261c371091e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2941
diff changeset
76 #endif
6261c371091e *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2941
diff changeset
77
2746
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
78 /* Define STACK_DIRECTION if you know the direction of stack
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
79 growth for your system; otherwise it will be automatically
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
80 deduced at run-time.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
81
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
82 STACK_DIRECTION > 0 => grows toward higher addresses
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
83 STACK_DIRECTION < 0 => grows toward lower addresses
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
84 STACK_DIRECTION = 0 => direction of growth unknown */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
86 #ifndef STACK_DIRECTION
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
87 #define STACK_DIRECTION 0 /* Direction unknown. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
88 #endif
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
89
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
90 #if STACK_DIRECTION != 0
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
91
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
92 #define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
93
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
94 #else /* STACK_DIRECTION == 0; need run-time code. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
95
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
96 static int stack_dir; /* 1 or -1 once known. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
97 #define STACK_DIR stack_dir
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
98
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
99 static void
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
100 find_stack_direction ()
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
101 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
102 static char *addr = NULL; /* Address of first `dummy', once known. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103 auto char dummy; /* To get stack address. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
104
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105 if (addr == NULL)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
106 { /* Initial entry. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 addr = ADDRESS_FUNCTION (dummy);
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 find_stack_direction (); /* Recurse once. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
111 else
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
112 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 /* Second entry. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114 if (ADDRESS_FUNCTION (dummy) > addr)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 stack_dir = 1; /* Stack grew upward. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116 else
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
117 stack_dir = -1; /* Stack grew downward. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
119 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
120
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
121 #endif /* STACK_DIRECTION == 0 */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
122
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
123 /* An "alloca header" is used to:
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
124 (a) chain together all alloca'ed blocks;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
125 (b) keep track of stack depth.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
126
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
127 It is very important that sizeof(header) agree with malloc
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
128 alignment chunk size. The following default should work okay. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
129
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
130 #ifndef ALIGN_SIZE
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
131 #define ALIGN_SIZE sizeof(double)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
132 #endif
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
133
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
134 typedef union hdr
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
135 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
136 char align[ALIGN_SIZE]; /* To force sizeof(header). */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
137 struct
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
138 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
139 union hdr *next; /* For chaining headers. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
140 char *deep; /* For stack depth measure. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
141 } h;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
142 } header;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
143
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
144 static header *last_alloca_header = NULL; /* -> last alloca header. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
145
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
146 /* Return a pointer to at least SIZE bytes of storage,
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
147 which will be automatically reclaimed upon exit from
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
148 the procedure that called alloca. Originally, this space
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
149 was supposed to be taken from the current stack frame of the
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
150 caller, but that method cannot be made to work for some
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
151 implementations of C, for example under Gould's UTX/32. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
152
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
153 pointer
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
154 alloca (size)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
155 unsigned size;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
156 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
157 auto char probe; /* Probes stack depth: */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
158 register char *depth = ADDRESS_FUNCTION (probe);
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
159
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
160 #if STACK_DIRECTION == 0
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
161 if (STACK_DIR == 0) /* Unknown growth direction. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
162 find_stack_direction ();
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
163 #endif
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
164
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
165 /* Reclaim garbage, defined as all alloca'd storage that
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
166 was allocated from deeper in the stack than currently. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
167
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
168 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
169 register header *hp; /* Traverses linked list. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
170
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
171 for (hp = last_alloca_header; hp != NULL;)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
172 if ((STACK_DIR > 0 && hp->h.deep > depth)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
173 || (STACK_DIR < 0 && hp->h.deep < depth))
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
174 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
175 register header *np = hp->h.next;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
176
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
177 free ((pointer) hp); /* Collect garbage. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
178
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
179 hp = np; /* -> next header. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
180 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
181 else
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
182 break; /* Rest are not deeper. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
183
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
184 last_alloca_header = hp; /* -> last valid storage. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
185 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
186
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
187 if (size == 0)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
188 return NULL; /* No allocation required. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
189
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
190 /* Allocate combined header + user data storage. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
191
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
192 {
2941
59bbdf423db8 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 2746
diff changeset
193 register pointer new = malloc (sizeof (header) + size);
2746
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
194 /* Address of header. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
195
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
196 ((header *) new)->h.next = last_alloca_header;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
197 ((header *) new)->h.deep = depth;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
198
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
199 last_alloca_header = (header *) new;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
200
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
201 /* User storage begins just after header. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
202
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
203 return (pointer) ((char *) new + sizeof (header));
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
204 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
205 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
206
4073
c476d93af94b *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 3044
diff changeset
207 #if defined (CRAY) && defined (CRAY_STACKSEG_END)
2746
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
208
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
209 #ifdef DEBUG_I00AFUNC
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
210 #include <stdio.h>
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
211 #endif
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
212
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
213 #ifndef CRAY_STACK
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
214 #define CRAY_STACK
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
215 #ifndef CRAY2
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
216 /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
217 struct stack_control_header
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
218 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
219 long shgrow:32; /* Number of times stack has grown. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
220 long shaseg:32; /* Size of increments to stack. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
221 long shhwm:32; /* High water mark of stack. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
222 long shsize:32; /* Current size of stack (all segments). */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
223 };
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
224
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
225 /* The stack segment linkage control information occurs at
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
226 the high-address end of a stack segment. (The stack
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
227 grows from low addresses to high addresses.) The initial
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
228 part of the stack segment linkage control information is
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
229 0200 (octal) words. This provides for register storage
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
230 for the routine which overflows the stack. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
231
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
232 struct stack_segment_linkage
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
233 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
234 long ss[0200]; /* 0200 overflow words. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
235 long sssize:32; /* Number of words in this segment. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
236 long ssbase:32; /* Offset to stack base. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
237 long:32;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
238 long sspseg:32; /* Offset to linkage control of previous
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
239 segment of stack. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
240 long:32;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
241 long sstcpt:32; /* Pointer to task common address block. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
242 long sscsnm; /* Private control structure number for
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
243 microtasking. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
244 long ssusr1; /* Reserved for user. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
245 long ssusr2; /* Reserved for user. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
246 long sstpid; /* Process ID for pid based multi-tasking. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
247 long ssgvup; /* Pointer to multitasking thread giveup. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
248 long sscray[7]; /* Reserved for Cray Research. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
249 long ssa0;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
250 long ssa1;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
251 long ssa2;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
252 long ssa3;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
253 long ssa4;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
254 long ssa5;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
255 long ssa6;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
256 long ssa7;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
257 long sss0;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
258 long sss1;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
259 long sss2;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
260 long sss3;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
261 long sss4;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
262 long sss5;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
263 long sss6;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
264 long sss7;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
265 };
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
266
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
267 #else /* CRAY2 */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
268 /* The following structure defines the vector of words
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
269 returned by the STKSTAT library routine. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
270 struct stk_stat
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
271 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
272 long now; /* Current total stack size. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
273 long maxc; /* Amount of contiguous space which would
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
274 be required to satisfy the maximum
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
275 stack demand to date. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
276 long high_water; /* Stack high-water mark. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
277 long overflows; /* Number of stack overflow ($STKOFEN) calls. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
278 long hits; /* Number of internal buffer hits. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
279 long extends; /* Number of block extensions. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
280 long stko_mallocs; /* Block allocations by $STKOFEN. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
281 long underflows; /* Number of stack underflow calls ($STKRETN). */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
282 long stko_free; /* Number of deallocations by $STKRETN. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
283 long stkm_free; /* Number of deallocations by $STKMRET. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
284 long segments; /* Current number of stack segments. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
285 long maxs; /* Maximum number of stack segments so far. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
286 long pad_size; /* Stack pad size. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
287 long current_address; /* Current stack segment address. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
288 long current_size; /* Current stack segment size. This
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
289 number is actually corrupted by STKSTAT to
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
290 include the fifteen word trailer area. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
291 long initial_address; /* Address of initial segment. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
292 long initial_size; /* Size of initial segment. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
293 };
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
294
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
295 /* The following structure describes the data structure which trails
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
296 any stack segment. I think that the description in 'asdef' is
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
297 out of date. I only describe the parts that I am sure about. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
298
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
299 struct stk_trailer
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
300 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
301 long this_address; /* Address of this block. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
302 long this_size; /* Size of this block (does not include
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
303 this trailer). */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
304 long unknown2;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
305 long unknown3;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
306 long link; /* Address of trailer block of previous
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
307 segment. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
308 long unknown5;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
309 long unknown6;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
310 long unknown7;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
311 long unknown8;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
312 long unknown9;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
313 long unknown10;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
314 long unknown11;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
315 long unknown12;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
316 long unknown13;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
317 long unknown14;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
318 };
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
319
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
320 #endif /* CRAY2 */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
321 #endif /* not CRAY_STACK */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
322
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
323 #ifdef CRAY2
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
324 /* Determine a "stack measure" for an arbitrary ADDRESS.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
325 I doubt that "lint" will like this much. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
326
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
327 static long
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
328 i00afunc (long *address)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
329 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
330 struct stk_stat status;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
331 struct stk_trailer *trailer;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
332 long *block, size;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
333 long result = 0;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
334
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
335 /* We want to iterate through all of the segments. The first
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
336 step is to get the stack status structure. We could do this
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
337 more quickly and more directly, perhaps, by referencing the
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
338 $LM00 common block, but I know that this works. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
339
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
340 STKSTAT (&status);
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
341
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
342 /* Set up the iteration. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
343
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
344 trailer = (struct stk_trailer *) (status.current_address
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
345 + status.current_size
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
346 - 15);
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
347
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
348 /* There must be at least one stack segment. Therefore it is
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
349 a fatal error if "trailer" is null. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
350
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
351 if (trailer == 0)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
352 abort ();
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
353
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
354 /* Discard segments that do not contain our argument address. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
355
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
356 while (trailer != 0)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
357 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
358 block = (long *) trailer->this_address;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
359 size = trailer->this_size;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
360 if (block == 0 || size == 0)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
361 abort ();
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
362 trailer = (struct stk_trailer *) trailer->link;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
363 if ((block <= address) && (address < (block + size)))
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
364 break;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
365 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
366
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
367 /* Set the result to the offset in this segment and add the sizes
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
368 of all predecessor segments. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
369
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
370 result = address - block;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
371
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
372 if (trailer == 0)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
373 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
374 return result;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
375 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
376
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
377 do
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
378 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
379 if (trailer->this_size <= 0)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
380 abort ();
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
381 result += trailer->this_size;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
382 trailer = (struct stk_trailer *) trailer->link;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
383 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
384 while (trailer != 0);
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
385
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
386 /* We are done. Note that if you present a bogus address (one
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
387 not in any segment), you will get a different number back, formed
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
388 from subtracting the address of the first block. This is probably
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
389 not what you want. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
390
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
391 return (result);
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
392 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
393
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
394 #else /* not CRAY2 */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
395 /* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
396 Determine the number of the cell within the stack,
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
397 given the address of the cell. The purpose of this
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
398 routine is to linearize, in some sense, stack addresses
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
399 for alloca. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
400
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
401 static long
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
402 i00afunc (long address)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
403 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
404 long stkl = 0;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
405
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
406 long size, pseg, this_segment, stack;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
407 long result = 0;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
408
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
409 struct stack_segment_linkage *ssptr;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
410
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
411 /* Register B67 contains the address of the end of the
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
412 current stack segment. If you (as a subprogram) store
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
413 your registers on the stack and find that you are past
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
414 the contents of B67, you have overflowed the segment.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
415
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
416 B67 also points to the stack segment linkage control
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
417 area, which is what we are really interested in. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
418
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
419 stkl = CRAY_STACKSEG_END ();
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
420 ssptr = (struct stack_segment_linkage *) stkl;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
421
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
422 /* If one subtracts 'size' from the end of the segment,
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
423 one has the address of the first word of the segment.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
424
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
425 If this is not the first segment, 'pseg' will be
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
426 nonzero. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
427
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
428 pseg = ssptr->sspseg;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
429 size = ssptr->sssize;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
430
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
431 this_segment = stkl - size;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
432
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
433 /* It is possible that calling this routine itself caused
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
434 a stack overflow. Discard stack segments which do not
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
435 contain the target address. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
436
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
437 while (!(this_segment <= address && address <= stkl))
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
438 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
439 #ifdef DEBUG_I00AFUNC
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
440 fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
441 #endif
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
442 if (pseg == 0)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
443 break;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
444 stkl = stkl - pseg;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
445 ssptr = (struct stack_segment_linkage *) stkl;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
446 size = ssptr->sssize;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
447 pseg = ssptr->sspseg;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
448 this_segment = stkl - size;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
449 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
450
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
451 result = address - this_segment;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
452
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
453 /* If you subtract pseg from the current end of the stack,
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
454 you get the address of the previous stack segment's end.
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
455 This seems a little convoluted to me, but I'll bet you save
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
456 a cycle somewhere. */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
457
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
458 while (pseg != 0)
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
459 {
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
460 #ifdef DEBUG_I00AFUNC
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
461 fprintf (stderr, "%011o %011o\n", pseg, size);
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
462 #endif
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
463 stkl = stkl - pseg;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
464 ssptr = (struct stack_segment_linkage *) stkl;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
465 size = ssptr->sssize;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
466 pseg = ssptr->sspseg;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
467 result += size;
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
468 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
469 return (result);
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
470 }
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
471
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
472 #endif /* not CRAY2 */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
473 #endif /* CRAY */
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
474
e4595f258ddd Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
475 #endif /* no alloca */