Where to Store Variables?

Similar documents
CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 20: Stack Frames 7 March 08

COMP 356 Programming Language Structures Notes for Chapter 10 of Concepts of Programming Languages Implementing Subprograms.

Stack Allocation. Run-Time Data Structures. Static Structures

PROGRAMMING CONCEPTS AND EMBEDDED PROGRAMMING IN C, C++ and JAVA: Lesson-4: Data Structures: Stacks

Chapter 5 Names, Bindings, Type Checking, and Scopes

X86-64 Architecture Guide

Stack machines The MIPS assembly language A simple source language Stack-machine implementation of the simple language Readings:

Habanero Extreme Scale Software Research Project

Organization of Programming Languages CS320/520N. Lecture 05. Razvan C. Bunescu School of Electrical Engineering and Computer Science

1 The Java Virtual Machine

language 1 (source) compiler language 2 (target) Figure 1: Compiling a program

Assembly Language: Function Calls" Jennifer Rexford!

picojava TM : A Hardware Implementation of the Java Virtual Machine

Keil C51 Cross Compiler

1) The postfix expression for the infix expression A+B*(C+D)/F+D*E is ABCD+*F/DE*++

Lecture 22: C Programming 4 Embedded Systems

An Introduction to Assembly Programming with the ARM 32-bit Processor Family

Machine-Code Generation for Functions

Last Class: OS and Computer Architecture. Last Class: OS and Computer Architecture

Storage Classes CS 110B - Rule Storage Classes Page 18-1 \handouts\storclas

MAX = 5 Current = 0 'This will declare an array with 5 elements. Inserting a Value onto the Stack (Push)

Lecture Outline. Stack machines The MIPS assembly language. Code Generation (I)

Course: Programming II - Abstract Data Types. The ADT Stack. A stack. The ADT Stack and Recursion Slide Number 1

Parameter passing in LISP

Module 2 Stacks and Queues: Abstract Data Types

Bypassing Browser Memory Protections in Windows Vista

Instruction Set Architecture (ISA) Design. Classification Categories

More MIPS: Recursion. Computer Science 104 Lecture 9

C Compiler Targeting the Java Virtual Machine

Instruction Set Architecture (ISA)

Memory Allocation. Static Allocation. Dynamic Allocation. Memory Management. Dynamic Allocation. Dynamic Storage Allocation

Computer Systems Architecture

Moving from CS 61A Scheme to CS 61B Java

Handout 1. Introduction to Java programming language. Java primitive types and operations. Reading keyboard Input using class Scanner.

Short Notes on Dynamic Memory Allocation, Pointer and Data Structure

DATA STRUCTURE - STACK

Crash Course in Java

Scoping (Readings 7.1,7.4,7.6) Parameter passing methods (7.5) Building symbol tables (7.6)

Implementation Aspects of OO-Languages

Data Structures Using C++ 2E. Chapter 5 Linked Lists

Instruction Set Architecture

Write Barrier Removal by Static Analysis

Chapter 7D The Java Virtual Machine

C++ INTERVIEW QUESTIONS

OpenACC 2.0 and the PGI Accelerator Compilers

PART IV Performance oriented design, Performance testing, Performance tuning & Performance solutions. Outline. Performance oriented design

Lecture 11 Doubly Linked Lists & Array of Linked Lists. Doubly Linked Lists

Symbol Tables. Introduction

The Java Virtual Machine and Mobile Devices. John Buford, Ph.D. Oct 2003 Presented to Gordon College CS 311

1 Abstract Data Types Information Hiding

Master of Sciences in Informatics Engineering Programming Paradigms 2005/2006. Final Examination. January 24 th, 2006

Chapter 5 Functions. Introducing Functions

Figure 1: Graphical example of a mergesort 1.

ECS 165B: Database System Implementa6on Lecture 2

2) Write in detail the issues in the design of code generator.

13 Classes & Objects with Constructors/Destructors

Typy danych. Data types: Literals:

Parameter Passing in Pascal

Podpora počas behu. Runtime Environments. Ján Šturc. Zima 2010

Semantic Analysis: Types and Type Checking

Advanced Computer Architecture-CS501. Computer Systems Design and Architecture 2.1, 2.2, 3.2

Object Oriented Software Design II

Monitors and Exceptions : How to Implement Java efficiently. Andreas Krall and Mark Probst Technische Universitaet Wien

A deeper look at Inline functions

Roos Instruments, Inc.

10CS35: Data Structures Using C

Trace-Based and Sample-Based Profiling in Rational Application Developer

Chapter 4 Lecture 5 The Microarchitecture Level Integer JAVA Virtual Machine

Java Virtual Machine Locks

Instruction Set Architecture. or How to talk to computers if you aren t in Star Trek

Elemental functions: Writing data-parallel code in C/C++ using Intel Cilk Plus

The Java Series. Java Essentials I What is Java? Basic Language Constructs. Java Essentials I. What is Java?. Basic Language Constructs Slide 1

Glossary of Object Oriented Terms

Getting Started with the Internet Communications Engine

MIPS Assembly Code Layout

Chapter 13 Storage classes

PROBLEMS (Cap. 4 - Istruzioni macchina)

Embedded Systems. Review of ANSI C Topics. A Review of ANSI C and Considerations for Embedded C Programming. Basic features of C

How To Port A Program To Dynamic C (C) (C-Based) (Program) (For A Non Portable Program) (Un Portable) (Permanent) (Non Portable) C-Based (Programs) (Powerpoint)

Inside the Java Virtual Machine

Interpreters and virtual machines. Interpreters. Interpreters. Why interpreters? Tree-based interpreters. Text-based interpreters

VB.NET Programming Fundamentals

Object Oriented Software Design II

A3 Computer Architecture

JavaScript. JavaScript: fundamentals, concepts, object model. Document Object Model. The Web Page. The window object (1/2) The document object

Infrastructure that supports (distributed) componentbased application development

KITES TECHNOLOGY COURSE MODULE (C, C++, DS)

General Introduction

Kernel Types System Calls. Operating Systems. Autumn 2013 CS4023

umps software development

Laboratorio di Sistemi Operativi Anno Accademico

CS2210: Compiler Construction. Runtime Environment

Introduction to Programming

Class 16: Function Parameters and Polymorphism

Stacks. Linear data structures

Hacking Techniques & Intrusion Detection. Ali Al-Shemery arabnix [at] gmail

C++FA 3.1 OPTIMIZING C++

How to Sandbox IIS Automatically without 0 False Positive and Negative

ASSEMBLY PROGRAMMING ON A VIRTUAL COMPUTER

Virtual vs Physical Addresses

Transcription:

Where to Store Variables? Static Allocation Variables created at compile-time Size and ress known at compile-time Stack Allocation Variables placed in activation records on a stack Variables are created / destroyed in LIFO order Heap Allocation Size and ress determined at run-time Creation / destruction of data occurs in any order 1 Early Languages (FORTRAN) Static Allocation Each variable is placed in memory ( static allocation ) Fortran had routines, but!no stack Recursion was not possible Values of a routine s variables are retained across invocations Initialization vs. re-initialization Each variable s size must be known at compile-time Dynamic arrays?

Stack Allocation Each variable is local to some routine Invoke a routine? Allocate storage for its variables (and initialize it?) Return? Pop frame (Variables are destroyed) Consider one routine (e.g., quicksort ) Many activations, many frames! Many copies of each local variable Local variables: Each invocation has its own set of variables The currently active invocation Its variables will be in the frame on top of stack. Every reference to a local variable will access data in the top frame 3 References to a local variable in the currently active routine StackTop General Idea In the SPARC %sp %fp *(StackTop + offset X ) ld [%fp-48],%l 4

Each local (and temp) variable has a size C int: 4 bytes, double: 8 bytes,. Laying Out the Frame Each local and temp variable needs an offset for each procedure (or block) do offset = ; for each local and temp variable do assign this variable to current offset offset = offset + this variable s length endfor endfor Each local (and temp) variable has a size C int: 4 bytes, double: 8 bytes,. PCAT all variables: 4 bytes Laying Out the Frame Each local and temp variable needs an offset for each procedure (or block) do May start at some other value (-4) offset = ; for each local and temp variable do assign this variable to current offset offset = offset + this variable s length endfor endfor We ll use -4

Each local (and temp) variable has a size C int: 4 bytes, double: 8 bytes,. PCAT all variables: 4 bytes Laying Out the Frame Each local and temp variable needs an offset for each procedure (or block) do offset = ; for each local and temp variable do assign this variable to current offset offset = offset + this variable s length endfor endfor We ll treat main body as just another routine. It will have a frame May start at some other value (-4) We ll use -4 Global variables Treat identically to local variables for procedures! 7 Variable Size Offset w 4 x 8 4 y 4 1 z 1 1 a 8 17 b 1 c 8 34 34 Example Ignoring alignment issues 8

Example Variable Size Offset Offset with Alignment w 4 x 8 4 8 bytes of ping 4 y 4 1 1 z 1 1 bytes of ping 3 a 8 17 4 b 1 3 7 bytes of ping c 8 4 34 34 48 9 Example Variable Size Offset Offset with Alignment w 4 x 8 4 8 bytes of ping 4 y 4 1 1 z 1 1 bytes of ping 3 a 8 17 4 b 1 3 7 bytes of ping c 8 4 34 34 48 Re-order! Place variables with most restrictive alignment first. Variable Size Offset x 8 a 8 8 c 8 1 w 4 4 y 4 8 z 1 3 b 1 33 34 34 1

Initial offset: -4 Increment: -4 PCAT Example Variable Size Offset w 4-4 x 4-8 y 4-1 z 4-1 a 4 - b 4-4 c 4-8 8-3 %sp %fp- %fp-1 %fp-1 %fp-8 %fp-4 %fp a z y x w 11 An Abstract View The Stack of Activation Records STACK TOP Temp data fields One activation record ( Stack frame ) Local data fields Machine Status Static link ( access link ) Dynamic link ( control link ) Return ress Returned value (optional) Arguments ( actuals ) To access a local or temp variable *(stacktop + offset) 1

The Dynamic Link When we return, we need to be able to go back to previous frame. During a call:!save old StackTop!Increment StackTop (Allocate new frame)!store old StackTop in Dynamic Link field During a return:!use the Dynamic Link to restore the old StackTop To access local variables: [StackTop + offset X ] To access variables in our caller s frame: [[StackTop + offset DynamicLink ] + offset X ] What do we need from the caller s frame?!arguments?!place to store a returned result? StackTop The Static Link used to access non-local variables (to be discussed later) 13 SPARC Much of the Activation Record is cached in registers!!! Dynamic Link Stored in registers (%sp, %fp) Return Address Stored in registers (%i7, %o7) Arguments Some in registers %i %i Rest in caller s frame Returned Value 3-bits: in register (%i, %o) %sp %fp hidden register hidden register hidden register Machine Status 4 bytes Architecture dependent & often not needed 14

The Calling Sequence!Compute argument values Allocate new frame!initialize it Move arguments into the new frame (optional) Save machine state (optional) Save return ress Transfer control to new routine The Return Sequence!Compute and move return value (optional) Pop stack / delete the top frame Resume execution in the caller s code Flexibility as to who!caller callee does what calling sequence return sequence 1 Caller s Code: call foo Callee s Code: foo: ret AAA AAA AAA DDD DDD DDD Calling Sequence Return Sequence BBB BBB BBB CCC CCC CCC 1

Where do you draw the line between the caller s frame and the callee s frame? Callee must be responsible for part of the job since only it knows the size of its local area. When compiling the caller The compiler does not have the callee s code. Shared by caller and callee Parms Returned Value Links Machine Status Local Vars Parms Returned Value Links Machine Status Local Vars Callee s Frame Caller s Frame 17 Where do you draw the line between the caller s frame and the callee s frame? Callee must be responsible for part of the job since only it knows the size of its local area. When compiling the caller The compiler does not have the callee s code. Shared by caller and callee Parms Returned Value Links Machine Status Local Vars Parms Returned Value Links Machine Status Local Vars Callee s Frame Caller s Frame 18

Parameter Passing in SPARC sp Callee bar Arguments to bar at known offset in the caller s frame fp fp+9 fp+9 Caller foo 19 Using a Stack for Expression Evaluation Source Code: x := y + ( * z); Target Code: push y push push z mult pop x

Using a Stack for Expression Evaluation Source Code: x := y + ( * z); Target Code: push y push push z mult pop x TOP x: y: z: Used for expression evaluation Frame, with local variables 1 Using a Stack for Argument Evaluation and Parameter Passing Calling Sequence: Push args onto the stack Save = TOP TOP = TOP + FrameSize Return Sequence: Move return value to where arg 1 was Restore TOP, Pop stack top into TOP Foo s Frame

Using a Stack for Argument Evaluation and Parameter Passing Calling Sequence: Push args onto the stack Save = TOP TOP = TOP + FrameSize Return Sequence: Move return value to where arg 1 was Restore TOP, Pop stack top into TOP Arg N Arg 1 Arguments Foo s Frame 3 Using a Stack for Argument Evaluation and Parameter Passing Calling Sequence: Push args onto the stack Save = TOP TOP = TOP + FrameSize TOP Return Sequence: Move return value to where arg 1 was Restore TOP, Pop stack top into Arg N Arg 1 Bar s Frame Arguments Foo s Frame 4

Using a Stack for Argument Evaluation and Parameter Passing Calling Sequence: Push args onto the stack Save = TOP TOP = TOP + FrameSize Return Sequence: Move return value to where arg 1 was Restore TOP, Pop stack top into TOP Result Foo s Frame Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP x: y: 3 z: 4 i: Foo s Frame

Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP 3 x: y: 3 z: 4 i: Foo s Frame 7 Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP 3 x: y: 3 z: 4 i: Foo s Frame 8

Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP 7 3 x: y: 3 z: 4 i: Foo s Frame 9 Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP 7 3 x: y: 3 z: 4 i: Foo s Frame 3

Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP 1 7 3 x: y: 3 z: 4 i: Foo s Frame 31 Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP 1 7 3 x: y: 3 z: 4 i: Foo s Frame 3

Using a Stack for Argument Evaluation and Parameter Passing Source Code: TOP x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x 1 7 3 x: y: 3 z: 4 i: Bar s Frame Waiting Foo s Frame 33 Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP 3 3 x: y: 3 z: 4 i: Result from Bar Foo s Frame 34

Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP 3 x: y: 3 z: 4 i: Foo s Frame 3 Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP 3 x: y: 3 z: 4 i: Foo s Frame 3

Using a Stack for Argument Evaluation and Parameter Passing Source Code: x := y + * (bar(7,i+1)); Target Code: push y push push 7 push i push 1 call bar mult pop x TOP x: 3 y: 3 z: 4 i: Foo s Frame 37 Variable-Length Local Variables Goal: Allow a routine to have variable-length data (i.e., dynamically-sized arrays) as local data in frame 38

Variable-Length Local Variables Goal: Allow a routine to have variable-length data (i.e., dynamically-sized arrays) as local data in frame Option 1: Allocate the variable on the heap Work with pointers to the data PCAT: Hide the pointers from the programmer Programmer codes: a[i] Compiler produces code like this: *(a + 4*i) Auto free the data when the routine returns? 39 Variable-Length Local Variables Goal: Allow a routine to have variable-length data (i.e., dynamically-sized arrays) as local data in frame Option 1: Allocate the variable on the heap Work with pointers to the data PCAT: Hide the pointers from the programmer Programmer codes: a[i] Compiler produces code like this: *(a + 4*i) Auto free the data when the routine returns? Option : Create the variable on the stack, dynamically Effectively: Enlarge the frame as necessary Still need to work with pointers 4

Variable-Length Local Variables We must have two pointers: Stack Top Local Variables at fixed offsets from Dynamically sized variables use hidden pointers TOP All references to a and b will be indirect through hidden pointers a: b: i: j: Foo s Frame 41 Variable-Length Local Variables We must have two pointers: Stack Top TOP Local Variables at fixed offsets from Array B Dynamically sized variables use hidden pointers Array A Foo s Frame All references to a and b will be indirect through hidden pointers a: b: i: j: 4

Local / Non-Local Variables procedure main() { int y; procedure foo1() { int x; procedure foo() { x call foo3(); y procedure foo3() { int x; x call foo1 / call foo call foo1 / call foo x call foo1 y 43 procedure main() { int y; procedure foo1() { int x 1 ; procedure foo() { x call foo3(); y procedure foo3() { int x 3 ; Local / Non-Local Variables 1 x call foo1 / call foo call foo1 / call foo x call foo1 y 44

Local / Non-Local Variables procedure main() { int y; procedure foo1() { 1 int x 1 ; procedure foo() { x Non-Local (1 level) call foo3(); y Non-Local ( levels) procedure foo3() { int x 3 ; Local ( levels) x call foo1 / call foo call foo1 / call foo x call foo1 y 4 Local / Non-Local Variables procedure main() { int y; procedure foo1() { 1 int x 1 ; procedure foo() { x Non-Local (1 level) call foo3(); y Non-Local ( levels) procedure foo3() { int x 3 ; Local ( levels) x call foo1 / call foo call foo1 / call foo x call foo1 y Static Links foo x 3 foo3 foo x 1 foo1 x 3 foo3 foo x 1 foo1 x 1 foo1 y main Dynamic Links 4

Lexical Scoping Static Scoping Rules For non-local variables Look in syntactically enclosing routine Look in next enclosing routine etc The norm for most languages procedure foo var x: integer procedure foo3 var procedure foo4 var x 47 Dynamic Scoping Rules For non-local variables Search the calling stack at runtime to locate the right variable. Uncommon. procedure bar () begin x end procedure foo1 () var x: integer begin call bar() end procedure foo () var x: integer begin call bar() end bar foo1 x: foo1 x: 48

procedure foo () is var x,y: ; begin var temp: ; temp := x; x := y; y := temp; end; begin var y,z: ; begin end; end; endprocedure; Statement Blocks Syntax: begin end; { 49 Statement Blocks Blocks are entered and exited in nested order. Idea: Create a new frame for each block. Push on stack.

Statement Blocks Blocks are entered and exited in nested order. Idea: Create a new frame for each block. Push on stack. But: No parameters No recursion All calls are inline! Overhead! So: Just put variables in frame of surrounding routine! 1 procedure foo () is var x,y: ; begin var temp: ; temp := x; x := y; y := temp; end; begin var y,z: ; begin end; end; endprocedure; Statement Blocks -: -1: -1: -8: -4: z temp y y x Syntax: begin end; { Frame for foo

Consider a language with: Functions as objects Non-local variable accesses Function Contexts procedure main() var p: function p = call p() endprocedure 3 Consider a language with: Functions as objects Non-local variable accesses Function Contexts!Bar is called Bar s frame is created x is created!bar sets p to point to function foo!bar returns Bar s frame is popped x is destroyed!foo is invoked foo accesses variable x procedure main() var p: function procedure bar() var x: procedure foo() x endprocedure p = foo endprocedure call bar() call p() endprocedure 4

Consider a language with: Functions as objects Non-local variable accesses Function Contexts!Bar is called Bar s frame is created x is created!bar sets p to point to function foo!bar returns Bar s frame is popped x is destroyed!foo is invoked foo accesses variable x Solution: Do not free bar s frame until it is no longer needed Put bar s frame on the heap Automatic garbage collection procedure main() var p: function procedure bar() var x: procedure foo() x endprocedure p = foo endprocedure call bar() call p() endprocedure C allows non-locals to be used within a function The C Solution static int x; However!Functions may not be nested!variables are either!local!global (i.e., static) void foo() { x void bar () { p = &foo; void main () { bar(); (*p) ();

The Static Link Nesting Depth: A routine s lexical level Main body! Nested routines! Add one Each frame contains a static link Points to the frame of the most recently invoked activation of the lexically surrounding routine. procedure main() { procedure foo() { procedure bar() { procedure goo() { 1 7 The Static Link Nesting Depth: A routine s lexical level Main body! Nested routines! Add one Each frame contains a static link Points to the frame of the most recently invoked activation of the lexically surrounding routine. procedure main() { procedure foo() { procedure bar() { procedure goo() { 1 Static Links bar goo bar foo goo bar foo foo main 1 1 1 8

Given a variable usage How do we find the frame containing the right variable? Assume that x is declared at lexical level M. Assume that x is used at lexical level N. (We must have N " M) At runtime Follow N-M static links to find the right frame. Use the offset of x within that frame. 9 main () proc g () proc foo () var x M 1 bar bar h N N proc h () proc bar () x N foo x: M foo x: M g 1 main x declared at level M x used at level N Follow N-M static links

proc a var x proc b proc c proc d x 8 7 call e proc e 8 x call b call d x call c x: b a call b Code: Follow static link 1 time Use offset (e.g., -4) within that frame 1 proc a var x proc b proc c proc d x call e 8 7 b proc e x call b call d x call c 8 x: e d c b a 8 8 7 call b Code: Follow static link 1 time Use offset (e.g., -4) within that frame

proc a var x proc b proc c proc d x call e 8 7 Code: Follow static link 3 times Use offset (e.g., -4) within that frame d c b proc e x call b call d x call c call b 8 x: e d c b a 8 8 7 3 How do we set up the Static Links? Whenever we call a routine must initialize static link in new frame. Assume foo calls bar Level = L BAR Level = L FOO Want to initialize bar s static link. Static Link? bar foo What frame should it point to??? 4

foo calls bar Initializing the Static Link Goal: Find the frame of the routine that lexically encloses bar Set bar s static link to point to it. Given: foo s frame is on the stack, directly below the newly allocated frame for bar. Approach: Use the static link in foo s frame. Follow L FOO - L BAR + 1 static links from foo s frame. This will be the frame of the routine that lexically encloses bar!!! Make bar s static link point to it. Case 1: L BAR = L FOO +1 foo contains bar directly proc foo proc bar call bar Case : L BAR = L FOO foo and bar at same level proc bar proc foo call bar Case 3: L BAR < L FOO foo is more deeply nested proc bar proc foo call bar Case 4: L BAR > L FOO +1 bar is nested deeply proc foo proc bar call bar Not Allowed!

Foo statically contains bar directly. Case 1: L BAR = L FOO +1 proc foo proc bar call bar L FOO - L BAR + 1 - + 1 = From foo s frame follow links! Just make bar s static link point to foo s frame. bar foo 7 Foo and bar at same level. proc g Case : L BAR = L FOO proc bar proc foo call bar L FOO - L BAR + 1 bar foo g - + 1 = 1 From foo s frame follow 1 link! 8

Case 3: L BAR < L FOO foo is more deeply nested (within bar or one of bar s siblings) proc g proc bar proc foo 9 call bar L FOO - L BAR + 1 bar foo 9 8 7 g 9 - + 1 = 4 From foo s frame follow 4 links! 9 Display Registers The Idea: In static storage maintain an array of pointers d[] The i-th element will be a pointer to an activation record on the stack whose lexical level is i. Assume we are currently executing in a routine ( f ) at lexical level d[] points to the top frame (i.e., the currently executing frame, for f ) d[] points to the most recent activation of the routine that lexically encloses f. (a routine at level, call it g ) d[4] points to the most recent activation of the routine that lexically encloses g (a routine at level 4, call it h ) d[] points to the most recent activation of a routine at level, call it main 7

proc c var x To access a non-local variable proc f x 3 Go to d[3] to get a pointer to the correct frame. d[i] where i is the lexical level at which the variable was declared. 4 3 1 4 f e e d c b 4 c 3 3 a 1 a main 1 71 How to Maintain the Display Registers? During call and return sequences Each activation record will have a word in which to save an old value of a display register. display register save area When calling a routine at lexical level i Allocate a new frame on the stack Save old value of d[i] in that word in the new frame d[i] := ptr to the new frame When returning d[i] = the saved value Note: The entire array of display registers will always be restored to its previous value after any sequence of calls and matching returns! 7

Example: f calls c!allocate new frame Save old d[3] Set d[3] to point to new frame 4 3 1 display registers 3 f e e d 4 c 3 c 3 b a 1 a 1 main 73 Example: f calls c!allocate new frame Save old d[3] Set d[3] to point to new frame 4 3 1 display registers c 3 f e e d 4 c 3 c 3 b a 1 a 1 main 74

Example: f calls c!allocate new frame Save old d[3] Set d[3] to point to new frame 4 3 1 display registers c 3 f e e d 4 c 3 c 3 b a 1 a 1 main 7 Example: f calls c!allocate new frame Save old d[3] Set d[3] to point to new frame 4 3 1 display registers c 3 f e e d 4 c 3 c 3 b a 1 a 1 main 7

Case 1: L BAR = L FOO + 1 Assume foo calls bar foo contains bar directly proc foo proc bar call bar Level = L FOO Whatever bar does, these registers will be unchanged after bar returns Routines that lexically enclose foo 1 9 8 7 4 3 1 display registers Level = L BAR bar foo 77 Cases and 3: L BAR # L FOO proc b proc c proc d proc e proc foo call bar proc bar 4 4 3 Routines that lexically enclose foo and bar 1 9 8 7 4 3 1 foo e d c b display registers bar foo e d c b 78

Cases and 3: L BAR # L FOO proc b proc c proc d proc e proc foo call bar proc bar 4 4 3 Routines that lexically enclose foo and bar 1 9 8 7 4 3 1 foo e bar c b display registers bar foo e d c b 79.data display:.word display1:.word display:.word display1:.word Producing Target Code At the beginning of the the program We ll need to compute the maximum lexical level! bar: save %fp,???,%fp set display4,%l1 ld [%l1],%l st %l,[%sp+4] st %fp,[%l1] procentry bar,lexlevel=4 ld set st ret restore [%sp+4],%l display4,%l1 %l,[%l1] returnvoid 8