void myp2tree(NODE *p) { struct symtab *sp; if (p->n_op != FCON) return; /* Write float constants to memory */ sp = IALLOC(sizeof(struct symtab)); sp->sclass = STATIC; sp->sap = 0; sp->slevel = 1; /* fake numeric label */ sp->soffset = getlab(); sp->sflags = 0; sp->stype = p->n_type; sp->squal = (CON >> TSHIFT); defloc(sp); ninval(0, tsize(sp->stype, sp->sdf, sp->sap), p); p->n_op = NAME; p->n_lval = 0; p->n_sp = sp; }
void myp2tree(NODE *p) { struct symtab *sp; int o = p->n_op; if (o != FCON) return; sp = inlalloc(sizeof(struct symtab)); sp->sclass = STATIC; sp->ssue = 0; sp->slevel = 1; /* fake numeric label */ sp->soffset = getlab(); sp->sflags = 0; sp->stype = p->n_type; sp->squal = (CON >> TSHIFT); defloc(sp); ninval(0, sp->ssue->suesize, p); p->n_op = NAME; p->n_lval = 0; p->n_sp = sp; }
void myp2tree(NODE *p) { struct symtab *sp; NODE *l, *r; int o = p->n_op; switch (o) { case NAME: /* reading from a name must be done with a subroutine */ if (p->n_type != CHAR && p->n_type != UCHAR) break; l = buildtree(ADDROF, ccopy(p), NIL); r = block(NAME, NIL, NIL, INT, 0, 0); r->n_sp = lookup(addname("__nova_rbyte"), SNORMAL); if (r->n_sp->sclass == SNULL) { r->n_sp->sclass = EXTERN; r->n_sp->stype = INCREF(p->n_type)+(FTN-PTR); } r->n_type = r->n_sp->stype; r = clocal(r); r = optim(buildtree(CALL, r, l)); *p = *r; nfree(r); break; case FCON: sp = tmpalloc(sizeof(struct symtab)); sp->sclass = STATIC; sp->sap = 0; sp->slevel = 1; /* fake numeric label */ sp->soffset = getlab(); sp->sflags = 0; sp->stype = p->n_type; sp->squal = (CON >> TSHIFT); defloc(sp); ninval(0, tsize(sp->stype, sp->sdf, sp->sap), p); p->n_op = NAME; p->n_lval = 0; p->n_sp = sp; } }
void myp2tree(NODE *p) { struct symtab *sp; NODE *l; if (cdope(p->n_op) & CALLFLG) { if (p->n_left->n_op == ADDROF && p->n_left->n_left->n_op == NAME) { p->n_left = nfree(p->n_left); l = p->n_left; l->n_op = ICON; if (l->n_sp->sclass != STATIC && l->n_sp->sclass != USTATIC) l->n_sp = picsymtab(l->n_sp->sname, "@PLTPC", ""); } } if (p->n_op != FCON) return; sp = IALLOC(sizeof(struct symtab)); sp->sclass = STATIC; sp->sap = 0; sp->slevel = 1; /* fake numeric label */ sp->soffset = getlab(); sp->sflags = 0; sp->stype = p->n_type; sp->squal = (CON >> TSHIFT); sp->sname = NULL; locctr(DATA, sp); defloc(sp); ninval(0, tsize(sp->stype, sp->sdf, sp->sap), p); p->n_op = NAME; slval(p, 0); p->n_sp = sp; }
/* * special handling before tree is written out. */ void myp2tree(NODE *p) { struct symtab *sp; union dimfun *df; union arglist *al; NODE *q; int i; switch (p->n_op) { case MOD: case DIV: if (p->n_type == LONG || p->n_type == ULONG) { /* Swap arguments for hardops() later */ q = p->n_left; p->n_left = p->n_right; p->n_right = q; } break; case CALL: case STCALL: /* * inform pass2 about varargs. * store first variadic argument number in n_stalign * in the CM node. */ if (p->n_right->n_op != CM) break; /* nothing to care about */ df = p->n_left->n_df; if (df && (al = df->dfun)) { for (i = 0; i < 6; i++, al++) { if (al->type == TELLIPSIS || al->type == TNULL) break; } p->n_right->n_stalign = al->type == TELLIPSIS ? i : 0; } else p->n_right->n_stalign = 0; break; case FCON: /* Write float constants to memory */ sp = inlalloc(sizeof(struct symtab)); sp->sclass = STATIC; sp->ssue = 0; sp->slevel = 1; /* fake numeric label */ sp->soffset = getlab(); sp->sflags = 0; sp->stype = p->n_type; sp->squal = (CON >> TSHIFT); defloc(sp); ninval(0, sp->ssue->suesize, p); p->n_op = NAME; p->n_lval = 0; p->n_sp = sp; break; } }
/* * print out a constant node * mat be associated with a label */ int ninval(CONSZ off, int fsz, NODE *p) { union { float f; double d; int i[2]; } u; struct symtab *q; TWORD t; #ifndef USE_GAS int i, j; #endif t = p->n_type; if (t > BTMASK) p->n_type = t = INT; /* pointer */ if (p->n_op == ICON && p->n_sp != NULL && DEUNSIGN(t) != INT) uerror("element not constant"); switch (t) { case LONGLONG: case ULONGLONG: #ifdef USE_GAS printf("\t.dword %lld\n", (long long)p->n_lval); #else i = p->n_lval >> 32; j = p->n_lval & 0xffffffff; p->n_type = INT; if (bigendian) { p->n_lval = j; ninval(off, 32, p); p->n_lval = i; ninval(off+32, 32, p); } else { p->n_lval = i; ninval(off, 32, p); p->n_lval = j; ninval(off+32, 32, p); } #endif break; case INT: case UNSIGNED: printf("\t.word " CONFMT, (CONSZ)p->n_lval); if ((q = p->n_sp) != NULL) { if ((q->sclass == STATIC && q->slevel > 0)) { printf("+" LABFMT, q->soffset); } else printf("+%s", q->soname ? q->soname : exname(q->sname)); } printf("\n"); break; case SHORT: case USHORT: astypnames[SHORT] = astypnames[USHORT] = "\t.half"; return 0; case LDOUBLE: case DOUBLE: u.d = (double)p->n_dcon; if (bigendian) { printf("\t.word\t%d\n", u.i[0]); printf("\t.word\t%d\n", u.i[1]); } else { printf("\t.word\t%d\n", u.i[1]); printf("\t.word\t%d\n", u.i[0]); } break; case FLOAT: u.f = (float)p->n_dcon; printf("\t.word\t0x%x\n", u.i[0]); break; default: return 0; } return 1; }