Code generation iii
This presentation is the property of its rightful owner.
Sponsored Links
1 / 25

Code Generation III PowerPoint PPT Presentation


  • 44 Views
  • Uploaded on
  • Presentation posted in: General

Code Generation III. PAs. PA4 5.1 – 7.2 PA5 (bonus) 24.1 – 24.2. PA4. Translate AST to LIR (file.ic -> file.lir) Instruction list for every method Dispatch table for each class Literal strings (all literal strings in file.ic) Optimizations (optional) Use microLIR simulator.

Download Presentation

Code Generation III

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 iii

Code Generation III


Code generation iii

PAs

  • PA4

    • 5.1 – 7.2

  • PA5 (bonus)

    • 24.1 – 24.2


Code generation iii

PA4

  • Translate AST to LIR (file.ic -> file.lir)

    • Instruction list for every method

    • Dispatch table for each class

    • Literal strings (all literal strings in file.ic)

    • Optimizations (optional)

  • Use microLIR simulator


Microlir simulator

microLIR simulator

  • Java application

    • Accepts and executes file.lir

  • Use it to test your translation

    • Checks correct syntax

    • Performs lightweight semantic checks

    • Runtime semantic checks

    • Debug modes (-verbose:1|2)

    • Prints program statistics (#registers, #labels, etc.)

  • Comes with sample inputs

  • Read Manual


Ic compiler

x86 executable

exe

ICProgram

ic

IC compiler

Compiler

LexicalAnalysis

Syntax Analysis

Parsing

AST

SymbolTableetc.

Inter.Rep.(IR)

CodeGeneration


Translating static calls

Translating static calls

StaticCall _A_foo(a=R1,b=5,c=x),R3

LIR code:

# push caller-saved registerspush %eaxpush %ecxpush %edx

# push parametersmov -4(%ebp),%eax # push xpush %eaxpush $5 # push 5mov -8(%ebp),%eax # push R1push %eax

call _A_foo

mov %eax,-16(%ebp) # store returned value in R3

# pop parameters (3 params*4 bytes = 12)add $12,%esp

# pop caller-saved registerspop %edxpop %ecxpop %eax


Translating virtual calls

Translating virtual calls

VirtualCall R1.2(b=5,c=x),R3

LIR code:

# push caller-saved registerspush %eaxpush %ecxpush %edx

R1

DVPtr

# push parametersmov -4(%ebp),%eax # push xpush %eaxpush $5 # push 5

x

y

# Find address of virtual method and call itmov -8(%ebp),%eax # load thispush %eax # push thismov 0(%eax),%eax # Load dispatch table addresscall *8(%eax) # Call table entry 2 (2*4=8)

mov %eax,-12(%ebp) # store returned value in R3

_DV_A

# pop parameters (2 params+this * 4 bytes = 12)add $12,%esp

# pop caller-saved registerspop %edxpop %ecxpop %eax


Library function calls

Library function calls

  • Static function calls

  • Reference type arguments require non-null runtime check

class Library {

static void println(string s); // prints string s followed by a newline.

static void print(string s); // prints string s.

static void printi(inti); // prints integer i.

static void printb(boolean b); // prints boolean b.

static intreadi(); // reads one character from the input.

...


Function prologue epilogue

Function prologue/epilogue

_A_foo:# prologuepush %ebpmov %esp,%ebp

# push local variables of foosub $12,%esp # 3 local vars+regs * 4 = 12

# push callee-saved registerspush %ebxpush %esipush %edi

function body

_A_foo_epilogoue: # extra label for each function

# pop callee-saved registerspop %edipop %esipop %ebx

mov %ebp,%esppop %ebpret


Representing dispatch tables

Representing dispatch tables

file.lir

PA4

_DV_A: [_A_sleep,_A_rise,_A_shine]_DV_B: [_A_sleep,_B_rise,_B_shine,_B_twinkle]

file.ic

PA5

class A { void sleep() {…} void rise() {…} void shine() {…} static void foo() {…}}class B extends A { void rise() {…} void shine() {…} void twinkle() {…}}

file.s

# data section.data .align 4_DV_A: .long _A_sleep .long _A_rise .long _A_shine_DV_B: .long _A_sleep .long _B_rise .long _B_shine .long _B_twinkle


Runtime checks

Runtime checks

  • Insert code to check attempt to perform illegal operations

    • Null pointer check

      • MoveField, MoveArray, ArrayLength, VirtualCall

      • Reference arguments to library functions should not be null

    • Array bounds check

      • MoveArray

    • Array allocation size check

      • __allocateArray(size) – size needs to be >0

      • Do we need to check argument of __allocateObject(#)?

    • Division by zero

      • Div, Mod

  • If check fails jump to error handler code that prints a message and gracefully exists program


Null pointer check

Null pointer check

# null pointer check

cmp $0,%eax

je labelNPE

Single generated handler for entire program

labelNPE:

push $strNPE# error message

call __println

push $1# error code

call __exit


Array bounds check

Array bounds check

# array bounds check (eax = array, ecx = index)

mov -4(%eax),%ebx # ebx = length

cmp %ecx,%ebx

jle labelABE # ebx <= ecx ?

cmp $0,%ecx

jl labelABE # ecx < 0 ?

Single generated handler for entire program

labelABE:

push $strABE # error message

call __println

push $1 # error code

call __exit


Array allocation size check

Array allocation size check

# array size check

cmp $0,%eax# eax == array size

jle labelASE # eax <= 0 ?

Single generated handler for entire program

labelASE:

push $strASE # error message

call __println

push $1 # error code

call __exit


Division by zero check

Division by zero check

# division by zero check

cmp $0,%eax# eax is divisor je labelDBE # eax == 0 ?

Single generated handler for entire program

labelDBE:

push $strDBE # error message

call __println

push $1 # error code

call __exit


Hello world example

Hello world example

class Library {

void println(string s);

...

}

class Hello {

static void main(string[] args) {

Library.println("Hello world\n");

}

}


Representing strings

Representing strings

  • Array preceded by a word indicating the length of the array

4

1

1

1

1

1

1

1

1

1

1

1

1

1

n

13

H

e

l

l

o

w

o

r

l

d

\

String reference


Assembly file structure

Assembly file structure

.title"hello.ic“# global declarations.global __ic_main

# data section.data.align 4.int 13str1: .string "Hello world\n“# text (code) section.text#----------------------------------------------------.align 4__ic_main:push %ebp # prologuemov %esp,%ebp

push $str1 # print(...)call __printadd $4, %esp

mov $0,%eax# return 0mov %ebp,%esp# epiloguepop %ebpret

header

statically-allocateddata: string literalsand dispatch tables

Method bodiesand error handlers


Implementation

Implementation

  • Hacker’s approach: translate directly to text

    • Not flexible

    • Hard to debug

  • Use objects representation


Possible instruction hierarchy

Possible instruction hierarchy

ASMInstr

LabelInstr

BinOpInstr

UnOpInstr

CallInstr

RetInstr

ASMInstr

JumpInstr

CondJumpInstr


Possible operand hierarchy

Possible operand hierarchy

ASMOperand

X86Reg

Immediate

Memory

Reg

Integer

Literal

Variable

Parameter

Displacement


Implementation example

Implementation example

class BinOpInstr extends ASMInstr { public final Operand src; public final Operand dst; public final String name; public BinOpInstr(String name, Operand src, Operand dst) { // Sanity check if (src instanceof Memory && dst instanceof Memory) { throw new RuntimeException(“Too many memory operands for arith instruction!”); this.name = name; this.src = src; this.dst = dst; } public String toString() {if (ASMInstr.intelSyntax) { return name + “ “ + src + “,” + dst; } else { return name + “ “ + dst + “,” + src; } } }


From assembly to executable

ICProgram

prog.ic

x86 assembly

x86 assembly

prog.s

prog.s

From assembly to executable

LexicalAnalysis

Syntax Analysis

Parsing

AST

SymbolTableetc.

Inter.Rep.(IR)

CodeGeneration

GNU assembler

prog.o

GNUlinker

prog.exe

libic.a(libic + gc)


Optimizations

Optimizations

  • More efficient register allocation for statements

    • IC statement

    • Basic Block

    • Method

  • Eliminate unnecessary labels and jumps

    • Post-translation pass


Optimizing labels jumps

Optimizing labels/jumps

  • If we have subsequent labels:_label1:_label2:

    We can merge labels and redirect jumps to the merged label

  • If we havejump label1_label1:Can eliminate jump

  • Eliminate labels not mentioned by any instruction


  • Login