2

Puis-je traduire un arbre de syntaxe abstraite directement dans le formulaire SSA, ou dois-je créer un graphique de flux de contrôle, puis créer le formulaire Static Single Assignment à partir de CFG?Puis-je traduire un AST en SSA, ou dois-je le traduire en CFG puis en SSA?

Et dans le contexte d'un graphique de flux de contrôle: comment est-ce que je représente ceci pour un programme de type c? Je pense que je pourrais stocker un graphique du CFG pour tous les blocs de base dans chaque fonction, mais quand j'appelle une fonction par exemple, cela peut compliquer les choses. Une autre façon dont je peux penser est un CFG pour l'ensemble du programme, c'est-à-dire tous les fichiers source, mais alors comment puis-je stocker des informations sur les fonctions? Pourrais-je stocker un pointeur sur la fonction dans le bloc de base (c'est-à-dire le nœud parent)?

Si je génère un SSA à partir d'un CFG, dois-je m'inquiéter d'avoir un CFG qui représente le flux de contrôle des instructions? Je pense que je n'aurais besoin que de représenter le flux de contrôle de bloc de base.

Répondre

8

Oui, vous pouvez créer un formulaire SSA sans créer de CFG en premier, mais vous ne pouvez pas utiliser l'algorithme de construction SSA classique de Cytron et al pour le faire. Il existe un autre algorithme décrit dans l'article Simple and Efficient Construction of Static Single Assignment Form (avertissement: je suis l'un des auteurs). Cet algorithme est utilisé dans libFirm, dans OpenJDK et dans le compilateur Go.

La plupart des compilateurs (afaik) utilisent le modèle un-CFG-par-fonction. Chaque bloc de base est un noeud. Les instructions (opérations/instructions/etc) appartiennent à un bloc de base. Certains stockent des instructions sous la forme d'une liste dans chaque bloc de base. Certains stockent des instructions sous la forme d'un graphique partiellement ordonné similaire au CFG.