Annotation of coherent/b/bin/as/space.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Space managment for 386 assembler.
                      3:  *
                      4:  * Normally anything galloc()ed for a line will be free()d
                      5:  * at the end of line. This can be avoided by umark()
                      6:  */
                      7: #include <stdio.h>
                      8: #include <asm.h>
                      9: 
                     10: static char **mArray;          /* all items galloc()ed for this line */
                     11: static unsigned top = 0;       /* highest item galloc()ed this line */
                     12: static unsigned max = 64;      /* count of slots in mArray, may grow */
                     13: 
                     14: #define QTOP 10                        /* count of preallocated blocks */
                     15: typedef union quick quick;
                     16: union quick {  /* for allocating quickly but wastefully */
                     17:        expr    e;
                     18:        data    d;
                     19:        sym     s;
                     20: };
                     21: 
                     22: static quick *qb;              /* pre allocated quick blocks */
                     23: static unsigned qtop = 0;      /* highest used quick block */
                     24: 
                     25: /*
                     26:  * Allocate a block of space.
                     27:  * Leave if there is no space left
                     28:  * at all.
                     29:  */
                     30: char *
                     31: alloc(n)
                     32: unsigned n;
                     33: {
                     34:        register char *p;
                     35:        extern char *calloc();
                     36: 
                     37:        if ((p = (char *)calloc(n, 1)) == NULL)
                     38:                fatal("Out of space");
                     39:                /* A call to \fBmalloc()\fR failed.
                     40:                 * The typical large consumers of RAM are macros
                     41:                 * and \fB.defines\fR; symbols consume less.
                     42:                 * Can you break your assembly into
                     43:                 * smaller pieces?
                     44:                 * Could you be in some sort of
                     45:                 * endless recursion or loop? */
                     46:        return (p);
                     47: }
                     48: 
                     49: /*
                     50:  * Init storage functions.
                     51:  */
                     52: void
                     53: initStor()
                     54: {
                     55:        extern char *malloc();
                     56: 
                     57: #if 0
                     58:        char *j;
                     59: 
                     60:        /* This speeds things up on many systems by minamizing
                     61:         * traffic with the operating system for space.
                     62:         */
                     63:        if(NULL != (j = malloc(16000)))
                     64:                free(j);
                     65: #endif
                     66:        mArray = (char **)alloc(max * sizeof(*mArray));
                     67:        qb = (quick *)alloc(QTOP * sizeof(*qb));
                     68: }
                     69: 
                     70: /*
                     71:  * Expand an area.
                     72:  */
                     73: expand(area, current, by, size)
                     74: char **area;
                     75: unsigned *current, by, size;
                     76: {
                     77:        if (NULL == (*area = realloc(*area, size * (*current += by))))
                     78:                fatal("Out of space");  /* NODOC */
                     79: }
                     80: 
                     81: /*
                     82:  * Get space and keep track of it on mArray.
                     83:  */
                     84: char *
                     85: galloc(size)
                     86: unsigned size;
                     87: {
                     88:        if(top == max)
                     89:                expand(&mArray, &max, 10, sizeof(*mArray));
                     90: 
                     91:        return (mArray[top++] = alloc(size));
                     92: }
                     93: 
                     94: /*
                     95:  * Forget an item on mArray.
                     96:  */
                     97: void
                     98: umark(p)
                     99: char *p;
                    100: {
                    101:        register char **t;
                    102: 
                    103:        for (t = mArray + top; t != mArray;) {
                    104:                if(p == *--t) {
                    105:                        *t = NULL;
                    106:                        return;
                    107:                }
                    108:        }
                    109:        fatal("Logic error in umark"); /* TECH */
                    110: }
                    111: 
                    112: /*
                    113:  * free all items on mArray.
                    114:  */
                    115: void
                    116: freel()
                    117: {
                    118:        register char **t;
                    119: 
                    120:        for(t = mArray + top; t != mArray; )
                    121:                if(NULL != *--t)
                    122:                        free(*t);
                    123:        qtop = top = 0;
                    124: }
                    125: 
                    126: /*
                    127:  * unmark all the parms.
                    128:  */
                    129: void
                    130: umList(p)
                    131: register parm *p;
                    132: {
                    133:        for(; NULL != p; p = p->next)
                    134:                umark((char *)p);
                    135: }
                    136: 
                    137: /*
                    138:  * free list of items connected by next pointers.
                    139:  */
                    140: void
                    141: freeList(p)
                    142: register parm *p;
                    143: {
                    144:        register parm *t;
                    145: 
                    146:        while(NULL != p) {
                    147:                p = (t = p)->next;
                    148:                free((char *)t);
                    149:        }
                    150: }
                    151: 
                    152: /*
                    153:  * Get an expr block.
                    154:  * There can only be more than 4 on an error to be spotted later.
                    155:  * This is done because the profiler spotted a large amount of time
                    156:  * malloc()ing expr blocks.
                    157:  */
                    158: expr *
                    159: xalloc()
                    160: {
                    161:        register expr *tmp;
                    162: 
                    163:        if(qtop == QTOP)
                    164:                return(gnew(expr));
                    165:        tmp = &(qb[qtop++].e);
                    166:        return((expr *)clear(tmp));
                    167: }
                    168: 
                    169: /*
                    170:  * Make a temporary copy of a sym.
                    171:  * Rarely done more than twice a line.
                    172:  */
                    173: sym *
                    174: copySym(s)
                    175: sym *s;
                    176: {
                    177:        register sym *n;
                    178: 
                    179:        if(qtop == QTOP)
                    180:                n = gnew(sym);
                    181:        else
                    182:                n = &(qb[qtop++].s);
                    183:        *n = *s;
                    184:        return(n);
                    185: }
                    186: 
                    187: /*
                    188:  * Get space for data item.
                    189:  */
                    190: data *
                    191: gitem(type)
                    192: {
                    193:        register data *d;
                    194: 
                    195:        if(qtop == QTOP)
                    196:                d = gnew(data);
                    197:        else
                    198:                d = &(qb[qtop++].d);
                    199:        d->next = NULL;
                    200:        d->type = type;
                    201:        d->count = 1;
                    202:        return(d);
                    203: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.