annotate src/alloca.c @ 51242:661e2fe7e775

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