Kevin Kofler
:Pollux
:Kevin KoflerJe voudrais bien entendre ces "avantages importants"... Le temps d'assemblage est négligeable. Et je ne parle pas d'include, je parle d'attendre le linking final pour produire du code binaire.
:* ton argument principal est que les optimisations du linker servent pour l'assembleur, qd il y a plusieurs .asm; à ceci, je réponds que la seule sémantique valable est celle d'A68k avec tous les fichiers mergés; parce que le format objet contient trop peu d'informations (différence entre bra.w et bra tout court, différence entre dc.w 0x1234 et move.l $direct,a0 ...) pour que les transformations effectuées soient sûres
Mon avis reste que la compilation séparée a des avantages importants qu'il ne faut pas abandonner au profit d'une optimisation qui peut aussi être effectuée autrement (dans le linker). Si on veut compiler tout en un, il y a le hack des include de code, mais c'est ce que c'est: un hack.
Les avantages: * Temps d'assemblage économisé (pas nécessairement négligeable).
Si, très clairement. Surtout qu'il n'y a aucun parsing à faire.
* Gestion des librairies statiques.
Il n'y a aucune différence : en l'occurrence, il faut aussi que les libs statiques se conforment au nouveau format de fichiers objets.
* Gestion du linking entre sources en des langages divers (C, GNU as, A68k, voire d'autres qui pourraient être introduits plus tard). La méthode du tout-en-un ne marche plus si on a du A68k et du GNU as.
Si. Ca ne demande pas plus de boulot que de se conformer au nouveau format de fichier objet, voire même plutôt moins (parce qu'il faudra encore rajouter des hacks pour la gestion des infos supplémentaires que tu compte rajouter).
Et puis, pour "attendre le linking final pour produire du code binaire", il faut à un moment convertir ça en include, et aussi renommer tous les labels non-exportés pour éviter les conflits. C'est beaucoup plus dur que ça n'a l'air, sachant que les assembleurs n'ont aucun support pour l'assemblage de plusieurs sources en même temps. Et puis je trouve que c'est au linker de faire le linking, pas à l'assembleur.
Je ne parle pas de passer par un fichier texte intermédiaire, je parle juste d'utiliser les routines de l'assembleur. Ce n'est vraiment pas compliqué.
Bah oui, mais pour gérer vraiment tous les cas tordus (du genre move.w #0x6000,d0; dc.w l1-l2), il faut faire extrêmement gaffe et la manière légère avec laquelle vous avez fait ça laisse supposer qu'il y a des chances qu'il reste des bugs...
Ce cas est déjà géré correctement. C'est à ça que sert le mode all-relocs: Il y aura un relogement vers l1 relatif à l2 (relogement de différence d'adresses). Le linker calcule l'offset final après les optimisations qui suppriment du code.
Non, c'est pire que ça. Je dis que sans une certaine forme de désassemblage ou à moins de gérer des tonnes de cas particuliers (donc c'est très casse-gueule),
move.w #0x6000,d0; dc.w l1-l2 a des chances de se retrouver transformé en move.w #(0x60<<8)|(l1-l2),d0 ...
(et je présume que le linker ne gère pas ça correctement non plus...

La seule façon où on est sûr de ne pas faire d'erreur, c'est d'assembler au dernier moment (et qui est certainement bien plus simple à implémenter que vos hacks qui consistent plus ou moins à désassembler le code objet).Notre méthode consiste surtout à repérer les relogements, et nous servir des relogements pour optimiser. Seulement s'il y a un relogement, nous regardons ce qu'il y a devant pour identifier l'instruction.
Et? Ca ne suffit pas... (cf plus haut)
Tout débogueur a besoin d'informations de débogage dans le fichier objet pour fonctionner. La nature exacte des informations dont nous aurons besoin n'est pas encore connue. Ça va se fixer au fur et à mesure de l'implémentation, quand il sera temps de réaliser le débogueur.De toute façon, plus on met dans les fichiers objet, mieux ça sera pour le futur débogueur qu'on prévoit toujours.De toute façon le débuggeur travaille toujours à un niveau supérieur (lignes de source), non?
J'ai déjà réfléchi au pb, mais il n'y a pas du tout besoin d'infos aussi fines que celles nécessaires à redimensionner un code & faire vos hacks.
Oui, ils sont orthogonales, mais il y a un seul type de peepholes dans le linker, et c'est l'optimisation tailcall. Et nous avons vraiment fait tout notre possible pour minimiser les erreurs: optimisation seulement en présence d'un relogement (par exemple, nous ne touchons pas à jsr (%a0);rts), optimisation seulement s'il n'y a pas de label entre les 2 instructions, ... Le risque d'erreurs est vraiment minime sous ces conditions.Non, c'est toujours assez risqué...
Je ne trouve pas, moi. Désolé, je crains que nous resterons en désaccord sur ce point.[/cite]
Oui, je le crains
