V9/cmd/sun/c2/alloc.c


#ifndef lint
static	char sccsid[] = "@(#)alloc.c 1.1 86/02/03 Copyr 1983 Sun Micro";
#endif

/*
 * Copyright (c) 1983 by Sun Microsystems, Inc.
 */

#include "as.h"
#include "c2.h"

char *malloc();
void freeoperand();
struct oper * freeoper;
struct optree * freeoptree;


#define NCHUNK 100	/* NODES at a time, for starters */
#define MAXCHUNK 1600	/* max value of 'allocsize' parameter */
NODE *
new(){
    NODE *p;
    static int allocsize = NCHUNK;
    static NODE z = { OP_COMMENT, SUBOP_Z /* rest zero */ };

    if (!freenodes){
	/* allocate new ones */
	register NODE * t;
	register int nnode;
	freenodes = (NODE *)malloc( (unsigned)(allocsize * sizeof *p));
	if (freenodes==NULL) 
		sys_error("cannot allocate %d new nodes", allocsize);
	/* put all on free list */
	for (t=freenodes, nnode=allocsize-1; --nnode; t++ )
	    t->forw = t+1;
	t->forw = NULL;
	if (allocsize < MAXCHUNK)
	    allocsize += allocsize; /* double allocation for next time */
    }
    p = freenodes;
    freenodes = p->forw;
    *p = z;
    p->lineno = line_no;
    return p;
}

NODE *
addnode( p ) 
    register NODE *p;
{
    p->back = first.back;
    p->back->forw = p;
    first.back = p;
    p->forw = &first;
    return p;
}

NODE *
deletenode( p )
    register NODE *p;
{
    NODE *pp = p->back;
    register int i;
    if (p->op == OP_FIRST)
	sys_error("deletenode: Freeing First\n");
    if (ISINSTRUC( p->op ) || ISPSEUDO( p->op ) )
	for (i=0; i<p->nref; i++)
	    freeoperand( p->ref[i] );
    pp->forw = p->forw;
    p->forw->back = pp;
    p->forw = freenodes;
    freenodes = p;
    return pp;
}


struct oper * 
newoperand( o )
    struct oper *o;
{
    struct oper *p;
    static int allocsize = NCHUNK;

    if (!freeoper){
	/* allocate new ones */
	register struct oper * t;
	register int nnode;
	freeoper = (struct oper *)malloc( (unsigned)(allocsize * sizeof *p));
	if (freeoper==NULL) 
		sys_error("cannot allocate %d new operands", allocsize);
	/* put all on free list */
	for (t=freeoper, nnode=allocsize-1; --nnode; t++ )
	    t->nsym_o = t+1;
	t->nsym_o = NULL;
	if (allocsize < MAXCHUNK)
	    allocsize += allocsize; /* double allocation for next time */
    }
    p = freeoper;
    freeoper = p->nsym_o;
    *p = *o;
    return p;
}

void
freeoperand( o )
    struct oper *o;
{
    if (o==NULL) return;
    o->nsym_o = freeoper;
    freeoper = o;
}

void
freetree( o )
    struct optree *o;
{
    if (o==NULL) return;
    o->right_t = (struct oper *)freeoptree;
    freeoptree = o;
}

struct optree *
newtree()
{
    struct optree *p;
    static int allocsize = NCHUNK;

    if (!freeoptree){
	/* allocate new ones */
	register struct optree * t;
	register int nnode;
	freeoptree = (struct optree *)malloc( (unsigned)(allocsize * sizeof *p));
	if (freeoptree==NULL) 
		sys_error("cannot allocate %d new operand subtrees", allocsize);
	/* put all on free list */
	for (t=freeoptree, nnode=allocsize-1; --nnode; t++ )
	    t->right_t = (struct oper *)(t+1);
	t->right_t = NULL;
	if (allocsize < MAXCHUNK)
	    allocsize += allocsize; /* double allocation for next time */
    }
    p = freeoptree;
    freeoptree = (struct optree *)(p->right_t);
    return p;
}