Question

Je souhaite tester des modifications d'architecture sur une architecture déjà existante (x86) à l'aide de simulateurs. Cependant, pour les tester correctement et exécuter des repères, je devrais peut-être apporter des modifications à l'ensemble d'instructions, existe-t-il un moyen d'ajouter ces modifications à GCC ou à tout autre compilateur?

Était-ce utile?

La solution

Solution simple:

Une approche commune consiste à ajouter l'assemblage en ligne et à coder directement les octets d'instruction.

Par exemple:

int main()
{
    asm __volatile__ (".byte 0x90\n");
    return 0;
}

compile (gcc -o3) dans:

00000000004005a0 <main>:
  4005a0:       90                      nop
  4005a1:       31 c0                   xor    %eax,%eax
  4005a3:       c3                      retq

Remplacez donc simplement 0x90 par vos octets Inst. Bien sûr, vous ne verrez pas les instructions réelles sur un objdump ordinaire, et le programme ne fonctionnerait probablement pas sur votre système (sauf si vous utilisez l'une des combinaisons NOP), mais le simulateur doit le reconnaître s'il y est correctement implémenté.

Notez que vous ne pouvez pas vous attendre à ce que le compilateur vous optimise bien pour vous lorsqu'il ne connaît pas cette instruction, et vous devez prendre soin et travailler avec des options de cloche / entrée / sortie / sortie en ligne si elle modifie l'état (registres, mémoire), pour assurer l'exactitude. Utilisez des optimisations uniquement si vous le devez.


Solution compliquée

L'approche alternative consiste à implémenter cela dans votre compilateur - cela peut être fait dans GCC, mais comme indiqué dans les commentaires, LLVM est probablement l'un des meilleurs à jouer, car il est conçu comme une plate-forme de développement de compilateur, mais il est toujours très compliqué Comme LLVM est le mieux adapté aux étapes d'optimisation IR, et est un peu moins convivial lorsque vous essayez de modifier les backends spécifiques à la cible.
Pourtant, c'est faisable et vous devez le faire si vous prévoyez également que votre compilateur décide quand émettre cette instruction. Je suggérerais de commencer la première option pour voir si votre simulateur fonctionne même avec cet ajout, et alors seulement passer du temps du côté du compilateur.

Si et quand vous décidez de l'implémenter dans LLVM, votre meilleur pari est de le définir comme une fonction intrinsèque, il y a relativement plus de documentation à ce sujet ici - http://llvm.org/docs/extendingllvm.html

Autres conseils

Vous pouvez ajouter de nouvelles instructions ou modifier existant en modifiant le groupe de fichiers dans GCC appelé "Machine Description". Modèles d'instructions dans <target>.md fichier, un code dans <target>.c Fichier, prédique, contraintes, etc. Tous ces éléments $GCCHOME/gcc/config/<target>/ dossier. Tout cela en utilisant le code ASM de génération de la génération de RTL. Vous pouvez également modifier les cas d'émission d'instructions en modifiant d'autres fichiers source GCC généraux, modifier la génération d'arborescence SSA, la génération RTL, mais tout cela un peu compliqué. Une explication simple ce qui s'est passé:

https://www.cse.iitb.ac.in/grc/slides/cgotut-gcc/topic5-md-intro.pdf

C'est faisable et je l'ai fait, mais c'est fastidieux. Il s'agit essentiellement du processus de portage du compilateur sur une nouvelle plate-forme, en utilisant une plate-forme existante comme modèle. Quelque part dans GCC, il y a un fichier qui définit l'ensemble d'instructions, et il passe par divers processus pendant la compilation qui génèrent du code et des données supplémentaires. Cela fait 20 ans et plus que je l'ai fait, j'ai donc oublié tous les détails, désolé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top