O Maple-IR é uma estrutura de análise estática baseada em IR industrial para Java Bytecode. Atualmente, ele implementa análises baseadas em forma de SSA, bem como construção e destruição de bytecode para IR. A cadeia de ferramentas pega a entrada do bytecode, eleva -a para a SSA IR, transforma o IR e recompila de volta ao bytecode. Isso é feito executando simbolicamente cada método enquanto simula a pilha, semelhante a como os raios hexadecimais binários Ninja ou Ida Pro operam. A análise intraprocedural de fluxo de dados é totalmente implementada e também são implementadas otimizações como dobragem constante e propagação de cópias. Um exportador CFG GraphViz também está disponível; Veja abaixo para exemplos.
Maple-IR não está em desenvolvimento ativo. É em hiato indefinidamente, embora as contribuições do código sejam bem -vindas. Faça perguntas, comentários e problemas no rastreador de questões.
O Maple-IR em sua forma atual ainda não está pronto para produção, embora possa ser feito com pouco esforço.
Se você usar o Maple-Ir, informe-nos! Gostaríamos muito de ouvir sobre quaisquer projetos legais para os quais você o use.

"É como LLVM, mas pior."
Aqui está a visualização do GraphViz para o IR otimizado e destruído (pós-SSA) para o seguinte 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 );
}
Aqui está uma função mais desagradável, na forma SSA otimizada, retirada do decompilador de Fernflower:
A destruição da SSA é implementada usando os métodos de Sreedhar et al. e Boissinot et al. O destruidor de Boissinot é atualmente o destruidor padrão. A construção da SSA é implementada com base em um algoritmo de varredura linear rápido de 1 passagem com base no método de Cytron et al. Usando fronteiras de dominância. Para mais detalhes, consulte SsagenPass.java. A destruição do bytecode é complicada em Java devido a intervalos de exceção. Além disso, linearizando o gráfico de fluxo de controle (CFG) de maneira simples é difícil devido ao ninho de loop. A linearização é tratada aplicando recursivamente o algoritmo de componentes superconnectados de Tarjan. As tabelas de exceção para cada método são descartadas e regeneradas com base na estrutura do gráfico de fluxo de controle. Para mais detalhes, consulte ControlFlowGraphDumper.
Para mais detalhes, consulte o Whitepaper.
javac em mente. Isso significa que, por exemplo, finally os blocos são processados corretamente, embora não perfeitamente. Para construir:
mvn clean compile test package
A construção produzirá dois frascos, um com dependências incluídas ( mapleir-full.jar ) e um sem ( mapleir-full-with-deps.jar ). Você também pode usar cada módulo individualmente.
Então, opcionalmente:
mvn install
Você também pode obter o Maple-Ir no Jitpack.
Contato: Por favor, arquivar um problema, farei o possível para responder o mais rápido possível.
O compartilhamento levará a relatado e derrotar (abençoar)
O Maple-Ir é licenciado sob o GPLV3. Para mais informações, consulte aqui.
Copyright (C) 2022 BIBL e RCX