code generation

11
CODE GENERATION DISCUSSION SECTION 11/20/2012

Upload: damien

Post on 04-Jan-2016

35 views

Category:

Documents


5 download

DESCRIPTION

Code Generation. Discussion Section 11/20/2012. Why iL ?. Clear demarcation between machine dependent and independent parts of the compiler Same language can be processed on different machines using by only changing the IL and re-using the IL->ML conversion - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Code Generation

CODE GENERATIONDISCUSSION SECTION 11/20/2012

Page 2: Code Generation

WHY IL?

Clear demarcation between machine dependent and independent parts of the compiler

Same language can be processed on different machines using by only changing the IL and re-using the IL->ML conversion

Code optimization is possible at this stage

Consider it as the language of an abstract machine

Page 3: Code Generation

STACK BASED IMPLEMENTATION

Instead of registers, we use a stack of values to store the intermediate results

A program to compute 7 + 5 using accumulator:

acc := 7

push acc

acc := 5

acc := acc + top_of_stack

pop stack

Page 4: Code Generation

COMMONLY USED ILP-code for Pascal

Bytecode for Java

Three address code

- Language independent

target := operand1 operand2⊕

4-tuple : (target, operand1, operator, operand2)

class AST {

...

/** Generate code for me, leaving my value on the stack. */

virtual void cgen (VM* machine);

}

class BinopNode : public AST {

Operand* cgen (VM* machine) {

Operand* left = getLeft ()->cgen (machine);

Operand* right = getRight ()->cgen (machine);

Operand* result = machine->allocateRegister ();

machine->emitInst (result, translateToInst (getOp ()), left, right);

return result;

}

emitInst produces three-address instructions

Page 5: Code Generation

IDENTIFIERS

class IdNode : public AST {

...

Operand* cgen (VM* machine) {

Operand result = machine->allocateRegister ();

machine->emitInst (MOVE, result, getDecl()

->getMyLocation (machine));

return result;

}

}

Page 6: Code Generation

CALLS

class CallNode : public AST {

...

Operand* cgen (VM* machine) {

AST* args = getArgList ();

for (int i = args->arity ()-1; i >= 0; i -= 1)machine->emitInst (PARAM, args.get (i)->cgen (machine));

Operand* callable = getCallable ()->cgen (machine);

machine->emitInst (CALL, callable, args->arity ());

return Operand::ReturnOperand;

}

}

Page 7: Code Generation

IFclass IfExprNode : public AST {

...

Operand* cgen (VM* machine) {Operand* left = getLeft ()->cgen (machine);

Operand* right = getRight ()->cgen (machine);

Label* elseLabel = machine->newLabel ();

Label* doneLabel = machine->newLabel ();

machine->emitInst (IFNE, left, right, elseLabel);

Operand* result = machine->allocateRegister ();

machine->emitInst (MOVE, result, getThenPart ()->cgen (machine));

machine->emitInst (GOTO, doneLabel);

machine->placeLabel (elseLabel);

machine->emitInst (MOVE, result, getElsePart ()->cgen (machine));

machine->placeLabel (doneLabel);

return result;

}

}

Page 8: Code Generation

def

class DefNode : public AST {

...

Operand* cgen (VM* machine) {machine->placeLabel (getName ());

machine->emitFunctionPrologue ();

Operand* result = getBody ()->cgen (machine);

machine->emitInst (MOVE, Operand::ReturnOperand, result);

machine->emitFunctionEpilogue ();

return Operand::NoneOperand;

}

}

Page 9: Code Generation

EXAMPLE 1

int main(void)

{

int i;

int b[10];

for (i = 0; i < 10; ++i) {

b[i] = i*i;

}

}

Code Generation:

i := 0 ; assignment

L1: if i >= 10 goto L2 ; conditional jump

t0 := i*i

t1 := &b ; address-of operation

t2 := t1 + i ; t2 holds the address of b[i]

*t2 := t0 ; store through pointer

i := i + 1

goto L1

L2: end

Page 10: Code Generation

EXAMPLE 2

def fib(x) =

if x = 1 then 0 else

if x = 2 then 1 else

fib(x - 1) + fib(x – 2)

fib: function prologue

r1 := x

if r1 != 1 then goto L1

r2 := 0

goto L2

L1:

r3 := x

if r3 != 2 then goto L3

r4 := 1

goto L4

L3:

r5 := x

r6 := r5 – 1

param r6

call fib, 1

r7 := rret

r8 := x

r9 := r8 – 2

param r9

call fib, 1

r10 := r7 + rret

r4 := r10

L4:

r2 := r4

L2:

rret := r2

function epilogue

Page 11: Code Generation

MORE EXAMPLES

Some more examples