void genstmt(STATEMENT *stmt, SYMBOL *funcsp) /* * genstmt will generate a statement and follow the next pointer * until the block is generated. */ { while (stmt != 0) { switch (stmt->type) { case st_varstart: gen_varstart(stmt->select); break; case st_dbgblock: gen_dbgblock(stmt->label); break; case st_tryblock: /* gen_tryblock(stmt->label); */ break; case st_block: genstmt(stmt->lower, funcsp); genstmt(stmt->blockTail, funcsp); break; case st_label: gen_label((int)stmt->label); break; case st_goto: gen_igoto(i_goto, (int)stmt->label); break; case st_asmgoto: gen_igoto(i_asmgoto, (int)stmt->label); break; case st_asmcond: gen_igoto(i_asmcond, (int)stmt->label); break; case st_throw: /* gen_throw((TYPE *)stmt->lst, stmt->select);*/ break; /* case st_functailexpr: gen_icode(i_functailstart, 0, 0, 0); gen_expr(funcsp, stmt->select, F_NOVALUE, natural_size(stmt->select)); * gen_icode(i_functailend, 0, 0, 0); break; */ case st_expr: case st_declare: gen_expr(funcsp, stmt->select, F_NOVALUE, natural_size(stmt->select)); break; case st_return: genreturn(stmt, funcsp, 0, 0, NULL); break; case st_line: gen_line(stmt->lineData); break; case st_select: genselect(stmt, funcsp, TRUE); break; case st_notselect: genselect(stmt, funcsp, FALSE); break; case st_switch: genxswitch(stmt, funcsp); break; case st__genword: gen_genword(stmt, funcsp); break; case st_passthrough: gen_asm(stmt); break; case st_datapassthrough: gen_asmdata(stmt); break; default: diag("unknown statement."); break; } stmt = stmt->next; } }
IMODE *genstmt(STATEMENT *stmt, SYMBOL *funcsp) /* * genstmt will generate a statement and follow the next pointer * until the block is generated. */ { IMODE *rv = NULL; while (stmt != 0) { STATEMENT *last = stmt; switch (stmt->type) { case st_varstart: gen_varstart(stmt->select); break; case st_dbgblock: gen_dbgblock(stmt->label); break; break; case st_block: rv = genstmt(stmt->lower, funcsp); genstmt(stmt->blockTail, funcsp); break; case st_label: gen_label((int)stmt->label); break; case st_goto: gen_igoto(i_goto, (int)stmt->label); break; case st_asmgoto: gen_igoto(i_asmgoto, (int)stmt->label); break; case st_asmcond: gen_igoto(i_asmcond, (int)stmt->label); break; case st_try: gen_try(funcsp, stmt, stmt->label, stmt->endlabel, stmt->breaklabel, stmt->lower); break; case st_catch: { STATEMENT *last; while (stmt && stmt->type == st_catch) { gen_catch(funcsp, stmt, stmt->altlabel, stmt->breaklabel, stmt->lower); last = stmt; stmt = stmt->next; } stmt = last; gen_label(stmt->breaklabel); } break; case st_expr: case st_declare: if (stmt->select) rv = gen_expr(funcsp, stmt->select, F_NOVALUE, natural_size(stmt->select)); break; case st_return: genreturn(stmt, funcsp, 0, 0, NULL); break; case st_line: gen_line(stmt->lineData); break; case st_select: genselect(stmt, funcsp, TRUE); break; case st_notselect: genselect(stmt, funcsp, FALSE); break; case st_switch: genxswitch(stmt, funcsp); break; case st__genword: gen_genword(stmt, funcsp); break; case st_passthrough: gen_asm(stmt); break; case st_datapassthrough: gen_asmdata(stmt); break; default: diag("unknown statement."); break; } if (last->type != st_return && last->destexp) { gen_expr(funcsp, last->destexp, F_NOVALUE, ISZ_ADDR); } stmt = stmt->next; } return rv; }
void genstmt(SNODE *stmt) /* * genstmt will generate a statement and follow the next pointer * until the block is generated. */ { while( stmt != 0 ) { switch( stmt->stype ) { case st_block: genstmt(stmt->exp); break; case st_label: gen_label((int)stmt->label); break; case st_goto: gen_code(op_jmp,0,make_label((int)stmt->label),0); break; case st_expr: initstack(); gen_expr(stmt->exp,F_ALL | F_NOVALUE, natural_size(stmt->exp)); break; case st_return: genreturn(stmt,0); break; case st_if: genif(stmt); break; case st_while: genwhile(stmt); break; case st_do: gendo(stmt); break; case st_for: gen_for(stmt); break; case st_continue: gen_code(op_jmp,0,make_label(contlab),0); break; case st_break: gen_code(op_jmp,0,make_label(breaklab),0); break; case st_switch: genxswitch(stmt); break; case st_line: gen_line(stmt); break; case st_asm: if (stmt->exp) add_peep(stmt->exp); break; case st__genword: gen_code(op_genword,0,make_immed((int)stmt->exp),0); break; default: diag("unknown statement."); break; } stmt = stmt->next; } }
/* * genstmt will generate a statement and follow the next pointer * until the block is generated. */ void GenerateStatement(Statement *stmt) { AMODE *ap; while( stmt != NULL ) { GenMixedSource(stmt); switch( stmt->stype ) { //case st_vortex: // gen_vortex(stmt); // break; case st_funcbody: GenerateFuncbody(stmt); break; case st_compound: GenerateCompound(stmt); break; case st_try: GenerateTry(stmt); break; case st_throw: GenerateThrow(stmt); break; case st_intoff: GenerateIntoff(stmt); break; case st_stop: GenerateStop(stmt); break; case st_inton: GenerateInton(stmt); break; case st_asm: GenerateAsm(stmt); break; case st_label: GenerateLabel((int64_t)stmt->label); break; case st_goto: GenerateMonadic(isThor?op_br:op_bra,0,make_clabel((int64_t)stmt->label)); break; //case st_critical: // GenerateCritical(stmt); // break; case st_spinlock: GenerateSpinlock(stmt); break; case st_spinunlock: GenerateSpinUnlock(stmt); break; case st_check: GenerateCheck(stmt); break; case st_expr: initstack(); ap = GenerateExpression(stmt->exp,F_ALL | F_NOVALUE, GetNaturalSize(stmt->exp)); ReleaseTempRegister(ap); tmpFreeAll(); break; case st_return: if (isFISA64) GenerateFISA64Return(currentFn,stmt); else if (is816) Generate816Return(currentFn,stmt); else if (isTable888) GenerateTable888Return(currentFn,stmt); else if (isRaptor64) GenerateRaptor64Return(currentFn,stmt); else GenerateReturn(currentFn,stmt); break; case st_if: GenerateIf(stmt); break; case st_do: GenerateDo(stmt); break; case st_dountil: GenerateDoUntil(stmt); break; case st_doloop: GenerateForever(stmt); break; case st_while: GenerateWhile(stmt); break; case st_until: GenerateUntil(stmt); break; case st_for: GenerateFor(stmt); break; case st_forever: GenerateForever(stmt); break; case st_firstcall: GenerateFirstcall(stmt); break; case st_continue: if (contlab==-1) error(ERR_NOT_IN_LOOP); GenerateDiadic(isThor?op_br:op_bra,0,make_clabel(contlab),0); break; case st_break: if (breaklab==-1) error(ERR_NOT_IN_LOOP); GenerateDiadic(isThor?op_br:op_bra,0,make_clabel(breaklab),0); break; case st_switch: genxswitch(stmt); break; case st_empty: break; default: printf("DIAG - unknown statement.\n"); break; } stmt = stmt->next; } }