Annotation of 43BSD/usr.bin/f77/src/f77pass1/bb.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)bb.c       5.2 (Berkeley) 3/9/86";
        !             9: #endif not lint
        !            10: 
        !            11: /*
        !            12:  * bb.c
        !            13:  *
        !            14:  * Basic block optimizations.
        !            15:  *
        !            16:  * University of Utah CS Dept modification history:
        !            17:  *
        !            18:  * $Log:       bb.c,v $
        !            19:  * Revision 5.2  86/03/09  18:13:56  donn
        !            20:  * In tempalloc(), don't forget to treat the vleng tree of a temp block
        !            21:  * before allocating it with altmpn.
        !            22:  * 
        !            23:  * Revision 2.1  84/07/19  12:01:20  donn
        !            24:  * Changed comment headers for UofU.
        !            25:  * 
        !            26:  * Revision 1.2  84/04/02  14:22:49  donn
        !            27:  * Bug in copy propagation missed places where temporaries are assigned to
        !            28:  * by OPSTAREQ or OPPLUSEQ, e.g. exponentiation with an integer constant
        !            29:  * power, expanded inline.
        !            30:  * 
        !            31:  */
        !            32: 
        !            33: #include "defs.h"
        !            34: #include "optim.h"
        !            35: 
        !            36: /*
        !            37:  *  This file contains code for determination of basic blocks,
        !            38:  *  as well as some other optimization supporting routines
        !            39:  *  [including the main routine 'optimize()'].
        !            40:  *
        !            41:  *  The compiler's general debugging flag ['debugflag'] has been
        !            42:  *  extended to provide the capability of having multiple flags
        !            43:  *  which are contained in an array.  If the option -d is used,
        !            44:  *  then the flag debugflag[0] is set.  If a sequence of one or more
        !            45:  *  numbers are given (e.g, -d3,7,12), then the flags debugflag[3],
        !            46:  *  debugflag[7], and debugflag[12] are set.  The maximum number of
        !            47:  *  flags available is specified in the defines.h file.
        !            48:  */
        !            49: 
        !            50: 
        !            51: Bblockp        firstblock = NULL;              /* first block in buffer */
        !            52: Bblockp        lastblock = NULL;               /* last block in buffer */
        !            53: 
        !            54: expptr tempalloc();
        !            55: 
        !            56: 
        !            57: optimize ()
        !            58: 
        !            59: {
        !            60: Bblockp bb;
        !            61: Slotp  sl,nextsl;
        !            62: 
        !            63: if (debugflag[2]) showbuffer ();
        !            64: 
        !            65: optloops ();
        !            66: 
        !            67: if (debugflag[3]) showbuffer ();
        !            68: 
        !            69: formbblock ();
        !            70: optcse ();
        !            71: 
        !            72: if (debugflag[4]) showbuffer ();
        !            73: 
        !            74: if (! debugflag[7])
        !            75:        copyprop ();
        !            76: 
        !            77: if (debugflag[9]) showbuffer ();
        !            78: 
        !            79: for (sl = firstslot; sl; sl = nextsl)
        !            80:        {
        !            81:        nextsl = sl->next;
        !            82:        if (sl->type == SKFRTEMP)
        !            83:                {
        !            84:                templist = mkchain (sl->expr,templist);
        !            85:                sl->expr = NULL;
        !            86:                delslot (sl);
        !            87:                }
        !            88:        else
        !            89:                sl->expr = tempalloc (sl->expr);
        !            90:        }
        !            91: 
        !            92: if (! debugflag[10])
        !            93:        regalloc ();
        !            94: 
        !            95: flushopt ();
        !            96: }
        !            97: 
        !            98: 
        !            99: 
        !           100: /*
        !           101:  *  creates a new basic block record
        !           102:  */
        !           103: 
        !           104: LOCAL Bblockp newblock (sl)
        !           105: Slotp  sl;
        !           106: 
        !           107: {
        !           108: register Bblockp bb;
        !           109: 
        !           110: bb = ALLOC( bblock );
        !           111: bb->next = NULL ;
        !           112: if (lastblock)
        !           113:        {
        !           114:        bb->prev = lastblock;
        !           115:        lastblock->next = bb;
        !           116:        lastblock = bb;
        !           117:        }
        !           118: else
        !           119:        {
        !           120:        firstblock = lastblock = bb;
        !           121:        bb->prev = NULL;
        !           122:        }
        !           123: 
        !           124: bb->first = sl;
        !           125: return (bb);
        !           126: }
        !           127: 
        !           128: 
        !           129: 
        !           130: /*
        !           131:  *  scans slot buffer, creating basic block records
        !           132:  */
        !           133: 
        !           134: formbblock ()
        !           135: 
        !           136: {
        !           137: Slotp  sl;
        !           138: field  type;
        !           139: Bblockp        newbb;
        !           140: 
        !           141: newbb = NULL;
        !           142: for (sl = firstslot; sl; sl = sl->next)
        !           143:        {
        !           144:        type = sl->type;
        !           145:        switch (type)
        !           146:                {
        !           147:                case SKEQ:
        !           148:                        if (!newbb)
        !           149:                                newbb = newblock(sl);
        !           150:                        if (containscall(sl->expr))
        !           151:                                {
        !           152:                                newbb->last = sl;
        !           153:                                newbb = NULL;
        !           154:                                }
        !           155:                        break;
        !           156:                case SKNULL:
        !           157:                case SKASSIGN:
        !           158:                case SKFRTEMP:
        !           159:                        if (!newbb)
        !           160:                                newbb = newblock(sl);
        !           161:                        break;
        !           162:                case SKPAUSE:
        !           163:                case SKSTOP:
        !           164:                case SKIFN:
        !           165:                case SKGOTO:
        !           166:                case SKCMGOTO:
        !           167:                case SKARIF:
        !           168:                case SKASGOTO:
        !           169:                case SKIOIFN:
        !           170:                case SKCALL:
        !           171:                case SKRETURN:
        !           172:                        if (!newbb)
        !           173:                                newbb = newblock(sl);
        !           174:                        newbb->last = sl;
        !           175:                        newbb = NULL;
        !           176:                        break;
        !           177:                case SKLABEL:
        !           178:                        if (newbb)
        !           179:                                newbb->last = sl->prev;
        !           180:                        newbb = newblock(sl);
        !           181:                        break;
        !           182:                case SKDOHEAD:
        !           183:                case SKENDDO:
        !           184:                        if (!newbb)
        !           185:                                newbb = newblock(sl);
        !           186:                        break;
        !           187:                default:
        !           188:                        badthing("SKtype", "formbblock", type);
        !           189:                        break;
        !           190:                }
        !           191:        }
        !           192: if (newbb)
        !           193:        newbb->last = lastslot;
        !           194: }
        !           195: 
        !           196: 
        !           197: 
        !           198: /*
        !           199:  *  frees all basic block records
        !           200:  *  as well as the id and value node chains hanging off the bb and their
        !           201:  *  respective cross link chains (IDlist, DUPlist and NODElist structs) 
        !           202:  */
        !           203: 
        !           204: clearbb ()
        !           205: {
        !           206: Bblockp        bb,next;
        !           207: 
        !           208: for (bb = firstblock; bb; bb = next)
        !           209:        {
        !           210:        next = bb->next;
        !           211:           { 
        !           212:             idptr idp,next;
        !           213:             for(idp = bb->headid; idp; idp = next) 
        !           214:                { 
        !           215:                 next = idp->next;
        !           216:                      {
        !           217:                      nodelptr nodelp, next;
        !           218:                      for(nodelp = idp->headnodelist; nodelp; nodelp = next)
        !           219:                         {
        !           220:                            next = nodelp->next;
        !           221:                            free( (charptr) nodelp);
        !           222:                         }      
        !           223:                      }
        !           224:                  free( (charptr) idp);
        !           225:                }       
        !           226:            }
        !           227:           { 
        !           228:             valuen vp,next;
        !           229:             for(vp = bb->headnode; vp; vp = next) 
        !           230:                { 
        !           231:                 next = vp->next;
        !           232:                      {
        !           233:                      idlptr idlp, next;
        !           234:                      for(idlp = vp->headdeplist; idlp; idlp = next)
        !           235:                         {
        !           236:                            next = idlp->next;
        !           237:                            free( (charptr) idlp);
        !           238:                         }      
        !           239:                      }
        !           240:                      {
        !           241:                      duplptr duplp, next;
        !           242:                      for(duplp = vp->headduplist; duplp; duplp = next)
        !           243:                         {
        !           244:                            next = duplp->next;
        !           245:                            free( (charptr) duplp);
        !           246:                         }      
        !           247:                      }
        !           248:                  free( (charptr) vp);
        !           249:                }       
        !           250:            }
        !           251:        free ( (charptr) bb);
        !           252:        }
        !           253: firstblock = lastblock = NULL;
        !           254: }
        !           255: 
        !           256: 
        !           257: /* structure for maintaining records on copy statements */
        !           258: 
        !           259: typedef struct Subrec {
        !           260:        Addrp   lmem;
        !           261:        Addrp   rmem;
        !           262:        int     sets;
        !           263: } *Subrecp;
        !           264: 
        !           265: 
        !           266: LOCAL chainp sublist;  /* list of copy statements */
        !           267: LOCAL int prop1count;  /* count of number of temporaries eliminated */
        !           268: LOCAL int prop2count;  /* count of number of uses of temporaries replaced */
        !           269: 
        !           270: expptr rmcommaop();
        !           271: Addrp subfor();
        !           272: 
        !           273: 
        !           274: 
        !           275: /*
        !           276:  *  eliminates copy statements of the form T1 = T2 from the intermediate
        !           277:  *  code, where T1 and T2 are temporary variables which are each
        !           278:  *  set only once;  eliminates the copy statement and replaces each
        !           279:  *  use of T1 by T2 (T1 is therefore totally eliminated).
        !           280:  */
        !           281: 
        !           282: LOCAL copyprop ()
        !           283: 
        !           284: {
        !           285: Slotp  sl,nextsl;
        !           286: expptr expr;
        !           287: Tempp  lp,rp;
        !           288: 
        !           289: for (sl = firstslot; sl; sl = sl->next)
        !           290:        sl->expr = rmcommaop (sl->expr,sl);
        !           291: 
        !           292: prop1count = prop2count = 0;
        !           293: findcopies ();
        !           294: 
        !           295: for (sl = firstslot; sl; sl = nextsl)
        !           296:        {
        !           297:        nextsl = sl->next;
        !           298:        expr = sl->expr;
        !           299: 
        !           300:        if ((sl->type == SKFRTEMP) && subfor (expr))
        !           301:                {
        !           302:                delslot (sl);
        !           303:                expr = ENULL;
        !           304:                }
        !           305:        else if (expr && expr->tag == TEXPR &&
        !           306:                        expr->exprblock.opcode == OPASSIGN)
        !           307:                {
        !           308:                lp = (Tempp) expr->exprblock.leftp;
        !           309:                rp = (Tempp) expr->exprblock.rightp;
        !           310:                if (lp->tag == TTEMP && rp->tag == TTEMP)
        !           311:                        if (subfor(lp->memalloc) == rp->memalloc
        !           312:                                        && !subfor (rp->memalloc))
        !           313:                                {
        !           314:                                frexpr (expr);
        !           315:                                expr = sl->expr = ENULL;
        !           316:                                prop1count++;
        !           317:                                }
        !           318:                }
        !           319: 
        !           320:        propagate (expr);
        !           321:        }
        !           322: 
        !           323: if (debugflag[0])
        !           324:        fprintf (diagfile,
        !           325:            "%d temporarie%s replaced by copy propagation (%d use%s)\n",
        !           326:                prop1count,(prop1count==1 ? "" : "s"),
        !           327:                prop2count,(prop2count==1 ? "" : "s") );
        !           328: }
        !           329: 
        !           330: 
        !           331: 
        !           332: /*
        !           333:  *  finds copy statements and enters information in table
        !           334:  */
        !           335: 
        !           336: LOCAL findcopies ()
        !           337: 
        !           338: {
        !           339: Slotp  sl;
        !           340: expptr expr;
        !           341: chainp cp;
        !           342: 
        !           343: for (sl = firstslot; sl; sl = sl->next)
        !           344:        {
        !           345:        expr = sl->expr;
        !           346:        if (expr) switch (expr->tag)
        !           347:            {
        !           348:            case TEXPR:
        !           349:                ckexpr (expr);
        !           350:                break;
        !           351: 
        !           352:            case TLIST:
        !           353:                for (cp = expr->listblock.listp; cp; cp = cp->nextp)
        !           354:                        {
        !           355:                        expr = (expptr) cp->datap;
        !           356:                        ckexpr (expr);
        !           357:                        }
        !           358:                break;
        !           359: 
        !           360:            default:
        !           361:                break;
        !           362:            }
        !           363:        }
        !           364: }
        !           365: 
        !           366: 
        !           367: 
        !           368: /*
        !           369:  *  checks an individual expression
        !           370:  */
        !           371: 
        !           372: ckexpr (expr)
        !           373: expptr expr;
        !           374: 
        !           375: {
        !           376: Tempp  lp,rp;
        !           377: int    oc = expr->exprblock.opcode;
        !           378: 
        !           379: if (oc == OPASSIGN || oc == OPPLUSEQ || oc == OPSTAREQ)
        !           380:        {
        !           381:        lp = (Tempp) expr->exprblock.leftp;
        !           382:        rp = (Tempp) expr->exprblock.rightp;
        !           383:        if (lp->tag == TTEMP)
        !           384:                if (rp->tag == TTEMP && oc == OPASSIGN)
        !           385:                        enter (lp->memalloc, rp->memalloc);
        !           386:                else
        !           387:                        enter (lp->memalloc, ENULL);
        !           388:        }
        !           389: }
        !           390: 
        !           391: 
        !           392: 
        !           393: /*
        !           394:  *  Enters the given memalloc values in the table (or update if they
        !           395:  *  are already there), for the assignment statement m1 = m2.
        !           396:  *  If m2 is NULL, this indicates that the assignment is not a copy
        !           397:  *  statement.
        !           398:  */
        !           399: 
        !           400: LOCAL enter (m1,m2)
        !           401: Addrp  m1,m2;
        !           402: 
        !           403: {
        !           404: chainp cp;
        !           405: Subrecp old,new;
        !           406: 
        !           407: for (cp = sublist; cp; cp = cp->nextp)
        !           408:        {
        !           409:        old = (Subrecp) cp->datap;
        !           410:        if (old->lmem == m1)
        !           411:                {
        !           412:                old->sets++;
        !           413:                return;
        !           414:                }
        !           415:        }
        !           416: 
        !           417: new = ALLOC (Subrec);
        !           418: new->lmem = m1;
        !           419: new->rmem = m2;
        !           420: new->sets = 1;
        !           421: sublist = mkchain (new, sublist);
        !           422: }
        !           423: 
        !           424: 
        !           425: 
        !           426: /*
        !           427:  *  looks for record for the given memalloc value
        !           428:  */
        !           429: 
        !           430: LOCAL Subrecp lookup (mem)
        !           431: Addrp  mem;
        !           432: 
        !           433: {
        !           434: chainp cp;
        !           435: Subrecp rec;
        !           436: 
        !           437: for (cp = sublist; cp; cp = cp->nextp)
        !           438:        {
        !           439:        rec = (Subrecp) cp->datap;
        !           440:        if (rec->lmem == mem)
        !           441:                return rec;
        !           442:        }
        !           443: 
        !           444: return NULL;
        !           445: }
        !           446: 
        !           447: 
        !           448: 
        !           449: /*
        !           450:  *  checks to see if there is a substitute for given memalloc value
        !           451:  */
        !           452: 
        !           453: LOCAL Addrp subfor (mem)
        !           454: Addrp  mem;
        !           455: 
        !           456: {
        !           457: Subrecp rec,rec2;
        !           458: Addrp  sub;
        !           459: 
        !           460: rec = lookup (mem);
        !           461: if (rec && rec->sets == 1)
        !           462:        {
        !           463:        sub = rec->rmem;
        !           464:        rec2 = lookup(sub);
        !           465:        if (rec2 && rec2->sets == 1)
        !           466:                return sub;
        !           467:        }
        !           468: 
        !           469: return NULL;
        !           470: }
        !           471: 
        !           472: 
        !           473: 
        !           474: /*
        !           475:  *  actually propagates the information
        !           476:  */
        !           477: 
        !           478: LOCAL propagate (expr)
        !           479: expptr expr;
        !           480: 
        !           481: {
        !           482: chainp t;
        !           483: Addrp  new;
        !           484: 
        !           485: if (! expr) return;
        !           486: 
        !           487: switch (expr->tag)
        !           488:        {
        !           489:        case TEXPR:
        !           490:                propagate (expr->exprblock.leftp);
        !           491:                propagate (expr->exprblock.rightp);
        !           492:                break;
        !           493: 
        !           494:        case TADDR:
        !           495:                propagate (expr->addrblock.vleng);
        !           496:                propagate (expr->addrblock.memoffset);
        !           497:                break;
        !           498: 
        !           499:        case TLIST:
        !           500:                for (t = expr->listblock.listp; t; t = t->nextp)
        !           501:                        propagate (t->datap);
        !           502:                break;
        !           503: 
        !           504:        case TTEMP:
        !           505:                new = subfor (expr->tempblock.memalloc);
        !           506:                if (new)
        !           507:                        {
        !           508:                        expr->tempblock.memalloc = new;
        !           509:                        prop2count++;
        !           510:                        }
        !           511:                break;
        !           512: 
        !           513:        default:
        !           514:                break;
        !           515:        }
        !           516: }
        !           517: 
        !           518: 
        !           519: 
        !           520: /*
        !           521:  *  allocates ADDR blocks for each TEMP in the expression
        !           522:  */
        !           523: 
        !           524: LOCAL expptr tempalloc (expr)
        !           525: expptr expr;
        !           526: 
        !           527: {
        !           528: chainp t;
        !           529: 
        !           530: if (! expr)
        !           531:        return NULL;
        !           532: 
        !           533: switch (expr->tag)
        !           534:     {
        !           535:     case TEXPR:
        !           536:        expr->exprblock.leftp = tempalloc (expr->exprblock.leftp);
        !           537:        expr->exprblock.rightp = tempalloc (expr->exprblock.rightp);
        !           538:        break;
        !           539: 
        !           540:     case TADDR:
        !           541:        expr->addrblock.vleng = tempalloc (expr->addrblock.vleng);
        !           542:        expr->addrblock.memoffset = tempalloc (expr->addrblock.memoffset);
        !           543:        break;
        !           544: 
        !           545:     case TLIST:
        !           546:        for (t = expr->listblock.listp; t; t = t->nextp)
        !           547:                t->datap = (tagptr) tempalloc (t->datap);
        !           548:        break;
        !           549: 
        !           550:     case TTEMP:
        !           551:        expr->tempblock.vleng = tempalloc (expr->tempblock.vleng);
        !           552:        return (expptr) cpexpr (altmpn (expr));
        !           553:        break;
        !           554: 
        !           555:     default:
        !           556:        break;
        !           557:     }
        !           558: return expr;
        !           559: }
        !           560: 
        !           561: 
        !           562: /********************* debugging routines *********************/
        !           563: 
        !           564: 
        !           565: 
        !           566: Announce (s,q)
        !           567: char *s;
        !           568: expptr q;
        !           569: 
        !           570: {
        !           571: fprintf (diagfile,"\nAn expression [%s]----->\n",s);
        !           572: showexpr(q,0);
        !           573: fprintf (diagfile,"\n-------------end of expr--------------\n");
        !           574: }
        !           575: 
        !           576: 
        !           577: 
        !           578: /*
        !           579:  *  dump the basic block buffer, including expressions, mnemonically
        !           580:  */
        !           581: 
        !           582: showbuffer ()
        !           583: 
        !           584: {
        !           585: Slotp  sl;
        !           586: Bblockp        bb;
        !           587: int    i;
        !           588: 
        !           589: fprintf (diagfile,"Basic blocks with first and last slots ----------\n");
        !           590: for (i=1, bb = firstblock; bb; i++, bb = bb->next)
        !           591:        fprintf (diagfile,"%2d.  %d  %d\n",i,bb->first,bb->last);
        !           592: fprintf (diagfile,"\n");
        !           593: 
        !           594: fprintf (diagfile,"Slots and expressions ----------\n");
        !           595: 
        !           596: fprintf (diagfile,"tag pointer vtype vclass vstg vleng\n");
        !           597: fprintf (diagfile,"          ADDR memno memoffset istemp ntempelt varleng\n");
        !           598: fprintf (diagfile,"          TEMP memalloc istemp ntempelt varleng\n");
        !           599: fprintf (diagfile,"          EXPR opcode leftp rightp\n");
        !           600: fprintf (diagfile,"          LIST type listp\n");
        !           601: fprintf (diagfile,"\n");
        !           602: 
        !           603: for (i=1, sl = firstslot; sl; i++, sl = sl->next)
        !           604:        {
        !           605:        fprintf (diagfile,"%2d.  ",i);
        !           606:        showslt (sl);
        !           607:        }
        !           608: fprintf (diagfile,"---------- End of showbuffer ----------\n");
        !           609: }
        !           610: 
        !           611: 
        !           612: 
        !           613: /*
        !           614:  *  dumps a single slot in the code buffer
        !           615:  */
        !           616: 
        !           617: LOCAL charptr Zslot[] = {"NULL",
        !           618:        "IFN","GOTO","LABEL","EQ","CALL","CMGOTO","STOP","DOHEAD",
        !           619:        "ENDDO","ARIF","RETURN","ASGOTO","PAUSE","ASSIGN","IOIFN","FRTEMP"};
        !           620: 
        !           621: 
        !           622: 
        !           623: showslt (sl)
        !           624: Slotp sl;
        !           625: 
        !           626: {
        !           627: fprintf (diagfile,"(%2d)  %d  %s  %d\n",
        !           628:        sl->lineno,sl,Zslot[sl->type],sl->label);
        !           629: showexpr (sl->expr,0);
        !           630: fprintf (diagfile,"\n");
        !           631: }
        !           632: 
        !           633: 
        !           634: 
        !           635: showslottype (type)
        !           636: int type;
        !           637: 
        !           638: {
        !           639: fprintf (diagfile,"%s\n",Zslot[type]);
        !           640: }
        !           641: 
        !           642: 
        !           643: 
        !           644: /*
        !           645:  *  displays the given expression at the given indentation, showing
        !           646:  *  its subexpressions at further indentations
        !           647:  */
        !           648: 
        !           649: LOCAL charptr Ztag[] = {"----",
        !           650:        "NAME","CONST","EXPR","ADDR","TEMP","PRIM","LIST","IMPLDO","ERROR"};
        !           651: LOCAL charptr Zstg[] = {"unk",
        !           652:        "ARG","AUTO","BSS","INIT","CONST","EXT","INTR","STFUNCT",
        !           653:        "COMMON","EQUIV","REG","LENG","NULL","PREG"};
        !           654: LOCAL charptr Zclass[] = {"unk",
        !           655:        "PARAM","VAR","ENTRY","MAIN","BLOCK","PROC","NAMELIST"};
        !           656: LOCAL charptr Zop[] = {"----",
        !           657:        "PLUS","MINUS","STAR","SLASH","POWER","NEG","OR","AND","EQV",
        !           658:        "NEQV","NOT","CONCAT","LT","EQ","GT","LE","NE","GE","CALL",
        !           659:        "CCALL","ASSIGN","PLUSEQ","STAREQ","CONV","LSHIFT","MOD",
        !           660:        "COMMA","QUEST","COLON","ABS","MIN","MAX","ADDR","INDIRECT",
        !           661:        "BITOR","BITAND","BITXOR","BITNOT","RSHIFT","PAREN"};
        !           662: LOCAL charptr Ztype[] = {"unk",
        !           663:        "ADDR","SHORT","LONG","REAL","DREAL","COMPLEX","DCOMPLEX",
        !           664:        "LOGICAL","CHAR","SUBR","ERROR"};
        !           665: 
        !           666: 
        !           667: showexpr(p,indent)
        !           668: tagptr p;
        !           669: int indent;
        !           670: 
        !           671: {
        !           672: int i;
        !           673: int type;
        !           674: chainp q;
        !           675: 
        !           676: #define PRHEAD(q) fprintf(diagfile,"%s %d %s %s %s %d", \
        !           677:        Ztag[q->tag], q, Ztype[q->headblock.vtype], \
        !           678:        Zclass[q->headblock.vclass], Zstg[q->headblock.vstg], \
        !           679:        q->headblock.vleng);
        !           680: #define SHOWEXPR(p) showexpr(p,indent+2)
        !           681: 
        !           682: 
        !           683: 
        !           684: if(p == NULL)
        !           685:        return;
        !           686: 
        !           687: for (i=0; i<indent; i++)
        !           688:        putc(' ',diagfile);
        !           689: 
        !           690: switch(p->tag)
        !           691:          {
        !           692:          case TCONST:
        !           693:               PRHEAD(p);
        !           694: 
        !           695:               type=p->constblock.vtype;
        !           696:               if (ISCHAR(p))
        !           697:                  {
        !           698:                       fprintf(diagfile," ISCHAR ccp= %d\n",
        !           699:                                                    p->constblock.const.ccp);
        !           700:                       SHOWEXPR(p->constblock.vleng);
        !           701:                  }
        !           702:               else  if( ISINT(type) )
        !           703:                    fprintf(diagfile," ci= %d\n",p->constblock.const.ci); 
        !           704:               else if( ISREAL(type) )
        !           705:                    fprintf(diagfile," cd[0]= %e\n",p->constblock.const.cd[0]);
        !           706:               else fprintf(diagfile," cd[0]= %e  cd[1]= %e\n",
        !           707:                             p->constblock.const.cd[0],
        !           708:                             p->constblock.const.cd[1] ); 
        !           709:               break;
        !           710: 
        !           711:          case TADDR:
        !           712:               PRHEAD(p);
        !           713:               fprintf(diagfile,
        !           714:               " memno= %d %d %d %d %d\n",
        !           715:               p->addrblock.memno,p->addrblock.memoffset,p->addrblock.istemp,
        !           716:               p->addrblock.ntempelt,p->addrblock.varleng);
        !           717:               SHOWEXPR(p->addrblock.vleng);
        !           718:               SHOWEXPR(p->addrblock.memoffset);
        !           719:               break;
        !           720: 
        !           721:          case TTEMP:
        !           722:              fprintf(diagfile,"%s %d %s %s %d",
        !           723:                        Ztag[p->tag], p, Ztype[p->headblock.vtype],
        !           724:                        Zclass[p->headblock.vclass],
        !           725:                        p->headblock.vleng);
        !           726:               fprintf(diagfile,
        !           727:                " memalloc= %d %d %d %d\n",
        !           728:                p->tempblock.memalloc,p->tempblock.istemp,
        !           729:                p->tempblock.ntempelt,p->tempblock.varleng);
        !           730:               SHOWEXPR(p->tempblock.vleng);
        !           731:              SHOWEXPR(p->tempblock.memalloc);
        !           732:               break;
        !           733: 
        !           734:          case TERROR:
        !           735:               fprintf(diagfile,"ERROR %d\n",p);
        !           736:               break;
        !           737:           
        !           738:          case TNAME:
        !           739:               fprintf(diagfile,"NAME %d\n",p);
        !           740:               return;
        !           741: 
        !           742:          case TPRIM:
        !           743:               fprintf(diagfile,"PRIM %d --- not implemented\n",p);
        !           744:               break;
        !           745: 
        !           746:          case TEXPR:
        !           747:               PRHEAD(p);
        !           748:               fprintf(diagfile," opcode= %s %d %d\n",
        !           749:                      Zop[p->exprblock.opcode],p->exprblock.leftp,
        !           750:                      p->exprblock.rightp);
        !           751:               SHOWEXPR(p->exprblock.leftp);
        !           752:               if(p->exprblock.rightp)
        !           753:                     SHOWEXPR(p->exprblock.rightp);
        !           754:               break;
        !           755: 
        !           756:          case TLIST:
        !           757:               fprintf(diagfile,"LIST %d %s %d\n",p,
        !           758:                       Ztype[p->listblock.vtype],p->listblock.listp);
        !           759:               for(q= p->listblock.listp ; q ; q = q->nextp)
        !           760:                       SHOWEXPR(q->datap);
        !           761:              for (i=0; i<indent; i++)
        !           762:                putc (' ',diagfile);
        !           763:               fprintf(diagfile,"END LIST %d\n",p);
        !           764:               break;
        !           765: 
        !           766:          default:
        !           767:               fprintf(diagfile,"showexpr BAD TAG= %d at %d \n",p->tag,p);
        !           768:            }
        !           769: }
        !           770: 
        !           771: 
        !           772: 
        !           773: selective()/************************************/
        !           774: {
        !           775: int i;
        !           776: Slotp sl;
        !           777: 
        !           778: i=0;
        !           779: fprintf (stderr,"SELECTIVE OUTPUT\n");
        !           780: for (sl=firstslot;sl;sl=sl->next)
        !           781:        {
        !           782:        i++;
        !           783:        if (i>=176 && i<184)
        !           784:                {
        !           785:                fprintf (stderr,"%d.  ",i);
        !           786:                showslt(sl);
        !           787:                }
        !           788:        }
        !           789: }
        !           790: 
        !           791: 
        !           792: 
        !           793: 
        !           794: LOCAL containscall(p)
        !           795: expptr p;
        !           796: {
        !           797:   chainp cp;
        !           798: 
        !           799:   if (p == NULL)
        !           800:     return NO;
        !           801: 
        !           802:   switch (p->tag)
        !           803:     {
        !           804:     case TADDR:
        !           805:       if (containscall(p->addrblock.vleng)
        !           806:          || containscall(p->addrblock.memoffset))
        !           807:        return YES;
        !           808:       else
        !           809:         return NO;
        !           810: 
        !           811:     case TCONST:
        !           812:       return NO;
        !           813: 
        !           814:     case TERROR:
        !           815:       return NO;
        !           816: 
        !           817:     case TEXPR:
        !           818:       if (p->exprblock.opcode == OPCALL ||
        !           819:          p->exprblock.opcode == OPCCALL)
        !           820:        return YES;
        !           821:       if (containscall(p->exprblock.vleng) ||
        !           822:          containscall(p->exprblock.leftp) ||
        !           823:          containscall(p->exprblock.rightp))
        !           824:        return YES;
        !           825:       else
        !           826:        return NO;
        !           827: 
        !           828:     case TLIST:
        !           829:       cp = p->listblock.listp;
        !           830:       while (cp)
        !           831:        {
        !           832:          if (containscall(cp->datap))
        !           833:            return YES;
        !           834:          cp = cp->nextp;
        !           835:        }
        !           836:       return NO;
        !           837: 
        !           838:     default:
        !           839:       return YES;
        !           840:     }
        !           841: }

unix.superglobalmegacorp.com

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