STATIC void cpp_function_indirect_type(type *t) { int farfunc; farfunc = tyfarfunc(t->Tnext->Tty) != 0; if (tybasic(t->Tty) == TYmemptr) { CHAR('8' + farfunc); cpp_scope(t->Ttag); CHAR('@'); //cpp_this_type(t->Tnext,t->Ttag); // MSC doesn't do this } else CHAR('6' + farfunc); }
STATIC void cpp_type_encoding(symbol *s) { char c; //printf("cpp_type_encoding()\n"); if (tyfunc(s->Stype->Tty)) { int farfunc; farfunc = tyfarfunc(s->Stype->Tty) != 0; #if SCPP || MARS if (isclassmember(s)) { // Member function int protection; int ftype; protection = cpp_protection(s); if (s->Sfunc->Fthunk && !(s->Sfunc->Fflags & Finstance)) ftype = 3; else switch (s->Sfunc->Fflags & (Fvirtual | Fstatic)) { case Fvirtual: ftype = 2; break; case Fstatic: ftype = 1; break; case 0: ftype = 0; break; default: assert(0); } CHAR('A' + farfunc + protection * 8 + ftype * 2); switch (ftype) { case 0: cpp_member_function_type(s); break; case 1: cpp_static_member_function_type(s); break; case 2: cpp_member_function_type(s); break; case 3: cpp_adjustor_thunk_type(s); break; } } else #endif { // Non-member function CHAR('Y' + farfunc); cpp_external_function_type(s); } } else { #if SCPP || MARS if (isclassmember(s)) { { // Static data member CHAR(cpp_protection(s) + '0'); cpp_static_member_data_type(s); } } else #endif { if (s->Sclass == SCstatic #if SCPP || MARS || (s->Sscope && s->Sscope->Sclass != SCstruct && s->Sscope->Sclass != SCnamespace) #endif ) { CHAR('4'); cpp_local_static_data_type(s); } else { CHAR('3'); cpp_external_data_type(s); } } } }
void cod5_prol_epi() { tym_t tym; tym_t tyf; block *b; block *bp; list_t bl; int nepis; tyf = funcsym_p->ty(); tym = tybasic(tyf); goto L1; if (!(config.flags4 & CFG4optimized) || anyiasm || usedalloca || usednteh || tyf & (mTYnaked | mTYloadds) || tym == TYifunc || tym == TYmfunc || // can't yet handle ECX passed as parameter tym == TYjfunc || // can't yet handle EAX passed as parameter config.flags & (CFGalwaysframe | CFGtrace) || // config.fulltypes || (config.wflags & WFwindows && tyfarfunc(tym)) || need_prolog(startblock) ) { // First block gets the prolog, all return blocks // get the epilog. //printf("not even a candidate\n"); L1: cod5_noprol(); return; } // Turn on BFLoutsideprolog for all blocks outside the ones needing the prolog. for (b = startblock; b; b = b->Bnext) b->Bflags &= ~BFLoutsideprolog; // start with them all off pe_add(startblock); // Look for only one block (bp) that will hold the prolog bp = NULL; nepis = 0; for (b = startblock; b; b = b->Bnext) { int mark; if (b->Bflags & BFLoutsideprolog) continue; // If all predecessors are marked mark = 0; assert(b->Bpred); for (bl = b->Bpred; bl; bl = list_next(bl)) { if (list_block(bl)->Bflags & BFLoutsideprolog) { if (mark == 2) goto L1; mark = 1; } else { if (mark == 1) goto L1; mark = 2; } } if (mark == 1) { if (bp) // if already have one goto L1; bp = b; } // See if b is an epilog mark = 0; for (bl = b->Bsucc; bl; bl = list_next(bl)) { if (list_block(bl)->Bflags & BFLoutsideprolog) { if (mark == 2) goto L1; mark = 1; } else { if (mark == 1) goto L1; mark = 2; } } if (mark == 1 || b->BC == BCret || b->BC == BCretexp) { b->Bflags |= BFLepilog; nepis++; if (nepis > 1 && config.flags4 & CFG4space) goto L1; } } if (bp) { bp->Bflags |= BFLprolog; //printf("=============== prolog opt\n"); } }