1 / 36

Compiler construction in4020 – lecture 11

Compiler construction in4020 – lecture 11. Koen Langendoen Delft University of Technology The Netherlands. Assignment 1: results. test results (3 - 14) expression priorities error recovery corner cases code ( 5- 7) Makefile documentation ( 5- 7) 2 pages!!.

Download Presentation

Compiler construction in4020 – lecture 11

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Compiler constructionin4020 – lecture 11 Koen Langendoen Delft University of Technology The Netherlands

  2. Assignment 1: results • test results (3-14) • expression priorities • error recovery • corner cases • code (5-7) • Makefile • documentation (5-7) • 2 pages!! thoroughly test your compiler

  3. ptr to B ptr to A inside B a1 m1_A_A a2 m2_A_B b1 m3_B_B B-object B-class Summary of lecture 10 • assemblers & linkers • OO programming • translation to C • method tables

  4. Quiz [Assignment 2]Which of the following features are part of OO-Asterix? • inheritance • method overriding • polymorphism • dynamic binding • (dependent) multiple inheritance Do we need method tables? If so, which flavor?

  5. Overview • routine types • activation records • invocation • values • code generation for control flow statements • boolean expressions • selection statements • repetition statements

  6. Routines and their activations • functionality of a routine call • supplying a new computing environment • passing information to the new environment • transfer of the flow-of-control to the new environment and (guaranteed) return • returning info from the new environment

  7. Activation records parameter k ... parameter 1 • activation record holds • local variables • parameters • working stack • administration part • routine activation order • last-in-first-out stack • otherwise  heap lexical pointer registers dynamic link return info frame ptr local variables FP working stack stack ptr SP

  8. parameter k parameter 1 ... Routine invocation registers dynamic link return address FP • caller builds new stack frame for callee • push parameters • push admin • transfer control to callee • stack return address, adjust FP • allocate space for local vars • execute code local variables working stack SP

  9. parameter n parameter 1 parameter k parameter 1 ... ... Routine invocation registers dynamic link return address FP • caller builds new stack frame for callee • push parameters • push admin • transfer control to callee • stack return address, adjust FP • allocate space for local vars • execute code local variables working stack SP

  10. parameter n parameter 1 parameter k parameter 1 ... ... Routine invocation registers dynamic link return address FP • caller builds new stack frame for callee • push parameters • push admin • transfer control to callee • stack return address, adjust FP • allocate space for local vars • execute code local variables working stack registers dynamic link return address SP

  11. parameter n parameter 1 parameter k parameter 1 ... ... Routine invocation registers dynamic link return address • caller builds new stack frame for callee • push parameters • push admin • transfer control to callee • stack return address, adjust FP • allocate space for local vars • execute code local variables working stack registers dynamic link return address SP FP

  12. parameter n parameter 1 parameter k parameter 1 ... ... Routine invocation registers dynamic link return address • caller builds new stack frame for callee • push parameters • push admin • transfer control to callee • stack return address, adjust FP • allocate space for local vars • execute code local variables working stack registers dynamic link return address FP local variables SP

  13. parameter n parameter 1 parameter k parameter 1 ... ... Routine invocation registers dynamic link return address • caller builds new stack frame for callee • push parameters • push admin • transfer control to callee • stack return address, adjust FP • allocate space for local vars • execute code local variables working stack registers dynamic link return address FP local variables working stack SP

  14. aap mies parameter i parameter i static link dynamic link return address static link dynamic link return address noot parameter i static link dynamic link return address Nested routines • activation record contains a lexical pointer or static link that points to outer scope int aap( int i) { int noot() {return i+7;} int mies(int i) {return i+noot();} return mies(2)-3; }

  15. Exercise (5 min.) • Given the GNU C routine: a) draw the stack that results from the call A(2) b) how does C access the parameter (a) from A? void A(int a) { void B(int b) { void C(void) { printf(“C called, a = %d\n”, a); } if (b == 0) C() else B(b-1); } B(a); }

  16. Answers

  17. dynamic links static links A 2 B 2 B 1 B 0 C Answers FP->static_link->static_link->param[#i]

  18. Break

  19. Operations on routines • calling • passing as a parameter • returning as a value • currying [functional programming, chap 7]

  20. flat int aap(int i) {return i+7;} int noot(int i, int (*f)(int)) {return (*f)(i);} int mies(int i) {return noot(i,aap);} address nested int noot(int (*f)()) {return (*f)();} int mies(int i) { int aap() {return i+7;} return noot(aap); } static link address Passing a routine as a parameter

  21. flat typedef int (*fptr)(int); int aap(int i) {return i+7;} fptr mies() {return aap;} nested typedef int (*fptr)(); fptr mies(int i) { int aap() {return i+7;} return aap; } return routine descriptor Returning a routine as a value return routine address and allocate activation records on the heap

  22. Lambda lifting • remove static links, only global routines • out-of-scope variables • referencing: pass additional pointers • creating: heap allocation int aap(int *i) {return *i+7;} fptr mies(int i) { int *_i = malloc(sizeof(i)); *_i = i; return closure(aap,_i); } typedef int (*fptr)(); fptr mies(int i) { int aap() {return i+7;} return aap; } nested lifted

  23. cmpl %eax,%edx jle L3 Code generation forcontrol flow statements • glue between basic blocks

  24. Boolean expressionsin flow of control • why special code generation? • performance: avoid conversions • lazy semantics: || and && in C Code expr( ”list != NULL”, r1) Code expr( ” list->key < key”, r2) IF NOT(r1 and r2) THEN GOTO label-end … label-end: if (list != NULL && list->key < key) { ... }

  25. PROCEDURE Boolean control code(Node, True label, False label): SELECT Node.type CASE Lazy and type: Boolean control code( Node.left, No label, False label); Boolean control code( Node.right, True label, False label); CASE Lazy or type: Boolean control code( Node.left, True label, No label); Boolean control code( Node.right, True label, False label); CASE Comparison type: Code expr( Node.left, R1) Code expr( Node.right, R2); IF True label /= No label): Emit(”IF” R1 Node.op R2 ”THEN GOTO” True label); IF False label /= No label): Emit( ”GOTO” False label); ELSE Emit(”IF” R1 Inv(Node.op) R2 ”THEN GOTO” False label); PROCEDURE Boolean control code(Node, True label, False label): SELECT Node.type CASE Lazy and type: Boolean control code( Node.left, No label, False label); Boolean control code( Node.right, True label, False label); CASE Lazy or type: Boolean control code( Node.left, True label, No label); Boolean control code( Node.right, True label, False label); CASE Comparison type: Code expr( Node.left, R1) Code expr( Node.right, R2); IF True label /= No label): Emit(”IF” R1 Node.op R2 ”THEN GOTO” True label); IF False label /= No label): Emit( ”GOTO” False label); ELSE Emit(”IF” R1 Inv(Node.op) R2 ”THEN GOTO” False label); PROCEDURE Boolean control code(Node, True label, False label): SELECT Node.type CASE Lazy and type: Boolean control code( Node.left, No label, False label); Boolean control code( Node.right, True label, False label); CASE Lazy or type: Boolean control code( Node.left, True label, No label); Boolean control code( Node.right, True label, False label); CASE Comparison type: Code expr( Node.left, R1) Code expr( Node.right, R2); IF True label /= No label): Emit(”IF” R1 Node.op R2 ”THEN GOTO” True label); IF False label /= No label): Emit( ”GOTO” False label); ELSE Emit(”IF” R1 Inv(Node.op) R2 ”THEN GOTO” False label); PROCEDURE Boolean control code(Node, True label, False label): SELECT Node.type CASE Lazy and type: Boolean control code( Node.left, No label, False label); Boolean control code( Node.right, True label, False label); CASE Lazy or type: Boolean control code( Node.left, True label, No label); Boolean control code( Node.right, True label, False label); CASE Comparison type: Code expr( Node.left, R1) Code expr( Node.right, R2); IF True label /= No label): Emit(”IF” R1 Node.op R2 ”THEN GOTO” True label); IF False label /= No label): Emit( ”GOTO” False label); ELSE Emit(”IF” R1 Inv(Node.op) R2 ”THEN GOTO” False label); PROCEDURE Boolean control code(Node, True label, False label): SELECT Node.type CASE Lazy and type: Boolean control code( Node.left, No label, False label); Boolean control code( Node.right, True label, False label); CASE Lazy or type: Boolean control code( Node.left, True label, No label); Boolean control code( Node.right, True label, False label); CASE Comparison type: Code expr( Node.left, R1) Code expr( Node.right, R2); IF True label /= No label): Emit(”IF” R1 Node.op R2 ”THEN GOTO” True label); IF False label /= No label): Emit( ”GOTO” False label); ELSE Emit(”IF” R1 Inv(Node.op) R2 ”THEN GOTO” False label);

  26. The if-statement if -statement condition true stmt false stmt IF THEN ELSE Boolean control code( condition, No_label, false_label) Code statement( true stmt) GOTO end_label; false_label: Code statement( false stmt) end_label:

  27. The if-statement if -statement condition true stmt false stmt IF THEN ELSE Boolean control code( condition, No_label, false_label) Code statement( true stmt) GOTO end_label: false_label: Code statement( false stmt) end_label: Boolean control code( condition, No_label, end_label) Code statement( true stmt) end_label:

  28. The case-statement Code expr( expression, Rexpr) IF Rexpr = I1 THEN GOTO label_1 ... IF Rexpr = In THEN GOTO label_n GOTO label_else; label_1: Code statement (statement1) GOTO end_label; ... label_n: Code statement (statementn) GOTO end_label; label_else: Code statement (statementdefault) end_label: CASE expressionIN I1: statement1 ... In: statementn ELSE statementdefault END CASE

  29. jump table .data case_table: label_low ... label_high The case-statement CASE expressionIN I1: statement1 ... In: statementn ELSE statementdefault END CASE Code expr( expression, Rexpr) IF Rexpr < Ilow THEN GOTO label_else IF Rexpr > Ihigh THEN GOTO label_else GOTO case_table[Rexpr- Ilow]; label_1: ...

  30. The while-statement while -statement condition statement WHILE DO END WHILE test_label: Boolean control code( condition, No_label, end_label) Code statement( statement) GOTO test_label; end_label: GOTO test_label; loop_label: Code statement( statement) test_label: Boolean control code( condition, loop_label , No_label)

  31. Code expr( lower bound, Ri) Code expr( upper bound, Rub) IF Ri > Rub THEN GOTO end_label loop_label: Code statement (statement) IF Ri = Rub THEN GOTO end_label Ri := Ri+1; GOTO loop_label; end_label: i:=lower bound; tmp_ub:=upper bound; WHILE i <= tmp_ub DO statement i := i+1; END FOR test before increment The for-statement FOR i IN lower bound.. upper bound DO statement END FOR

  32. Exercise (3 min.) • give a translation schema for repeat statements repeat -statement statement condition REPEAT UNTIL END REPEAT

  33. Answers

  34. Answers repeat -statement statement condition REPEAT UNTIL END REPEAT repeat_label: Code statement( statement) Boolean control code( condition, No_label , repeat_label)

  35. mies parameter i static link dynamic link return address noot parameter i static link dynamic link return address Summary • (nested) routines • activation records • routine descriptors • code generation for control flow statements • conditional expressions: true & false labels • case-statement: jump table • for-statement: overflow

  36. Homework • study sections: • 6.5Code generation for modules • assignment 2: • make Asterix OO • deadline June 4 08:59 • print handout for next week [blackboard]

More Related