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(). |