Eu me deparei essa semana com o problema de depurar um programa no qual nenhum debugger poderia me ajudar. Pode parecer besteira, mas existem alguns casos onde isso é ocorre. No meu caso, estava alterando um JIT compiler e não adiantava usar gdb, pois o endereço da função é gerado em runtime e navegar pelo assembly dos trampolines não é muito produtivo. Não me sentido vendido, apelei para a versão masoquista do printf.
Pior que não poder usar um debugger, é o fato de não ser possivel simplesmente usar um printf, já que você está gerando código. Você tem que inserir manualmente no stream de instruções uma chamada à função – nada como gastar 20 minutos só para conseguir fazer isso!
O truque foi simplesmente usar o compilador C como exemplo, gerei o assembly de um “hello world” e então escreve o código equivalente no JIT compiler. O detalhe é que o compilador é esperto e utiliza desvios relativos, que são muito mais rápidos que desvios indiretos via registrador, para remediar esse embrólio tive de providenciar o endereço do ‘printf’ e embutir no código compilado. O resultado ficou algo parecido com:
char * fmt_str = "---- in val %d ----\n";
int pf = (int)(void *)&printf;
push_reg(inst->source_reg);
push_imm((int)(void *)str);
mov_reg_imm(EAX, pf);
call_abs_ind(EAX);
add_reg_imm(ESP, 4);
Fiquei realmente com saudade de programar Java do Eclipse, a produtividade é enorme, mas apesar dos tropeços valeu pela aventura brincar com esse JIT compiler. Esse é o tipo de projeto que recomendo a quem deseja aprender os detalhes sórdidos de cada plataforma e se tornar um melhor programador. Os resultados podem sair lentamente, mas recomendo que vale a recompensa. O código é baseado naquilo que fiz no mono jit, apenas ajustado para clareza -eles tem convenções dificeis de decifrar
3 responses so far ↓
1 Fábio // Mar 23, 2007 at 9:58 am
Post legal, tem alguma sugestão p/ quem quer aprender um pouco mais sobre geração de código/assembly, algum site, livro, etc?
2 kumpera // Mar 23, 2007 at 10:20 am
Oi Fábio.
.
O assunto é muito amplo, então existe muita coisa para se aprender. Apesar disso eu gostei muito do tutorial do Jack Chenshaw de compiladores, ele fala de como gerar código para processadores motorola, para resolver isso só ler os manuais da intel dos processadores dela.
.
O Dragon Book também é muito útil, apesar de estar muitíssimo defasado (não chega nem a comentar sobre SSA).
.
Por fim, de uma olhada nos fontes de sistemas que envolvem geração de código e possuem um código razoavelmente legivel, tais como o JikesRVM e, nem tanto, o LLVM.
3 Heber // May 3, 2007 at 12:39 pm
Esse post me fez lembrar do ultimo ano de computação, noites e noites viradas pra terminar meu compilador, ufa! , mas pro pessoal que ta afim de aprofundar no assunto de geração de codigos, é bom ler sobre lex e yacc, e também claro gramaticas formais.
Leave a Comment