1
/* alloca.c -- allocate automatically reclaimed memory
2
(Mostly) portable public-domain implementation -- D A Gwyn
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.
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.
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.
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. */
24
/* Synched up with: FSF 19.30. */
29
Very few changes for XEmacs.
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.
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))
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
52
#ifndef STACK_DIRECTION
55
#endif /* STACK_DIRECTION undefined */
59
/* If your stack is a linked list of frames, you have to
60
provide an "address metric" ADDRESS_FUNCTION macro. */
62
#if defined (CRAY) && defined (CRAY_STACKSEG_END)
64
#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
66
#define ADDRESS_FUNCTION(arg) &(arg)
69
#ifdef __STDC__ /* XEmacs change */
70
typedef void *pointer;
72
typedef char *pointer;
75
/* XEmacs: With ERROR_CHECK_MALLOC defined, there is no xfree -- it's
76
a macro that does some stuff to try and trap invalid frees,
77
and then calls xfree_1 to actually do the work. */
80
# ifdef ERROR_CHECK_MALLOC
81
void xfree_1 (pointer);
82
# define xfree xfree_1
92
/* Different portions of Emacs need to call different versions of
93
malloc. The Emacs executable needs alloca to call xmalloc, because
94
ordinary malloc isn't protected from input signals. On the other
95
hand, the utilities in lib-src need alloca to call malloc; some of
96
them are very simple, and don't have an xmalloc routine.
98
Non-Emacs programs expect this to call use xmalloc.
100
Callers below should use malloc. */
103
#define malloc xmalloc
106
extern pointer malloc ();
108
extern void *malloc();
111
/* Define STACK_DIRECTION if you know the direction of stack
112
growth for your system; otherwise it will be automatically
115
STACK_DIRECTION > 0 => grows toward higher addresses
116
STACK_DIRECTION < 0 => grows toward lower addresses
117
STACK_DIRECTION = 0 => direction of growth unknown */
119
#ifndef STACK_DIRECTION
120
#define STACK_DIRECTION 0 /* Direction unknown. */
123
#if STACK_DIRECTION != 0
125
#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
127
#else /* STACK_DIRECTION == 0; need run-time code. */
129
static int stack_dir; /* 1 or -1 once known. */
130
#define STACK_DIR stack_dir
133
find_stack_direction ()
135
static char *addr = NULL; /* Address of first `dummy', once known. */
136
auto char dummy; /* To get stack address. */
139
{ /* Initial entry. */
140
addr = ADDRESS_FUNCTION (dummy);
142
find_stack_direction (); /* Recurse once. */
147
if (ADDRESS_FUNCTION (dummy) > addr)
148
stack_dir = 1; /* Stack grew upward. */
150
stack_dir = -1; /* Stack grew downward. */
154
#endif /* STACK_DIRECTION == 0 */
156
/* An "alloca header" is used to:
157
(a) chain together all alloca'ed blocks;
158
(b) keep track of stack depth.
160
It is very important that sizeof(header) agree with malloc
161
alignment chunk size. The following default should work okay. */
164
#define ALIGN_SIZE sizeof(double)
169
char align[ALIGN_SIZE]; /* To force sizeof(header). */
172
union hdr *next; /* For chaining headers. */
173
char *deep; /* For stack depth measure. */
177
static header *last_alloca_header = NULL; /* -> last alloca header. */
179
/* Return a pointer to at least SIZE bytes of storage,
180
which will be automatically reclaimed upon exit from
181
the procedure that called alloca. Originally, this space
182
was supposed to be taken from the current stack frame of the
183
caller, but that method cannot be made to work for some
184
implementations of C, for example under Gould's UTX/32. */
187
#ifdef EMACS_WANTS_C_ALLOCA
194
auto char probe; /* Probes stack depth: */
195
register char *depth = ADDRESS_FUNCTION (probe);
197
#if STACK_DIRECTION == 0
198
if (STACK_DIR == 0) /* Unknown growth direction. */
199
find_stack_direction ();
202
/* Reclaim garbage, defined as all alloca'd storage that
203
was allocated from deeper in the stack than currently. */
206
register header *hp; /* Traverses linked list. */
208
for (hp = last_alloca_header; hp != NULL;)
209
if ((STACK_DIR > 0 && hp->h.deep > depth)
210
|| (STACK_DIR < 0 && hp->h.deep < depth))
212
register header *np = hp->h.next;
214
free ((pointer) hp); /* Collect garbage. */
216
hp = np; /* -> next header. */
219
break; /* Rest are not deeper. */
221
last_alloca_header = hp; /* -> last valid storage. */
225
return NULL; /* No allocation required. */
227
/* Allocate combined header + user data storage. */
230
register pointer new = malloc (sizeof (header) + size);
231
/* Address of header. */
233
((header *) new)->h.next = last_alloca_header;
234
((header *) new)->h.deep = depth;
236
last_alloca_header = (header *) new;
238
/* User storage begins just after header. */
240
return (pointer) ((char *) new + sizeof (header));
244
#if defined (CRAY) && defined (CRAY_STACKSEG_END)
246
#ifdef DEBUG_I00AFUNC
253
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
254
struct stack_control_header
256
long shgrow:32; /* Number of times stack has grown. */
257
long shaseg:32; /* Size of increments to stack. */
258
long shhwm:32; /* High water mark of stack. */
259
long shsize:32; /* Current size of stack (all segments). */
262
/* The stack segment linkage control information occurs at
263
the high-address end of a stack segment. (The stack
264
grows from low addresses to high addresses.) The initial
265
part of the stack segment linkage control information is
266
0200 (octal) words. This provides for register storage
267
for the routine which overflows the stack. */
269
struct stack_segment_linkage
271
long ss[0200]; /* 0200 overflow words. */
272
long sssize:32; /* Number of words in this segment. */
273
long ssbase:32; /* Offset to stack base. */
275
long sspseg:32; /* Offset to linkage control of previous
278
long sstcpt:32; /* Pointer to task common address block. */
279
long sscsnm; /* Private control structure number for
281
long ssusr1; /* Reserved for user. */
282
long ssusr2; /* Reserved for user. */
283
long sstpid; /* Process ID for pid based multi-tasking. */
284
long ssgvup; /* Pointer to multitasking thread giveup. */
285
long sscray[7]; /* Reserved for Cray Research. */
305
/* The following structure defines the vector of words
306
returned by the STKSTAT library routine. */
309
long now; /* Current total stack size. */
310
long maxc; /* Amount of contiguous space which would
311
be required to satisfy the maximum
312
stack demand to date. */
313
long high_water; /* Stack high-water mark. */
314
long overflows; /* Number of stack overflow ($STKOFEN) calls. */
315
long hits; /* Number of internal buffer hits. */
316
long extends; /* Number of block extensions. */
317
long stko_mallocs; /* Block allocations by $STKOFEN. */
318
long underflows; /* Number of stack underflow calls ($STKRETN). */
319
long stko_free; /* Number of deallocations by $STKRETN. */
320
long stkm_free; /* Number of deallocations by $STKMRET. */
321
long segments; /* Current number of stack segments. */
322
long maxs; /* Maximum number of stack segments so far. */
323
long pad_size; /* Stack pad size. */
324
long current_address; /* Current stack segment address. */
325
long current_size; /* Current stack segment size. This
326
number is actually corrupted by STKSTAT to
327
include the fifteen word trailer area. */
328
long initial_address; /* Address of initial segment. */
329
long initial_size; /* Size of initial segment. */
332
/* The following structure describes the data structure which trails
333
any stack segment. I think that the description in 'asdef' is
334
out of date. I only describe the parts that I am sure about. */
338
long this_address; /* Address of this block. */
339
long this_size; /* Size of this block (does not include
343
long link; /* Address of trailer block of previous
358
#endif /* not CRAY_STACK */
361
/* Determine a "stack measure" for an arbitrary ADDRESS.
362
I doubt that "lint" will like this much. */
365
i00afunc (long *address)
367
struct stk_stat status;
368
struct stk_trailer *trailer;
372
/* We want to iterate through all of the segments. The first
373
step is to get the stack status structure. We could do this
374
more quickly and more directly, perhaps, by referencing the
375
$LM00 common block, but I know that this works. */
379
/* Set up the iteration. */
381
trailer = (struct stk_trailer *) (status.current_address
382
+ status.current_size
385
/* There must be at least one stack segment. Therefore it is
386
a fatal error if "trailer" is null. */
391
/* Discard segments that do not contain our argument address. */
395
block = (long *) trailer->this_address;
396
size = trailer->this_size;
397
if (block == 0 || size == 0)
399
trailer = (struct stk_trailer *) trailer->link;
400
if ((block <= address) && (address < (block + size)))
404
/* Set the result to the offset in this segment and add the sizes
405
of all predecessor segments. */
407
result = address - block;
416
if (trailer->this_size <= 0)
418
result += trailer->this_size;
419
trailer = (struct stk_trailer *) trailer->link;
421
while (trailer != 0);
423
/* We are done. Note that if you present a bogus address (one
424
not in any segment), you will get a different number back, formed
425
from subtracting the address of the first block. This is probably
426
not what you want. */
431
#else /* not CRAY2 */
432
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
433
Determine the number of the cell within the stack,
434
given the address of the cell. The purpose of this
435
routine is to linearize, in some sense, stack addresses
439
i00afunc (long address)
443
long size, pseg, this_segment, stack;
446
struct stack_segment_linkage *ssptr;
448
/* Register B67 contains the address of the end of the
449
current stack segment. If you (as a subprogram) store
450
your registers on the stack and find that you are past
451
the contents of B67, you have overflowed the segment.
453
B67 also points to the stack segment linkage control
454
area, which is what we are really interested in. */
456
stkl = CRAY_STACKSEG_END ();
457
ssptr = (struct stack_segment_linkage *) stkl;
459
/* If one subtracts 'size' from the end of the segment,
460
one has the address of the first word of the segment.
462
If this is not the first segment, 'pseg' will be
465
pseg = ssptr->sspseg;
466
size = ssptr->sssize;
468
this_segment = stkl - size;
470
/* It is possible that calling this routine itself caused
471
a stack overflow. Discard stack segments which do not
472
contain the target address. */
474
while (!(this_segment <= address && address <= stkl))
476
#ifdef DEBUG_I00AFUNC
477
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
482
ssptr = (struct stack_segment_linkage *) stkl;
483
size = ssptr->sssize;
484
pseg = ssptr->sspseg;
485
this_segment = stkl - size;
488
result = address - this_segment;
490
/* If you subtract pseg from the current end of the stack,
491
you get the address of the previous stack segment's end.
492
This seems a little convoluted to me, but I'll bet you save
493
a cycle somewhere. */
497
#ifdef DEBUG_I00AFUNC
498
fprintf (stderr, "%011o %011o\n", pseg, size);
501
ssptr = (struct stack_segment_linkage *) stkl;
502
size = ssptr->sssize;
503
pseg = ssptr->sspseg;
509
#endif /* not CRAY2 */
512
#endif /* complicated expression at top of file */