/*-------------------------------------------------------------------------*/ void parcours_var_simple(n_var *n, char * var) { int i = rechercheExecutable(n->nom); if( i < 0) { printf("Variable %s non déclaré\n", n->nom); affiche_dico(); exit(1); } else if (dico.tab[i].type == T_TABLEAU_ENTIER) { printf("Indice tableau %s est attendu\n", n->nom); affiche_dico(); exit(1); } if(dico.tab[i].classe == C_VARIABLE_GLOBALE) { sprintf(var, "$%s", n->nom); } else if (dico.tab[i].classe == C_ARGUMENT) { int adress = dico.tab[i].adresse; int result = 4 * nbArg - adress; sprintf(var, "%d($fp) #variable argument %s",result,n->nom); } else if (dico.tab[i].classe == C_VARIABLE_LOCALE){ int adresse = -1 *(8 + dico.tab[i].adresse); sprintf(var, "%d($fp) #variable locale", adresse); } }
void parcours_appel(n_appel *n) { char tmp[250]; int id = rechercheExecutable(n->fonction); if(id < 0) { printf("Fonction %s introuvable\n", n->fonction); affiche_dico(); exit(1); } printMips("subi $sp, $sp, 4 #Val Retour"); int nbArg = parcours_l_exp(n->args); if(dico.tab[id].complement != nbArg) { printf("Nombre Argument différent pour l'appel à %s\n", n->fonction); affiche_dico(); exit(1); } sprintf(tmp,"jal %s",n->fonction); printMips(tmp); int i = nbArg * 4; if(i != 0) { sprintf(tmp,"addi $sp, $sp, %d #désalocation des arguments",i); printMips(tmp); } }
void mips_gen_inst_affect_tab(const n_var* v){ //Charge indice mips_gen_pop_reg("$t0"); //Indice x4 mips_gen_instr_3("add", "$t0", "$t0", "$t0"); mips_gen_instr_3("add", "$t0", "$t0", "$t0"); mips_gen_pop_reg("$t1"); char* nom = v->nom; int i = rechercheExecutable(nom); if(i == -1) erreur_1s("MIPS: Variable %s introuvable", nom); switch(dico.tab[i].classe){ case C_VARIABLE_GLOBALE: printf("\tsw $t1, %s($t0) # stocke variable\n", nom); break; default: erreur_1s("MIPS: tableau %s Portée invalide", nom); } }
void parcours_foncDec(n_dec *n) { char tmp[256]; sprintf(tmp, "%s :", n->nom); printMips(tmp); debutFunc(); int i = rechercheExecutable(n->nom); if( i >= 0) { printf("Fonction %s déjà déclaré\n", n->nom); affiche_dico(); exit(1); } int id = ajouteIdentificateur(n->nom, contexte, T_FONCTION, 0, -1); entreeFonction(); contexte = C_ARGUMENT; parcours_l_dec(n->u.foncDec_.param); int j = 0; for(int i = dico.sommet - 1; i >= 0; i--){ if(dico.tab[i].classe != C_ARGUMENT) break; j++; } nbArg = j; i = id; int nbvariableLocale = 0; dico.tab[id].complement = j; contexte = C_VARIABLE_LOCALE; parcours_l_dec(n->u.foncDec_.variables); while (i+1 < dico.sommet && (dico.tab[i+1].classe == C_VARIABLE_LOCALE || dico.tab[i+1].classe == C_ARGUMENT)){ if(dico.tab[i+1].classe == C_VARIABLE_LOCALE) ++nbvariableLocale; ++i; } nbvariableLocalFonc = nbvariableLocale; parcours_instr(n->u.foncDec_.corps); sprintf(tmp,"addi $sp, $sp %d # desallocation variables locales",nbvariableLocale * 4); printMips(tmp); affiche_dico(); sortieFonction(); finFunc(); }
/*-------------------------------------------------------------------------*/ void parcours_var_indicee(n_var *n, char * var) { int i = rechercheExecutable(n->nom); if( i < 0) { printf("Tableau %s non déclaré\n", n->nom); affiche_dico(); exit(1); } else if (dico.tab[i].type == T_ENTIER) { printf("%s n'est pas un Tableau\n", n->nom); affiche_dico(); exit(1); } parcours_exp( n->u.indicee_.indice ); depile ("$t4"); printMips("add $t4,$t4,$t4"); printMips("add $t4,$t4,$t4"); sprintf(var,"$%s($t4)",n->nom); }
void parcours_table(n_prog *n) { printMips(".data"); parcours_l_dec(n->variables); printMips(".text"); printMips("__start:"); printMips("jal main"); printMips("li $v0, 10"); printMips("syscall"); parcours_l_dec(n->fonctions); int id = rechercheExecutable("main"); if(id < 0 || dico.tab[id].complement != 0) { printf("Fonction main non trouvé\n"); affiche_dico(); exit(1); } }
void mips_gen_inst_affect(const n_var* v){ mips_gen_pop_reg("$t1"); char* nom = v->nom; int i = rechercheExecutable(nom); if(i == -1) erreur_1s("MIPS: Variable %s introuvable", nom); switch(dico.tab[i].classe){ case C_VARIABLE_GLOBALE: printf("\tsw $t1, %s # stocke variable\n", nom); break; case C_VARIABLE_LOCALE: printf("\tsw\t$t1, -%d($fp) # stocke variable\n", dico.tab[i].adresse + 8); //8 = $fp + $ra break; default: erreur_1s("MIPS: %s Portée invalide", nom); } }
void mips_gen_exp_var(const n_exp* exp){ char* nom = exp->u.var->nom; int i = rechercheExecutable(nom); if(i == -1) erreur_1s("MIPS: Variable %s introuvable", nom); switch(dico.tab[i].classe){ case C_VARIABLE_GLOBALE: printf("\tlw $t1, %s # lit variable dans $t1\n", exp->u.var->nom); break; case C_ARGUMENT: printf("\tlw $t1, %d($fp) # lit variable dans $t1\n", (adresseArgumentCourant - dico.tab[i].adresse)); break; case C_VARIABLE_LOCALE: printf("\tlw $t1, -%d($fp) # lit variable dans $t1\n", (dico.tab[i].adresse + 8)); break; default: erreur_1s("MIPS: exp_var : %s Portée invalide", nom); } mips_gen_stack_reg("$t1"); }
void mips_gen_exp_var_tab(const n_var* var){ mips_gen_pop_reg("$t0"); //$t0 * 4 mips_gen_instr_3("add", "$t0", "$t0", "$t0"); mips_gen_instr_3("add", "$t0", "$t0", "$t0"); char* nom = var->nom; int i = rechercheExecutable(nom); if(i == -1) erreur_1s("MIPS: Variable %s introuvable", nom); switch(dico.tab[i].classe){ case C_VARIABLE_GLOBALE: printf("\tlw $t1, %s($t0) # lit variable dans $t1\n", var->nom); break; default: erreur_1s("MIPS: exp_var_tab : %s Portée invalide", nom); } mips_gen_stack_reg("$t1"); }