| Moving towards Run-Time Organisation | |
| Generic stack-based model & abstract machine code | |
| Function calling conventions | |
| Locals/Arguments in registers or in memory? | |
| Handling nested scopes | |
| For speed, keep as much as possible in registers | ||
| When f calls g and both require register r, who manages r? | ||
| Caller save – if r must be saved by f | ||
| Callee save – if r must be saved by g | ||
| Also in registers where possible | ||
| Registers may be reused in subsequent calls | ||
| Caller reserves memory to save them | ||
| Callee saves as necessary | ||
| Return address and result often passed in a register as well | ||
Frame resident variables… when?
| Variable accessed in a function nested within this one | ||
| The variable has escaped | ||
| Register holding variable needed for something else | ||
| No other register available | ||
| Too many locals/temporaries/parameters to fit in registers | ||
| And so they spill out into the frame | ||
Escaping variables – static links
| Code of inner function can access variables in a lexically outer function | ||
| Frames matching lexical structure must be linked together | ||
| Each frame has a static link to the frame of the function statically or lexically enclosing it | ||
| Read up – P138 | ||
So what information is required?
| Identify which values can be held in registers, which must be in memory | ||
| Escapes in memory | ||
| Note - at this stage, a property of the source language | ||
| Develop an abstraction for frame layout | ||
| Initially to record this information | ||
| Notion of levels required to model nesting depth | ||
| Additional pass over the AST, before any type checking/ translation | ||
| Add escape? field to locals and formals in AST, initially set to false | ||
| Construct symbol table during pass | ||
| Entry for every local and formal, indicating lexical level and with a pointer to AST entry | ||
| On every access to local/formal | ||
| Lookup in table, check if declaration level is greater than current level – set escape? to true if so | ||
| Semantic analysis phase would like to | ||
| allocate machine registers to parameters and locals | ||
| allocate memory addresses for code bodies | ||
| Too early for this… | ||
| So use temporaries – abstract names – for registers, and | ||
| labels for static memory addresses | ||
| Translate | |||
| Level | |||
| Translate.AccessList | |||
| Translate.Access | |||
| Frame | |||
| Frame abstract class – realised for specific architectures | |||
| Frame.AccessList | |||
| Frame. Access | |||
| Temp | |||
| Label and Temp | |||
| Semant | |||
| Absyn | |||
| Read through Chapter 6 | ||||
| 6.1 Stack Frames | ||||
| Although note that the discussion on parameter passing is wider than we need | ||||
| Be sure about static links | ||||
| Work through the example if necessary | ||||
| 6.2 Frames in Tiger | ||||
| Rather an opaque treatment | ||||
| Read as much as you like, but concentrate on | ||||
| Calculating escapes | ||||
| Temporaries and labels | ||||
| Managing static links | ||||
| The rest is easier to understand with the code nearby | ||||
| I’ll set up the code for download by Wednesday a.m. | ||||