diff options
Diffstat (limited to 'gl/alloca.c')
-rw-r--r-- | gl/alloca.c | 154 |
1 files changed, 77 insertions, 77 deletions
diff --git a/gl/alloca.c b/gl/alloca.c index ff1cb7e..75afdb9 100644 --- a/gl/alloca.c +++ b/gl/alloca.c | |||
@@ -81,37 +81,37 @@ long i00afunc (); | |||
81 | STACK_DIRECTION = 0 => direction of growth unknown */ | 81 | STACK_DIRECTION = 0 => direction of growth unknown */ |
82 | 82 | ||
83 | # ifndef STACK_DIRECTION | 83 | # ifndef STACK_DIRECTION |
84 | # define STACK_DIRECTION 0 /* Direction unknown. */ | 84 | # define STACK_DIRECTION 0 /* Direction unknown. */ |
85 | # endif | 85 | # endif |
86 | 86 | ||
87 | # if STACK_DIRECTION != 0 | 87 | # if STACK_DIRECTION != 0 |
88 | 88 | ||
89 | # define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ | 89 | # define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ |
90 | 90 | ||
91 | # else /* STACK_DIRECTION == 0; need run-time code. */ | 91 | # else /* STACK_DIRECTION == 0; need run-time code. */ |
92 | 92 | ||
93 | static int stack_dir; /* 1 or -1 once known. */ | 93 | static int stack_dir; /* 1 or -1 once known. */ |
94 | # define STACK_DIR stack_dir | 94 | # define STACK_DIR stack_dir |
95 | 95 | ||
96 | static void | 96 | static void |
97 | find_stack_direction (void) | 97 | find_stack_direction (void) |
98 | { | 98 | { |
99 | static char *addr = NULL; /* Address of first `dummy', once known. */ | 99 | static char *addr = NULL; /* Address of first `dummy', once known. */ |
100 | auto char dummy; /* To get stack address. */ | 100 | auto char dummy; /* To get stack address. */ |
101 | 101 | ||
102 | if (addr == NULL) | 102 | if (addr == NULL) |
103 | { /* Initial entry. */ | 103 | { /* Initial entry. */ |
104 | addr = ADDRESS_FUNCTION (dummy); | 104 | addr = ADDRESS_FUNCTION (dummy); |
105 | 105 | ||
106 | find_stack_direction (); /* Recurse once. */ | 106 | find_stack_direction (); /* Recurse once. */ |
107 | } | 107 | } |
108 | else | 108 | else |
109 | { | 109 | { |
110 | /* Second entry. */ | 110 | /* Second entry. */ |
111 | if (ADDRESS_FUNCTION (dummy) > addr) | 111 | if (ADDRESS_FUNCTION (dummy) > addr) |
112 | stack_dir = 1; /* Stack grew upward. */ | 112 | stack_dir = 1; /* Stack grew upward. */ |
113 | else | 113 | else |
114 | stack_dir = -1; /* Stack grew downward. */ | 114 | stack_dir = -1; /* Stack grew downward. */ |
115 | } | 115 | } |
116 | } | 116 | } |
117 | 117 | ||
@@ -124,21 +124,21 @@ find_stack_direction (void) | |||
124 | It is very important that sizeof(header) agree with malloc | 124 | It is very important that sizeof(header) agree with malloc |
125 | alignment chunk size. The following default should work okay. */ | 125 | alignment chunk size. The following default should work okay. */ |
126 | 126 | ||
127 | # ifndef ALIGN_SIZE | 127 | # ifndef ALIGN_SIZE |
128 | # define ALIGN_SIZE sizeof(double) | 128 | # define ALIGN_SIZE sizeof(double) |
129 | # endif | 129 | # endif |
130 | 130 | ||
131 | typedef union hdr | 131 | typedef union hdr |
132 | { | 132 | { |
133 | char align[ALIGN_SIZE]; /* To force sizeof(header). */ | 133 | char align[ALIGN_SIZE]; /* To force sizeof(header). */ |
134 | struct | 134 | struct |
135 | { | 135 | { |
136 | union hdr *next; /* For chaining headers. */ | 136 | union hdr *next; /* For chaining headers. */ |
137 | char *deep; /* For stack depth measure. */ | 137 | char *deep; /* For stack depth measure. */ |
138 | } h; | 138 | } h; |
139 | } header; | 139 | } header; |
140 | 140 | ||
141 | static header *last_alloca_header = NULL; /* -> last alloca header. */ | 141 | static header *last_alloca_header = NULL; /* -> last alloca header. */ |
142 | 142 | ||
143 | /* Return a pointer to at least SIZE bytes of storage, | 143 | /* Return a pointer to at least SIZE bytes of storage, |
144 | which will be automatically reclaimed upon exit from | 144 | which will be automatically reclaimed upon exit from |
@@ -150,11 +150,11 @@ static header *last_alloca_header = NULL; /* -> last alloca header. */ | |||
150 | void * | 150 | void * |
151 | alloca (size_t size) | 151 | alloca (size_t size) |
152 | { | 152 | { |
153 | auto char probe; /* Probes stack depth: */ | 153 | auto char probe; /* Probes stack depth: */ |
154 | register char *depth = ADDRESS_FUNCTION (probe); | 154 | register char *depth = ADDRESS_FUNCTION (probe); |
155 | 155 | ||
156 | # if STACK_DIRECTION == 0 | 156 | # if STACK_DIRECTION == 0 |
157 | if (STACK_DIR == 0) /* Unknown growth direction. */ | 157 | if (STACK_DIR == 0) /* Unknown growth direction. */ |
158 | find_stack_direction (); | 158 | find_stack_direction (); |
159 | # endif | 159 | # endif |
160 | 160 | ||
@@ -162,7 +162,7 @@ alloca (size_t size) | |||
162 | was allocated from deeper in the stack than currently. */ | 162 | was allocated from deeper in the stack than currently. */ |
163 | 163 | ||
164 | { | 164 | { |
165 | register header *hp; /* Traverses linked list. */ | 165 | register header *hp; /* Traverses linked list. */ |
166 | 166 | ||
167 | # ifdef emacs | 167 | # ifdef emacs |
168 | BLOCK_INPUT; | 168 | BLOCK_INPUT; |
@@ -170,18 +170,18 @@ alloca (size_t size) | |||
170 | 170 | ||
171 | for (hp = last_alloca_header; hp != NULL;) | 171 | for (hp = last_alloca_header; hp != NULL;) |
172 | if ((STACK_DIR > 0 && hp->h.deep > depth) | 172 | if ((STACK_DIR > 0 && hp->h.deep > depth) |
173 | || (STACK_DIR < 0 && hp->h.deep < depth)) | 173 | || (STACK_DIR < 0 && hp->h.deep < depth)) |
174 | { | 174 | { |
175 | register header *np = hp->h.next; | 175 | register header *np = hp->h.next; |
176 | 176 | ||
177 | free (hp); /* Collect garbage. */ | 177 | free (hp); /* Collect garbage. */ |
178 | 178 | ||
179 | hp = np; /* -> next header. */ | 179 | hp = np; /* -> next header. */ |
180 | } | 180 | } |
181 | else | 181 | else |
182 | break; /* Rest are not deeper. */ | 182 | break; /* Rest are not deeper. */ |
183 | 183 | ||
184 | last_alloca_header = hp; /* -> last valid storage. */ | 184 | last_alloca_header = hp; /* -> last valid storage. */ |
185 | 185 | ||
186 | # ifdef emacs | 186 | # ifdef emacs |
187 | UNBLOCK_INPUT; | 187 | UNBLOCK_INPUT; |
@@ -189,7 +189,7 @@ alloca (size_t size) | |||
189 | } | 189 | } |
190 | 190 | ||
191 | if (size == 0) | 191 | if (size == 0) |
192 | return NULL; /* No allocation required. */ | 192 | return NULL; /* No allocation required. */ |
193 | 193 | ||
194 | /* Allocate combined header + user data storage. */ | 194 | /* Allocate combined header + user data storage. */ |
195 | 195 | ||
@@ -229,10 +229,10 @@ alloca (size_t size) | |||
229 | /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ | 229 | /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ |
230 | struct stack_control_header | 230 | struct stack_control_header |
231 | { | 231 | { |
232 | long shgrow:32; /* Number of times stack has grown. */ | 232 | long shgrow:32; /* Number of times stack has grown. */ |
233 | long shaseg:32; /* Size of increments to stack. */ | 233 | long shaseg:32; /* Size of increments to stack. */ |
234 | long shhwm:32; /* High water mark of stack. */ | 234 | long shhwm:32; /* High water mark of stack. */ |
235 | long shsize:32; /* Current size of stack (all segments). */ | 235 | long shsize:32; /* Current size of stack (all segments). */ |
236 | }; | 236 | }; |
237 | 237 | ||
238 | /* The stack segment linkage control information occurs at | 238 | /* The stack segment linkage control information occurs at |
@@ -244,21 +244,21 @@ struct stack_control_header | |||
244 | 244 | ||
245 | struct stack_segment_linkage | 245 | struct stack_segment_linkage |
246 | { | 246 | { |
247 | long ss[0200]; /* 0200 overflow words. */ | 247 | long ss[0200]; /* 0200 overflow words. */ |
248 | long sssize:32; /* Number of words in this segment. */ | 248 | long sssize:32; /* Number of words in this segment. */ |
249 | long ssbase:32; /* Offset to stack base. */ | 249 | long ssbase:32; /* Offset to stack base. */ |
250 | long:32; | 250 | long:32; |
251 | long sspseg:32; /* Offset to linkage control of previous | 251 | long sspseg:32; /* Offset to linkage control of previous |
252 | segment of stack. */ | 252 | segment of stack. */ |
253 | long:32; | 253 | long:32; |
254 | long sstcpt:32; /* Pointer to task common address block. */ | 254 | long sstcpt:32; /* Pointer to task common address block. */ |
255 | long sscsnm; /* Private control structure number for | 255 | long sscsnm; /* Private control structure number for |
256 | microtasking. */ | 256 | microtasking. */ |
257 | long ssusr1; /* Reserved for user. */ | 257 | long ssusr1; /* Reserved for user. */ |
258 | long ssusr2; /* Reserved for user. */ | 258 | long ssusr2; /* Reserved for user. */ |
259 | long sstpid; /* Process ID for pid based multi-tasking. */ | 259 | long sstpid; /* Process ID for pid based multi-tasking. */ |
260 | long ssgvup; /* Pointer to multitasking thread giveup. */ | 260 | long ssgvup; /* Pointer to multitasking thread giveup. */ |
261 | long sscray[7]; /* Reserved for Cray Research. */ | 261 | long sscray[7]; /* Reserved for Cray Research. */ |
262 | long ssa0; | 262 | long ssa0; |
263 | long ssa1; | 263 | long ssa1; |
264 | long ssa2; | 264 | long ssa2; |
@@ -282,27 +282,27 @@ struct stack_segment_linkage | |||
282 | returned by the STKSTAT library routine. */ | 282 | returned by the STKSTAT library routine. */ |
283 | struct stk_stat | 283 | struct stk_stat |
284 | { | 284 | { |
285 | long now; /* Current total stack size. */ | 285 | long now; /* Current total stack size. */ |
286 | long maxc; /* Amount of contiguous space which would | 286 | long maxc; /* Amount of contiguous space which would |
287 | be required to satisfy the maximum | 287 | be required to satisfy the maximum |
288 | stack demand to date. */ | 288 | stack demand to date. */ |
289 | long high_water; /* Stack high-water mark. */ | 289 | long high_water; /* Stack high-water mark. */ |
290 | long overflows; /* Number of stack overflow ($STKOFEN) calls. */ | 290 | long overflows; /* Number of stack overflow ($STKOFEN) calls. */ |
291 | long hits; /* Number of internal buffer hits. */ | 291 | long hits; /* Number of internal buffer hits. */ |
292 | long extends; /* Number of block extensions. */ | 292 | long extends; /* Number of block extensions. */ |
293 | long stko_mallocs; /* Block allocations by $STKOFEN. */ | 293 | long stko_mallocs; /* Block allocations by $STKOFEN. */ |
294 | long underflows; /* Number of stack underflow calls ($STKRETN). */ | 294 | long underflows; /* Number of stack underflow calls ($STKRETN). */ |
295 | long stko_free; /* Number of deallocations by $STKRETN. */ | 295 | long stko_free; /* Number of deallocations by $STKRETN. */ |
296 | long stkm_free; /* Number of deallocations by $STKMRET. */ | 296 | long stkm_free; /* Number of deallocations by $STKMRET. */ |
297 | long segments; /* Current number of stack segments. */ | 297 | long segments; /* Current number of stack segments. */ |
298 | long maxs; /* Maximum number of stack segments so far. */ | 298 | long maxs; /* Maximum number of stack segments so far. */ |
299 | long pad_size; /* Stack pad size. */ | 299 | long pad_size; /* Stack pad size. */ |
300 | long current_address; /* Current stack segment address. */ | 300 | long current_address; /* Current stack segment address. */ |
301 | long current_size; /* Current stack segment size. This | 301 | long current_size; /* Current stack segment size. This |
302 | number is actually corrupted by STKSTAT to | 302 | number is actually corrupted by STKSTAT to |
303 | include the fifteen word trailer area. */ | 303 | include the fifteen word trailer area. */ |
304 | long initial_address; /* Address of initial segment. */ | 304 | long initial_address; /* Address of initial segment. */ |
305 | long initial_size; /* Size of initial segment. */ | 305 | long initial_size; /* Size of initial segment. */ |
306 | }; | 306 | }; |
307 | 307 | ||
308 | /* The following structure describes the data structure which trails | 308 | /* The following structure describes the data structure which trails |
@@ -311,13 +311,13 @@ struct stk_stat | |||
311 | 311 | ||
312 | struct stk_trailer | 312 | struct stk_trailer |
313 | { | 313 | { |
314 | long this_address; /* Address of this block. */ | 314 | long this_address; /* Address of this block. */ |
315 | long this_size; /* Size of this block (does not include | 315 | long this_size; /* Size of this block (does not include |
316 | this trailer). */ | 316 | this trailer). */ |
317 | long unknown2; | 317 | long unknown2; |
318 | long unknown3; | 318 | long unknown3; |
319 | long link; /* Address of trailer block of previous | 319 | long link; /* Address of trailer block of previous |
320 | segment. */ | 320 | segment. */ |
321 | long unknown5; | 321 | long unknown5; |
322 | long unknown6; | 322 | long unknown6; |
323 | long unknown7; | 323 | long unknown7; |
@@ -355,8 +355,8 @@ i00afunc (long *address) | |||
355 | /* Set up the iteration. */ | 355 | /* Set up the iteration. */ |
356 | 356 | ||
357 | trailer = (struct stk_trailer *) (status.current_address | 357 | trailer = (struct stk_trailer *) (status.current_address |
358 | + status.current_size | 358 | + status.current_size |
359 | - 15); | 359 | - 15); |
360 | 360 | ||
361 | /* There must be at least one stack segment. Therefore it is | 361 | /* There must be at least one stack segment. Therefore it is |
362 | a fatal error if "trailer" is null. */ | 362 | a fatal error if "trailer" is null. */ |
@@ -371,10 +371,10 @@ i00afunc (long *address) | |||
371 | block = (long *) trailer->this_address; | 371 | block = (long *) trailer->this_address; |
372 | size = trailer->this_size; | 372 | size = trailer->this_size; |
373 | if (block == 0 || size == 0) | 373 | if (block == 0 || size == 0) |
374 | abort (); | 374 | abort (); |
375 | trailer = (struct stk_trailer *) trailer->link; | 375 | trailer = (struct stk_trailer *) trailer->link; |
376 | if ((block <= address) && (address < (block + size))) | 376 | if ((block <= address) && (address < (block + size))) |
377 | break; | 377 | break; |
378 | } | 378 | } |
379 | 379 | ||
380 | /* Set the result to the offset in this segment and add the sizes | 380 | /* Set the result to the offset in this segment and add the sizes |
@@ -390,7 +390,7 @@ i00afunc (long *address) | |||
390 | do | 390 | do |
391 | { | 391 | { |
392 | if (trailer->this_size <= 0) | 392 | if (trailer->this_size <= 0) |
393 | abort (); | 393 | abort (); |
394 | result += trailer->this_size; | 394 | result += trailer->this_size; |
395 | trailer = (struct stk_trailer *) trailer->link; | 395 | trailer = (struct stk_trailer *) trailer->link; |
396 | } | 396 | } |
@@ -453,7 +453,7 @@ i00afunc (long address) | |||
453 | fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); | 453 | fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); |
454 | # endif | 454 | # endif |
455 | if (pseg == 0) | 455 | if (pseg == 0) |
456 | break; | 456 | break; |
457 | stkl = stkl - pseg; | 457 | stkl = stkl - pseg; |
458 | ssptr = (struct stack_segment_linkage *) stkl; | 458 | ssptr = (struct stack_segment_linkage *) stkl; |
459 | size = ssptr->sssize; | 459 | size = ssptr->sssize; |