Compiler Construction Code Generation II Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.

Slides:



Advertisements
Similar presentations
Intermediate Representation III. 2 PAs PA2 deadline is
Advertisements

C Programming and Assembly Language Janakiraman V – NITK Surathkal 2 nd August 2014.
1 Homework / Exam Turn in mp2 at start of class today Reading –PAL, pp 3-6, Exam #1 next class –Open Book / Open Notes –NO calculators or other.
Compiler Construction Intermediate Representation III Activation Records Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
Assembly Language for Intel-Based Computers Chapter 8: Advanced Procedures Kip R. Irvine.
Lecture 13 – Compiling Object-Oriented Programs Eran Yahav 1 Reference: MCD
Lecture 10 – Activation Records Eran Yahav 1 Reference: Dragon 7.1,7.2. MCD 6.3,
Lecture 11 – Code Generation Eran Yahav 1 Reference: Dragon 8. MCD
University of Washington Last Time For loops  for loop → while loop → do-while loop → goto version  for loop → while loop → goto “jump to middle” version.
1 Storage Registers vs. memory Access to registers is much faster than access to memory Goal: store as much data as possible in registers Limitations/considerations:
PC hardware and x86 3/3/08 Frans Kaashoek MIT
Accessing parameters from the stack and calling functions.
Practical Session 3. The Stack The stack is an area in memory that its purpose is to provide a space for temporary storage of addresses and data items.
– 1 – , F’02 ICS05 Instructor: Peter A. Dinda TA: Bin Lin Recitation 4.
Chapter 12: High-Level Language Interface. Chapter Overview Introduction Inline Assembly Code C calls assembly procedures Assembly calls C procedures.
Run time vs. Compile time
Compiler Construction Recap Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.
Assembly תרגול 8 פונקציות והתקפת buffer.. Procedures (Functions) A procedure call involves passing both data and control from one part of the code to.
Compiler Construction Activation records Code Generation Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University.
Stack Activation Records Topics IA32 stack discipline Register saving conventions Creating pointers to local variables February 6, 2003 CSCE 212H Computer.
Compiler Construction Code Generation I Ran Shaham and Ohad Shacham School of Computer Science Tel-Aviv University.
David Evans CS201j: Engineering Software University of Virginia Computer Science Lecture 18: 0xCAFEBABE (Java Byte Codes)
6.828: PC hardware and x86 Frans Kaashoek
Computer Architecture and Operating Systems CS 3230 :Assembly Section Lecture 7 Department of Computer Science and Software Engineering University of Wisconsin-Platteville.
Dr. José M. Reyes Álamo 1.  The 80x86 memory addressing modes provide flexible access to memory, allowing you to easily access ◦ Variables ◦ Arrays ◦
Lecture 10 – Code Generation Eran Yahav 1 Reference: Dragon 8. MCD
Today’s topics Parameter passing on the system stack Parameter passing on the system stack Register indirect and base-indexed addressing modes Register.
Code Generation Gülfem Savrun Yeniçeri CS 142 (b) 02/26/2013.
CSc 453 Runtime Environments Saumya Debray The University of Arizona Tucson.
Fabián E. Bustamante, Spring 2007 Machine-Level Programming III - Procedures Today IA32 stack discipline Register saving conventions Creating pointers.
Assembly Language for Intel-Based Computers, 6 th Edition Chapter 8: Advanced Procedures (c) Pearson Education, All rights reserved. You may.
Activation Records CS 671 February 7, CS 671 – Spring The Compiler So Far Lexical analysis Detects inputs with illegal tokens Syntactic analysis.
Code Generation III. PAs PA4 5.1 – 7.2 PA5 (bonus) 24.1 –
Winter Compiler Construction T12 – Code Generation Mooly Sagiv and Roman Manevich School of Computer Science Tel-Aviv University.
COP4020 Programming Languages Subroutines and Parameter Passing Prof. Xin Yuan.
Activation Records (in Tiger) CS 471 October 24, 2007.
Compiler Construction Dr. Noam Rinetzky and Orr Tamir School of Computer Science Tel Aviv University
Winter Compiler Construction T11 – Activation records + Introduction to x86 assembly Mooly Sagiv and Roman Manevich School of Computer Science.
Microprocessors The ia32 User Instruction Set Jan 31st, 2002.
Intermediate Representation II Storage Allocation and Management EECS 483 – Lecture 18 University of Michigan Wednesday, November 8, 2006.
Compiler Construction Code Generation Activation Records
University of Amsterdam Computer Systems – the instruction set architecture Arnoud Visser 1 Computer Systems The instruction set architecture.
1 Assembly Language: Function Calls Jennifer Rexford.
Code Generation II. 2 Compiler IC Program ic x86 executable exe Lexical Analysis Syntax Analysis Parsing ASTSymbol Table etc. Inter. Rep. (IR) Code Generation.
Calling Procedures C calling conventions. Outline Procedures Procedure call mechanism Passing parameters Local variable storage C-Style procedures Recursion.
Winter Compiler Construction T10 – IR part 3 + Activation records Mooly Sagiv and Roman Manevich School of Computer Science Tel-Aviv University.
LECTURE 19 Subroutines and Parameter Passing. ABSTRACTION Recall: Abstraction is the process by which we can hide larger or more complex code fragments.
ICS51 Introductory Computer Organization Accessing parameters from the stack and calling functions.
Assembly function call convention
Reading Condition Codes (Cont.)
Assembly language.
C function call conventions and the stack
143A: Principles of Operating Systems Lecture 4: Calling conventions
Homework In-line Assembly Code Machine Language
Introduction to Compilers Tim Teitelbaum
Assembly IA-32.
Recitation 2 – 2/4/01 Outline Machine Model
Assembly Language Programming V: In-line Assembly Code
Machine-Level Programming 4 Procedures
Stack Frames and Advanced Procedures
Procedures – Overview Lecture 19 Mon, Mar 28, 2005.
Assembly Language Programming II: C Compiler Calling Sequences
Winter Compiler Construction T10 – IR part 3
Machine-Level Programming III: Procedures Sept 18, 2001
MIPS Procedure Calls CSE 378 – Section 3.
Multi-modules programming
ICS51 Introductory Computer Organization
Presentation transcript:

Compiler Construction Code Generation II Rina Zviel-Girshin and Ohad Shacham School of Computer Science Tel-Aviv University

2 Compiler IC Program ic x86 executable exe Lexical Analysis Syntax Analysis Parsing ASTSymbol Table etc. Inter. Rep. (IR) Code Generation IC compiler We saw: X86 assembly Code generation Today: Code generation Runtime checks

3 x86 assembly AT&T syntax and Intel syntax We’ll be using AT&T syntax Work with GNU Assembler (GAS)GNU Assembler

4 Immediate and register operands Immediate Value specified in the instruction itself Preceded by $ Example: add $4,%esp Register Register name is used Preceded by % Example: mov %esp,%ebp

5 Reminder: accessing variables Use offset from frame pointer Above FP = parameters Below FP = locals (and spilled LIR registers) Examples %ebp + 4 = return address %ebp + 8 = first parameter %ebp – 4 = first local …… SP FP Return address local 1 … local n Previous fp param n … param 1 FP+8 FP-4

6 Memory and base displacement operands Memory operands Obtain value at given address Example: mov (%eax), %eax Base displacement Obtain value at computed address Syntax: disp(base,index,scale) offset = base + (index * scale) + displacement Example: mov $42, 2(%eax) Example: mov $42, (%eax,%ecx,4)

7 Reminder: accessing variables Use offset from frame pointer Above FP = parameters Below FP = locals (and spilled LIR registers) Examples %ebp + 8 = first parameter %eax = %ebp + 8 (%eax) = the value 572 8(%ebp) = the value 572 …… SP FP Return address local 1 … local n Previous fp param n … 572 %eax,FP+8 FP-4

8 LIR to assembly Need to know how to translate: Function bodies Translation for each kind of LIR instruction Calling sequences Correctly access parameters and variables Compute offsets for parameter and variables Dispatch tables String literals Runtime checks Error handlers

9 Translating LIR instructions Translate function bodies: 1. Compute offsets for: Local variables (-4,-8,-12,…) LIR registers (considered extra local variables) Function parameters (+8,+12,+16,…) Take this parameter into account 2. Translate instruction list for each function Local translation for each LIR instruction Local (machine) register allocation

10 Memory offsets implementation // MethodLayout instance per function declaration class MethodLayout { // Maps variables/parameters/LIR registers to // offsets relative to frame pointer (BP) Map memoryToOffset; } void foo(int x, int y) { int z = x + y; g = z; // g is a field Library.printi(z); } virtual function takes one extra parameter: this MethodLayout for foo MemoryOffset this +8 x +12 y +16 z -4 R0 -8 R1 -12 _A_foo: Move x,R0 Add y,R0 Move R0,z Move this,R1 MoveField R0,R1.1 Library __printi(R0),Rdummy (manual) LIR translation 1 PA4 PA5

11 Memory offsets example MethodLayout for foo _A_foo: Move x,R0 Add y,R0 Move R0,z Move this,R1 MoveField R0,R1.1 Library __printi(R0),Rdummy _A_foo: push %ebp # prologue mov %esp,%ebp sub $12, %esp mov 12(%ebp),%eax # Move x,R0 mov %eax,-8(%ebp) mov 16(%ebp),%eax # Add y,R0 add -8(%ebp),%eax mov %eax,-8(%ebp) mov -8(%ebp),%eax # Move R0,z mov %eax,-4(%ebp) mov 8(%ebp),%eax # Move this,R1 mov %eax,-12(%ebp) mov -8(%ebp),%eax # MoveField R0,R1.1 mov -12(%ebp),%ebx mov %eax,4(%ebx) mov -8(%ebp),%eax # Library __printi(R0) push %eax call __printi add $4,%esp _A_foo_epilogoue: mov %ebp,%esp # epilogoue pop %ebp ret LIR translation Translation to x86 assembly MemoryOffset this +8 x +12 y +16 z -4 R0 -8 R

12 Calls/returns Direct function call syntax: call name Example: call __println Return instruction: ret

13 Handling functions Need to implement call sequence Caller code: Pre-call code: Push caller-save registers Push parameters Call (special treatment for virtual function calls) Post-call code: Copy returned value (if needed) Pop parameters Pop caller-save registers Callee code Each function has prologue and epilogue

14 call caller callee return caller Caller push code Callee push code (prologue) Callee pop code (epilogue) Copy returned value Caller pop code Push caller-save registers Push actual parameters (in reverse order) push return address Jump to call address Push current base-pointer bp = sp Push local variables Push callee-save registers Pop callee-save registers Pop callee activation record Pop old base-pointer pop return address Jump to address Pop parameters Pop caller-save registers Call sequences

15 Translating static calls StaticCall _A_foo(a=R1,b=5,c=x),R3 LIR code: # push parameters mov -4(%ebp),%eax # push x push %eax push $5 # push 5 mov -8(%ebp),%eax # push R1 push %eax # push caller-saved registers push %eax push %ecx push %edx call _A_foo # pop parameters (3 params*4 bytes = 12) add $12,%esp # pop caller-saved registers pop %edx pop %ecx pop %eax only if the value stored in these registers is needed by the callerh mov %eax,-16(%ebp) # store returned value in R3 Only if return register is not Rdummy only if the value stored in these registers is needed by the caller

16 Virtual functions Indirect call: call *( Reg ) Example: call *(%eax) Used for virtual function calls Dispatch table lookup Passing/receiving the this variable

17 Translating virtual calls VirtualCall R1.2(b=5,c=x),R3 # push parameters mov -4(%ebp),%eax # push x push %eax push $5 # push 5 # push caller-saved registers push %eax push %ecx push %edx LIR code: # pop parameters (2 params+this * 4 bytes = 12) add $12,%esp # pop caller-saved registers pop %edx pop %ecx pop %eax mov %eax,-12(%ebp) # store returned value in R3 x y DVPtr R1 0_A_rise 1_A_shine 2_A_twinkle _DV_A # Find address of virtual method and call it mov -8(%ebp),%eax # load this push %eax # push this mov 0(%eax),%eax # Load dispatch table address call *8(%eax) # Call table entry 2 (2*4=8)

18 Function prologue/epilogue _A_foo: # prologue push %ebp mov %esp,%ebp # push local variables of foo sub $12,%esp # 3 local vars+regs * 4 = 12 # push callee-saved registers push %ebx push %esi push %edi function body # pop callee-saved registers pop %edi pop %esi pop %ebx # push local variables of foo sub $12,%esp # 3 local vars+regs * 4 = 12 mov %ebp,%esp pop %ebp ret _A_foo_epilogoue: # extra label for each function Optional: only if register allocation optimization is used (in PA5) only if the these registers will be modified by the collee

19 Representing dispatch tables class A { void sleep() {…} void rise() {…} void shine() {…} static void foo() {…} } class B extends A { void rise() {…} void shine() {…} void twinkle() {…} } _DV_A: [_A_sleep,_A_rise,_A_shine] _DV_B: [_A_sleep,_B_rise,_B_shine,_B_twinkle] file.ic file.lir # 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 file.s PA4 PA5

20 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 Array allocation size check Division by zero If check fails jump to error handler code that prints a message and gracefully exists program

21 Null pointer check # null pointer check cmp $0,%eax je labelNPE labelNPE: push $strNPE# error message call __println push $1# error code call __exit Single generated handler for entire program

22 Array bounds check # array bounds check mov -4(%eax),%ebx # ebx = length mov $0,%ecx # ecx = index cmp %ecx,%ebx jle labelABE # ebx <= ecx ? cmp $0,%ecx jl labelABE # ecx < 0 ? labelABE: push $strABE # error message call __println push $1 # error code call __exit Single generated handler for entire program

23 Array allocation size check # array size check cmp $0,%eax# eax == array size jle labelASE # eax <= 0 ? labelASE: push $strASE # error message call __println push $1 # error code call __exit Single generated handler for entire program

24 Division by zero check # division by zero check cmp $0,%eax# eax is divisor je labelDBE # eax == 0 ? labelDBE: push $strDBE # error message call __println push $1 # error code call __exit Single generated handler for entire program

25 Optimizations More efficient register allocation for statements Allocate machine registers during translation Eliminate unnecessary labels and jumps Post-translation pass

26 Optimizing labels/jumps If we have subsequent labels: _label1: _label2: We can merge labels and redirect jumps to the merged label After translation (easier) Map old labels to new labels If we have jump label1 _label1: Can eliminate jump Eliminate labels not mentioned by any instruction

27 Optimizing register allocation Goal: associate machine registers with LIR registers as much as possible Optimization done only for sequence of instructions translated from single statement See more details on web site

28 class Library { void println(string s); } class Hello { static void main(string[] args) { Library.println("Hello world!"); } Hello world example

29 Assembly file structure.title"hello.ic“ # global declarations.global __ic_main # data section.data.align 4.int 13 str1:.string "Hello world\n“ # text (code) section.text # align 4 __ic_main: push %ebp # prologue mov %esp,%ebp push $str1 # print(...) call __print add $4, %esp mov $0,%eax# return 0 mov %ebp,%esp# epilogue pop %ebp ret header statically-allocated data: string literals and dispatch tables symbol exported to linker Method bodies and error handlers string length in bytes comment

30 Assembly file structure.title"hello.ic“ # global declarations.global __ic_main # data section.data.align 4.int 13 str1:.string "Hello world\n“ # text (code) section.text # align 4 __ic_main: push %ebp # prologue mov %esp,%ebp push $str1 # print(...) call __print add $4, %esp mov $0,%eax# return 0 mov %ebp,%esp# epilogue pop %ebp ret Immediates have $ prefix Register names have % prefix Comments using # Labels end with the (standard) : push print parameter call print pop parameter store return value of main in eax prologue – save ebp and set to be esp epilogue – restore esp and ebp (pop)

31 From assembly to executable Lexical Analysis Syntax Analysis Parsing ASTSymbol Table etc. Inter. Rep. (IR) Code Generation IC Program prog.ic x86 assembly prog.s x86 assembly prog.s libic.a (libic + gc) GNU assembler prog.o GNU linker prog.exe Can automate compilation+assembling+linking with script / Ant