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 ff1cb7e9..75afdb96 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; |
