Partially sync files.el from XEmacs 21.5 for wildcard support.
[sxemacs] / src / 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 /* Synched up with: FSF 19.30. */
25
26 /* Authorship:
27
28    FSF: A long time ago.
29    Very few changes for XEmacs.
30  */
31
32 #ifdef HAVE_CONFIG_H
33 #include <config.h>
34 #endif
35
36 /* XEmacs: If compiling with GCC 2, this file is theoretically not needed.
37    However, alloca() is broken under GCC 2 on many machines: you
38    cannot put a call to alloca() as part of an argument to a function.
39  */
40 /* If someone has defined alloca as a macro,
41    there must be some other way alloca is supposed to work.  */
42 /* XEmacs sometimes uses the C alloca even when a builtin alloca is available,
43    because it's safer. */
44 #if defined (EMACS_WANTS_C_ALLOCA) || (!defined (alloca) && (!defined (__GNUC__) || __GNUC__ < 2))
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 #ifdef __STDC__                 /* XEmacs change */
66 typedef void *pointer;
67 #else
68 typedef char *pointer;
69 #endif
70
71 /* XEmacs: With ERROR_CHECK_MALLOC defined, there is no xfree -- it's
72    a macro that does some stuff to try and trap invalid frees,
73    and then calls xfree_1 to actually do the work. */
74
75 #ifdef emacs
76 # ifdef ERROR_CHECK_MALLOC
77 void xfree_1(pointer);
78 #  define xfree xfree_1
79 # else
80 void xfree(pointer);
81 # endif
82 #endif
83
84 #ifndef NULL
85 #define NULL    0
86 #endif
87
88 /* Different portions of Emacs need to call different versions of
89    malloc.  The Emacs executable needs alloca to call xmalloc, because
90    ordinary malloc isn't protected from input signals.  On the other
91    hand, the utilities in lib-src need alloca to call malloc; some of
92    them are very simple, and don't have an xmalloc routine.
93
94    Non-Emacs programs expect this to call use xmalloc.
95
96    Callers below should use malloc.  */
97
98 #ifdef emacs
99 #define malloc xmalloc
100 #endif
101 extern pointer malloc();
102
103 /* Define STACK_DIRECTION if you know the direction of stack
104    growth for your system; otherwise it will be automatically
105    deduced at run-time.
106
107    STACK_DIRECTION > 0 => grows toward higher addresses
108    STACK_DIRECTION < 0 => grows toward lower addresses
109    STACK_DIRECTION = 0 => direction of growth unknown  */
110
111 #ifndef STACK_DIRECTION
112 #define STACK_DIRECTION 0       /* Direction unknown.  */
113 #endif
114
115 #if STACK_DIRECTION != 0
116
117 #define STACK_DIR       STACK_DIRECTION /* Known at compile-time.  */
118
119 #else                           /* STACK_DIRECTION == 0; need run-time code.  */
120
121 static int stack_dir;           /* 1 or -1 once known.  */
122 #define STACK_DIR       stack_dir
123
124 static void find_stack_direction()
125 {
126         static char *addr = NULL;       /* Address of first `dummy', once known.  */
127         auto char dummy;        /* To get stack address.  */
128
129         if (addr == NULL) {     /* Initial entry.  */
130                 addr = ADDRESS_FUNCTION(dummy);
131
132                 find_stack_direction(); /* Recurse once.  */
133         } else {
134                 /* Second entry.  */
135                 if (ADDRESS_FUNCTION(dummy) > addr)
136                         stack_dir = 1;  /* Stack grew upward.  */
137                 else
138                         stack_dir = -1; /* Stack grew downward.  */
139         }
140 }
141
142 #endif                          /* STACK_DIRECTION == 0 */
143
144 /* An "alloca header" is used to:
145    (a) chain together all alloca'ed blocks;
146    (b) keep track of stack depth.
147
148    It is very important that sizeof(header) agree with malloc
149    alignment chunk size.  The following default should work okay.  */
150
151 #ifndef ALIGN_SIZE
152 #define ALIGN_SIZE      sizeof(double)
153 #endif
154
155 typedef union hdr {
156         char align[ALIGN_SIZE]; /* To force sizeof(header).  */
157         struct {
158                 union hdr *next;        /* For chaining headers.  */
159                 char *deep;     /* For stack depth measure.  */
160         } h;
161 } header;
162
163 static header *last_alloca_header = NULL;       /* -> last alloca header.  */
164
165 /* Return a pointer to at least SIZE bytes of storage,
166    which will be automatically reclaimed upon exit from
167    the procedure that called alloca.  Originally, this space
168    was supposed to be taken from the current stack frame of the
169    caller, but that method cannot be made to work for some
170    implementations of C, for example under Gould's UTX/32.  */
171
172 pointer
173 #ifdef EMACS_WANTS_C_ALLOCA
174 c_alloca(size)
175 #else
176 alloca(size)
177 #endif
178 unsigned size;
179 {
180         auto char probe;        /* Probes stack depth: */
181         register char *depth = ADDRESS_FUNCTION(probe);
182
183 #if STACK_DIRECTION == 0
184         if (STACK_DIR == 0)     /* Unknown growth direction.  */
185                 find_stack_direction();
186 #endif
187
188         /* Reclaim garbage, defined as all alloca'd storage that
189            was allocated from deeper in the stack than currently. */
190
191         {
192                 register header *hp;    /* Traverses linked list.  */
193
194                 for (hp = last_alloca_header; hp != NULL;)
195                         if ((STACK_DIR > 0 && hp->h.deep > depth)
196                             || (STACK_DIR < 0 && hp->h.deep < depth)) {
197                                 register header *np = hp->h.next;
198
199                                 free((pointer) hp);     /* Collect garbage.  */
200
201                                 hp = np;        /* -> next header.  */
202                         } else
203                                 break;  /* Rest are not deeper.  */
204
205                 last_alloca_header = hp;        /* -> last valid storage.  */
206         }
207
208         if (size == 0)
209                 return NULL;    /* No allocation required.  */
210
211         /* Allocate combined header + user data storage.  */
212
213         {
214                 register pointer new = malloc(sizeof(header) + size);
215                 /* Address of header.  */
216
217                 ((header *) new)->h.next = last_alloca_header;
218                 ((header *) new)->h.deep = depth;
219
220                 last_alloca_header = (header *) new;
221
222                 /* User storage begins just after header.  */
223
224                 return (pointer) ((char *)new + sizeof(header));
225         }
226 }
227
228 #if defined (CRAY) && defined (CRAY_STACKSEG_END)
229
230 #ifdef DEBUG_I00AFUNC
231 #include <stdio.h>
232 #endif
233
234 #ifndef CRAY_STACK
235 #define CRAY_STACK
236 #ifndef CRAY2
237 /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
238 struct stack_control_header {
239         long shgrow:32;         /* Number of times stack has grown.  */
240         long shaseg:32;         /* Size of increments to stack.  */
241         long shhwm:32;          /* High water mark of stack.  */
242         long shsize:32;         /* Current size of stack (all segments).  */
243 };
244
245 /* The stack segment linkage control information occurs at
246    the high-address end of a stack segment.  (The stack
247    grows from low addresses to high addresses.)  The initial
248    part of the stack segment linkage control information is
249    0200 (octal) words.  This provides for register storage
250    for the routine which overflows the stack.  */
251
252 struct stack_segment_linkage {
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         long now;               /* Current total stack size.  */
291         long maxc;              /* Amount of contiguous space which would
292                                    be required to satisfy the maximum
293                                    stack demand to date.  */
294         long high_water;        /* Stack high-water mark.  */
295         long overflows;         /* Number of stack overflow ($STKOFEN) calls.  */
296         long hits;              /* Number of internal buffer hits.  */
297         long extends;           /* Number of block extensions.  */
298         long stko_mallocs;      /* Block allocations by $STKOFEN.  */
299         long underflows;        /* Number of stack underflow calls ($STKRETN).  */
300         long stko_free;         /* Number of deallocations by $STKRETN.  */
301         long stkm_free;         /* Number of deallocations by $STKMRET.  */
302         long segments;          /* Current number of stack segments.  */
303         long maxs;              /* Maximum number of stack segments so far.  */
304         long pad_size;          /* Stack pad size.  */
305         long current_address;   /* Current stack segment address.  */
306         long current_size;      /* Current stack segment size.  This
307                                    number is actually corrupted by STKSTAT to
308                                    include the fifteen word trailer area.  */
309         long initial_address;   /* Address of initial segment.  */
310         long initial_size;      /* Size of initial segment.  */
311 };
312
313 /* The following structure describes the data structure which trails
314    any stack segment.  I think that the description in 'asdef' is
315    out of date.  I only describe the parts that I am sure about.  */
316
317 struct stk_trailer {
318         long this_address;      /* Address of this block.  */
319         long this_size;         /* Size of this block (does not include
320                                    this trailer).  */
321         long unknown2;
322         long unknown3;
323         long link;              /* Address of trailer block of previous
324                                    segment.  */
325         long unknown5;
326         long unknown6;
327         long unknown7;
328         long unknown8;
329         long unknown9;
330         long unknown10;
331         long unknown11;
332         long unknown12;
333         long unknown13;
334         long unknown14;
335 };
336
337 #endif                          /* CRAY2 */
338 #endif                          /* not CRAY_STACK */
339
340 #ifdef CRAY2
341 /* Determine a "stack measure" for an arbitrary ADDRESS.
342    I doubt that "lint" will like this much. */
343
344 static long i00afunc(long *address)
345 {
346         struct stk_stat status;
347         struct stk_trailer *trailer;
348         long *block, size;
349         long result = 0;
350
351         /* We want to iterate through all of the segments.  The first
352            step is to get the stack status structure.  We could do this
353            more quickly and more directly, perhaps, by referencing the
354            $LM00 common block, but I know that this works.  */
355
356         STKSTAT(&status);
357
358         /* Set up the iteration.  */
359
360         trailer = (struct stk_trailer *)(status.current_address
361                                          + status.current_size - 15);
362
363         /* There must be at least one stack segment.  Therefore it is
364            a fatal error if "trailer" is null.  */
365
366         if (trailer == 0)
367                 abort();
368
369         /* Discard segments that do not contain our argument address.  */
370
371         while (trailer != 0) {
372                 block = (long *)trailer->this_address;
373                 size = trailer->this_size;
374                 if (block == 0 || size == 0)
375                         abort();
376                 trailer = (struct stk_trailer *)trailer->link;
377                 if ((block <= address) && (address < (block + size)))
378                         break;
379         }
380
381         /* Set the result to the offset in this segment and add the sizes
382            of all predecessor segments.  */
383
384         result = address - block;
385
386         if (trailer == 0) {
387                 return result;
388         }
389
390         do {
391                 if (trailer->this_size <= 0)
392                         abort();
393                 result += trailer->this_size;
394                 trailer = (struct stk_trailer *)trailer->link;
395         }
396         while (trailer != 0);
397
398         /* We are done.  Note that if you present a bogus address (one
399            not in any segment), you will get a different number back, formed
400            from subtracting the address of the first block.  This is probably
401            not what you want.  */
402
403         return (result);
404 }
405
406 #else                           /* not CRAY2 */
407 /* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
408    Determine the number of the cell within the stack,
409    given the address of the cell.  The purpose of this
410    routine is to linearize, in some sense, stack addresses
411    for alloca.  */
412
413 static long i00afunc(long address)
414 {
415         long stkl = 0;
416
417         long size, pseg, this_segment, stack;
418         long result = 0;
419
420         struct stack_segment_linkage *ssptr;
421
422         /* Register B67 contains the address of the end of the
423            current stack segment.  If you (as a subprogram) store
424            your registers on the stack and find that you are past
425            the contents of B67, you have overflowed the segment.
426
427            B67 also points to the stack segment linkage control
428            area, which is what we are really interested in.  */
429
430         stkl = CRAY_STACKSEG_END();
431         ssptr = (struct stack_segment_linkage *)stkl;
432
433         /* If one subtracts 'size' from the end of the segment,
434            one has the address of the first word of the segment.
435
436            If this is not the first segment, 'pseg' will be
437            nonzero.  */
438
439         pseg = ssptr->sspseg;
440         size = ssptr->sssize;
441
442         this_segment = stkl - size;
443
444         /* It is possible that calling this routine itself caused
445            a stack overflow.  Discard stack segments which do not
446            contain the target address.  */
447
448         while (!(this_segment <= address && address <= stkl)) {
449 #ifdef DEBUG_I00AFUNC
450                 fprintf(stderr, "%011o %011o %011o\n", this_segment, address,
451                         stkl);
452 #endif
453                 if (pseg == 0)
454                         break;
455                 stkl = stkl - pseg;
456                 ssptr = (struct stack_segment_linkage *)stkl;
457                 size = ssptr->sssize;
458                 pseg = ssptr->sspseg;
459                 this_segment = stkl - size;
460         }
461
462         result = address - this_segment;
463
464         /* If you subtract pseg from the current end of the stack,
465            you get the address of the previous stack segment's end.
466            This seems a little convoluted to me, but I'll bet you save
467            a cycle somewhere.  */
468
469         while (pseg != 0) {
470 #ifdef DEBUG_I00AFUNC
471                 fprintf(stderr, "%011o %011o\n", pseg, size);
472 #endif
473                 stkl = stkl - pseg;
474                 ssptr = (struct stack_segment_linkage *)stkl;
475                 size = ssptr->sssize;
476                 pseg = ssptr->sspseg;
477                 result += size;
478         }
479         return (result);
480 }
481
482 #endif                          /* not CRAY2 */
483 #endif                          /* CRAY */
484
485 #endif                          /* complicated expression at top of file */