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