Doxygen Source Code Documentation
vax.c File Reference
#include "defs.h"#include "pccdefs.h"#include "output.h"Go to the source code of this file.
| Functions | |
| void | prconi (FILEP fp, ftnint n) | 
| void | prcona (FILEP fp, ftnint a) | 
| void | prconr (FILEP fp, Constp x, int k) | 
| char * | memname (int stg, long mem) | 
| void addrlit | Argdcl ((Addrp)) | 
| expptr | make_int_expr (expptr e) | 
| expptr | prune_left_conv (expptr e) | 
| void | write_comment (Void) | 
| int * | count_args (Void) | 
| void awalk | Argdcl ((expptr)) | 
| void | aawalk (struct Primblock *P) | 
| void | afwalk (struct Primblock *P) | 
| void | awalk (expptr e) | 
| chainp | argsort (chainp p0) | 
| void | prolog (FILE *outfile, register chainp p) | 
| Variables | |
| int | regnum [] | 
| int | wrote_comment | 
| FILE * | comment_file | 
| int | nu | 
| int * | refs | 
| int * | used | 
Function Documentation
| 
 | 
| 
 Definition at line 236 of file vax.c. References Primblock::argsp, awalk(), Chain::datap, Primblock::fcharp, Primblock::lcharp, Listblock::listp, Primblock::namep, Chain::nextp, p, q, Expression::tag, TCONST, and Nameblock::vtype. Referenced by awalk(). 
 00238 {
00239         chainp p;
00240         expptr q;
00241 
00242         if (P->argsp)
00243                 for(p = P->argsp->listp; p; p = p->nextp) {
00244                         q = (expptr)p->datap;
00245                         if (q->tag != TCONST)
00246                                 awalk(q);
00247                         }
00248         if (P->namep->vtype == TYCHAR) {
00249                 if (q = P->fcharp)
00250                         awalk(q);
00251                 if (q = P->lcharp)
00252                         awalk(q);
00253                 }
00254         }
 | 
| 
 | 
| 
 Definition at line 261 of file vax.c. References Nameblock::argno, Primblock::argsp, awalk(), CLPROC, Chain::datap, Listblock::listp, Primblock::namep, Chain::nextp, nu, p, Expression::primblock, PTHISPROC, q, refs, Expression::tag, TCONST, TPRIM, used, Nameblock::vclass, Nameblock::vdim, Nameblock::vknownarg, and Nameblock::vprocclass. Referenced by awalk(). 
 00263 {
00264         chainp p;
00265         expptr q;
00266         Namep np;
00267 
00268         for(p = P->argsp->listp; p; p = p->nextp) {
00269                 q = (expptr)p->datap;
00270                 switch(q->tag) {
00271                   case TPRIM:
00272                         np = q->primblock.namep;
00273                         if (np->vknownarg)
00274                                 if (!refs[np->argno]++)
00275                                         used[nu++] = np->argno;
00276                         if (q->primblock.argsp == 0) {
00277                                 if (q->primblock.namep->vclass == CLPROC
00278                                  && q->primblock.namep->vprocclass
00279                                                 != PTHISPROC
00280                                  || q->primblock.namep->vdim != NULL)
00281                                         continue;
00282                                 }
00283                   default:
00284                         awalk(q);
00285                         /* no break */
00286                   case TCONST:
00287                         continue;
00288                   }
00289                 }
00290         }
 | 
| 
 | 
| 
 | 
| 
 | 
| 
 | 
| 
 | 
| 
 Definition at line 340 of file vax.c. References Nameblock::argno, args, awalk(), Dimblock::basexpr, CHNULL, ckalloc(), Chain::datap, Dimblock::dims, errstr(), frchain(), free, Nameblock::fvarname, i, mkchain(), Dimblock::ndim, Chain::nextp, nu, p, q, refs, used, and Nameblock::vdim. Referenced by prolog(). 
 00342 {
00343         Namep *args, q, *stack;
00344         int i, nargs, nout, nst;
00345         chainp *d, *da, p, rv, *rvp;
00346         struct Dimblock *dp;
00347 
00348         if (!p0)
00349                 return p0;
00350         for(nargs = 0, p = p0; p; p = p->nextp)
00351                 nargs++;
00352         args = (Namep *)ckalloc(i = nargs*(sizeof(Namep) + 2*sizeof(chainp)
00353                         + 2*sizeof(int)));
00354         memset((char *)args, 0, i);
00355         stack = args + nargs;
00356         d = (chainp *)(stack + nargs);
00357         refs = (int *)(d + nargs);
00358         used = refs + nargs;
00359 
00360         for(p = p0; p; p = p->nextp) {
00361                 q = (Namep) p->datap;
00362                 args[q->argno] = q;
00363                 }
00364         for(p = p0; p; p = p->nextp) {
00365                 q = (Namep) p->datap;
00366                 if (!(dp = q->vdim))
00367                         continue;
00368                 i = dp->ndim;
00369                 while(--i >= 0)
00370                         awalk(dp->dims[i].dimexpr);
00371                 awalk(dp->basexpr);
00372                 while(nu > 0) {
00373                         refs[i = used[--nu]] = 0;
00374                         d[i] = mkchain((char *)q, d[i]);
00375                         }
00376                 }
00377         for(i = nst = 0; i < nargs; i++)
00378                 for(p = d[i]; p; p = p->nextp)
00379                         refs[((Namep)p->datap)->argno]++;
00380         while(--i >= 0)
00381                 if (!refs[i])
00382                         stack[nst++] = args[i];
00383         if (nst == nargs) {
00384                 rv = p0;
00385                 goto done;
00386                 }
00387         nout = 0;
00388         rv = 0;
00389         rvp = &rv;
00390         while(nst > 0) {
00391                 nout++;
00392                 q = stack[--nst];
00393                 *rvp = p = mkchain((char *)q, CHNULL);
00394                 rvp = &p->nextp;
00395                 da = d + q->argno;
00396                 for(p = *da; p; p = p->nextp)
00397                         if (!--refs[(q = (Namep)p->datap)->argno])
00398                                 stack[nst++] = q;
00399                 frchain(da);
00400                 }
00401         if (nout < nargs)
00402                 for(i = 0; i < nargs; i++)
00403                         if (refs[i]) {
00404                                 q = args[i];
00405                                 errstr("Can't adjust %.38s correctly\n\
00406         due to dependencies among arguments.",
00407                                         q->fvarname);
00408                                 *rvp = p = mkchain((char *)q, CHNULL);
00409                                 rvp = &p->nextp;
00410                                 frchain(d+i);
00411                                 }
00412  done:
00413         free((char *)args);
00414         return rv;
00415         }
 | 
| 
 | 
| 
 Definition at line 297 of file vax.c. References aawalk(), afwalk(), Nameblock::argno, badtag(), CLVAR, nu, refs, TADDR, TCONST, TERROR, TEXPR, TLIST, top, TPRIM, UNAM_NAME, used, Nameblock::vclass, and Nameblock::vknownarg. Referenced by aawalk(), afwalk(), and argsort(). 
 00299 {
00300         Namep np;
00301  top:
00302         if (!e)
00303                 return;
00304         switch(e->tag) {
00305           default:
00306                 badtag("awalk", e->tag);
00307           case TCONST:
00308           case TERROR:
00309           case TLIST:
00310                 return;
00311           case TADDR:
00312                 if (e->addrblock.uname_tag == UNAM_NAME) {
00313                         np = e->addrblock.user.name;
00314                         if (np->vknownarg && !refs[np->argno]++)
00315                                 used[nu++] = np->argno;
00316                         }
00317                 e = e->addrblock.memoffset;
00318                 goto top;
00319           case TPRIM:
00320                 np = e->primblock.namep;
00321                 if (np->vknownarg && !refs[np->argno]++)
00322                         used[nu++] = np->argno;
00323                 if (e->primblock.argsp && np->vclass != CLVAR)
00324                         afwalk((struct Primblock *)e);
00325                 else
00326                         aawalk((struct Primblock *)e);
00327                 return;
00328           case TEXPR:
00329                 awalk(e->exprblock.rightp);
00330                 e = e->exprblock.leftp;
00331                 goto top;
00332           }
00333         }
 | 
| 
 | 
| 
 Definition at line 212 of file vax.c. References Entrypoint::arglist, ckalloc(), Chain::datap, Entrypoint::entnextp, Chain::nextp, and q. Referenced by prolog(). 
 00213 {
00214         register int *ac;
00215         register chainp cp;
00216         register struct Entrypoint *ep;
00217         register Namep q;
00218 
00219         ac = (int *)ckalloc(nallargs*sizeof(int));
00220 
00221         for(ep = entries; ep; ep = ep->entnextp)
00222                 for(cp = ep->arglist; cp; cp = cp->nextp)
00223                         if (q = (Namep)cp->datap)
00224                                 ac[q->argno]++;
00225         return ac;
00226         }
 | 
| 
 | 
| 
 Definition at line 139 of file vax.c. References addrlit(), Chain::datap, ENULL, mkexpr(), Chain::nextp, OPWHATSIN, STGARG, TADDR, Addrblock::tag, TEXPR, TLIST, UNAM_CONST, and Addrblock::uname_tag. Referenced by dim_finish(). 
 00141 {
00142     chainp listp;
00143     Addrp ap;
00144 
00145     if (e != ENULL)
00146         switch (e -> tag) {
00147             case TADDR:
00148                 if (e -> addrblock.vstg == STGARG
00149                  && !e->addrblock.isarray)
00150                     e = mkexpr (OPWHATSIN, e, ENULL);
00151                 break;
00152             case TEXPR:
00153                 e -> exprblock.leftp = make_int_expr (e -> exprblock.leftp);
00154                 e -> exprblock.rightp = make_int_expr (e -> exprblock.rightp);
00155                 break;
00156             case TLIST:
00157                 for(listp = e->listblock.listp; listp; listp = listp->nextp)
00158                         if ((ap = (Addrp)listp->datap)
00159                          && ap->tag == TADDR
00160                          && ap->uname_tag == UNAM_CONST)
00161                                 addrlit(ap);
00162                 break;
00163             default:
00164                 break;
00165         } /* switch */
00166 
00167     return e;
00168 } /* make_int_expr */
 | 
| 
 | ||||||||||||
| 
 Definition at line 98 of file vax.c. References badstg(), STGBSS, STGCOMMON, STGCONST, STGEQUIV, STGEXT, and STGINIT. Referenced by dataname(). 
 00100 {
00101         static char s[20];
00102 
00103         switch(stg)
00104         {
00105         case STGCOMMON:
00106         case STGEXT:
00107                 sprintf(s, "_%s", extsymtab[mem].cextname);
00108                 break;
00109 
00110         case STGBSS:
00111         case STGINIT:
00112                 sprintf(s, "v.%ld", mem);
00113                 break;
00114 
00115         case STGCONST:
00116                 sprintf(s, "L%ld", mem);
00117                 break;
00118 
00119         case STGEQUIV:
00120                 sprintf(s, "q.%ld", mem+eqvstart);
00121                 break;
00122 
00123         default:
00124                 badstg("memname", stg);
00125         }
00126         return(s);
00127 }
 | 
| 
 | ||||||||||||
| 
 Definition at line 55 of file vax.c. Referenced by setdata(). 
 00057 {
00058         fprintf(fp, "\tL%ld\n", a);
00059 }
 | 
| 
 | ||||||||||||
| 
 Definition at line 39 of file vax.c. References FILEP. Referenced by setdata(). 
 00041 {
00042         fprintf(fp, "\t%ld\n", n);
00043 }
 | 
| 
 | ||||||||||||||||
| 
 Definition at line 69 of file vax.c. References Constant::cd, cds(), Constant::cds, Constblock::Const, dtos(), FILEP, Constblock::vstg, and x0. Referenced by setdata(). 
 00071 {
00072         char *x0, *x1;
00073         char cdsbuf0[64], cdsbuf1[64];
00074 
00075         if (k > 1) {
00076                 if (x->vstg) {
00077                         x0 = x->Const.cds[0];
00078                         x1 = x->Const.cds[1];
00079                         }
00080                 else {
00081                         x0 = cds(dtos(x->Const.cd[0]), cdsbuf0);
00082                         x1 = cds(dtos(x->Const.cd[1]), cdsbuf1);
00083                         }
00084                 fprintf(fp, "\t%s %s\n", x0, x1);
00085                 }
00086         else
00087                 fprintf(fp, "\t%s\n", x->vstg ? x->Const.cds[0]
00088                                 : cds(dtos(x->Const.cd[0]), cdsbuf0));
00089 }
 | 
| 
 | ||||||||||||
| 
 Definition at line 423 of file vax.c. References Nameblock::argno, argsort(), Dimblock::baseoffset, Dimblock::basexpr, Constant::ci, CLBLOCK, comment_file, Constblock::Const, Expression::constblock, count_args(), cpexpr(), Nameblock::cvarname, Chain::datap, Dimblock::dims, fixtype(), frchain(), free, i, ISICON, mkconv(), mkexpr(), Dimblock::ndim, next_tab, Chain::nextp, nice_printf(), OPASSIGN, OPMINUSEQ, OPSTAR, out_and_free_statement(), prev_tab, prune_left_conv(), q, TYINT, Nameblock::vdim, Nameblock::vlastdim, Nameblock::vleng, Nameblock::vtype, write_comment(), and wrote_comment. Referenced by procode(). 
 00425 {
00426         int addif, addif0, i, nd, size;
00427         int *ac;
00428         register Namep q;
00429         register struct Dimblock *dp;
00430         chainp p0, p1;
00431 
00432         if(procclass == CLBLOCK)
00433                 return;
00434         p0 = p;
00435         p1 = p = argsort(p);
00436         wrote_comment = 0;
00437         comment_file = outfile;
00438         ac = 0;
00439 
00440 /* Compute the base addresses and offsets for the array parameters, and
00441    assign these values to local variables */
00442 
00443         addif = addif0 = nentry > 1;
00444         for(; p ; p = p->nextp)
00445         {
00446             q = (Namep) p->datap;
00447             if(dp = q->vdim)    /* if this param is an array ... */
00448             {
00449                 expptr Q, expr;
00450 
00451                 /* See whether to protect the following with an if. */
00452                 /* This only happens when there are multiple entries. */
00453 
00454                 nd = dp->ndim - 1;
00455                 if (addif0) {
00456                         if (!ac)
00457                                 ac = count_args();
00458                         if (ac[q->argno] == nentry)
00459                                 addif = 0;
00460                         else if (dp->basexpr
00461                                     || dp->baseoffset->constblock.Const.ci)
00462                                 addif = 1;
00463                         else for(addif = i = 0; i <= nd; i++)
00464                                 if (dp->dims[i].dimexpr
00465                                 && (i < nd || !q->vlastdim)) {
00466                                         addif = 1;
00467                                         break;
00468                                         }
00469                         if (addif) {
00470                                 write_comment();
00471                                 nice_printf(outfile, "if (%s) {\n", /*}*/
00472                                                 q->cvarname);
00473                                 next_tab(outfile);
00474                                 }
00475                         }
00476                 for(i = 0 ; i <= nd; ++i)
00477 
00478 /* Store the variable length of each dimension (which is fixed upon
00479    runtime procedure entry) into a local variable */
00480 
00481                     if ((Q = dp->dims[i].dimexpr)
00482                         && (i < nd || !q->vlastdim)) {
00483                         expr = (expptr)cpexpr(Q);
00484                         write_comment();
00485                         out_and_free_statement (outfile, mkexpr (OPASSIGN,
00486                                 fixtype(cpexpr(dp->dims[i].dimsize)), expr));
00487                     } /* if dp -> dims[i].dimexpr */
00488 
00489 /* size   will equal the size of a single element, or -1 if the type is
00490    variable length character type */
00491 
00492                 size = typesize[ q->vtype ];
00493                 if(q->vtype == TYCHAR)
00494                     if( ISICON(q->vleng) )
00495                         size *= q->vleng->constblock.Const.ci;
00496                     else
00497                         size = -1;
00498 
00499                 /* Fudge the argument pointers for arrays so subscripts
00500                  * are 0-based. Not done if array bounds are being checked.
00501                  */
00502                 if(dp->basexpr) {
00503 
00504 /* Compute the base offset for this procedure */
00505 
00506                     write_comment();
00507                     out_and_free_statement (outfile, mkexpr (OPASSIGN,
00508                             cpexpr(fixtype(dp->baseoffset)),
00509                             cpexpr(fixtype(dp->basexpr))));
00510                 } /* if dp -> basexpr */
00511 
00512                 if(! checksubs) {
00513                     if(dp->basexpr) {
00514                         expptr tp;
00515 
00516 /* If the base of this array has a variable adjustment ... */
00517 
00518                         tp = (expptr) cpexpr (dp -> baseoffset);
00519                         if(size < 0 || q -> vtype == TYCHAR)
00520                             tp = mkexpr (OPSTAR, tp, cpexpr (q -> vleng));
00521 
00522                         write_comment();
00523                         tp = mkexpr (OPMINUSEQ,
00524                                 mkconv (TYADDR, (expptr)p->datap),
00525                                 mkconv(TYINT, fixtype
00526                                 (fixtype (tp))));
00527 /* Avoid type clash by removing the type conversion */
00528                         tp = prune_left_conv (tp);
00529                         out_and_free_statement (outfile, tp);
00530                     } else if(dp->baseoffset->constblock.Const.ci != 0) {
00531 
00532 /* if the base of this array has a nonzero constant adjustment ... */
00533 
00534                         expptr tp;
00535 
00536                         write_comment();
00537                         if(size > 0 && q -> vtype != TYCHAR) {
00538                             tp = prune_left_conv (mkexpr (OPMINUSEQ,
00539                                     mkconv (TYADDR, (expptr)p->datap),
00540                                     mkconv (TYINT, fixtype
00541                                     (cpexpr (dp->baseoffset)))));
00542                             out_and_free_statement (outfile, tp);
00543                         } else {
00544                             tp = prune_left_conv (mkexpr (OPMINUSEQ,
00545                                     mkconv (TYADDR, (expptr)p->datap),
00546                                     mkconv (TYINT, fixtype
00547                                     (mkexpr (OPSTAR, cpexpr (dp -> baseoffset),
00548                                     cpexpr (q -> vleng))))));
00549                             out_and_free_statement (outfile, tp);
00550                         } /* else */
00551                     } /* if dp -> baseoffset -> const */
00552                 } /* if !checksubs */
00553 
00554                 if (addif) {
00555                         nice_printf(outfile, /*{*/ "}\n");
00556                         prev_tab(outfile);
00557                         }
00558             }
00559         }
00560         if (wrote_comment)
00561             nice_printf (outfile, "\n/* Function Body */\n");
00562         if (ac)
00563                 free((char *)ac);
00564         if (p0 != p1)
00565                 frchain(&p1);
00566 } /* prolog */
 | 
| 
 | 
| 
 Definition at line 181 of file vax.c. References charptr, free, Exprblock::leftp, OPCONV, and TEXPR. Referenced by prolog(). 
 00183 {
00184     struct Exprblock *leftp;
00185 
00186     if (e && e -> tag == TEXPR && e -> exprblock.leftp &&
00187             e -> exprblock.leftp -> tag == TEXPR) {
00188         leftp = &(e -> exprblock.leftp -> exprblock);
00189         if (leftp -> opcode == OPCONV) {
00190             e -> exprblock.leftp = leftp -> leftp;
00191             free ((charptr) leftp);
00192         }
00193     }
00194 
00195     return e;
00196 } /* prune_left_conv */
 | 
| 
 | 
| 
 Definition at line 203 of file vax.c. References comment_file, nice_printf(), and wrote_comment. Referenced by prolog(). 
 00204 {
00205         if (!wrote_comment) {
00206                 wrote_comment = 1;
00207                 nice_printf (comment_file, "/* Parameter adjustments */\n");
00208                 }
00209         }
 | 
Variable Documentation
| 
 | 
| 
 Definition at line 200 of file vax.c. Referenced by prolog(), and write_comment(). | 
| 
 | 
| 
 | 
| 
 | 
| 
 | 
| 
 | 
| Initial value:   {
        11, 10, 9, 8, 7, 6 } | 
| 
 | 
| 
 | 
| 
 | 
| 
 Definition at line 199 of file vax.c. Referenced by prolog(), and write_comment(). | 
 
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
 
 
 
 
       
	   
	   
	   
	  