Code generation
Download
1 / 11

Code Generation - PowerPoint PPT Presentation


  • 85 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Code Generation' - bena


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Code generation

Code Generation

Discussion Section 11/20/2012


Why il
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


Stack based implementation
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


Commonly used il
Commonly used IL

  • P-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


Identifiers
identifiers

  • class IdNode : public AST {

  • ...

  • Operand* cgen (VM* machine) {

    Operand result = machine->allocateRegister ();

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

    ->getMyLocation(machine));

    return result;

  • }

  • }


Calls
Calls

  • class CallNode : public AST {

    ...

    Operand* cgen (VM* machine) {

    AST* args = getArgList ();

    for (inti = 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;

    }

  • }


IF

  • class 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;

    }

  • }


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;

    }

  • }


Example 1
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


Example 2
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 gotoL1

  • r2 := 0

  • goto L2

  • L1:

  • r3 := x

  • if r3 != 2 then gotoL3

  • r4 := 1

  • goto L4

  • L3:

  • r5 := x

  • r6 := r5 – 1

  • paramr6

  • call fib, 1

  • r7 := rret

  • r8 := x

  • r9 := r8 – 2

  • paramr9

  • call fib, 1

  • r10 := r7 + rret

  • r4 := r10

  • L4:

  • r2 := r4

  • L2:

  • rret:= r2

  • function epilogue


More examples
More examples

  • Some more examples


ad