activation records chapter 6. 2 local variables, instantiations ex: function f(x:int) : int = let...
Post on 22-Dec-2015
216 views
TRANSCRIPT
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
Many (recursive) f calls -> Many x’s and y’s
Runtime Stack
3
Higher-order Function
In Pseudo-C
int (*)() f(int x) { int g(int y) {return x+y;}
return g;
}
int (*h)() = f(3); -> x=3
int (*j)() = f(4); -> x=4
int z = h(5) ; <- no x
int w = j(7) ; <- no x
nested function +higher-order function
-> not in stack-mode
Pascal -> no higher function
C -> no nested function
runtime stack
Stack Frames
incomingargs
locallocalvariablesvariables
return addressreturn address
tempstemps
saved saved registersregisters
arg narg n....
arg 1arg 1Static linkStatic link
arg narg n....
arg 1arg 1static linkstatic link
outgoingargs
currentframe
prevframe
nextframe
stackpointer
framepointer
low
er
mem
ory
ad
dre
sses
hig
her
ad
dre
sses
• Push/pop frames• Access variables in
deeper frames -> nonlocal variables
• Stack frame– Local varialbes– Parameters– Return address– Temporaries– Register save area
• Usually has “standard” frame layout for several languages
• Depends on architecture
4
5
arg narg n....
arg 1arg 1stackpointer
framepointer
arg arg nn....
arg arg 11
stackpointer
framepointer
: frame sizeeither fixed or varies => Can be determined very late
Frame PointerFrame Pointer
• g calls f(a1, a2, ………, an)
5
6
Registers
• register : local vars, temporary results…– Can save load/store instructions
• general purpose vs. special purpose registers• caller save vs. callee save register
– Ex: MIPS r16-r23 are preserved across procedure calls(callee-save) r0-r15 not preserved (caller-save)
• If we do interprocedure analysis, we can do fine register save scheduling.
7
Parameter Passing
• passing with stack• passing some in registers and others in stack
– k=6 or 4– Need to save register when call another function
• need not to save “argument registers”, when– Leaf procedure– Interprocedural register allocation
– Arguments become dead variables when calling another function
– Register windows
8
Parameter Passing (Cont’d)
• argument passing in reg + stack
• Sometimes formal parameters are at consecutive addresses : register save area by callee
• call-by-reference– Code for dereferencing formal
parameter access
arg karg k....
arg 1arg 1
arg narg n....
arg k+arg k+11
register
savearea
framepointer
9
Return Address
• g calls f : f returns – Need g’s address (resume point) -> return address
• Can be saved – On stack– In special register– In special memory location
• Hardware “call” instruction dependent– Usually in designated registers– Need to save (no-leaf proc)– No need to save (leaf proc)
10
Frame-resident Variables
• Variables are written to memory only when necessary– Variable will be passed by reference or & (address
of) operator is applied– Variable is accessed by a procedure nested inside
the current one– Value is too big to fit into a single register– Variable is an array– Register holding variable is needed for special
purpose (parameter passing)– Too many local variables (“spilled” into frame)
11
Escaped Variable
• A variable “escape”s if it is passed by reference, its address is taken, or it is accessed from a nested function.
• Variables are bound to register or memory in later phase in compiling.
Static Linksprettyprint output
write --output
show
n
ident
i,s
--output
--n
-- i,s
Variable References• Static Links• Display• Lambda lifting (passing all nonlocals as parameters)
Procedure Callsprettyprint show ident
show,,
13
Lambda lifting
• remove static links, only global routines• out-of-scope variables
– referencing: pass additional pointers– creating: heap allocation
typedef int (*fptr)();
fptr mies(int i) {
int aap() {return i+7;}
return aap;
}
nested
int aap(int *i) {return *i+7;}
fptr mies(int i) {
int *_i = malloc(sizeof(i));
*_i = i;
return closure(aap,_i);
}
lifted
14
Frames in MiniJava
• Package Frame – Access.java AccessList.java Frame.java
• PackageTemp– Temp.java, TempList.java, Label.java, LabelList.java
• Package Util– BoolList.java
• Package T (Mips, Sparcs)– T(Mips/Sparcs)Frame.java
• Inframe(), InReg(), newFrame(), allocLocal()
15
Package Frame
• Abstraction of Actual Frames
package Frame;
import Temp.Templ import Temp.Label;
Public abstract class Access{ … }
public class AccessList {
public Access head;
public AccessList tail;
public AccessList(Access h, AccessList t) {
head=h; tail=t;}
}
16
Frame.javapublic abstract class Frame { public abstract Frame newFrame(Temp.Label name,
Util.BoolList formals); public Temp.Label name; public AccessList formals; public abstract Access allocLocal(boolean
escape);
public abstract Temp.Temp FP(); public abstract Temp.Temp RV(); /* ..other stuff, eventually … */
// public abstract int wordSize();// public abstract Tree.Exp externalCall(String
func, Tree.ExpList args);}
17
TFrame : specific to Target Machine
• For T machine… package T;
class Frame extends Frame.Frame {
/* real definitions of Frame */
….
}
• In machine independent part of compiler // in class Main.Main:
Frame.Frame frame = new T.Frame(…);
– To hide the identity of the target machine
18
Making new Frames
– Hold information fo parameters & local variables– Frame for function f with k formals
newFrame(f, l) where f : Label l:BoolList
Ex: a three-argument function named g with 1st argument escaped (No parameters will be escapes in MiniJava.)
frame,newFrame(g,
new BoolList(true,
new BoolList(false,
new BoolList(false,null))))
19
Class Access
• Describe formal & local vars in the frame or in registers
• Abstract data type whose implementaion is visible only inside the Frame module:
package T class InFrame extends Frame.Access { int offset; InFrame (int o) {offset = o; } } class InReg extends Frame.Access { Temp.Temp temp; InReg(Temp.Temp t) {temp = t; }
20
Access and Allocate the Vars
• InFrame(X) : a memory location at offset X from the FP(frame pointer)
• InReg(t84) : in register t84
• formals in Frame.java– A list of k “accesses” denoting locations where the
formal parameters will be kept at runtime , as seen from inside the callee
– May be seen differently by the caller and calle : “shift of view”
– View shift must be handled by “newFrame()”
21
Representation of Frame Descriptions
• Implementation of frame is an object holding:– the location of all the formals– instructions required to implement the “view
shift”– the number of locals allocated so far– the “label” at which the function’s machine
code is to begin– See Table 6.4 on page 129
22
Local Variables
• To allocation a new local var in a frame f– f.allocLocal(true) //allocate in Memory– will return InFrame() access with an offset from FP
ex) two local vars in Sparcs => InFrame(-4), InFrame(-8)– f.allocLocal(false) // allocate in register– will return InReg()
ex) on register-allocated vars => InReg(t481)
• allocLocal(bool) – Called when frame is create – Called when nested block is entered
Allocating Local Storage in frame with the Same Name
function f() =
let var v1 := 6
in
print(v1);
let var v2 := 7
in print(v2);
end
print(v1);
let var v3 := 8
in print(v3);
end
print(v1);
end
allocLocal()
allocLocal()
allocLocal()
v1
v2
v3
v1 might
use same space
framepointer
stackpointer
24
Escape Variables
• No variables escape in MiniJava, because – there is no nesting of classes and methods– it is not possible to take the address of a
variable– integers and booleans are passed by value– object, including integer arrays, can be
represented as pointers that are passed by value
25
Calculating Escapes
• FindEscape(): looks for escaping variables and records this information in the escape fields of AST– Traverse the entire AST before semantic analysis
• When the variables are encounted,– Set 0 when first encountered– Set 1 when referenced at inner block!
when address is taken by &
when call-by-reference
26
Temporaries and Labels
• Temp’s are virtual registers– May not be enough registers available to store all
temporaries in a register– Delay decision until later
• Label’s are like labels in assembler, a location of a machine language instruction
• Classes Temp and Label in package Temp• Packages Frame and Temp provide machine
independent views of variables
27
Managing Static Links
• Static Link management is somewhat tedious?• MiniJava does not have nested function
declararions: thus Frame should not know anything about static links.
• It will be handled in the Translation phase.• Static links may be passed to the callee by the 1st
formal parameter.