Activation Records Mooly Sagiv Schrierber 317 03-640-7606 Wed 10:00-12:00 html://www.math.tau.ac.il/~msagiv/courses/wcc01.html Chapter.

Slides:



Advertisements
Similar presentations
The University of Adelaide, School of Computer Science
Advertisements

Register Allocation Mooly Sagiv Schrierber Wed 10:00-12:00 html://
CSI 3120, Implementing subprograms, page 1 Implementing subprograms The environment in block-structured languages The structure of the activation stack.
ECE 232 L6.Assemb.1 Adapted from Patterson 97 ©UCBCopyright 1998 Morgan Kaufmann Publishers ECE 232 Hardware Organization and Design Lecture 6 MIPS Assembly.
1 Lecture 4: Procedure Calls Today’s topics:  Procedure calls  Large constants  The compilation process Reminder: Assignment 1 is due on Thursday.
Procedure Calls Prof. Sirer CS 316 Cornell University.
MIPS Calling Convention Chapter 2.7 Appendix A.6.
Computer Architecture CSCE 350
CPS3340 COMPUTER ARCHITECTURE Fall Semester, /17/2013 Lecture 12: Procedures Instructor: Ashraf Yaseen DEPARTMENT OF MATH & COMPUTER SCIENCE CENTRAL.
Ch. 8 Functions.
Procedures II (1) Fall 2005 Lecture 07: Procedure Calls (Part 2)
The University of Adelaide, School of Computer Science
CSE 5317/4305 L7: Run-Time Storage Organization1 Run-Time Storage Organization Leonidas Fegaras.
Activation Records Mooly Sagiv Schrierber Wed 10:00-12:00 html:// Chapter.
Chapter 10 Implementing Subprograms. Copyright © 2012 Addison- Wesley. All rights reserved. 1-2 Chapter 10 Topics The General Semantics of Calls and Returns.
Basic Blocks Mooly Sagiv Schrierber Wed 10:00-12:00 html:// Chapter 8.
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:
Intermediate Code Generation Mooly Sagiv Schrierber Wed 10:00-12:00 html://
Register Allocation Mooly Sagiv html://
1 Chapter 7: Runtime Environments. int * larger (int a, int b) { if (a > b) return &a; //wrong else return &b; //wrong } int * larger (int *a, int *b)
1 Handling nested procedures Method 1 : static (access) links –Reference to the frame of the lexically enclosing procedure –Static chains of such links.
Activation Records Mooly Sagiv html:// Chapter 6.3.
ISBN Chapter 10 Implementing Subprograms.
CS 536 Spring Code generation I Lecture 20.
Activation Records Mooly Sagiv Schrierber Wed 14:00-15:00 this week only html://
Activation Records Mooly Sagiv html:// Chapter 6.3.
Honors Compilers Addressing of Local Variables Mar 19 th, 2002.
Intro to Computer Architecture
Activation Records Mooly Sagiv html:// Chapter 6.3.
Run time vs. Compile time
The environment of the computation Declarations introduce names that denote entities. At execution-time, entities are bound to values or to locations:
1 Run time vs. Compile time The compiler must generate code to handle issues that arise at run time Representation of various data types Procedure linkage.
Chapter 6 Activation Records. Local Variables, Instantiations int f(int x) { int y = x+x; if (y
Activation Records Chapter 6. 2 Local Variables, Instantiations Ex: function f(x:int) : int = let var y := x + x in if y < 10 then f(y) else y – 1 end.
Chapter 8 :: Subroutines and Control Abstraction
Chapter 7: Runtime Environment –Run time memory organization. We need to use memory to store: –code –static data (global variables) –dynamic data objects.
Runtime Environments What is in the memory? Runtime Environment2 Outline Memory organization during program execution Static runtime environments.
13/02/2009CA&O Lecture 04 by Engr. Umbreen Sabir Computer Architecture & Organization Instructions: Language of Computer Engr. Umbreen Sabir Computer Engineering.
Runtime Environments Compiler Construction Chapter 7.
Compiler Run-time Organization Lecture 7. 2 What we have covered so far… We have covered the front-end phases –Lexical analysis –Parsing –Semantic analysis.
Programming Language Principles Lecture 24 Prepared by Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida Subroutines.
Compiler Construction
Chapter 10 Implementing Subprograms. Copyright © 2012 Addison-Wesley. All rights reserved.1-2 Chapter 10 Topics The General Semantics of Calls and Returns.
Copyright © 2005 Elsevier Chapter 8 :: Subroutines and Control Abstraction Programming Language Pragmatics Michael L. Scott.
Activation Records CS 671 February 7, CS 671 – Spring The Compiler So Far Lexical analysis Detects inputs with illegal tokens Syntactic analysis.
1 Control Abstraction (Section ) CSCI 431 Programming Languages Fall 2003 A compilation of material developed by Felix Hernandez-Campos and Michael.
COP4020 Programming Languages Subroutines and Parameter Passing Prof. Xin Yuan.
Activation Records (in Tiger) CS 471 October 24, 2007.
Run-Time Storage Organization Compiler Design Lecture (03/23/98) Computer Science Rensselaer Polytechnic.
CSC 8505 Compiler Construction Runtime Environments.
CS412/413 Introduction to Compilers and Translators Spring ’99 Lecture 11: Functions and stack frames.
Intermediate Representation II Storage Allocation and Management EECS 483 – Lecture 18 University of Michigan Wednesday, November 8, 2006.
ISBN Chapter 10 Implementing Subprograms.
1 Compiler Construction Run-time Environments,. 2 Run-Time Environments (Chapter 7) Continued: Access to No-local Names.
ISBN Chapter 10 Implementing Subprograms.
LECTURE 19 Subroutines and Parameter Passing. ABSTRACTION Recall: Abstraction is the process by which we can hide larger or more complex code fragments.
Mooly Sagiv html://
Compilation /15a Lecture 7
COMPILERS Activation Records
Activation Records Mooly Sagiv
Introduction to Compilers Tim Teitelbaum
Procedures (Functions)
Procedures (Functions)
An Overview to Compiler Design
Chap. 8 :: Subroutines and Control Abstraction
Chap. 8 :: Subroutines and Control Abstraction
The University of Adelaide, School of Computer Science
Runtime Environments What is in the memory?.
10/6: Lecture Topics C Brainteaser More on Procedure Call
Presentation transcript:

Activation Records Mooly Sagiv Schrierber Wed 10:00-12:00 html:// Chapter 6

Basic Compiler Phases Source program (string) Fin. Assembly lexical analysis syntax analysis semantic analysis Translate Instruction selection Register Allocation Tokens Abstract syntax tree Intermediate representation Assembly Frame

Example factorial let function nfactor (n: int): int = if n = 0 then 1 else n * nfactor(n-1) in nfactor(10) end

IR for Main /* prologue of main starts with l1 */ /* body of main */ MOV(TEMP(RV), CALL(NAME(l2), ExpList(CONST(10), null /* next argument */))) /* epilogue of main */

IR for nfact /* Prologue of nfunc starts with l2 */ /* body of nfunc */ MOV(TEMP(RV), ESEQ(SEQ( CJUMP(=, “n”, CONST(0), NAME(l3), NAME(l4)), LABEL(l3) /* then-clause */, MOV(TEMP(t1), CONST(1)), JUMP(NAME(l5)), LABEL(l4), /* else-clause */ MOV(TEMP(t1), BINOP(MUL, “n”, CALL(NAME(l2), ExpList(BINOP(MINUS, “n”, CONST(1)), null /* next argument */)))), LABEL(l5)), TEMP(t1))) /* epilogue of nfunc */ Where to store the value of n?

Pseudo IR for nfact /* Prologue of nfunc starts with l2 */ PUSH(TEMP t128) MOVE(TEMP t128, TEMP t104) /* body of nfunc */ MOV(TEMP(RV), ESEQ(SEQ( CJUMP(=, TEMP t128, CONST(0), NAME(l3), NAME(l4)), LABEL(l3) /* then-clause */, MOV(TEMP(t1), CONST(1)), JUMP(NAME(l5)), LABEL(l4), /* else-clause */ MOV(TEMP(t1), BINOP(MUL, TEMP t128, CALL(NAME(l2), ExpList(BINOP(MINUS, TEMP t128, CONST(1)), null /* next argument */)))), LABEL(l5)), TEMP(t1))) /* epilogue of nfunc */ POP(TEMP t128)

.globl nfactor.ent nfactor nfactor_framesize=40.frame $sp,nfactor_framesize,$31 nfactor: addiu $sp,$sp,-nfactor_framesize L6: sw $2,0+nfactor_framesize($sp) or $25,$0,$4 # save arg1 or $24,$0,$31 sw $24,-4+nfactor_framesize($sp) sw $30,-8+nfactor_framesize($sp) beq $25,$0,L0 # n = 0? L1: or $30,$0,$25 lw $24,0+nfactor_framesize($sp) or $2,$0,$24 addi $25,$25,-1 # n-1 or $4,$0,$25 # arg1 = n-1 jal nfactor or $25,$0,$2 # r25= (n-1)! mult $30,$25 # r30=n(n-1)! mflo $30 L2: or $2,$0,$30 lw $30,-nfactor_framesize($sp) or $31,$0,$30 lw $30,-8+nfactor_framesize($sp) b L5 L0: addi $30,$0,1 b L2 L5: addiu $sp,$sp,nfactor_framesize j $31.end nfactor

Outline of this lecture Properties of variables Stack Frames The Frame Pointer and Frame Size The Static Pointers and Nesting Levels Machine Architectures Parameter Passing and return Address Limitations Memory Management in the Tiger Language Summary

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

Stack Frames Allocate a separate space for every procedure incarnation Relative addresses Provides a simple mean to achieve modularity 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

A Typical Stack Frame higher addresses previous frame current frame static link argument 1 argument 2 locals return address temporaries argument 2 argument 1 static link outgoing parameters saved registers lower addresses next frame frame size frame pointer stack pointer outgoing parameters

Pseudo IR for nfact LABEL L2 MOVE(TEMP SP, BINOP(MINUS, TEMP SP, CONST framesize))) MOVE(MEM(BINOP(MINUS, TEMP FP, CONST k)), TEMP t128) MOVE(TEMP t128, TEMP t104) MOV(TEMP(RV), ESEQ(SEQ( CJUMP(=, TEMP t128, CONST(0), NAME(l3), NAME(l4)), LABEL(l3) /* then-clause */, MOV(TEMP(t1), CONST(1)), JUMP(NAME(l5)), LABEL(l4), /* else-clause */ MOV(TEMP(t1), BINOP(MUL, TEMP t128, CALL(NAME(l2), ExpList(BINOP(MINUS, TEMP t128, CONST(1)), null /* next argument */)))), LABEL(l5)), TEMP(t1))) MOVE(TEMP t128, MEM(BINOP(MINUS, TEMP FP, CONST k))) MOVE(TEMP SP, BINOP(PLUS, TEMP SP, CONST framesize)))

Pascal Frame higher addresses previous frame current frame static link argument 2 argument 1 locals return address temporaries argument 1 argument 2 static link outgoing parameters saved registers lower addresses next frame bp sp previous bp

Summary thus far The structure of the stack frame may depend on –Machine –Architecture –Programming language –Compiler Conventions The stack is updated by: –Emitted compiler instructions –Designated hardware instructions

The Frame Pointer The caller –the calling routine The callee –the called routine caller responsibilities: –Calculate arguments and save in the stack –Store static link call instruction: M[--SP] := RA PC := callee callee responsibilities: –FP := SP –SP := SP - frame-size Why use both SP and FP?

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

Pascal Conformant Arrays program foo ; const max = 4 ; var m 1, m 2, m 3 : array [1..max, 1..max] of integer var i, j: integer procedure mult(a, b: array [1..l, 1..l] of integer; var c:array [1..l, 1..l] of integer)); var i, j, k: integer; begin { mult } for i := 1 to l do for j := 1 to l do begin c[i, j] := 0 ; for k := 1 to l do c[i, j] := c[i, j] + a[i, k] * b[k, j]; end end; { mult} begin { foo} … mult(m 1, m 2, m 3 ) end. { foo}

Supporting Static Scoping References to non-local variables Language rules –No nesting of functions C, C++, Java –Non-local references are bounded to the most recently enclosed declared procedure and “die” when the procedure end Algol, Pascal, Tiger Simplest implementation Pass the stack pointer as an extra argument to functions –Scope rules guarantee that this can be done Generate code to traverse the frames

let function fun1():int = let var d:=0 function fun2():int = d+1 in fun2() end in fun1() end /* prologue starts at t_main: */ MOVE(TEMP t103, CALL(NAME fun1, TEMP FP)) /* epilogue */ /* prologue starts at fun1 */ ESEQ( MOVE( MEM(BINOP(PLUS, TEMP FP, CONST -4)), CONST 0), CALL(NAME fun2, TEMP FP))) /* epilogue */ /* prologue starts at fun2 */ BINOP(PLUS, MEM( BINOP(PLUS, MEM(BINOP(PLUS, TEMP FP, CONST 0)), CONST -4)), CONST 1), … /* epilogue */

type tree = { key: string, left: tree, right: tree } function pretyprint(tree: tree): string = let var output := “” function write(s: string) = output := concat(output, s) function show(n: int, t: tree) = let function indent(s: string) = (for i := 1 to n do write(“ ”); output := concat(output, s)) in if t= nil then indent(“.”) else (indent(t.key); show(n+1, t.left); show(n+1, t.right)) end {show} in show(0, tree); output end Realistic Tiger Example link main output link pretyprint show link n t indent s i tree

type tree = { key: string, left: tree, right: tree } function pretyprint(tree: tree): string = let var output := “” function write(s: string) = output := concat(output, s) function show(n: int, t: tree) = let function indent(s: string) = (for i := 1 to n do write(“ ”); output := concat(output, s)) in if t= nil then indent(“.”) else (indent(t.key); show(n+1, t.left); show(n+1, t.right)) end {show} in show(0, tree); output end Realistic Tiger Example link main output link pretyprint show link n t n tree show t

Other Implementations of Static Scoping Display –An array of static links –d[i] is static link nesting level i –Can be stored in the stack lambda-lifting – Pass non-local variables as extra parameters

Machine Registers Every year –CPUs are improving by 50%-60% –Main memory speed is improving 10% Machine registers allow efficient accesses –Utilized by the compiler Other memory units exist –Cache

RISC vs. CISC Machines FeatureRISCCISC Registers  32 6, 8, 16 Register ClassesOneSome Arithmetic OperandsRegistersMemory+Registers Instructions3-addr2-addr Addressing Modes r M[r+c] (l,s) several Instruction Length32 bitsVariable Side-effectsNoneSome Instruction-Cost“Uniform”Varied

Caller-save vs. Callee-Save Registers Compile every procedure separately Partition the machine registers into two sets –Caller-Save registers –Callee-Save registers Hardware support may be available Register allocation algorithm will be described later

Parameter Passing 1960s – In memory No recursion is allowed 1970s – 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)

Modern Architectures return-address –also normally saved in a register on a call –a non leaf procedure saves this value on the stack –No stack support in the hardware function-result –Normally saved in a register on a call –A non leaf procedure saves this value on the stack

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

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

type tree = { key: string, left: tree, right: tree } function pretyprint(tree: tree): string = let var output := “” function write(s: string) = output := concat(output, s) function show(n: int, t: tree) = let function indent(s: string) = (for i := 1 to n do write(“ ”); output := concat(output, s)) in if t= nil then indent(“.”) else (indent(t.key); show(n+1, t.left); show(n+1, t.right)) end {show} in show(0, tree); output end

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)); }

Higher Order Functions fun f(x) = let fun g(y) = x + y in g end val h = f(3) val j = f(4) val z = h(5) val w = j(7) int (*)() f(int x) { int g(int y) { return x + y; } return g ; } int (*h)() = f(3); int (*j)() = f(4); int z = h(5); int w = j(7);

Memory Management in the Tiger Compiler Isolate architecture dependent parts in a separate module –Frame Isolate programming language dependent parts in a separate module –Translate Isolate labels and register temporaries in a separate module –Temp

Two Layers of Abstraction semant.c translateh translate.c frame.htemp.h mipsframe.ctemp.c

Temporaries and Labels /* temp.h */ typedef struct Temp_temp_ *Temp_temp; Temp_temp Temp_newtemp(void); typedef struct Temp_tempList_ *Temp_tempList; struct Temp_tempList_ { Temp\_temp head; Temp_tempList tail;} Temp_tempList Temp_TempList(Temp_temp h, Temp_tempList t); typedef S_symbol Temp_label; Temp_label Temp_newlabel(void); Temp_label Temp_namedlabel(string name); string Temp_labelstring(Temp_label s);

Example frame invocations (translate.c) When a function g(x, y, z) where x escapes is encountered f = F_newFrame (g, U_BoolList(TRUE, U_BoolList(FALSE, U_BoolList(FALSE, NULL)))) ; When a local variable v is encountered a = F_allocLocal(f, escape) –Causes to reserve a space for v in f or in register When a variable is accessed F_Exp(a, access) returns the generated code –access is the code for computing the static link –Ignored when f

Hidden in  frame.c Word size The location of the formals Machine instructions to implement “shift-of- view”' (prologue) The number of locals allocated so far The label in which the machine code starts

The frame interface /* frame.h */ typedef struct F_frame_ *F_Frame; typedef struct F_access_ *F_access; typedef struct F_accessList_ *F_accessList; struct F_accessList_ { F_access head; F_accessList tail; } F_frame F_newFrame(Temp_label name, U_boolList formals); F_label F_name(F_frame d); F_accessList F_formals(F_frame f); F_access f_allocLocal(F_frame f, bool escape); Temp_temp F_FP(void); extern const int F_wordsize; T_exp F_Exp(F_access acc, T_EXP static_link);

MIPS frame implementation /* frame.c */ #include “temp.h” #include “frame.h” struct F_frame_ {Temp_label name; int formalsCount; int localsCount; F_accessList formals; … }; typedef enum {inFrame, inReg} F_access_kind; struct F_access { F_access_kind kind; union { int offset; /* frame offset */ Temp_temp reg; /* register */ } u; }; … F_access F_allocLocal(F_frame f, bool escape) { assert(f); if (escape) return F_allocInFrame(-1 * F_wordSize * + f  localsCount); else return F_allocInRegister(); }

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

The Need for Register Copies function m(x: int, y: int) = (h(y, y); h(x, x))

Nesting Blocks in Tiger function f() = let var v := 6 in = print(v); let var v := 7 in print(v) end; print(v); let var v := 8 in print(v) end; print(v); end

Managing Static Links Implemented in the translate module (translate.c) The static pointer is passed as extra argument For every function records the frame of function in which it is defined Generate instruction sequences for non-local references

Summary Stack frames provide a simple compile-time memory management –Locality of references is supported Can be complex –What about procedure parameters? Memory allocation is one of most interesting areas