FAQ pour le TP 2 de Compilation

Historique des mises à jour :
03/01/12 - 21h00 : ajout de notification à propos d’une situation erronée.
29/12/11 - 18h00 : ajout de solution 2 au problème 4.

03/01/12 - Attention : évitez d’utiliser dans vos tests avec VSM des instructions de la forme t[i] := i (affectation d’une variable à un élément d’un tableau, en utilisant la même variable de l’indice). L’énoncé ne précise pas clairement comment gérer cette situation, donc elle ne sera pas testée sous VSM. En MIPS, aucun traitement particulier n’est nécessaire ; le résultat obtenu devrait être celui attendu.

Cette page récolte des situations d’erreur peu compréhensibles pour vous aider à trouver la solution.
Si vous avez des erreurs non-répertoriées qui vous semblent pertinentes:

  1. Vérifiez que vous avez les dernières versions de tous les fichiers disponibles sur /share/m1info/COMP/TP2/src. Vérifiez notamment VSLParser.g et VslComp.java (la version initiale n’accepte pas l’option de ligne de commande “-mips” ou “-vsm”). Vous pouvez recopier le répertoire TP2 sur le vôtre (en effectuant une copie des fichiers que vous avez modifiés, notamment TypeSystem.java et Code3aGenerator.java), et ensuite remettre les fichiers que vous avez modifiés.
  2. Si vous avez les bonnes versions et l’erreur persiste, envoyez un message à moi (Andre point Oliveira tiret Maroneze AT univ tiret rennes1 point fr) contenant :

J’essaierai de vous aider et, si la situation me semble pertinente, je l’ajouterai à la FAQ.

Plus vous me donnez d’informations, plus il y a des chances que je pourrai vous aider. Même si ce n’est pas le cas, isoler l’erreur et trouver les situations où elle arrive peut faire partie du compte-rendu et donc contribuer à votre note.


 

1  Erreurs à la compilation du code

1.1  Compilation vers MIPS

Problème 1 :
Mon programme affiche les messages d’erreur suivants :
yyerror: syntax error - line:1 yyerror: syntax error - line:1
Solution :
Le code produit contient des lignes invalides. Le plus souvent, elles sont causées par des messages d’erreur redirigées vers le fichier source, ou des messages de débogage qui ne sont pas reconnus comme des commentaires MIPS. Vérifiez que le fichier .s produit ne contient aucune de ces lignes. Les commentaires doivent commencer par # en MIPS et \ en VSM.

2  Erreurs à l’exécution du code

2.1  Exécution avec MIPS

Problème 2 :
Mon programme marche correctement avec la VSM mais il a des comportements bizarres en MIPS. D’ailleurs, le code produit (affiché avec code.print()) me semble entièrement correct.
Solution :
Le code affiché avec code.print() ne contient pas 100% de l’information pertinente pour la génération de code; il est possible que vous ayez oublié d’effectuer VarAttribute.setParam(true) pour les variables qui sont des paramètres de fonction. Dans ce cas, le générateur de code MIPS les considérera comme des variables locales et non des paramètres. Le fait que les deux soient générées avec la même instruction TAC_ARG rend plus difficile la détection de ce bug.

 

2.2  Exécution avec VSM

Problème 3 :
L’exécution du code produit génère une erreur similaire à celle-ci :
vam: bus error 000000d9: BAL R2,R3 R0 = 00000000 R1 = 00000000 R2 = 09030000 R3 = 0000021c R4 = 00000008 R5 = 00000321 R6 = 00000003 R7 = 01000000 R8 = 0000031d R9 = 0000000a R10 = 00000000 R11 = 00000000 R12 = 00000000 R13 = 00000000 R14 = 00000000 R15 = 00000000 PC = 000000db Z = 1 CLK = 2726 000000d0: 00000408 11000000 000e2307 31000000 000000e0: 04090500 00030507 51000000 1c090200 000000f0: 0002ca07 11000000 14091100 0000140e 00000000: 09010000 03220711 00000000 09030000 00000010: 021c0d00 00000507 31000000 04090500 00000020: 00000007 51000000 08081500 00000809
Solution :
Ce message, ainsi que plusieurs autres messages liés à l’exécution de la machine virtuelle VSM (comme l’activation du débogueur) sont des symptômes de corruption de la mémoire (p. ex., écrasement de la pile). Cela peut arriver si on oublie d’ajouter des instructions TAC_VAR (notamment pour les variables temporaires).

 
Problème 4 :
Mon programme marche avec MIPS, mais avec VSM il produit des erreurs aléatoires.
Solution 1 :
Ceci est le plus souvent un symptôme de corruption de la mémoire: la compilation vers MIPS est beaucoup plus tolérante envers des accès à des variables non réservées dans la pile (oubli d’ajout de TAC_VARs). L’erreur ne se manifeste donc que dans le code VSM, pour lequel la machine virtuelle est moins tolérante à ces fautes (ce qui a l’avantage d’attraper les erreurs plus tôt). Vérifiez que le code compilé produit des instructions TAC_VAR pour chaque temporaire.
Solution 2 :
Ce comportement peut aussi se produire quand il y a du code intermédiaire généré entre des TAC_ARG et un TAC_CALL. Surtout en VSM, il est important qu’entre les instructions TAC_ARG et le TAC_CALL correspondant il n’y ait pas d’instructions intermédiaires. Pour la génération de code d’appel à une fonction, il faut donc cumuler le code des TAC_ARG et le générer à la fin, juste avant le TAC_CALL, pour éviter que des calculs intermédiaires puissent corrompre les registres.

This document was translated from LATEX by HEVEA.