Maple-IR es un marco de análisis estático industrial basado en IR para el bytecodo Java. Actualmente, implementa el análisis basado en forma de SSA, así como la construcción y destrucción del bytecode a IR. La cadena de herramientas toma la entrada del código de byto, la eleva a SSA IR, transforma el IR y luego se vuelve a colocar hasta Bytecode. Esto se hace ejecutando simbólicamente cada método al simular la pila, similar a cómo funcionan los rayos hexagonales de Ninja Binary o Ida Pro. El análisis de flujo de datos intraprocedural se implementa completamente, y las optimizaciones como el plegamiento constante y la propogación de copias también se implementan. Un exportador CFG GraphViz también está disponible; Vea a continuación los ejemplos.
Maple-IR no está en desarrollo activo. Está en pausa indefinidamente, aunque las contribuciones del código son bienvenidas. Por favor, presente preguntas, comentarios y problemas en el rastreador de problemas.
Maple-IR en su forma actual aún no está listo para la producción, aunque se puede hacer con poco esfuerzo.
Si usa Maple-IR, ¡háganoslo saber! Nos encantaría saber sobre cualquier proyecto genial para los que lo use.

"Es como LLVM, pero peor".
Aquí está la visualización GraphViz para el IR optimizado, destruido (post-SSA) para el siguiente código:
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 );
}
Aquí hay una función más desagradable, en forma SSA optimizada, tomada del descompilador de Fernflower:
La destrucción de SSA se implementa utilizando los métodos de Sreedhar et al. y Boissinot et al .. El destructor Boissinot es actualmente el destructor predeterminado. La construcción de SSA se implementa en base a un algoritmo de escaneo lineal de 1 paso rápido basado libremente en el método de Cytron et al. Usando fronteras de dominio. Para más detalles, consulte ssagenpass.java. La destrucción de bytecode es complicado en Java debido a los rangos de excepción. Además, la linealización del gráfico de flujo de control (CFG) de manera simple es difícil debido a la anidación de bucle. La linealización se maneja aplicando recursivamente el algoritmo de componentes superconectados de Tarjan. Las tablas de excepción para cada método se descartan y se regeneran en función de la estructura del gráfico de flujo de control. Para obtener más detalles, consulte ControlflowGraphDumper.
Para más detalles, consulte el documento técnico.
javac en mente. Esto significa, por ejemplo, finally los bloques se procesan correctamente, aunque no cuidadosamente. Para construir:
mvn clean compile test package
La construcción producirá dos frascos, uno con dependencias incluidas ( mapleir-full.jar ) y otra sin ( mapleir-full-with-deps.jar ). También puede usar cada módulo individualmente.
Entonces, opcionalmente:
mvn install
También puede obtener Maple-IR en jitpack.
Contacto: por favor presente un problema, haré todo lo posible para responder lo más rápido posible.
Compartir conducirá a informar y golpear (bendecir)
Maple-IR tiene licencia bajo el GPLV3. Para obtener más información, consulte aquí.
Copyright (c) 2022 BIBL y RCX