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