Maple-IR est un cadre d'analyse statique basé sur IR industriel pour les bytecode Java. Actuellement, il met en œuvre une analyse basée sur la forme SSA ainsi que la construction et la destruction de Bytecode à IR. La chaîne d'outils prend l'entrée bytecode, le soulève vers SSA IR, transforme l'IR, puis recompile vers le bas en bytecode. Cela se fait en exécutant symboliquement chaque méthode lors de la simulation de la pile, similaire à la fonctionnalité des rayons hexadécimaux ninja binaire ou IDA Pro. L'analyse intraprocédurale des données de données est entièrement mise en œuvre, et des optimisations telles que le pliage constant et la propagation de copie sont également implémentées. Un exportateur CFG Graphviz est également disponible; Voir ci-dessous pour des exemples.
Maple-IR n'est pas en développement actif. Il est indéfiniment sur la pause, bien que les contributions du code soient les bienvenues. Veuillez déposer des questions, des commentaires et des problèmes sur le tracker du problème.
Maple-IR dans sa forme actuelle n'est pas encore prêt pour la production, bien qu'il puisse être fait avec peu d'effort.
Si vous utilisez Maple-IR, faites-le nous savoir! Nous serions ravis d'entendre parler de tous les projets sympas pour lesquels vous l'utilisez.

"C'est comme LLVM, mais pire."
Voici la visualisation GraphViz pour l'IR optimisé, détruit (post-SSA) pour le code suivant:
void test130 () {
int x = 5 ;
int y = 10 ;
do {
try {
trap ( x , y );
y = x ;
trap ( x , y );
y = 123 ;
} catch ( RuntimeException e ) {
do {
trap ( x , y );
int z = y ;
trap ( x , y );
y = x ;
trap ( x , y );
x = z ;
trap ( x , y );
} while (! p ());
}
} while ( p ());
System . out . println ( x );
System . out . println ( y );
}
Voici une fonction plus méchante, sous forme SSA optimisée, tirée du décompilateur Fernflower:
La destruction de la SSA est mise en œuvre en utilisant les méthodes de Sreedhar et al. et Boisinot et al .. Le destructeur BoisSinot est actuellement le destructeur par défaut. La construction de SSA est mise en œuvre sur la base d'un algorithme de balayage linéaire rapide à 1 pass librement basé sur la méthode de Cytron et al. Utilisation des frontières de dominance. Pour plus de détails, voir ssagenpass.java. La destruction de Bytecode est délicate en Java en raison des gammes d'exception. De plus, la linéarisation du graphique de flux de contrôle (CFG) de manière simple est difficile en raison de la nidification de boucle. La linéarisation est gérée en appliquant récursivement l'algorithme des composants superconnectés de Tarjan. Les tables d'exception pour chaque méthode sont jetées et régénérées en fonction de la structure du graphique de flux de contrôle. Pour plus de détails, voir ControlFlowGraphDumper.
Pour plus de détails, consultez le livre blanc.
javac . Cela signifie, par exemple, les blocs finally traités correctement, mais pas soigneusement. Pour construire:
mvn clean compile test package
La construction produira deux pots, un avec des dépendances incluses ( mapleir-full.jar ) et une sans ( mapleir-full-with-deps.jar ). Vous pouvez également utiliser chaque module individuellement.
Ensuite, éventuellement:
mvn install
Vous pouvez également obtenir Maple-IR sur Jitpack.
Contact: veuillez déposer un problème, je ferai de mon mieux pour répondre le plus rapidement possible.
Le partage mènera à des rapports et à la battement (Bless)
Maple-IR est autorisé sous le GPLV3. Pour plus d'informations, veuillez consulter ici.
Copyright (C) 2022 BIBL et RCX