T_exp T_Cjump(T_binOp op, T_exp left, T_exp right, Temp_label jumpToHereIfTrue, Temp_label jumpToHereIfFalse) { T_exp p = (T_exp) checked_malloc(sizeof *p); p->kind=T_CJUMP; p->PrintMyNodeSerialNumber = serial_node_number++; sprintf( p->PrintTheKindOfTreeIAm, "CJUMP\n op = %s\n if (left op right) goto %s;\n else goto %s;", binopConvertEnumToString[op], Temp_labelstring(jumpToHereIfTrue), Temp_labelstring(jumpToHereIfFalse)); p->u.CJUMP.op=op; p->u.CJUMP.left=left; p->u.CJUMP.right=right; p->u.CJUMP.jumpToHereIfTrue=jumpToHereIfTrue; p->u.CJUMP.jumpToHereIfFalse=jumpToHereIfFalse; return p; }
static void display_l(Tr_level l) { static int lnum; if (l->parent) { printf("parent: %s\n", Temp_labelstring(l->parent->name)); } else { printf("parent: root\n"); } printf("addr: %s\n", Temp_labelstring(l->name)); display_f(l->frame); }
/* 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))); }
int main(int argc, string *argv) { #if 0 Temp_temp a1 = Temp_namedtemp(1), a2 = Temp_namedtemp(2), a3 = Temp_namedtemp(3), a4 = Temp_namedtemp(4), a5 = Temp_namedtemp(5); Temp_tempList a = Temp_TempList(a1, Temp_TempList(a2, Temp_TempList(a3, NULL))), b = Temp_TempList(a2, Temp_TempList(a4, NULL)); printf("union: "); printTempList(unionn(a, b)); printf("except: "); printTempList(except(a,b)); #endif #if 1 A_exp absyn_root; S_table base_env, base_tenv; F_fragList frags; char outfile[100]; FILE *out = stdout; if (argc==2) { absyn_root = parse(argv[1]); if (!absyn_root) return 1; //pr_exp(stdout,absyn_root, 4); frags = SEM_transProg(absyn_root); if (anyErrors) return 1; /* don't continue */ /* convert the filename */ sprintf(outfile, "%s.s", argv[1]); out = fopen(outfile, "w"); for (;frags;frags=frags->tail) { if (frags->head->kind == F_procFrag) { //puts(Temp_labelstring(F_name(frags->head->u.proc.frame))); doProc(out, frags->head->u.proc.frame, frags->head->u.proc.body); } else if (frags->head->kind == F_stringFrag) { fprintf(out, "%s: %s\n",Temp_labelstring(frags->head->u.stringg.label), frags->head->u.stringg.str); } else assert(0); } fclose(out); return 0; } EM_error(0,"usage: tiger file.tig"); return 1; #endif }
T_exp T_Label(Temp_label label) { T_exp p = (T_exp) checked_malloc(sizeof *p); p->kind=T_LABEL; p->PrintMyNodeSerialNumber = serial_node_number++; sprintf(p->PrintTheKindOfTreeIAm,"LABEL: %s",Temp_labelstring(label)); p->u.LABEL=label; return p; }
T_exp T_JumpLabel(Temp_label label) { T_exp p = (T_exp) checked_malloc(sizeof *p); p->kind=T_JUMP; p->PrintMyNodeSerialNumber = serial_node_number++; sprintf(p->PrintTheKindOfTreeIAm,"JUMP %s",Temp_labelstring(label)); p->u.JUMP.type = T_JUMP_LABEL; p->u.JUMP.u.label=label; return p; }
T_exp T_Call(Temp_label name, T_expList args) { T_exp p = (T_exp) checked_malloc(sizeof *p); p->kind=T_CALL; p->PrintMyNodeSerialNumber = serial_node_number++; sprintf(p->PrintTheKindOfTreeIAm,"CALL: %s",Temp_labelstring(name)); p->u.CALL.name = name; p->u.CALL.args = args; return p; }
T_exp T_Function(T_exp prologue, T_exp body, T_exp epilogue, Temp_label name) { T_exp p = (T_exp) checked_malloc(sizeof *p); p->kind=T_FUNCTION; p->PrintMyNodeSerialNumber = serial_node_number++; sprintf(p->PrintTheKindOfTreeIAm,"FUNCTION: %s",Temp_labelstring(name)); p->u.FUNCTION.prologue = prologue; p->u.FUNCTION.body = body; p->u.FUNCTION.epilogue = epilogue; p->u.FUNCTION.name = name; return p; }
/* first param is string created by this function by reading 'assem' string * and replacing `d `s and `j stuff. * Last param is function to use to determine what to do with each temp. */ static void format(char *result, string assem, Temp_tempList dst, Temp_tempList src, AS_targets jumps, Temp_map m) { char *p; int i = 0; /* offset to result string */ for (p = assem; p && *p != '\0'; p++) { if (*p == '`') { switch(*(++p)) { case 's': { int n = *(++p) - '0'; string s = Temp_look(m, nthTemp(src,n)); strcpy(result+i, s); i += strlen(s); } break; case 'd': { int n = *(++p) - '0'; string s = Temp_look(m, nthTemp(dst,n)); strcpy(result+i, s); i += strlen(s); } break; case 'j': assert(jumps); { int n = *(++p) - '0'; string s = Temp_labelstring(nthLabel(jumps->labels,n)); strcpy(result+i, s); i += strlen(s); } break; default: assert(0); } } else { result[i] = *p; i++; } } result[i] = '\0'; }
/* first param is string created by this function by reading 'assem' string * and replacing `d `s and `j stuff. * Last param is function to use to determine what to do with each temp. */ void AS_format(char *result, string assem, Temp_tempList dst, Temp_tempList src, AS_targets jumps, Temp_map m) { char *p; int i = 0; /* offset to result string */ for(p = assem; p && *p != '\0'; p++) if (*p == '`') switch(*(++p)) { case 's': {int n = atoi(++p); //printf("mark start\n"); //printf("n = %d\n", n); //if(nthTemp(src,n)==NULL){printf("But it is NULL!\n");}fflush(stdout); string s = Temp_look(m, nthTemp(src,n)); //printf("mark end\n");fflush(stdout); strcpy(result+i, s); i += strlen(s); } break; case 'd': {int n = atoi(++p); string s = Temp_look(m, nthTemp(dst,n)); strcpy(result+i, s); i += strlen(s); } break; case 'j': assert(jumps); {int n = atoi(++p); string s = Temp_labelstring(nthLabel(jumps->labels,n)); strcpy(result+i, s); i += strlen(s); } break; case '`': result[i] = '`'; i++; break; default: assert(0); } else {result[i] = *p; i++; } result[i] = '\0'; }
static void display_ac(Tr_access ac) { printf("level: %s\n", Temp_labelstring(ac->level->name)); dis_ac(ac->access); }