2010-12-10 57 views
1

Valgrind utilise une représentation de code intermédiaire pour nous permettre d'instrumenter le code binaire afin que nous n'ayons pas à traiter de constructions au niveau du langage de programmation. Dans le processus de conversion du code binaire en code de représentation intermédiaire (IR) de Valgrind, il montre l'utilisation de registres pour les opérations comme les additions, etc. Il y en a 1024 qui sont utilisés. Ce que je ne reçois pas est un autre type de registres appelés registres temporaires représentés comme tX où X est un nombre. Ainsi, je peux voir ceci:Quelle est la différence entre les registres et les registres temporaires?

t28 = Add32(t26,0xFFFFFFFC:I32) 
t4 = LDle:I32(t28) 

t ce qui signifie un registre temporaire. Autant que je peux voir, ils semblent se comporter très semblable aux registres réguliers mais ne réussissent pas à comprendre comment ils sont différents. Quelqu'un peut-il me dire ce qu'est un registre temporaire et en quoi est-il différent d'un registre régulier?

+1

Je manque probablement quelque chose d'évident ici, mais je ne vois ni R ni T dans cet exemple ...? –

+0

@Laurence: Correction de ma question. Merci de l'avoir signalé. – Legend

Répondre

2

Dans la construction de compilateur, la classe I a été enseignée que les registres en code intermédiaire sont des registres virtuels. Ils n'ont pas forcément quoi que ce soit à voir avec l'exécutable de la plateforme cible. Ils pourraient être de vrais registres de CPU, ou ils peuvent être temporaires dans la mémoire. Tout dépend du générateur de code et de l'optimiseur. C'est le générateur de code qui décide où les temporaires doivent être alloués.

Une grande raison pour générer des IR est de maximiser la portabilité du compilateur. Vous pouvez utiliser un frontal du compilateur pour toutes les plates-formes, puis passer l'IR aux générateurs de code spécifiques à la plate-forme. GCC fonctionne de cette façon, et je suis sûr que la plupart, sinon tous les compilateurs décents travaillent de cette façon.

Un autre avantage est que vous pouvez effectuer certaines optimisations sur le code IR, avant qu'il ne soit envoyé au générateur de code. Certaines optimisations ne sont pas spécifiques à une plateforme: par exemple, les codes qui ne sont pas affectés par une boucle peuvent être retirés de la boucle. L'optimiseur de plate-forme optimise généralement à un niveau inférieur tel que l'allocation de registre, le branchement, etc., ce qui dépend vraiment des propriétés du CPU.

+0

Génial. Merci pour l'explication détaillée. – Legend