Annotation of researchv9/cmd/sun/c2/alloc.c, revision 1.1

1.1     ! root        1: 
        !             2: #ifndef lint
        !             3: static char sccsid[] = "@(#)alloc.c 1.1 86/02/03 Copyr 1983 Sun Micro";
        !             4: #endif
        !             5: 
        !             6: /*
        !             7:  * Copyright (c) 1983 by Sun Microsystems, Inc.
        !             8:  */
        !             9: 
        !            10: #include "as.h"
        !            11: #include "c2.h"
        !            12: 
        !            13: char *malloc();
        !            14: void freeoperand();
        !            15: struct oper * freeoper;
        !            16: struct optree * freeoptree;
        !            17: 
        !            18: 
        !            19: #define NCHUNK 100     /* NODES at a time, for starters */
        !            20: #define MAXCHUNK 1600  /* max value of 'allocsize' parameter */
        !            21: NODE *
        !            22: new(){
        !            23:     NODE *p;
        !            24:     static int allocsize = NCHUNK;
        !            25:     static NODE z = { OP_COMMENT, SUBOP_Z /* rest zero */ };
        !            26: 
        !            27:     if (!freenodes){
        !            28:        /* allocate new ones */
        !            29:        register NODE * t;
        !            30:        register int nnode;
        !            31:        freenodes = (NODE *)malloc( (unsigned)(allocsize * sizeof *p));
        !            32:        if (freenodes==NULL) 
        !            33:                sys_error("cannot allocate %d new nodes", allocsize);
        !            34:        /* put all on free list */
        !            35:        for (t=freenodes, nnode=allocsize-1; --nnode; t++ )
        !            36:            t->forw = t+1;
        !            37:        t->forw = NULL;
        !            38:        if (allocsize < MAXCHUNK)
        !            39:            allocsize += allocsize; /* double allocation for next time */
        !            40:     }
        !            41:     p = freenodes;
        !            42:     freenodes = p->forw;
        !            43:     *p = z;
        !            44:     p->lineno = line_no;
        !            45:     return p;
        !            46: }
        !            47: 
        !            48: NODE *
        !            49: addnode( p ) 
        !            50:     register NODE *p;
        !            51: {
        !            52:     p->back = first.back;
        !            53:     p->back->forw = p;
        !            54:     first.back = p;
        !            55:     p->forw = &first;
        !            56:     return p;
        !            57: }
        !            58: 
        !            59: NODE *
        !            60: deletenode( p )
        !            61:     register NODE *p;
        !            62: {
        !            63:     NODE *pp = p->back;
        !            64:     register int i;
        !            65:     if (p->op == OP_FIRST)
        !            66:        sys_error("deletenode: Freeing First\n");
        !            67:     if (ISINSTRUC( p->op ) || ISPSEUDO( p->op ) )
        !            68:        for (i=0; i<p->nref; i++)
        !            69:            freeoperand( p->ref[i] );
        !            70:     pp->forw = p->forw;
        !            71:     p->forw->back = pp;
        !            72:     p->forw = freenodes;
        !            73:     freenodes = p;
        !            74:     return pp;
        !            75: }
        !            76: 
        !            77: 
        !            78: struct oper * 
        !            79: newoperand( o )
        !            80:     struct oper *o;
        !            81: {
        !            82:     struct oper *p;
        !            83:     static int allocsize = NCHUNK;
        !            84: 
        !            85:     if (!freeoper){
        !            86:        /* allocate new ones */
        !            87:        register struct oper * t;
        !            88:        register int nnode;
        !            89:        freeoper = (struct oper *)malloc( (unsigned)(allocsize * sizeof *p));
        !            90:        if (freeoper==NULL) 
        !            91:                sys_error("cannot allocate %d new operands", allocsize);
        !            92:        /* put all on free list */
        !            93:        for (t=freeoper, nnode=allocsize-1; --nnode; t++ )
        !            94:            t->nsym_o = t+1;
        !            95:        t->nsym_o = NULL;
        !            96:        if (allocsize < MAXCHUNK)
        !            97:            allocsize += allocsize; /* double allocation for next time */
        !            98:     }
        !            99:     p = freeoper;
        !           100:     freeoper = p->nsym_o;
        !           101:     *p = *o;
        !           102:     return p;
        !           103: }
        !           104: 
        !           105: void
        !           106: freeoperand( o )
        !           107:     struct oper *o;
        !           108: {
        !           109:     if (o==NULL) return;
        !           110:     o->nsym_o = freeoper;
        !           111:     freeoper = o;
        !           112: }
        !           113: 
        !           114: void
        !           115: freetree( o )
        !           116:     struct optree *o;
        !           117: {
        !           118:     if (o==NULL) return;
        !           119:     o->right_t = (struct oper *)freeoptree;
        !           120:     freeoptree = o;
        !           121: }
        !           122: 
        !           123: struct optree *
        !           124: newtree()
        !           125: {
        !           126:     struct optree *p;
        !           127:     static int allocsize = NCHUNK;
        !           128: 
        !           129:     if (!freeoptree){
        !           130:        /* allocate new ones */
        !           131:        register struct optree * t;
        !           132:        register int nnode;
        !           133:        freeoptree = (struct optree *)malloc( (unsigned)(allocsize * sizeof *p));
        !           134:        if (freeoptree==NULL) 
        !           135:                sys_error("cannot allocate %d new operand subtrees", allocsize);
        !           136:        /* put all on free list */
        !           137:        for (t=freeoptree, nnode=allocsize-1; --nnode; t++ )
        !           138:            t->right_t = (struct oper *)(t+1);
        !           139:        t->right_t = NULL;
        !           140:        if (allocsize < MAXCHUNK)
        !           141:            allocsize += allocsize; /* double allocation for next time */
        !           142:     }
        !           143:     p = freeoptree;
        !           144:     freeoptree = (struct optree *)(p->right_t);
        !           145:     return p;
        !           146: }

unix.superglobalmegacorp.com

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