Temp_map F_TempMap() { static Temp_map m = NULL; if (!m) { m = Temp_empty(); Temp_enter(m, F_FP(), "fp"); Temp_enter(m, F_SP(), "sp"); Temp_enter(m, F_RV(), "rv"); Temp_enter(m, F_ZERO(), "zf"); Temp_tempList args = F_ARGS(); Temp_tempList callee = F_CALLEE(); Temp_tempList caller = F_CALLER(); string buf[10]; for (int i=0; args; args = args->tail, i++) { sprintf(buf, "args%d", i); Temp_enter(m, args, ""); } for (int i=0; callee; callee = callee->tail, i++) { sprintf(buf, "callee%d", i); Temp_enter(m, args, ""); } for (int i=0; caller; caller = caller->tail, i++) { sprintf(buf, "caller%d", i); Temp_enter(m, args, ""); } } return Temp_layerMap(m, Temp_name()); }
static void F_add_to_map(string str, Temp_temp temp) { if (!F_tempMap) { F_tempMap = Temp_name(); } Temp_enter(F_tempMap, temp, str); }
Temp_temp Temp_newtemp(void) {Temp_temp p = (Temp_temp) checked_malloc(sizeof (*p)); p->num=temps++; {char r[16]; sprintf(r, "%d", p->num); Temp_enter(Temp_name(), p, String(r)); } return p; }
T_exp T_Temp(Temp_temp temp) { T_exp p = (T_exp) checked_malloc(sizeof *p); p->kind=T_TEMP; p->PrintMyNodeSerialNumber = serial_node_number++; sprintf(p->PrintTheKindOfTreeIAm,"TEMP %s",Temp_look(Temp_name(),temp)); p->u.TEMP=temp; return p; }
T_exp T_JumpRegister(Temp_temp temp) { T_exp p = (T_exp) checked_malloc(sizeof *p); p->kind=T_JUMP; p->PrintMyNodeSerialNumber = serial_node_number++; sprintf(p->PrintTheKindOfTreeIAm,"JUMP %s",Temp_look(Temp_name(),temp)); p->u.JUMP.type = T_JUMP_REGISTER; p->u.JUMP.u.temp=temp; return p; }
void show_instr(void * i) { AS_instr instr = (AS_instr) i; assert(F_tempMap); assert(instr); /*switch (instr->kind) { case I_OPER: puts(instr->u.OPER.assem); break; case I_LABEL: puts(instr->u.LABEL.assem); break; case I_MOVE: puts(instr->u.MOVE.assem); break; default: assert("Invalid SHOW INSTR"); }*/ AS_print(stdout, instr, Temp_layerMap(F_tempMap, Temp_name())); }
/* print the assembly language instructions to filename.s */ static void doProc(FILE *out, F_frame frame, T_stm body) { T_stmList stmList; AS_instrList iList; stmList = C_linearize(body); stmList = C_traceSchedule(C_basicBlocks(stmList)); // printStmList(stdout, stmList); print_graph_Stm_List(out, stmList); iList = F_codegen(frame, stmList); fprintf(stdout, "BEGIN %s\n", Temp_labelstring(frame->name)); AS_printInstrList (stdout, iList, Temp_layerMap(f_map,Temp_name())); fprintf(stdout, "END %s\n\n", Temp_labelstring(frame->name)); }
static void doProc(FILE *out, F_frame frame, T_stm body) { //printStm(body); AS_proc proc; T_stmList stmList; AS_instrList iList; stmList = C_linearize(body); stmList = C_traceSchedule(C_basicBlocks(stmList)); //printStmList(stdout, stmList); iList = codegen(frame, stmList); /* 9 */ G_graph g = FG_AssemFlowGraph(iList); //G_show(stdout, G_nodes(g), show_instr); //show_graph(g); struct L_graph lg = L_liveness(g); show_graph(lg.graph); fprintf(out, "BEGIN %s\n", Temp_labelstring(F_name(frame))); AS_printInstrList (out, iList, Temp_layerMap(F_tempMap,Temp_name())); fprintf(out, "END %s\n\n", Temp_labelstring(F_name(frame))); }
Temp_temp Temp_newtemp(const char *name) { Temp_temp p = (Temp_temp) checked_malloc(sizeof (*p)); p->num=temps++; { char r[LOG_2_MAX_NUM_TEMPORARIES]; if (strcmp(name,"") == 0) { sprintf(r, "%s_%d","Temp",p->num); } else { strcpy(r,name); } Temp_enter(Temp_name(), p, String(r)); } return p; }