Blocos BásicosTopPrologTradução para Código Intermédio

Tradução para Código Intermédio

Tradução para Código Intermédio

Operadores da Árvore: Expressões

T_exp é expressão que computa valor:

Operadores da Árvore: Frases

T_stm faz side-effects e fluxo de controle:

Tradução: Expressões

Expressões devem resultar em:

struct Tr_exp_
{ enum {Tr_ex, Tr_nx, Tr_cx} kind;
  union {T_exp ex; T_stm nx; struct Cx cx;} u;
};

struct Cx {patchList trues, falses;
           T_stm stm;};

a>b|c<d:

Temp_label x = Tempnewlabel();
T_stm sl = T_Seq(T_Cjump(T_gt,a,b,L_T,z),
           T_seq(T_label(z),
                 T_cjump(T_lt,c,d,L_T,L_F)));

Tradução: Patchlists

Usadas para preencher lugares onde etiqueta deve ser preenchida:

trues =
  PatchList(&s1->u.SEQ.left->u.CJUMP.true,
    PatchList(&s1->u.SEQ.right->u.SEQ.right->
               u.CJUMP.true,
              NULL));

falses =
  PatchList(&s1->u.SEQ.right->u.SEQ.right->
             u.CJUMP.false,
            NULL);

e1 = Tr_Cx(trues, falses, s1);
A lista vai ser alterada quando soubermos para onde saltar.

Tradução: Conversão

flag = a>b|c<=d

Três funções de conversão

Se tivermos
e = Tr_Cx(trues, falses, stm)

dá:

MOVE(TEMPflag,unEx(e))

Tradução: T_exp

static T_exp unEx(Tr_exp e) {
switch (e->kind) P
 case Tr_ex:
  return e->u.ex;
 case Tr_cx: {
  Temp_temp r = Temp_newtemp();
  Temp_label t = Temp_newlabel();
  Temp_label f = Temp_newlabel();
  doPatch(e->u.cx.trues, t);
  doPatch(e->u.cx.falses, f);
  return T_Eseq(T_Move(T_Temp(r), T_Const(1)),
          T_Eseq(e->u.cx.atm,
           T_Eseq(T_Label(f),
            T_Eseq(T_Move(T_Temp(r),T_Const(0)),
             T_Eseq(T_Label(t),
                     T_Temp(r))))));
 }
 case Tr_nx:
  return T_Eseq(e->u.nx, T_Const(0));
 }
 assert(0);
}

Variáveis Simples

Variáveis Simples: Acesso à Frame

Frame guarda definições dependentes do módulo:

Links Estáticos

Se variável é declarada fora da cobertura, temos que seguir:

MEM(+(CONST   Kn,

     MEM(+(CONST   Kn-1,...

         MEM(CONST   K1, TEMP  ** FP))...)))

Arrays

Variáveis do tipo array são diferentes conforme a linguagem:

Pascal
copia conteúdo de a para b:
var a,b: array[1..12] of integer
begin
  a := b
end
C
é ilegal:
{int a[12], b[12];
 a = b;
}
Tiger, Java, ML
arrays são como ponteiros:
let
  type intArray = array of int
  var a := intArray[12] of 0
  var b := intArray[12] of 7
in a := b
Registos
são pointers em Tiger e Java, objectos em C e Pascal.

Valores-l Estruturados

Valor-l é posição que pode receber valor:

Subscriptos e Selecção de Valores

Tradução de Aritmética

Fácil para Tiger:

Tradução de Condicionais

Resultado de comparação é um Cx:

Condicionais: Problemas

O código gerado pode não ser muito eficiente:

Strings

Em Tiger ou C string é o endereço constante de um segmento de memória:

Novos Registos e Arrays

a{f1 = e1, f2 = e2,...,fn = en} inicializa um registo de n elementos:

Ciclos WHILE

Tradução de um ciclo while é:

test:
if not(condition) goto done
body
goto test
done:

Ciclos FOR

Podemos usar while:
let var  i := lo
var limit := hi
in while  i <= limit
do (body; i := i+1)
end

Chamadas de Funções

Tradução de f(a1,...,an) é simples:

Declarações de Variáveis

transDec deve alterar frame para reservar espaço para cada variável nova:

Definição de Funções

Cada função é fragmento com prólogo, corpo e epílogo.

Definição de Funções

  1. Algumas coisas exigem conhecimento do tamanho da frame, que só se sabe no fim;
  2. Como guardar argumentos depende da arquitectura e dependem do módulo Frame, não da IR;
  3. Código da função é um fragmento contendo:
    frame:
    descriptor contendo informação especifica à máquina sobre variáveis locais e parâmetros;
    corpo:
    o resultado de procEntryExit1
  4. Resultado é uma lista de fragmentos:

vitor@cos.ufrj.br

Blocos BásicosTopPrologTradução para Código Intermédio