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.  */ 
  37 # include "blockinput.h" 
  38 # define xalloc_die() memory_full () 
  41 #  define free EMACS_FREE 
  47 /* If compiling with GCC 2, this file's not needed.  */ 
  48 #if !defined (__GNUC__) || __GNUC__ < 2 
  50 /* If someone has defined alloca as a macro, 
  51    there must be some other way alloca is supposed to work.  */ 
  56 /* actually, only want this if static is defined as "" 
  57    -- this is for usg, in which emacs must undefine static 
  58    in order to make unexec workable 
  60 #    ifndef STACK_DIRECTION 
  63 -- must know STACK_DIRECTION at compile
-time
 
  64 /* Using #error here is not wise since this file should work for 
  65    old and obscure compilers.  */ 
  66 #    endif /* STACK_DIRECTION undefined */ 
  70 /* If your stack is a linked list of frames, you have to 
  71    provide an "address metric" ADDRESS_FUNCTION macro.  */ 
  73 #  if defined (CRAY) && defined (CRAY_STACKSEG_END) 
  75 #   define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) 
  77 #   define ADDRESS_FUNCTION(arg) &(arg) 
  82 #    define POINTER_TYPE void 
  84 #    define POINTER_TYPE char 
  87 typedef POINTER_TYPE 
*pointer
; 
  93 /* Define STACK_DIRECTION if you know the direction of stack 
  94    growth for your system; otherwise it will be automatically 
  97    STACK_DIRECTION > 0 => grows toward higher addresses 
  98    STACK_DIRECTION < 0 => grows toward lower addresses 
  99    STACK_DIRECTION = 0 => direction of growth unknown  */ 
 101 #  ifndef STACK_DIRECTION 
 102 #   define STACK_DIRECTION      0       /* Direction unknown.  */ 
 105 #  if STACK_DIRECTION != 0 
 107 #   define STACK_DIR    STACK_DIRECTION /* Known at compile-time.  */ 
 109 #  else /* STACK_DIRECTION == 0; need run-time code.  */ 
 111 static int stack_dir
;           /* 1 or -1 once known.  */ 
 112 #   define STACK_DIR    stack_dir 
 115 find_stack_direction () 
 117   static char *addr 
= NULL
;     /* Address of first `dummy', once known.  */ 
 118   auto char dummy
;              /* To get stack address.  */ 
 121     {                           /* Initial entry.  */ 
 122       addr 
= ADDRESS_FUNCTION (dummy
); 
 124       find_stack_direction ();  /* Recurse once.  */ 
 129       if (ADDRESS_FUNCTION (dummy
) > addr
) 
 130         stack_dir 
= 1;          /* Stack grew upward.  */ 
 132         stack_dir 
= -1;         /* Stack grew downward.  */ 
 136 #  endif /* STACK_DIRECTION == 0 */ 
 138 /* An "alloca header" is used to: 
 139    (a) chain together all alloca'ed blocks; 
 140    (b) keep track of stack depth. 
 142    It is very important that sizeof(header) agree with malloc 
 143    alignment chunk size.  The following default should work okay.  */ 
 146 #   define ALIGN_SIZE   sizeof(double) 
 151   char align
[ALIGN_SIZE
];       /* To force sizeof(header).  */ 
 154       union hdr 
*next
;          /* For chaining headers.  */ 
 155       char *deep
;               /* For stack depth measure.  */ 
 159 static header 
*last_alloca_header 
= NULL
;       /* -> last alloca header.  */ 
 161 /* Return a pointer to at least SIZE bytes of storage, 
 162    which will be automatically reclaimed upon exit from 
 163    the procedure that called alloca.  Originally, this space 
 164    was supposed to be taken from the current stack frame of the 
 165    caller, but that method cannot be made to work for some 
 166    implementations of C, for example under Gould's UTX/32.  */ 
 172   auto char probe
;              /* Probes stack depth: */ 
 173   register char *depth 
= ADDRESS_FUNCTION (probe
); 
 175 #  if STACK_DIRECTION == 0 
 176   if (STACK_DIR 
== 0)           /* Unknown growth direction.  */ 
 177     find_stack_direction (); 
 180   /* Reclaim garbage, defined as all alloca'd storage that 
 181      was allocated from deeper in the stack than currently.  */ 
 184     register header 
*hp
;        /* Traverses linked list.  */ 
 190     for (hp 
= last_alloca_header
; hp 
!= NULL
;) 
 191       if ((STACK_DIR 
> 0 && hp
->h
.deep 
> depth
) 
 192           || (STACK_DIR 
< 0 && hp
->h
.deep 
< depth
)) 
 194           register header 
*np 
= hp
->h
.next
; 
 196           free ((pointer
) hp
);  /* Collect garbage.  */ 
 198           hp 
= np
;              /* -> next header.  */ 
 201         break;                  /* Rest are not deeper.  */ 
 203     last_alloca_header 
= hp
;    /* -> last valid storage.  */ 
 211     return NULL
;                /* No allocation required.  */ 
 213   /* Allocate combined header + user data storage.  */ 
 216     /* Address of header.  */ 
 217     register pointer 
new; 
 219     size_t combined_size 
= sizeof (header
) + size
; 
 220     if (combined_size 
< sizeof (header
)) 
 223     new = xmalloc (combined_size
); 
 228     ((header 
*) new)->h
.next 
= last_alloca_header
; 
 229     ((header 
*) new)->h
.deep 
= depth
; 
 231     last_alloca_header 
= (header 
*) new; 
 233     /* User storage begins just after header.  */ 
 235     return (pointer
) ((char *) new + sizeof (header
)); 
 239 #  if defined (CRAY) && defined (CRAY_STACKSEG_END) 
 241 #   ifdef DEBUG_I00AFUNC 
 248 /* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ 
 249 struct stack_control_header
 
 251     long shgrow
:32;             /* Number of times stack has grown.  */ 
 252     long shaseg
:32;             /* Size of increments to stack.  */ 
 253     long shhwm
:32;              /* High water mark of stack.  */ 
 254     long shsize
:32;             /* Current size of stack (all segments).  */ 
 257 /* The stack segment linkage control information occurs at 
 258    the high-address end of a stack segment.  (The stack 
 259    grows from low addresses to high addresses.)  The initial 
 260    part of the stack segment linkage control information is 
 261    0200 (octal) words.  This provides for register storage 
 262    for the routine which overflows the stack.  */ 
 264 struct stack_segment_linkage
 
 266     long ss
[0200];              /* 0200 overflow words.  */ 
 267     long sssize
:32;             /* Number of words in this segment.  */ 
 268     long ssbase
:32;             /* Offset to stack base.  */ 
 270     long sspseg
:32;             /* Offset to linkage control of previous 
 273     long sstcpt
:32;             /* Pointer to task common address block.  */ 
 274     long sscsnm
;                /* Private control structure number for 
 276     long ssusr1
;                /* Reserved for user.  */ 
 277     long ssusr2
;                /* Reserved for user.  */ 
 278     long sstpid
;                /* Process ID for pid based multi-tasking.  */ 
 279     long ssgvup
;                /* Pointer to multitasking thread giveup.  */ 
 280     long sscray
[7];             /* Reserved for Cray Research.  */ 
 300 /* The following structure defines the vector of words 
 301    returned by the STKSTAT library routine.  */ 
 304     long now
;                   /* Current total stack size.  */ 
 305     long maxc
;                  /* Amount of contiguous space which would 
 306                                    be required to satisfy the maximum 
 307                                    stack demand to date.  */ 
 308     long high_water
;            /* Stack high-water mark.  */ 
 309     long overflows
;             /* Number of stack overflow ($STKOFEN) calls.  */ 
 310     long hits
;                  /* Number of internal buffer hits.  */ 
 311     long extends
;               /* Number of block extensions.  */ 
 312     long stko_mallocs
;          /* Block allocations by $STKOFEN.  */ 
 313     long underflows
;            /* Number of stack underflow calls ($STKRETN).  */ 
 314     long stko_free
;             /* Number of deallocations by $STKRETN.  */ 
 315     long stkm_free
;             /* Number of deallocations by $STKMRET.  */ 
 316     long segments
;              /* Current number of stack segments.  */ 
 317     long maxs
;                  /* Maximum number of stack segments so far.  */ 
 318     long pad_size
;              /* Stack pad size.  */ 
 319     long current_address
;       /* Current stack segment address.  */ 
 320     long current_size
;          /* Current stack segment size.  This 
 321                                    number is actually corrupted by STKSTAT to 
 322                                    include the fifteen word trailer area.  */ 
 323     long initial_address
;       /* Address of initial segment.  */ 
 324     long initial_size
;          /* Size of initial segment.  */ 
 327 /* The following structure describes the data structure which trails 
 328    any stack segment.  I think that the description in 'asdef' is 
 329    out of date.  I only describe the parts that I am sure about.  */ 
 333     long this_address
;          /* Address of this block.  */ 
 334     long this_size
;             /* Size of this block (does not include 
 338     long link
;                  /* Address of trailer block of previous 
 353 #   endif /* not CRAY_STACK */ 
 356 /* Determine a "stack measure" for an arbitrary ADDRESS. 
 357    I doubt that "lint" will like this much.  */ 
 360 i00afunc (long *address
) 
 362   struct stk_stat status
; 
 363   struct stk_trailer 
*trailer
; 
 367   /* We want to iterate through all of the segments.  The first 
 368      step is to get the stack status structure.  We could do this 
 369      more quickly and more directly, perhaps, by referencing the 
 370      $LM00 common block, but I know that this works.  */ 
 374   /* Set up the iteration.  */ 
 376   trailer 
= (struct stk_trailer 
*) (status
.current_address
 
 377                                     + status
.current_size
 
 380   /* There must be at least one stack segment.  Therefore it is 
 381      a fatal error if "trailer" is null.  */ 
 386   /* Discard segments that do not contain our argument address.  */ 
 390       block 
= (long *) trailer
->this_address
; 
 391       size 
= trailer
->this_size
; 
 392       if (block 
== 0 || size 
== 0) 
 394       trailer 
= (struct stk_trailer 
*) trailer
->link
; 
 395       if ((block 
<= address
) && (address 
< (block 
+ size
))) 
 399   /* Set the result to the offset in this segment and add the sizes 
 400      of all predecessor segments.  */ 
 402   result 
= address 
- block
; 
 411       if (trailer
->this_size 
<= 0) 
 413       result 
+= trailer
->this_size
; 
 414       trailer 
= (struct stk_trailer 
*) trailer
->link
; 
 416   while (trailer 
!= 0); 
 418   /* We are done.  Note that if you present a bogus address (one 
 419      not in any segment), you will get a different number back, formed 
 420      from subtracting the address of the first block.  This is probably 
 421      not what you want.  */ 
 426 #   else /* not CRAY2 */ 
 427 /* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. 
 428    Determine the number of the cell within the stack, 
 429    given the address of the cell.  The purpose of this 
 430    routine is to linearize, in some sense, stack addresses 
 434 i00afunc (long address
) 
 438   long size
, pseg
, this_segment
, stack
; 
 441   struct stack_segment_linkage 
*ssptr
; 
 443   /* Register B67 contains the address of the end of the 
 444      current stack segment.  If you (as a subprogram) store 
 445      your registers on the stack and find that you are past 
 446      the contents of B67, you have overflowed the segment. 
 448      B67 also points to the stack segment linkage control 
 449      area, which is what we are really interested in.  */ 
 451   stkl 
= CRAY_STACKSEG_END (); 
 452   ssptr 
= (struct stack_segment_linkage 
*) stkl
; 
 454   /* If one subtracts 'size' from the end of the segment, 
 455      one has the address of the first word of the segment. 
 457      If this is not the first segment, 'pseg' will be 
 460   pseg 
= ssptr
->sspseg
; 
 461   size 
= ssptr
->sssize
; 
 463   this_segment 
= stkl 
- size
; 
 465   /* It is possible that calling this routine itself caused 
 466      a stack overflow.  Discard stack segments which do not 
 467      contain the target address.  */ 
 469   while (!(this_segment 
<= address 
&& address 
<= stkl
)) 
 471 #    ifdef DEBUG_I00AFUNC 
 472       fprintf (stderr
, "%011o %011o %011o\n", this_segment
, address
, stkl
); 
 477       ssptr 
= (struct stack_segment_linkage 
*) stkl
; 
 478       size 
= ssptr
->sssize
; 
 479       pseg 
= ssptr
->sspseg
; 
 480       this_segment 
= stkl 
- size
; 
 483   result 
= address 
- this_segment
; 
 485   /* If you subtract pseg from the current end of the stack, 
 486      you get the address of the previous stack segment's end. 
 487      This seems a little convoluted to me, but I'll bet you save 
 488      a cycle somewhere.  */ 
 492 #    ifdef DEBUG_I00AFUNC 
 493       fprintf (stderr
, "%011o %011o\n", pseg
, size
); 
 496       ssptr 
= (struct stack_segment_linkage 
*) stkl
; 
 497       size 
= ssptr
->sssize
; 
 498       pseg 
= ssptr
->sspseg
; 
 504 #   endif /* not CRAY2 */ 
 507 # endif /* no alloca */ 
 508 #endif /* not GCC version 2 */