Doxygen Source Code Documentation
output.c File Reference
#include "defs.h"
#include "names.h"
#include "output.h"
Go to the source code of this file.
Defines | |
#define | TRUE 1 |
#define | FALSE 0 |
#define | OPNEG_KLUDGE (sizeof(opcode_table)/sizeof(table_entry) - 1) |
#define | cpd(n) cp->vstg ? cp->Const.cds[n] : dtos(cp->Const.cd[n]) |
Functions | |
void output_arg_list | Argdcl ((FILEP, struct Listblock *)) |
void output_binary | Argdcl ((FILEP, Exprp)) |
void output_literal | Argdcl ((FILEP, long, Constp)) |
void output_prim | Argdcl ((FILEP, struct Primblock *)) |
void | expr_out (FILE *fp, expptr e) |
void | out_and_free_statement (FILE *outfile, expptr expr) |
int | same_ident (expptr left, expptr right) |
int | samefpconst (register Constp c1, register Constp c2, register int n) |
int | sameconst (register Constp c1, register Constp c2) |
int | same_expr (expptr e1, expptr e2) |
void | out_name (FILE *fp, Namep namep) |
void | out_const (FILE *fp, register Constp cp) |
void | out_args (FILE *fp, expptr ep) |
void | out_addr (FILE *fp, struct Addrblock *addrp) |
void | output_literal (FILE *fp, long memno, Constp cp) |
void | output_prim (FILE *fp, struct Primblock *primp) |
void | output_arg_list (FILE *fp, struct Listblock *listp) |
void | output_unary (FILE *fp, struct Exprblock *e) |
char * | findconst (register long m) |
int | opconv_fudge (FILE *fp, struct Exprblock *e) |
void | output_binary (FILE *fp, struct Exprblock *e) |
void | out_call (FILE *outfile, int op, int ftype, expptr len, expptr name, expptr args) |
char * | flconst (char *buf, char *x) |
char * | dtos (double x) |
void | out_init (Void) |
void | extern_out (FILE *fp, Extsym *extsym) |
void | output_list (FILE *fp, struct Listblock *listp) |
void | out_asgoto (FILE *outfile, expptr expr) |
void | out_if (FILE *outfile, expptr expr) |
void | output_rbrace (FILE *outfile, char *s) |
void | out_else (FILE *outfile) |
void | elif_out (FILE *outfile, expptr expr) |
void | endif_out (FILE *outfile) |
void | end_else_out (FILE *outfile) |
void | compgoto_out (FILE *outfile, expptr index, expptr labels) |
void | out_for (FILE *outfile, expptr init, expptr test, expptr inc) |
void | out_end_for (FILE *outfile) |
Variables | |
char | _assoc_table [] = { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } |
table_entry | opcode_table [] |
int | dneg |
char | opeqable [sizeof(opcode_table)/sizeof(table_entry)] |
char * | Longfmt = "%ld" |
char | tr_tab [Table_size] |
Define Documentation
|
Definition at line 448 of file output.c. Referenced by out_const(). |
|
Definition at line 32 of file output.c. Referenced by out_call(). |
|
Definition at line 127 of file output.c. Referenced by output_unary(). |
|
Definition at line 29 of file output.c. Referenced by out_call(). |
Function Documentation
|
|
|
|
|
|
|
|
|
Definition at line 1628 of file output.c. References Chain::datap, ENULL, err, erri(), expr_out(), Expression::exprblock, i, ISICON, next_tab, nice_printf(), Exprblock::opcode, OPWHATSIN, prev_tab, s2, Expression::tag, TEXPR, TLIST, TNAME, and user_label(). Referenced by do_p1_comp_goto().
01630 { 01631 char *s1, *s2; 01632 01633 if (index == ENULL) 01634 err ("compgoto_out: null index for computed goto"); 01635 else if (labels && labels -> tag != TLIST) 01636 erri ("compgoto_out: expected label list, got tag '%d'", 01637 labels -> tag); 01638 else { 01639 chainp elts; 01640 int i = 1; 01641 01642 s2 = /*(*/ ") {\n"; /*}*/ 01643 if (Ansi) 01644 s1 = "switch ("; /*)*/ 01645 else if (index->tag == TNAME || index->tag == TEXPR 01646 && index->exprblock.opcode == OPWHATSIN) 01647 s1 = "switch ((int)"; /*)*/ 01648 else { 01649 s1 = "switch ((int)("; 01650 s2 = ")) {\n"; /*}*/ 01651 } 01652 nice_printf(outfile, s1); 01653 expr_out (outfile, index); 01654 nice_printf (outfile, s2); 01655 next_tab (outfile); 01656 01657 for (elts = labels -> listblock.listp; elts; elts = elts -> nextp, i++) { 01658 if (elts -> datap) { 01659 if (ISICON(((expptr) (elts -> datap)))) 01660 nice_printf (outfile, "case %d: goto %s;\n", i, 01661 user_label(((expptr)(elts->datap))->constblock.Const.ci)); 01662 else 01663 err ("compgoto_out: bad label in label list"); 01664 } /* if (elts -> datap) */ 01665 } /* for elts */ 01666 prev_tab (outfile); 01667 nice_printf (outfile, /*{*/ "}\n"); 01668 } /* else */ 01669 } /* compgoto_out */ |
|
Definition at line 1363 of file output.c. References mem(). Referenced by imagpart(), mkcxcon(), p1_const(), prconr(), putconst(), realpart(), and samefpconst().
01365 { 01366 static char buf[64]; 01367 #ifdef USE_DTOA 01368 g_fmt(buf, x); 01369 #else 01370 sprintf(buf, db_fmt_string, x); 01371 #endif 01372 return strcpy(mem(strlen(buf)+1,0), buf); 01373 } |
|
Definition at line 1587 of file output.c. References out_if(), output_rbrace(), and prev_tab. Referenced by do_p1_elif().
01589 { 01590 prev_tab (outfile); 01591 output_rbrace(outfile, "} else "); 01592 out_if (outfile, expr); 01593 } /* elif_out */ |
|
Definition at line 1612 of file output.c. References output_rbrace(), and prev_tab. Referenced by do_p1_endelse().
01614 { 01615 prev_tab (outfile); 01616 output_rbrace(outfile, "}\n"); 01617 } /* end_else_out */ |
|
Definition at line 1600 of file output.c. References output_rbrace(), and prev_tab. Referenced by do_p1_endif().
01602 { 01603 prev_tab (outfile); 01604 output_rbrace(outfile, "}\n"); 01605 } /* endif_out */ |
|
Definition at line 147 of file output.c. References Expression::constblock, err, erri(), Expression::exprblock, free, frexpr(), is_binary_op, is_unary_op, ISICON, ISINT, ISONE, op_assign(), OPASSIGN, opeqable, OPMINUSEQ, OPPLUSEQ, OPPREDEC, OPPREINC, out_addr(), out_const(), out_name(), output_binary(), output_list(), output_prim(), output_unary(), Exprblock::rightp, same_ident(), STGARG, TADDR, TCONST, TERROR, TEXPR, TIMPLDO, TLIST, TNAME, TPRIM, and warn(). Referenced by compgoto_out(), do_p1_subr_ret(), opconv_fudge(), out_addr(), out_and_free_statement(), out_args(), out_asgoto(), out_call(), out_for(), out_if(), output_arg_list(), output_binary(), and output_list().
00149 { 00150 if (e == (expptr) NULL) 00151 return; 00152 00153 switch (e -> tag) { 00154 case TNAME: out_name (fp, (struct Nameblock *) e); 00155 return; 00156 00157 case TCONST: out_const(fp, &e->constblock); 00158 goto end_out; 00159 case TEXPR: 00160 break; 00161 00162 case TADDR: out_addr (fp, &(e -> addrblock)); 00163 goto end_out; 00164 00165 case TPRIM: if (!nerr) 00166 warn ("expr_out: got TPRIM"); 00167 output_prim (fp, &(e -> primblock)); 00168 return; 00169 00170 case TLIST: output_list (fp, &(e -> listblock)); 00171 end_out: frexpr(e); 00172 return; 00173 00174 case TIMPLDO: err ("expr_out: got TIMPLDO"); 00175 return; 00176 00177 case TERROR: 00178 default: 00179 erri ("expr_out: bad tag '%d'", e -> tag); 00180 } /* switch */ 00181 00182 /* Now we know that the tag is TEXPR */ 00183 00184 /* Optimize on simple expressions, such as "a = a + b" ==> "a += b" */ 00185 00186 if (e -> exprblock.opcode == OPASSIGN && e -> exprblock.rightp && 00187 e -> exprblock.rightp -> tag == TEXPR) { 00188 int opcode; 00189 00190 opcode = e -> exprblock.rightp -> exprblock.opcode; 00191 00192 if (opeqable[opcode]) { 00193 expptr leftp, rightp; 00194 00195 if ((leftp = e -> exprblock.leftp) && 00196 (rightp = e -> exprblock.rightp -> exprblock.leftp)) { 00197 00198 if (same_ident (leftp, rightp)) { 00199 expptr temp = e -> exprblock.rightp; 00200 00201 e -> exprblock.opcode = op_assign(opcode); 00202 00203 e -> exprblock.rightp = temp -> exprblock.rightp; 00204 temp->exprblock.rightp = 0; 00205 frexpr(temp); 00206 } /* if same_ident (leftp, rightp) */ 00207 } /* if leftp && rightp */ 00208 } /* if opcode == OPPLUS || */ 00209 } /* if e -> exprblock.opcode == OPASSIGN */ 00210 00211 00212 /* Optimize on increment or decrement by 1 */ 00213 00214 { 00215 int opcode = e -> exprblock.opcode; 00216 expptr leftp = e -> exprblock.leftp; 00217 expptr rightp = e -> exprblock.rightp; 00218 00219 if (leftp && rightp && (leftp -> headblock.vstg == STGARG || 00220 ISINT (leftp -> headblock.vtype)) && 00221 (opcode == OPPLUSEQ || opcode == OPMINUSEQ) && 00222 ISINT (rightp -> headblock.vtype) && 00223 ISICON (e -> exprblock.rightp) && 00224 (ISONE (e -> exprblock.rightp) || 00225 e -> exprblock.rightp -> constblock.Const.ci == -1)) { 00226 00227 /* Allow for the '-1' constant value */ 00228 00229 if (!ISONE (e -> exprblock.rightp)) 00230 opcode = (opcode == OPPLUSEQ) ? OPMINUSEQ : OPPLUSEQ; 00231 00232 /* replace the existing opcode */ 00233 00234 if (opcode == OPPLUSEQ) 00235 e -> exprblock.opcode = OPPREINC; 00236 else 00237 e -> exprblock.opcode = OPPREDEC; 00238 00239 /* Free up storage used by the right hand side */ 00240 00241 frexpr (e -> exprblock.rightp); 00242 e->exprblock.rightp = 0; 00243 } /* if opcode == OPPLUS */ 00244 } /* block */ 00245 00246 00247 if (is_unary_op (e -> exprblock.opcode)) 00248 output_unary (fp, &(e -> exprblock)); 00249 else if (is_binary_op (e -> exprblock.opcode)) 00250 output_binary (fp, &(e -> exprblock)); 00251 else 00252 erri ("expr_out: bad opcode '%d'", (int) e -> exprblock.opcode); 00253 00254 free((char *)e); 00255 00256 } /* expr_out */ |
|
Definition at line 1434 of file output.c. References Extsym::cextname, and nice_printf(). Referenced by out_addr(), out_call(), out_name(), wr_abbrevs(), and wr_common_decls().
01436 { 01437 if (extsym == (Extsym *) NULL) 01438 return; 01439 01440 nice_printf (fp, "%s", extsym->cextname); 01441 01442 } /* extern_out */ |
|
Definition at line 829 of file output.c. References Literal::cds, Fatal(), and Literal::litnum. Referenced by opconv_fudge().
|
|
Definition at line 1351 of file output.c. Referenced by out_const(), and wr_equiv_init().
01353 {
01354 sprintf(buf, fl_fmt_string, x);
01355 return buf;
01356 }
|
|
Definition at line 848 of file output.c. References Expression::addrblock, badtag(), c_type_decl(), Constblock::Const, Expression::constblock, Nameblock::cvarname, expr_out(), fatali(), findconst(), Expression::headblock, ICON, Addrblock::isarray, ISCOMPLEX, Exprblock::leftp, M, Addrblock::memno, Addrblock::memoffset, mkexpr(), nice_printf(), ONEOF, OPMINUS, OPSTAR, out_addr(), out_name(), STGCOMMON, STGCONST, STGEQUIV, STGMEMNO, STGUNKNOWN, TADDR, Nameblock::tag, Expression::tag, TCONST, TNAME, UNAM_IDENT, UNAM_NAME, UNAM_REF, Addrblock::uname_tag, Addrblock::user, Nameblock::voffset, Nameblock::vstg, Addrblock::vstg, Addrblock::vtype, Exprblock::vtype, and Headblock::vtype. Referenced by output_binary().
00850 { 00851 /* special handling for conversions, ichar and character*1 */ 00852 register expptr lp; 00853 register union Expression *Offset; 00854 register char *cp; 00855 int lt; 00856 char buf[8], *s; 00857 unsigned int k; 00858 Namep np; 00859 Addrp ap; 00860 00861 if (!(lp = e->leftp)) /* possible with erroneous Fortran */ 00862 return 1; 00863 lt = lp->headblock.vtype; 00864 if (lt == TYCHAR) { 00865 switch(lp->tag) { 00866 case TNAME: 00867 nice_printf(fp, "*(unsigned char *)"); 00868 out_name(fp, (Namep)lp); 00869 return 1; 00870 case TCONST: 00871 tconst: 00872 cp = lp->constblock.Const.ccp; 00873 tconst1: 00874 k = *(unsigned char *)cp; 00875 if (k < 128) { /* ASCII character */ 00876 sprintf(buf, chr_fmt[k], k); 00877 nice_printf(fp, "'%s'", buf); 00878 } 00879 else 00880 nice_printf(fp, "%d", k); 00881 return 1; 00882 case TADDR: 00883 switch(lp->addrblock.vstg) { 00884 case STGMEMNO: 00885 if (halign && e->vtype != TYCHAR) { 00886 nice_printf(fp, "*(%s *)", 00887 c_type_decl(e->vtype,0)); 00888 expr_out(fp, lp); 00889 return 1; 00890 } 00891 cp = findconst(lp->addrblock.memno); 00892 goto tconst1; 00893 case STGCONST: 00894 goto tconst; 00895 } 00896 lp->addrblock.vtype = tyint; 00897 Offset = lp->addrblock.memoffset; 00898 switch(lp->addrblock.uname_tag) { 00899 case UNAM_REF: 00900 nice_printf(fp, "*(unsigned char *)"); 00901 return 0; 00902 case UNAM_NAME: 00903 np = lp->addrblock.user.name; 00904 if (ONEOF(np->vstg, 00905 M(STGCOMMON)|M(STGEQUIV))) 00906 Offset = mkexpr(OPMINUS, Offset, 00907 ICON(np->voffset)); 00908 } 00909 lp->addrblock.memoffset = Offset ? 00910 mkexpr(OPSTAR, Offset, 00911 ICON(typesize[tyint])) 00912 : ICON(0); 00913 lp->addrblock.isarray = 1; 00914 /* STGCOMMON or STGEQUIV would cause */ 00915 /* voffset to be added in a second time */ 00916 lp->addrblock.vstg = STGUNKNOWN; 00917 nice_printf(fp, "*(unsigned char *)&"); 00918 return 0; 00919 default: 00920 badtag("opconv_fudge", lp->tag); 00921 } 00922 } 00923 if (lt != e->vtype) { 00924 s = c_type_decl(e->vtype, 0); 00925 if (ISCOMPLEX(lt)) { 00926 np = (Namep)e->leftp; 00927 switch(np->tag) { 00928 case TNAME: 00929 nice_printf(fp, "(%s) %s.r", s, 00930 np->cvarname); 00931 return 1; 00932 case TADDR: 00933 ap = (Addrp)np; 00934 switch(ap->uname_tag) { 00935 case UNAM_IDENT: 00936 nice_printf(fp, "(%s) %s.r", s, 00937 ap->user.ident); 00938 return 1; 00939 case UNAM_NAME: 00940 nice_printf(fp, "(%s) ", s); 00941 out_addr(fp, ap); 00942 nice_printf(fp, ".r"); 00943 return 1; 00944 } 00945 default: 00946 fatali("Unexpected tag %d in opconv_fudge", 00947 np->tag); 00948 } 00949 } 00950 nice_printf(fp, "(%s) ", s); 00951 } 00952 return 0; 00953 } |
|
Definition at line 551 of file output.c. References Constant::ci, CLPROC, Addrblock::cmplx_sub, Addrblock::Const, Constblock::Const, Expression::constblock, expr_out(), extern_out(), Fatal(), ICON, is_left_assoc, Addrblock::isarray, ISICON, M, Addrblock::memno, Addrblock::memoffset, mkexpr(), mkintcon(), Addrblock::name, nice_printf(), Addrblock::ntempelt, offset, ONEOF, oneof_stg(), op_precedence, OPMINUS, OPPLUS, OPSLASH, out_args(), out_const(), out_name(), output_literal(), PTHISPROC, Addrblock::skip_offset, STGARG, STGCOMMON, STGCONST, STGEQUIV, STGMEMNO, Expression::tag, TCONST, TEXPR, UNAM_CHARP, UNAM_CONST, UNAM_EXTERN, UNAM_IDENT, UNAM_NAME, UNAM_REF, UNAM_UNKNOWN, Addrblock::uname_tag, Addrblock::user, Addrblock::vclass, Addrblock::vstg, and Addrblock::vtype. Referenced by expr_out(), opconv_fudge(), and wr_nv_ident_help().
00553 { 00554 extern Extsym *extsymtab; 00555 int was_array = 0; 00556 char *s; 00557 00558 00559 if (addrp == NULL) 00560 return; 00561 if (doin_setbound 00562 && addrp->vstg == STGARG 00563 && addrp->vtype != TYCHAR 00564 && ISICON(addrp->memoffset) 00565 && !addrp->memoffset->constblock.Const.ci) 00566 nice_printf(fp, "*"); 00567 00568 switch (addrp -> uname_tag) { 00569 case UNAM_REF: 00570 nice_printf(fp, "%s_%s(", addrp->user.name->cvarname, 00571 addrp->cmplx_sub ? "subscr" : "ref"); 00572 out_args(fp, addrp->memoffset); 00573 nice_printf(fp, ")"); 00574 return; 00575 case UNAM_NAME: 00576 out_name (fp, addrp -> user.name); 00577 break; 00578 case UNAM_IDENT: 00579 if (*(s = addrp->user.ident) == ' ') { 00580 if (multitype) 00581 nice_printf(fp, "%s", 00582 xretslot[addrp->vtype]->user.ident); 00583 else 00584 nice_printf(fp, "%s", s+1); 00585 } 00586 else { 00587 nice_printf(fp, "%s", s); 00588 } 00589 break; 00590 case UNAM_CHARP: 00591 nice_printf(fp, "%s", addrp->user.Charp); 00592 break; 00593 case UNAM_EXTERN: 00594 extern_out (fp, &extsymtab[addrp -> memno]); 00595 break; 00596 case UNAM_CONST: 00597 switch(addrp->vstg) { 00598 case STGCONST: 00599 out_const(fp, (Constp)addrp); 00600 break; 00601 case STGMEMNO: 00602 output_literal (fp, addrp->memno, 00603 (Constp)addrp); 00604 break; 00605 default: 00606 Fatal("unexpected vstg in out_addr"); 00607 } 00608 break; 00609 case UNAM_UNKNOWN: 00610 default: 00611 nice_printf (fp, "Unknown Addrp"); 00612 break; 00613 } /* switch */ 00614 00615 /* It's okay to just throw in the brackets here because they have a 00616 precedence level of 15, the highest value. */ 00617 00618 if ((addrp->uname_tag == UNAM_NAME && addrp->user.name->vdim 00619 || addrp->ntempelt > 1 || addrp->isarray) 00620 && addrp->vtype != TYCHAR) { 00621 expptr offset; 00622 00623 was_array = 1; 00624 00625 offset = addrp -> memoffset; 00626 addrp->memoffset = 0; 00627 if (ONEOF(addrp->vstg, M(STGCOMMON)|M(STGEQUIV)) 00628 && addrp -> uname_tag == UNAM_NAME 00629 && !addrp->skip_offset) 00630 offset = mkexpr (OPMINUS, offset, mkintcon ( 00631 addrp -> user.name -> voffset)); 00632 00633 nice_printf (fp, "["); 00634 00635 offset = mkexpr (OPSLASH, offset, 00636 ICON (typesize[addrp -> vtype] * (addrp -> Field ? 2 : 1))); 00637 expr_out (fp, offset); 00638 nice_printf (fp, "]"); 00639 } 00640 00641 /* Check for structure field reference */ 00642 00643 if (addrp -> Field && addrp -> uname_tag != UNAM_CONST && 00644 addrp -> uname_tag != UNAM_UNKNOWN) { 00645 if (oneof_stg((addrp -> uname_tag == UNAM_NAME ? addrp -> user.name : 00646 (Namep) NULL), addrp -> vstg, M(STGARG)|M(STGEQUIV)) 00647 && !was_array && (addrp->vclass != CLPROC || !multitype)) 00648 nice_printf (fp, "->%s", addrp -> Field); 00649 else 00650 nice_printf (fp, ".%s", addrp -> Field); 00651 } /* if */ 00652 00653 /* Check for character subscripting */ 00654 00655 if (addrp->vtype == TYCHAR && 00656 (addrp->vclass != CLPROC || addrp->uname_tag == UNAM_NAME 00657 && addrp->user.name->vprocclass == PTHISPROC) && 00658 addrp -> memoffset && 00659 (addrp -> uname_tag != UNAM_NAME || 00660 addrp -> user.name -> vtype == TYCHAR) && 00661 (!ISICON (addrp -> memoffset) || 00662 (addrp -> memoffset -> constblock.Const.ci))) { 00663 00664 int use_paren = 0; 00665 expptr e = addrp -> memoffset; 00666 00667 if (!e) 00668 return; 00669 addrp->memoffset = 0; 00670 00671 if (ONEOF(addrp->vstg, M(STGCOMMON)|M(STGEQUIV)) 00672 && addrp -> uname_tag == UNAM_NAME) { 00673 e = mkexpr (OPMINUS, e, mkintcon (addrp -> user.name -> voffset)); 00674 00675 /* mkexpr will simplify it to zero if possible */ 00676 if (e->tag == TCONST && e->constblock.Const.ci == 0) 00677 return; 00678 } /* if addrp -> vstg == STGCOMMON */ 00679 00680 /* In the worst case, parentheses might be needed OUTSIDE the expression, 00681 too. But since I think this subscripting can only appear as a 00682 parameter in a procedure call, I don't think outside parens will ever 00683 be needed. INSIDE parens are handled below */ 00684 00685 nice_printf (fp, " + "); 00686 if (e -> tag == TEXPR) { 00687 int arg_prec = op_precedence (e -> exprblock.opcode); 00688 int prec = op_precedence (OPPLUS); 00689 use_paren = arg_prec && (arg_prec < prec || (arg_prec == prec && 00690 is_left_assoc (OPPLUS))); 00691 } /* if e -> tag == TEXPR */ 00692 if (use_paren) nice_printf (fp, "("); 00693 expr_out (fp, e); 00694 if (use_paren) nice_printf (fp, ")"); 00695 } /* if */ 00696 } /* out_addr */ |
|
Definition at line 265 of file output.c. References expr_out(), and nice_printf(). Referenced by prolog(), and start_formatting().
00267 { 00268 if (expr) 00269 expr_out (outfile, expr); 00270 00271 nice_printf (outfile, ";\n"); 00272 } /* out_and_free_statement */ |
|
Definition at line 525 of file output.c. References badtag(), Chain::datap, expr_out(), Expression::listblock, Listblock::listp, Chain::nextp, nice_printf(), Expression::tag, and TLIST. Referenced by out_addr().
00527 { 00528 chainp arglist; 00529 00530 if(ep->tag != TLIST) 00531 badtag("out_args", ep->tag); 00532 for(arglist = ep->listblock.listp;;) { 00533 expr_out(fp, (expptr)arglist->datap); 00534 arglist->datap = 0; 00535 if (!(arglist = arglist->nextp)) 00536 break; 00537 nice_printf(fp, ", "); 00538 } 00539 } |
|
Definition at line 1478 of file output.c. References Expression::addrblock, Nameblock::assigned_values, Chain::datap, err, expr_out(), Expression::exprblock, Exprblock::leftp, Expression::nameblock, next_tab, Chain::nextp, nice_printf(), Exprblock::opcode, OPWHATSIN, prev_tab, TADDR, Expression::tag, TEXPR, TNAME, UNAM_NAME, Addrblock::uname_tag, Addrblock::user, and user_label(). Referenced by do_p1_asgoto().
01480 { 01481 chainp value; 01482 Namep namep; 01483 int k; 01484 01485 if (expr == (expptr) NULL) { 01486 err ("out_asgoto: NULL variable expr"); 01487 return; 01488 } /* if expr */ 01489 01490 nice_printf (outfile, Ansi ? "switch (" : "switch ((int)"); /*)*/ 01491 expr_out (outfile, expr); 01492 nice_printf (outfile, ") {\n"); 01493 next_tab (outfile); 01494 01495 /* The initial addrp value will be stored as a namep pointer */ 01496 01497 switch(expr->tag) { 01498 case TNAME: 01499 /* local variable */ 01500 namep = &expr->nameblock; 01501 break; 01502 case TEXPR: 01503 if (expr->exprblock.opcode == OPWHATSIN 01504 && expr->exprblock.leftp->tag == TNAME) 01505 /* argument */ 01506 namep = &expr->exprblock.leftp->nameblock; 01507 else 01508 goto bad; 01509 break; 01510 case TADDR: 01511 if (expr->addrblock.uname_tag == UNAM_NAME) { 01512 /* initialized local variable */ 01513 namep = expr->addrblock.user.name; 01514 break; 01515 } 01516 default: 01517 bad: 01518 err("out_asgoto: bad expr"); 01519 return; 01520 } 01521 01522 for(k = 0, value = namep -> varxptr.assigned_values; value; 01523 value = value->nextp, k++) { 01524 nice_printf (outfile, "case %d: goto %s;\n", k, 01525 user_label((long)value->datap)); 01526 } /* for value */ 01527 prev_tab (outfile); 01528 01529 nice_printf (outfile, "}\n"); 01530 } /* out_asgoto */ |
|
Definition at line 1095 of file output.c. References Expression::addrblock, Nameblock::arginfo, Argtypes::atypes, CHNULL, Constant::ci, CLPROC, Constblock::Const, Expression::constblock, Chain::datap, Argtypes::defined, Argtypes::dnargs, err, expr_out(), Expression::exprblock, extern_out(), FALSE, forcereal, frchain(), Expression::headblock, Addrblock::isarray, ISCHAR, ISCOMPLEX, ISICON, L, Exprblock::leftp, Longfmt, M, Addrblock::memno, Addrblock::memoffset, Expression::nameblock, Argtypes::nargs, nice_printf(), ONEOF, oneof_stg(), op_precedence, OPCCALL, Exprblock::opcode, OPCOMMA, OPWHATSIN, out_const(), out_name(), PTHISPROC, q, STGARG, STGAUTO, STGBSS, STGCOMMON, STGEQUIV, STGEXT, STGINIT, STGLENG, STGMEMNO, STGREG, TADDR, Nameblock::tag, Expression::tag, TCONST, TEXPR, TNAME, TRUE, TYERROR, Atype::type, UNAM_CHARP, UNAM_EXTERN, UNAM_IDENT, UNAM_NAME, Addrblock::uname_tag, Addrblock::user, Headblock::vclass, Nameblock::vimpltype, Nameblock::vprocclass, Addrblock::vstg, Headblock::vtype, and Addrblock::vtype. Referenced by output_binary().
01097 { 01098 chainp arglist; /* Pointer to any actual arguments */ 01099 chainp cp; /* Iterator over argument lists */ 01100 Addrp ret_val = (Addrp) NULL; 01101 /* Function return value buffer, if any is 01102 required */ 01103 int byvalue; /* True iff we're calling a C library 01104 routine */ 01105 int done_once; /* Used for writing commas to outfile */ 01106 int narg, t; 01107 register expptr q; 01108 long L; 01109 Argtypes *at; 01110 Atype *A, *Ac; 01111 Namep np; 01112 extern int forcereal; 01113 01114 /* Don't use addresses if we're calling a C function */ 01115 01116 byvalue = op == OPCCALL; 01117 01118 if (args) 01119 arglist = args -> listblock.listp; 01120 else 01121 arglist = CHNULL; 01122 01123 /* If this is a CHARACTER function, the first argument is the result */ 01124 01125 if (ftype == TYCHAR) 01126 if (ISICON (len)) { 01127 ret_val = (Addrp) (arglist -> datap); 01128 arglist = arglist -> nextp; 01129 } else { 01130 err ("adjustable character function"); 01131 return; 01132 } /* else */ 01133 01134 /* If this is a COMPLEX function, the first argument is the result */ 01135 01136 else if (ISCOMPLEX (ftype)) { 01137 ret_val = (Addrp) (arglist -> datap); 01138 arglist = arglist -> nextp; 01139 } /* if ISCOMPLEX */ 01140 01141 /* prepare to cast procedure parameters -- set A if we know how */ 01142 np = name->tag == TEXPR && name->exprblock.opcode == OPWHATSIN 01143 ? (Namep)name->exprblock.leftp : (Namep)name; 01144 01145 A = Ac = 0; 01146 if (np->tag == TNAME && (at = np->arginfo)) { 01147 if (at->nargs > 0) 01148 A = at->atypes; 01149 if (Ansi && (at->defined || at->nargs > 0)) 01150 Ac = at->atypes; 01151 } 01152 01153 /* Now we can actually start to write out the function invocation */ 01154 01155 if (ftype == TYREAL && forcereal) 01156 nice_printf(outfile, "(real)"); 01157 if (name -> tag == TEXPR && name -> exprblock.opcode == OPWHATSIN) { 01158 nice_printf (outfile, "("); 01159 expr_out (outfile, name); 01160 nice_printf (outfile, ")"); 01161 } 01162 else 01163 expr_out(outfile, name); 01164 01165 nice_printf(outfile, "("); 01166 01167 if (ret_val) { 01168 if (ISCOMPLEX (ftype)) 01169 nice_printf (outfile, "&"); 01170 expr_out (outfile, (expptr) ret_val); 01171 if (Ac) 01172 Ac++; 01173 01174 /* The length of the result of a character function is the second argument */ 01175 /* It should be in place from putcall(), so we won't touch it explicitly */ 01176 01177 } /* if ret_val */ 01178 done_once = ret_val ? TRUE : FALSE; 01179 01180 /* Now run through the named arguments */ 01181 01182 narg = -1; 01183 for (cp = arglist; cp; cp = cp -> nextp, done_once = TRUE) { 01184 01185 if (done_once) 01186 nice_printf (outfile, ", "); 01187 narg++; 01188 01189 if (!( q = (expptr)cp->datap) ) 01190 continue; 01191 01192 if (q->tag == TADDR) { 01193 if (q->addrblock.vtype > TYERROR) { 01194 /* I/O block */ 01195 nice_printf(outfile, "&%s", q->addrblock.user.ident); 01196 continue; 01197 } 01198 if (!byvalue && q->addrblock.isarray 01199 && q->addrblock.vtype != TYCHAR 01200 && q->addrblock.memoffset->tag == TCONST) { 01201 01202 /* check for 0 offset -- after */ 01203 /* correcting for equivalence. */ 01204 L = q->addrblock.memoffset->constblock.Const.ci; 01205 if (ONEOF(q->addrblock.vstg, M(STGCOMMON)|M(STGEQUIV)) 01206 && q->addrblock.uname_tag == UNAM_NAME) 01207 L -= q->addrblock.user.name->voffset; 01208 if (L) 01209 goto skip_deref; 01210 01211 if (Ac && narg < at->dnargs 01212 && q->headblock.vtype != (t = Ac[narg].type) 01213 && t > TYADDR && t < TYSUBR) 01214 nice_printf(outfile, "(%s*)", typename[t]); 01215 01216 /* &x[0] == x */ 01217 /* This also prevents &sizeof(doublereal)[0] */ 01218 01219 switch(q->addrblock.uname_tag) { 01220 case UNAM_NAME: 01221 out_name(outfile, q->addrblock.user.name); 01222 continue; 01223 case UNAM_IDENT: 01224 nice_printf(outfile, "%s", 01225 q->addrblock.user.ident); 01226 continue; 01227 case UNAM_CHARP: 01228 nice_printf(outfile, "%s", 01229 q->addrblock.user.Charp); 01230 continue; 01231 case UNAM_EXTERN: 01232 extern_out(outfile, 01233 &extsymtab[q->addrblock.memno]); 01234 continue; 01235 } 01236 } 01237 } 01238 01239 /* Skip over the dereferencing operator generated only for the 01240 intermediate file */ 01241 skip_deref: 01242 if (q -> tag == TEXPR && q -> exprblock.opcode == OPWHATSIN) 01243 q = q -> exprblock.leftp; 01244 01245 if (q->headblock.vclass == CLPROC) { 01246 if (Castargs && (q->tag != TNAME 01247 || q->nameblock.vprocclass != PTHISPROC) 01248 && (q->tag != TADDR 01249 || q->addrblock.uname_tag != UNAM_NAME 01250 || q->addrblock.user.name->vprocclass 01251 != PTHISPROC)) 01252 { 01253 if (A && (t = A[narg].type) >= 200) 01254 t %= 100; 01255 else { 01256 t = q->headblock.vtype; 01257 if (q->tag == TNAME && q->nameblock.vimpltype) 01258 t = TYUNKNOWN; 01259 } 01260 nice_printf(outfile, "(%s)", usedcasts[t] = casttypes[t]); 01261 } 01262 } 01263 else if (Ac && narg < at->dnargs 01264 && q->headblock.vtype != (t = Ac[narg].type) 01265 && t > TYADDR && t < TYSUBR) 01266 nice_printf(outfile, "(%s*)", typename[t]); 01267 01268 if ((q -> tag == TADDR || q-> tag == TNAME) && 01269 (byvalue || q -> headblock.vstg != STGREG)) { 01270 if (q -> headblock.vtype != TYCHAR) 01271 if (byvalue) { 01272 01273 if (q -> tag == TADDR && 01274 q -> addrblock.uname_tag == UNAM_NAME && 01275 ! q -> addrblock.user.name -> vdim && 01276 oneof_stg(q -> addrblock.user.name, q -> addrblock.vstg, 01277 M(STGARG)|M(STGEQUIV)) && 01278 ! ISCOMPLEX(q->addrblock.user.name->vtype)) 01279 nice_printf (outfile, "*"); 01280 else if (q -> tag == TNAME 01281 && oneof_stg(&q->nameblock, q -> nameblock.vstg, 01282 M(STGARG)|M(STGEQUIV)) 01283 && !(q -> nameblock.vdim)) 01284 nice_printf (outfile, "*"); 01285 01286 } else { 01287 expptr memoffset; 01288 01289 if (q->tag == TADDR && 01290 !ONEOF (q -> addrblock.vstg, M(STGEXT)|M(STGLENG)) 01291 && ( 01292 ONEOF(q->addrblock.vstg, 01293 M(STGCOMMON)|M(STGEQUIV)|M(STGMEMNO)) 01294 || ((memoffset = q->addrblock.memoffset) 01295 && (!ISICON(memoffset) 01296 || memoffset->constblock.Const.ci))) 01297 || ONEOF(q->addrblock.vstg, 01298 M(STGINIT)|M(STGAUTO)|M(STGBSS)) 01299 && !q->addrblock.isarray) 01300 nice_printf (outfile, "&"); 01301 else if (q -> tag == TNAME 01302 && !oneof_stg(&q->nameblock, q -> nameblock.vstg, 01303 M(STGARG)|M(STGEXT)|M(STGEQUIV))) 01304 nice_printf (outfile, "&"); 01305 } /* else */ 01306 01307 expr_out (outfile, q); 01308 } /* if q -> tag == TADDR || q -> tag == TNAME */ 01309 01310 /* Might be a Constant expression, e.g. string length, character constants */ 01311 01312 else if (q -> tag == TCONST) { 01313 if (tyioint == TYLONG) 01314 Longfmt = "%ldL"; 01315 out_const(outfile, &q->constblock); 01316 Longfmt = "%ld"; 01317 } 01318 01319 /* Must be some other kind of expression, or register var, or constant. 01320 In particular, this is likely to be a temporary variable assignment 01321 which was generated in p1put_call */ 01322 01323 else if (!ISCOMPLEX (q -> headblock.vtype) && !ISCHAR (q)){ 01324 int use_paren = q -> tag == TEXPR && 01325 op_precedence (q -> exprblock.opcode) <= 01326 op_precedence (OPCOMMA); 01327 01328 if (use_paren) nice_printf (outfile, "("); 01329 expr_out (outfile, q); 01330 if (use_paren) nice_printf (outfile, ")"); 01331 } /* if !ISCOMPLEX */ 01332 else 01333 err ("out_call: unknown parameter"); 01334 01335 } /* for (cp = arglist */ 01336 01337 if (arglist) 01338 frchain (&arglist); 01339 01340 nice_printf (outfile, ")"); 01341 01342 } /* out_call */ |
|
Definition at line 456 of file output.c. References c, Constant::ccp1, Constant::ci, Constblock::Const, Expression::constblock, cpd, erri(), flconst(), Longfmt, nice_printf(), TYQUAD, Constblock::vleng, and Constblock::vtype. Referenced by expr_out(), out_addr(), out_call(), output_literal(), wr_array_init(), wr_globals(), and wr_output_values().
00458 { 00459 static char real_buf[50], imag_buf[50]; 00460 unsigned int k; 00461 int type = cp->vtype; 00462 00463 switch (type) { 00464 case TYINT1: 00465 case TYSHORT: 00466 nice_printf (fp, "%ld", cp->Const.ci); /* don't cast ci! */ 00467 break; 00468 case TYLONG: 00469 #ifdef TYQUAD 00470 case TYQUAD: 00471 #endif 00472 nice_printf (fp, Longfmt, cp->Const.ci); /* don't cast ci! */ 00473 break; 00474 case TYREAL: 00475 nice_printf(fp, "%s", flconst(real_buf, cpd(0))); 00476 break; 00477 case TYDREAL: 00478 nice_printf(fp, "%s", cpd(0)); 00479 break; 00480 case TYCOMPLEX: 00481 nice_printf(fp, cm_fmt_string, flconst(real_buf, cpd(0)), 00482 flconst(imag_buf, cpd(1))); 00483 break; 00484 case TYDCOMPLEX: 00485 nice_printf(fp, dcm_fmt_string, cpd(0), cpd(1)); 00486 break; 00487 case TYLOGICAL1: 00488 case TYLOGICAL2: 00489 case TYLOGICAL: 00490 nice_printf (fp, "%s", cp->Const.ci ? "TRUE_" : "FALSE_"); 00491 break; 00492 case TYCHAR: { 00493 char *c = cp->Const.ccp, *ce; 00494 00495 if (c == NULL) { 00496 nice_printf (fp, "\"\""); 00497 break; 00498 } /* if c == NULL */ 00499 00500 nice_printf (fp, "\""); 00501 ce = c + cp->vleng->constblock.Const.ci; 00502 while(c < ce) { 00503 k = *(unsigned char *)c++; 00504 nice_printf(fp, str_fmt[k], k); 00505 } 00506 for(k = cp->Const.ccp1.blanks; k > 0; k--) 00507 nice_printf(fp, " "); 00508 nice_printf (fp, "\""); 00509 break; 00510 } /* case TYCHAR */ 00511 default: 00512 erri ("out_const: bad type '%d'", (int) type); 00513 break; 00514 } /* switch */ 00515 00516 } /* out_const */ |
|
Definition at line 1573 of file output.c. References next_tab, output_rbrace(), and prev_tab. Referenced by do_p1_else().
01575 { 01576 prev_tab (outfile); 01577 output_rbrace(outfile, "} else {\n"); 01578 next_tab (outfile); 01579 } /* out_else */ |
|
Definition at line 1699 of file output.c. References nice_printf(), and prev_tab. Referenced by do_p1_end_for().
01701 { 01702 prev_tab (outfile); 01703 nice_printf (outfile, "}\n"); 01704 } /* out_end_for */ |
|
Definition at line 1680 of file output.c. References expr_out(), next_tab, and nice_printf(). Referenced by do_p1_for().
01682 { 01683 nice_printf (outfile, "for ("); 01684 expr_out (outfile, init); 01685 nice_printf (outfile, "; "); 01686 expr_out (outfile, test); 01687 nice_printf (outfile, "; "); 01688 expr_out (outfile, inc); 01689 nice_printf (outfile, ") {\n"); 01690 next_tab (outfile); 01691 } /* out_for */ |
|
Definition at line 1538 of file output.c. References expr_out(), next_tab, and nice_printf(). Referenced by do_p1_if(), and elif_out().
01540 { 01541 nice_printf (outfile, "if ("); 01542 expr_out (outfile, expr); 01543 nice_printf (outfile, ") {\n"); 01544 next_tab (outfile); 01545 } /* out_if */ |
|
Definition at line 1382 of file output.c. References OPBITAND, OPBITOR, OPBITXOR, opeqable, OPLSHIFT, OPMINUS, OPMOD, OPPLUS, OPSLASH, OPSTAR, and tr_tab. Referenced by fileinit().
01383 { 01384 extern int tab_size; 01385 register char *s; 01386 01387 s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+-."; 01388 while(*s) 01389 tr_tab[*s++] = 3; 01390 tr_tab['>'] = 1; 01391 01392 opeqable[OPPLUS] = 1; 01393 opeqable[OPMINUS] = 1; 01394 opeqable[OPSTAR] = 1; 01395 opeqable[OPSLASH] = 1; 01396 opeqable[OPMOD] = 1; 01397 opeqable[OPLSHIFT] = 1; 01398 opeqable[OPBITAND] = 1; 01399 opeqable[OPBITXOR] = 1; 01400 opeqable[OPBITOR ] = 1; 01401 01402 01403 /* Set the output format for both types of floating point constants */ 01404 01405 if (fl_fmt_string == NULL || *fl_fmt_string == '\0') 01406 fl_fmt_string = Ansi == 1 ? "%sf" : "(float)%s"; 01407 01408 if (db_fmt_string == NULL || *db_fmt_string == '\0') 01409 db_fmt_string = "%.17g"; 01410 01411 /* Set the output format for both types of complex constants. They will 01412 have string parameters rather than float or double so that the decimal 01413 point may be added to the strings generated by the {db,fl}_fmt_string 01414 formats above */ 01415 01416 if (cm_fmt_string == NULL || *cm_fmt_string == '\0') { 01417 cm_fmt_string = "{%s,%s}"; 01418 } /* if cm_fmt_string == NULL */ 01419 01420 if (dcm_fmt_string == NULL || *dcm_fmt_string == '\0') { 01421 dcm_fmt_string = "{%s,%s}"; 01422 } /* if dcm_fmt_string == NULL */ 01423 01424 tab_size = 4; 01425 } /* out_init */ |
|
Definition at line 421 of file output.c. References Extsym::curno, Nameblock::cvarname, extern_out(), nice_printf(), PTHISPROC, STGCOMMON, usedefsforcommon, Nameblock::vardesc, Nameblock::vcommequiv, Nameblock::vprocclass, Nameblock::vstg, and Nameblock::vtype. Referenced by dmalloc_verbose(), expr_out(), list_arg_types(), listargs(), opconv_fudge(), out_addr(), out_call(), output_prim(), wr_abbrevs(), wr_one_init(), and wr_struct().
00423 { 00424 extern int usedefsforcommon; 00425 Extsym *comm; 00426 00427 if (namep == NULL) 00428 return; 00429 00430 /* DON'T want to use oneof_stg() here; need to find the right common name 00431 */ 00432 00433 if (namep->vstg == STGCOMMON && !namep->vcommequiv && !usedefsforcommon) { 00434 comm = &extsymtab[namep->vardesc.varno]; 00435 extern_out(fp, comm); 00436 nice_printf(fp, "%d.", comm->curno); 00437 } /* if namep -> vstg == STGCOMMON */ 00438 00439 if (namep->vprocclass == PTHISPROC && namep->vtype != TYSUBR) 00440 nice_printf(fp, xretslot[namep->vtype]->user.ident); 00441 else 00442 nice_printf (fp, "%s", namep->cvarname); 00443 } /* out_name */ |
|
Definition at line 755 of file output.c. References expr_out(), and nice_printf(). Referenced by output_prim().
00757 { 00758 chainp arg_list; 00759 00760 if (listp == (struct Listblock *) NULL || listp -> listp == (chainp) NULL) 00761 return; 00762 00763 nice_printf (fp, "("); 00764 00765 for (arg_list = listp -> listp; arg_list; arg_list = arg_list -> nextp) { 00766 expr_out (fp, (expptr) arg_list -> datap); 00767 if (arg_list -> nextp != (chainp) NULL) 00768 00769 /* Might want to add a hook in here to accomodate the style setting which 00770 wants spaces after commas */ 00771 00772 nice_printf (fp, ","); 00773 } /* for arg_list */ 00774 00775 nice_printf (fp, ")"); 00776 } /* output_arg_list */ |
|
Definition at line 962 of file output.c. References erri(), expr_out(), Expression::exprblock, format, is_left_assoc, is_negatable(), is_right_assoc, isnegative_const(), Exprblock::leftp, negate_const(), nice_printf(), op_format, op_precedence, OPADDR, OPCALL, OPCCALL, Exprblock::opcode, OPCOMMA_ARG, OPCONV, opconv_fudge(), OPMINUS, OPNEG, OPPLUS, out_call(), Exprblock::rightp, SPECIAL_FMT, Expression::tag, TCONST, and TEXPR. Referenced by expr_out(), and output_unary().
00964 { 00965 char *format; 00966 extern table_entry opcode_table[]; 00967 int prec; 00968 00969 if (e == NULL || e -> tag != TEXPR) 00970 return; 00971 00972 /* Instead of writing a huge switch, I've incorporated the output format 00973 into a table. Things like "%l" and "%r" stand for the left and 00974 right subexpressions. This should allow both prefix and infix 00975 functions to be specified (e.g. "(%l * %r", "z_div (%l, %r"). Of 00976 course, I should REALLY think out the ramifications of writing out 00977 straight text, as opposed to some intermediate format, which could 00978 figure out and optimize on the the number of required blanks (we don't 00979 want "x - (-y)" to become "x --y", for example). Special cases (such as 00980 incomplete implementations) could still be implemented as part of the 00981 switch, they will just have some dummy value instead of the string 00982 pattern. Another difficulty is the fact that the complex functions 00983 will differ from the integer and real ones */ 00984 00985 /* Handle a special case. We don't want to output "x + - 4", or "y - - 3" 00986 */ 00987 if ((e -> opcode == OPPLUS || e -> opcode == OPMINUS) && 00988 e -> rightp && e -> rightp -> tag == TCONST && 00989 isnegative_const (&(e -> rightp -> constblock)) && 00990 is_negatable (&(e -> rightp -> constblock))) { 00991 00992 e -> opcode = (e -> opcode == OPPLUS) ? OPMINUS : OPPLUS; 00993 negate_const (&(e -> rightp -> constblock)); 00994 } /* if e -> opcode == PLUS or MINUS */ 00995 00996 prec = op_precedence (e -> opcode); 00997 format = op_format (e -> opcode); 00998 00999 if (format != SPECIAL_FMT) { 01000 while (*format) { 01001 if (*format == '%') { 01002 int arg_prec, use_paren = 0; 01003 expptr lp, rp; 01004 01005 switch (*(format + 1)) { 01006 case 'l': 01007 lp = e->leftp; 01008 if (lp && lp->tag == TEXPR) { 01009 arg_prec = op_precedence(lp->exprblock.opcode); 01010 01011 use_paren = arg_prec && 01012 (arg_prec < prec || (arg_prec == prec && 01013 is_right_assoc (prec))); 01014 } /* if e -> leftp */ 01015 if (e->opcode == OPCONV && opconv_fudge(fp,e)) 01016 break; 01017 if (use_paren) 01018 nice_printf (fp, "("); 01019 expr_out(fp, lp); 01020 if (use_paren) 01021 nice_printf (fp, ")"); 01022 break; 01023 case 'r': 01024 rp = e->rightp; 01025 if (rp && rp->tag == TEXPR) { 01026 arg_prec = op_precedence(rp->exprblock.opcode); 01027 01028 use_paren = arg_prec && 01029 (arg_prec < prec || (arg_prec == prec && 01030 is_left_assoc (prec))); 01031 use_paren = use_paren || 01032 (rp->exprblock.opcode == OPNEG 01033 && prec >= op_precedence(OPMINUS)); 01034 } /* if e -> rightp */ 01035 if (use_paren) 01036 nice_printf (fp, "("); 01037 expr_out(fp, rp); 01038 if (use_paren) 01039 nice_printf (fp, ")"); 01040 break; 01041 case '\0': 01042 case '%': 01043 nice_printf (fp, "%%"); 01044 break; 01045 default: 01046 erri ("output_binary: format err: '%%%c' illegal", 01047 (int) *(format + 1)); 01048 break; 01049 } /* switch */ 01050 format += 2; 01051 } else 01052 nice_printf (fp, "%c", *format++); 01053 } /* while *format */ 01054 } else { 01055 01056 /* Handle Special cases of formatting */ 01057 01058 switch (e -> opcode) { 01059 case OPCCALL: 01060 case OPCALL: 01061 out_call (fp, (int) e -> opcode, e -> vtype, 01062 e -> vleng, e -> leftp, e -> rightp); 01063 break; 01064 01065 case OPCOMMA_ARG: 01066 doin_setbound = 1; 01067 nice_printf(fp, "("); 01068 expr_out(fp, e->leftp); 01069 nice_printf(fp, ", &"); 01070 doin_setbound = 0; 01071 expr_out(fp, e->rightp); 01072 nice_printf(fp, ")"); 01073 break; 01074 01075 case OPADDR: 01076 default: 01077 nice_printf (fp, "Sorry, can't format OPCODE '%d'", 01078 e -> opcode); 01079 break; 01080 } 01081 01082 } /* else */ 01083 } /* output_binary */ |
|
Definition at line 1452 of file output.c. References expr_out(), and nice_printf(). Referenced by expr_out().
01454 { 01455 int did_one = 0; 01456 chainp elts; 01457 01458 nice_printf (fp, "("); 01459 if (listp) 01460 for (elts = listp -> listp; elts; elts = elts -> nextp) { 01461 if (elts -> datap) { 01462 if (did_one) 01463 nice_printf (fp, ", "); 01464 expr_out (fp, (expptr) elts -> datap); 01465 did_one = 1; 01466 } /* if elts -> datap */ 01467 } /* for elts */ 01468 nice_printf (fp, ")"); 01469 } /* output_list */ |
|
Definition at line 706 of file output.c. References lit_name(), Literal::lituse, nice_printf(), and out_const(). Referenced by out_addr().
00708 { 00709 struct Literal *litp, *lastlit; 00710 00711 lastlit = litpool + nliterals; 00712 00713 for (litp = litpool; litp < lastlit; litp++) { 00714 if (litp -> litnum == memno) 00715 break; 00716 } /* for litp */ 00717 00718 if (litp >= lastlit) 00719 out_const (fp, cp); 00720 else { 00721 nice_printf (fp, "%s", lit_name (litp)); 00722 litp->lituse++; 00723 } 00724 } /* output_literal */ |
|
Definition at line 733 of file output.c. References nice_printf(), out_name(), and output_arg_list(). Referenced by expr_out().
00735 { 00736 if (primp == NULL) 00737 return; 00738 00739 out_name (fp, primp -> namep); 00740 if (primp -> argsp) 00741 output_arg_list (fp, primp -> argsp); 00742 00743 if (primp -> fcharp != (expptr) NULL || primp -> lcharp != (expptr) NULL) 00744 nice_printf (fp, "Sorry, no substrings yet"); 00745 } |
|
Definition at line 1553 of file output.c. References last_was_label, and nice_printf(). Referenced by elif_out(), end_else_out(), endif_out(), and out_else().
01555 { 01556 extern int last_was_label; 01557 register char *fmt; 01558 01559 if (last_was_label) { 01560 last_was_label = 0; 01561 fmt = ";%s"; 01562 } 01563 else 01564 fmt = "%s"; 01565 nice_printf(outfile, fmt, s); 01566 } |
|
Definition at line 786 of file output.c. References dneg, erri(), nice_printf(), OPABS, OPADDR, OPBITNOT, OPCALL, OPCCALL, OPCHARCAST, Exprblock::opcode, OPDABS, OPIDENTITY, OPNEG, OPNEG1, OPNEG_KLUDGE, OPNOT, OPPREDEC, OPPREINC, OPWHATSIN, output_binary(), and Exprblock::vtype. Referenced by expr_out().
00788 { 00789 if (e == NULL) 00790 return; 00791 00792 switch (e -> opcode) { 00793 case OPNEG: 00794 if (e->vtype == TYREAL && dneg) { 00795 e->opcode = OPNEG_KLUDGE; 00796 output_binary(fp,e); 00797 e->opcode = OPNEG; 00798 break; 00799 } 00800 case OPNEG1: 00801 case OPNOT: 00802 case OPABS: 00803 case OPBITNOT: 00804 case OPWHATSIN: 00805 case OPPREINC: 00806 case OPPREDEC: 00807 case OPADDR: 00808 case OPIDENTITY: 00809 case OPCHARCAST: 00810 case OPDABS: 00811 output_binary (fp, e); 00812 break; 00813 case OPCALL: 00814 case OPCCALL: 00815 nice_printf (fp, "Sorry, no OPCALL yet"); 00816 break; 00817 default: 00818 erri ("output_unary: bad opcode", (int) e -> opcode); 00819 break; 00820 } /* switch */ 00821 } /* output_unary */ |
|
Definition at line 387 of file output.c. References Expression::constblock, same_ident(), sameconst(), TADDR, TCONST, TEXPR, and TNAME. Referenced by same_ident().
00389 { 00390 if (!e1 || !e2) 00391 return !e1 && !e2; 00392 00393 if (e1 -> tag != e2 -> tag || e1 -> headblock.vtype != e2 -> headblock.vtype) 00394 return 0; 00395 00396 switch (e1 -> tag) { 00397 case TEXPR: 00398 if (e1 -> exprblock.opcode != e2 -> exprblock.opcode) 00399 return 0; 00400 00401 return same_expr (e1 -> exprblock.leftp, e2 -> exprblock.leftp) && 00402 same_expr (e1 -> exprblock.rightp, e2 -> exprblock.rightp); 00403 case TNAME: 00404 case TADDR: 00405 return same_ident (e1, e2); 00406 case TCONST: 00407 return sameconst(&e1->constblock, &e2->constblock); 00408 default: 00409 return 0; 00410 } /* switch */ 00411 } /* same_expr */ |
|
Definition at line 282 of file output.c. References Expression::addrblock, Expression::exprblock, left, Exprblock::leftp, Exprblock::opcode, OPWHATSIN, same_expr(), TADDR, Expression::tag, TEXPR, TNAME, UNAM_CHARP, UNAM_IDENT, UNAM_NAME, UNAM_REF, and Addrblock::user. Referenced by expr_out(), and same_expr().
00284 { 00285 if (!left || !right) 00286 return 0; 00287 00288 if (left -> tag == TNAME && right -> tag == TNAME && left == right) 00289 return 1; 00290 00291 if (left -> tag == TADDR && right -> tag == TADDR && 00292 left -> addrblock.uname_tag == right -> addrblock.uname_tag) 00293 switch (left -> addrblock.uname_tag) { 00294 case UNAM_REF: 00295 case UNAM_NAME: 00296 00297 /* Check for array subscripts */ 00298 00299 if (left -> addrblock.user.name -> vdim || 00300 right -> addrblock.user.name -> vdim) 00301 if (left -> addrblock.user.name != 00302 right -> addrblock.user.name || 00303 !same_expr (left -> addrblock.memoffset, 00304 right -> addrblock.memoffset)) 00305 return 0; 00306 00307 return same_ident ((expptr) (left -> addrblock.user.name), 00308 (expptr) right -> addrblock.user.name); 00309 case UNAM_IDENT: 00310 return strcmp(left->addrblock.user.ident, 00311 right->addrblock.user.ident) == 0; 00312 case UNAM_CHARP: 00313 return strcmp(left->addrblock.user.Charp, 00314 right->addrblock.user.Charp) == 0; 00315 default: 00316 return 0; 00317 } /* switch */ 00318 00319 if (left->tag == TEXPR && left->exprblock.opcode == OPWHATSIN 00320 && right->tag == TEXPR && right->exprblock.opcode == OPWHATSIN) 00321 return same_ident(left->exprblock.leftp, 00322 right->exprblock.leftp); 00323 00324 return 0; 00325 } /* same_ident */ |
|
Definition at line 351 of file output.c. References Constant::ccp1, Constant::ci, Constblock::Const, Expression::constblock, err, memcmp(), samefpconst(), TYINT, and Constblock::vleng. Referenced by same_expr().
00353 { 00354 switch(c1->vtype) { 00355 case TYCOMPLEX: 00356 case TYDCOMPLEX: 00357 if (!samefpconst(c1,c2,1)) 00358 return 0; 00359 case TYREAL: 00360 case TYDREAL: 00361 return samefpconst(c1,c2,0); 00362 case TYCHAR: 00363 return c1->Const.ccp1.blanks == c2->Const.ccp1.blanks 00364 && c1->vleng->constblock.Const.ci 00365 == c2->vleng->constblock.Const.ci 00366 && !memcmp(c1->Const.ccp, c2->Const.ccp, 00367 (int)c1->vleng->constblock.Const.ci); 00368 case TYSHORT: 00369 case TYINT: 00370 case TYLOGICAL: 00371 return c1->Const.ci == c2->Const.ci; 00372 } 00373 err("unexpected type in sameconst"); 00374 return 0; 00375 } |
|
Definition at line 334 of file output.c. References Constant::cd, Constant::cds, Constblock::Const, dtos(), s2, and Constblock::vstg. Referenced by sameconst().
|
Variable Documentation
|
|
|
Definition at line 129 of file output.c. Referenced by output_unary(), and set_externs(). |
|
Definition at line 446 of file output.c. Referenced by out_call(), and out_const(). |
|
|
|
Definition at line 130 of file output.c. Referenced by expr_out(), and out_init(). |
|
Definition at line 1375 of file output.c. Referenced by ind_printf(), and out_init(). |