Compilation /15a Lecture 7. Activation Records Noam Rinetzky

Similar documents
THEORY OF COMPILATION

Compilation Lecture 6: Attribute Grammars IR Noam Rinetzky

G Programming Languages - Fall 2012

CSC 2400: Computing Systems. X86 Assembly: Function Calls"

Assembly Language: Function Calls

Winter Compiler Construction T11 Activation records + Introduction to x86 assembly. Today. Tips for PA4. Today:

G Programming Languages Spring 2010 Lecture 4. Robert Grimm, New York University

Lecture #16: Introduction to Runtime Organization. Last modified: Fri Mar 19 00:17: CS164: Lecture #16 1

Assembly Language: Function Calls" Goals of this Lecture"

Assembly Language: Function Calls. Goals of this Lecture. Function Call Problems

Assembly Language: Function Calls" Goals of this Lecture"

CIT Week13 Lecture

CSC 2400: Computing Systems. X86 Assembly: Function Calls

Topic 7: Activation Records

CA Compiler Construction

Assembly III: Procedures. Jo, Heeseung

ASSEMBLY III: PROCEDURES. Jo, Heeseung

CS356: Discussion #6 Assembly Procedures and Arrays. Marco Paolieri

Run Time Environment. Activation Records Procedure Linkage Name Translation and Variable Access

What the CPU Sees Basic Flow Control Conditional Flow Control Structured Flow Control Functions and Scope. C Flow Control.

Procedure Calls. Young W. Lim Mon. Young W. Lim Procedure Calls Mon 1 / 29

System Software Assignment 1 Runtime Support for Procedures

Concepts Introduced in Chapter 7

Procedure Calls. Young W. Lim Sat. Young W. Lim Procedure Calls Sat 1 / 27

Typical Runtime Layout. Tiger Runtime Environments. Example: Nested Functions. Activation Trees. code. Memory Layout

Assembly III: Procedures. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

x86 assembly CS449 Fall 2017

LECTURE 19. Subroutines and Parameter Passing

Run Time Environment. Procedure Abstraction. The Procedure as a Control Abstraction. The Procedure as a Control Abstraction

CS213. Machine-Level Programming III: Procedures

Compilation 2014 Activation Records

Winter Compiler Construction T10 IR part 3 + Activation records. Today. LIR language

COMP 303 Computer Architecture Lecture 3. Comp 303 Computer Architecture

Machine-level Programming (3)

CS 480 Fall Runtime Environments. Mike Lam, Professor. (a.k.a. procedure calls and heap management)

The Activation Record (AR)

CPEG421/621 Tutorial

Digital Forensics Lecture 3 - Reverse Engineering

! Those values must be stored somewhere! Therefore, variables must somehow be bound. ! How?

Scope, Functions, and Storage Management

Runtime management. CS Compiler Design. The procedure abstraction. The procedure abstraction. Runtime management. V.

Run-time Environment

Programming Languages

Stack -- Memory which holds register contents. Will keep the EIP of the next address after the call

See P&H 2.8 and 2.12, and A.5-6. Prof. Hakim Weatherspoon CS 3410, Spring 2015 Computer Science Cornell University

Procedure and Object- Oriented Abstraction

Systems I. Machine-Level Programming V: Procedures

AS08-C++ and Assembly Calling and Returning. CS220 Logic Design AS08-C++ and Assembly. AS08-C++ and Assembly Calling Conventions

Function Calls COS 217. Reading: Chapter 4 of Programming From the Ground Up (available online from the course Web site)

Run-Time Environments

Machine-Level Programming III: Procedures

Separate compilation. Topic 6: Runtime Environments p.1/21. CS 526 Topic 6: Runtime Environments The linkage convention

Run-time Environments

Run-time Environments

The course that gives CMU its Zip! Machine-Level Programming III: Procedures Sept. 17, 2002

Principles of Programming Languages Topic: Scope and Memory Professor Louis Steinberg Fall 2004

An Overview to Compiler Design. 2008/2/14 \course\cpeg421-08s\topic-1a.ppt 1

Calling Conventions. See P&H 2.8 and Hakim Weatherspoon CS 3410, Spring 2013 Computer Science Cornell University

Procedure and Function Calls, Part II. Comp 412 COMP 412 FALL Chapter 6 in EaC2e. target code. source code Front End Optimizer Back End

CSE 504. Expression evaluation. Expression Evaluation, Runtime Environments. One possible semantics: Problem:

Stacks and Frames Demystified. CSCI 3753 Operating Systems Spring 2005 Prof. Rick Han

Course Administration

administrivia today start assembly probably won t finish all these slides Assignment 4 due tomorrow any questions?

Intel assembly language using gcc

Control Abstraction. Hwansoo Han

Chapter 9 :: Subroutines and Control Abstraction

Run Time Environments

211: Computer Architecture Summer 2016

Procedures and Run-Time Storage

Subprograms, Subroutines, and Functions

Compilers and Code Optimization EDOARDO FUSELLA

CMSC 313 Lecture 12. Project 3 Questions. How C functions pass parameters. UMBC, CMSC313, Richard Chang

CS153: Compilers Lecture 8: Compiling Calls

238P: Operating Systems. Lecture 3: Calling conventions. Anton Burtsev October, 2018

Procedures and Run-Time Storage

CPSC W Term 2 Problem Set #3 - Solution

Objectives. ICT106 Fundamentals of Computer Systems Topic 8. Procedures, Calling and Exit conventions, Run-time Stack Ref: Irvine, Ch 5 & 8

Q1: /20 Q2: /30 Q3: /24 Q4: /26. Total: /100

CSE Lecture In Class Example Handout

Code Generation. The Main Idea of Today s Lecture. We can emit stack-machine-style code for expressions via recursion. Lecture Outline.

Implementing Procedure Calls

We can emit stack-machine-style code for expressions via recursion

CS 31: Intro to Systems Functions and the Stack. Martin Gagne Swarthmore College February 23, 2016

Status. Lecture #15: Introduction to Runtime Organization. Run-time environments. Code Generation Goals and Considerations

Example. program sort; var a : array[0..10] of integer; procedure readarray; : function partition (y, z :integer) :integer; var i, j,x, v :integer; :

CS 33: Week 3 Discussion. x86 Assembly (v1.0) Section 1G

X86 Assembly -Procedure II:1

Run-time Environments. Lecture 13. Prof. Alex Aiken Original Slides (Modified by Prof. Vijay Ganesh) Lecture 13

Functions in MIPS. Functions in MIPS 1

CPSC 213. Introduction to Computer Systems. Procedures and the Stack. Unit 1e Feb 11, 13, 15, and 25. Winter Session 2018, Term 2

Code Generation. Lecture 30

Practical Malware Analysis

Lecture 5. Announcements: Today: Finish up functions in MIPS

Chap. 8 :: Subroutines and Control Abstraction

CSc 520 Principles of Programming Languages. Questions. rocedures as Control Abstractions... 30: Procedures Introduction

Anne Bracy CS 3410 Computer Science Cornell University

Calling Conventions. Hakim Weatherspoon CS 3410, Spring 2012 Computer Science Cornell University. See P&H 2.8 and 2.12

IA32 Stack. Lecture 5 Machine-Level Programming III: Procedures. IA32 Stack Popping. IA32 Stack Pushing. Topics. Pushing. Popping

Hakim Weatherspoon CS 3410 Computer Science Cornell University

Question 4.2 2: (Solution, p 5) Suppose that the HYMN CPU begins with the following in memory. addr data (translation) LOAD 11110

Transcription:

Compilation 0368-3133 2014/15a Lecture 7 Activation Records Noam Rinetzky 1

Code generation for procedure calls (+ a few words on the runtime system) 2

Code generation for procedure calls Compile time generation of code for procedure invocations Activation Records (aka Stack Frames) 3

Supporting Procedures Stack: a new computing environment e.g., temporary memory for local variables Passing information into the new environment Parameters Transfer of control to/from procedure Handling return values 4

Calling Conventions In general, compiler can use any convention to handle procedures In practice, CPUs specify standards Aka calling conventios Allows for compiler interoperability Libraries! 5

Abstract Register Machine (High Level View) CPU Code Control General purpose registers (data) registers Register 00 Register 01 Register xx Register PC Data High addresses Low addresses 6

Abstract Register Machine (High Level View) CPU Main Memory Code Control General purpose registers (data) registers Register 00 Register 01 Register xx Register PC Global Variables Stack High addresses Register Stack Heap Low addresses 7

Abstract Activation Record Stack Stack grows this way main Proc 1 Proc k Proc 2 Proc k Proc k+1 Proc k+2 Proc k+1 Stack frame for procedure Proc k+1 (a 1,,a N ) Proc k+2 8

Abstract Stack Frame Proc k Parameters (actual arguments) Locals and temporaries Param N Param N-1 Param 1 _t0 _tk x y Stack frame for procedure Proc k+1 (a 1,,a N ) Proc k+2 9

Handling Procedures Store local variables/temporaries in a stack A function call instruction pushes arguments to stack and jumps to the function label A statement x=f(a1,,an); looks like Push a1; Push an; Call f; Pop x; // copy returned value Returning a value is done by pushing it to the stack (return x;) Push x; Return control to caller (and roll up stack) Return; 10

Abstract Register Machine CPU Main Memory Code Control General purpose registers (data) registers Register 00 Register 01 Register xx Register PC Global Variables Stack High addresses Heap Low addresses 11

Abstract Register Machine CPU Main Memory Code General purpose (data) registers Register 00 Register 01 Register xx Global Variables Stack High addresses Control registers Register PC Register Stack Heap Low addresses 12

Intro: Functions Example int SimpleFn(int z) { int x, y; x = x * y * z; return x; } void main() { int w; w = SimpleFunction(137); } _SimpleFn: _t0 = x * y; _t1 = _t0 * z; x = _t1; Push x; Return; main: _t0 = 137; Push _t0; Call _SimpleFn; Pop w; 13

What Can We Do with Procedures? Declarations & Definitions Call & Return Jumping out of procedures Passing & Returning procedures as parameters 14

Design Decisions Scoping rules Static scoping vs. dynamic scoping Caller/callee conventions Parameters Who saves register values? Allocating space for local variables 15

Static (lexical) Scoping main ( ) { B 0 } int a = 0 ; int b = 0 ; { B 1 } int b = 1 ; { B 2 } { B 3 } int a = 2 ; printf ( %d %d\n, a, b) int b = 3 ; printf ( %d %d\n, a, b) ; printf ( %d %d\n, a, b) ; printf ( %d %d\n, a, b) ; a name refers to its (closest) enclosing scope known at compile time Declaration Scopes a=0 B0,B1,B3 b=0 B0 b=1 B1,B2 a=2 B2 b=3 B3 16

Dynamic Scoping Each identifier is associated with a global stack of bindings When entering scope where identifier is declared push declaration on identifier stack When exiting scope where identifier is declared pop identifier stack Evaluating the identifier in any context binds to the current top of stack Determined at runtime 17

Example int x = 42; int f() { return x; } int g() { int x = 1; return f(); } int main() { return g(); } What value is returned from main? Static scoping? Dynamic scoping? 18

Why do we care? We need to generate code to access variables Static scoping Identifier binding is known at compile time Address of the variable is known at compile time Assigning addresses to variables is part of code generation No runtime errors of access to undefined variable Can check types of variables 19

Variable addresses for static scoping: first attempt int x = 42; int f() { return x; } int g() { int x = 1; return f(); } int main() { return g(); } identifier x (global) x (inside g) address 0x42 0x73 20

Variable addresses for static scoping: first attempt int a [11] ; void quicksort(int m, int n) { int i; if (n > m) { i = partition(m, n); quicksort (m, i-1) ; quicksort (i+1, n) ; } what is the address of the variable i in the procedure quicksort? main() {... quicksort (1, 9) ; } 21

Compile-Time Information on Variables Name Type Scope when is it recognized Duration Size Until when does its value exist How many bytes are required at runtime Address Fixed Relative 22 Dynamic

Activation Record (Stack Frames) separate space for each procedure invocation managed at runtime code for managing it generated by the compiler desired properties efficient allocation and deallocation procedures are called frequently variable size different procedures may require different memory sizes 23

Semi-Abstract Register Machine CPU Main Memory High addresses Control General purpose registers (data) registers Stack registers Register 00 Register 01 Register xx Register PC ebp esp Global Variables Stack Heap Low addresses 24

A Logical Stack Frame (Simplified) Parameters (actual arguments) Locals and temporaries Param N Param N-1 Param 1 _t0 _tk x y Stack frame for function f(a1,,an) 25

Runtime Stack Stack of activation records Call = push new activation record Return = pop activation record Only one active activation record top of stack How do we handle recursion? 26

Activation Record (frame) high addresses administrative part low addresses parameter k parameter 1 return information lexical pointer dynamic link registers & misc local variables temporaries next frame would be here incoming parameters frame (base) pointer stack pointer stack grows down 27

Runtime Stack SP stack pointer top of current frame FP frame pointer base of current frame Sometimes called BP (base pointer) Usually points to a fixed offset from the start of the frame FP Previous frame Current frame stack grows down SP 28

Code Blocks Programming language provide code blocks void foo() adminstrative { x1 y1 int x = 8 ; y=9;//1 x2 { int x = y * y ;//2 } x3 { int x = y * 7 ;//3} x = y + 1; } 29

L-Values of Local Variables The offset in the stack is known at compile time L-val(x) = FP+offset(x) x = 5 Þ Load_Constant 5, R3 Store R3, offset(x)(fp) 30

Pentium Runtime Stack Register Usage ESP Stack pointer EBP Base pointer Pentium stack registers Instruction push, pusha, pop,popa, call return Usage push on runtime stack Base pointer transfer control to called routine transfer control back to caller Pentium stack and call/ret instructions 31

Accessing Stack Variables Use offset from FP (%ebp) Remember: stack grows downwards Above FP = parameters Below FP = locals Examples %ebp + 4 = return address %ebp + 8 = first parameter %ebp 4 = first local FP+8 FP FP-4 SP Param n param1 Return address Previous fp Local 1 Local n Param n param1 Return address 32

Factorial fact(int n) fact: pushl %ebp # save ebp movl %esp,%ebp # ebp=esp pushl %ebx # save ebx movl 8(%ebp),%ebx # ebx = n cmpl $1,%ebx # n = 1? jle.lresult # then done leal -1(%ebx),%eax # eax = n-1 EBP+8 pushl %eax # call fact # fact(n-1) EBP imull %ebx,%eax # eax=retv*n jmp.lreturn # EBP-4.lresult: movl $1,%eax # retv.lreturn: ESP movl -4(%ebp),%ebx # restore ebx movl %ebp,%esp # restore esp popl %ebp # restore ebp (disclaimer: real compiler can do better than that) n Return address Previous fp old %ebp old %ebx old %eax Return address (stack in intermediate point) 33

Call Sequences The processor does not save the content of registers on procedure calls So who will? Caller saves and restores registers Callee saves and restores registers But can also have both save/restore some registers 34

Call Sequences caller Caller push code call Push caller-save registers Push actual parameters (in reverse order) push return address (+ other admin info) Jump to call address caller callee Callee push code (prologue) Callee pop code (epilogue) return Caller pop code 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 return value + parameters Pop caller-save registers 35

To Callee-save or to Caller-save? Callee-saved registers need only be saved when callee modifies their value Some heuristics and conventions are followed 36

Caller-Save and Callee-Save Registers Callee-Save Registers Saved by the callee before modification Values are automatically preserved across calls Caller-Save Registers Saved (if needed) by the caller before calls Values are not automatically preserved across calls Usually the architecture defines caller-save and calleesave registers Separate compilation Interoperability between code produced by different compilers/languages But compiler writers decide when to use caller/callee registers 37

Callee-Save Registers Saved by the callee before modification Usually at procedure prolog Restored at procedure epilog Hardware support may be available Values are automatically preserved across calls int foo(int a) { int b=a+1; f1(); g1(b); return(b+2); }.global _foo Add_Constant -K, SP //allocate space for foo Store_Local R5, -14(FP) // save R5 Load_Reg R5, R0; Add_Constant R5, 1 JSR f1 ; JSR g1; Add_Constant R5, 2; Load_Reg R5, R0 Load_Local -14(FP), R5 // restore R5 Add_Constant K, SP; RTS // deallocate 38

Caller-Save Registers Saved by the caller before calls when needed Values are not automatically preserved across calls.global _bar void bar (int y) { int x=y+1; f2(x); g2(2); g2(8); } Add_Constant -K, SP //allocate space for bar Add_Constant R0, 1 JSR f2 Load_Constant 2, R0 ; JSR g2; Load_Constant 8, R0 ; JSR g2 Add_Constant K, SP // deallocate space for bar RTS 39

1960s In memory 1970s Parameter Passing No recursion is allowed In stack 1980s In registers First k parameters are passed in registers (k=4 or k=6) Where is time saved? Most procedures are leaf procedures Interprocedural register allocation Many of the registers may be dead before another invocation Register windows are allocated in some architectures per call (e.g., sun Sparc) 40

Activation Records & Language Design 41

Compile-Time Information on Variables Name, type, size Address kind Fixed (global) Relative (local) Dynamic (frame unknown size) Scope when is it recognized Duration Until when does its value exist 42

Scoping int x = 42; int f() { return x; } int g() { int x = 1; return f(); } int main() { return g(); } What value is returned from main? Static scoping? Dynamic scoping? 43

Nested Procedures For example Pascal Any routine can have sub-routines Any sub-routine can access anything that is defined in its containing scope or inside the sub-routine itself non-local variables 44

Example: Nested Procedures program p(){ int x; procedure a(){ int y; procedure b(){ c() }; procedure c(){ int z; procedure d(){ y := x + z }; b() d() } a() c() } a() } Possible call sequence: p d a d a d c d b d c d d what are the addresses of variables x, y and z in procedure d? 45

Nested Procedures can call a sibling, ancestor when c uses (non-local) variables from a, which instance of a is it? Possible call sequence: p d a d a d c d b d c d d P how do you find the right activation record at runtime? a a c b c d 46

Nested Procedures goal: find the closest routine in the stack from a given nesting level if we reached the same routine in a sequence of calls routine of level k uses variables of the same nesting level, it uses its own variables if it uses variables of nesting level j < k then it must be the last routine called at level j If a procedure is last at level j on the stack, then it must be ancestor of the current routine Possible call sequence: p d a d a d c d b d c d d P a a c b c d 47

Nested Procedures problem: a routine may need to access variables of another routine that contains it statically solution: lexical pointer (a.k.a. access link) in the activation record lexical pointer points to the last activation record of the nesting level above it in our example, lexical pointer of d points to activation records of c lexical pointers created at runtime number of links to be traversed is known at compile time 48

Lexical Pointers program p(){ int x; procedure a(){ int y; Possible call sequence: p d a d a d c d b d c d d y a procedure b(){ c() }; procedure c(){ int z; procedure d(){ y := x + z P y z a c }; b() d() a a b } } a() c() c b c z c } a() d d 49

Lexical Pointers program p(){ int x; procedure a(){ } int y; procedure b(){ c() }; } procedure c(){ int z; procedure d(){ }; y := x + z b() d() a() c() Possible call sequence: p d a d a d c d b d c d d a() } invokes nested in P a a c b c d y y z z a a c b c d 50

Activation Records: Remarks 51

Stack Frames Allocate a separate space for every procedure incarnation Relative addresses Provide a simple mean to achieve modularity Supports separate code generation of procedures Naturally supports recursion Efficient memory allocation policy Low overhead Hardware support may be available LIFO policy Not a pure stack Non local references Updated using arithmetic 52

Non-Local goto in C syntax 53

Non-local gotos in C setjmp remembers the current location and the stack frame longjmp jumps to the current location (popping many activation records) 54

Non-Local Transfer of Control in C 55

Variable Length Frame Size C allows allocating objects of unbounded size in the stack void p() { int i; char *p; scanf( %d, &i); p = (char *) alloca(i*sizeof(int)); } Some versions of Pascal allows conformant array value parameters 56

Limitations The compiler may be forced to store a value on a stack instead of registers The stack may not suffice to handle some language features 57

Frame-Resident Variables A variable x cannot be stored in register when: x is passed by reference Address of x is taken (&x) is addressed via pointer arithmetic on the stack-frame (C varags) x is accessed from a nested procedure The value is too big to fit into a single register The variable is an array The register of x is needed for other purposes Too many local variables An escape variable: Passed by reference Address is taken Addressed via pointer arithmetic on the stack-frame Accessed from a nested procedure 58

The Frames in Different Architectures g(x, y, z) where x escapes Pentium MIPS Sparc x y z InFrame(8) InFrame(0) InFrame(68) InFrame(12) InReg(X 157 ) InReg(X 157 ) InFrame(16) InReg(X 158 ) InReg(X 158 ) View Change M[sp+0] fp fp sp sp sp-k sp sp-k M[sp+K+0] r 2 X 157 r4 save %sp, -K, %sp M[fp+68] i 0 X 157 i 1 X 158 r5 X 158 i 2 59

Limitations of Stack Frames A local variable of P cannot be stored in the activation record of P if its duration exceeds the duration of P Example 1: Static variables in C (own variables in Algol) void p(int x) { static int y = 6 ; y += x; } Example 2: Features of the C language int * f() { int x ; return &x ; } Example 3: Dynamic allocation int * f() { return (int *) malloc(sizeof(int)); } 60

Compiler Implementation Hide machine dependent parts Hide language dependent part Use special modules 61

Basic Compiler Phases Tokens Abstract syntax tree Control Flow Graph Assembly lexical analysis syntax analysis semantic analysis Code generation Assembler/Linker Source program (string) Frame manager.exe 62

Hidden in the frame ADT Word size The location of the formals Frame resident variables Machine instructions to implement shiftof-view (prologue/epilogue) The number of locals allocated so far The label in which the machine code starts 63

Activation Records: Summary compile time memory management for procedure data works well for data with well-scoped lifetime deallocation when procedure returns 64