CSE 131 B Compiler Construction II Discussion 8
CSE 131 B – Compiler Construction II Discussion 8: Complex Data Structures 3/7/2007 Reminder: No class Thursday – lab hours instead
Example of Arrays in Details TYPE arr = ARRAY 10 OF INTEGER; TYPE dbl. Arr = ARRAY 5 OF arr; VAR x : INTEGER; VAR my. Arr : dbl. Arr; BEGIN x : = 3; my. Arr[x][7] : = 99; WRITE my. Arr[x][7]; my. Arr[1] : = my. Arr[x]; WRITE my. Arr[1][7]; END.
Resulting Code. section ". rodata" int. Fmt: . asciz "%d". section ". bss". align 4. skip 204 ! 4 for int, 200 for array of array globals: ! x is at %l 7 -4 ! my. Arr is at %l 7 -204. section ". text". align 4. global main: set save set SAVE. main, %g 1 %sp, %g 1, %sp globals, %l 7 ! x : = 3 set 3, %l 0 st %l 0, [%fp-4] ld [%fp-4], %l 0 st %l 0, [%l 7 -4] ! my. Arr[x][7] : = 99 ld [%l 7 -4], %l 0 st %l 0, [%fp-8] ld [%fp-8], %o 0 set 40, %o 1 call. mul nop sub %l 7, 204, %l 0 add %l 0, %o 0, %l 0 st %l 0, [%fp-12] set 7, %l 0 ! tmp 1 (value) ! assign into x ! get x ! tmp 2 (value) ! size of "arr" ! ! base of my. Arr add offset of "x“ tmp 3 (address) set 7 st ld set call nop ld add st set st ld ld st %l 0, [%fp-16], %o 0 4, %o 1. mul ! tmp 4 (value) [%fp-12], %l 0, %o 0, %l 0, [%fp-20] 99, %l 0, [%fp-24], %l 0 [%fp-20], %l 1 %l 0, [%l 1] ! ! ! ! ! WRITE ld st ld set call nop sub add st set st ld set call nop ld add st set ld ld call nop my. Array[x][7] [%l 7 -4], %l 0, [%fp-28], %o 0 40, %o 1. mul ! size of "INTEGER" base of my. Arr[x]-- Note difference! add offset of "7" tmp 5 (address) set 99 tmp 6 (value) get rhs get dest addr do assignment ! get x ! tmp 7 (value) ! size of "arr" %l 7, 204, %l 0, %o 0, %l 0, [%fp-32] 7, %l 0, [%fp-36], %o 0 4, %o 1. mul ! ! ! base of my. Arr add offset of "x" tmp 8 (address) set 7 tmp 9 (value) [%fp-32], %l 0, %o 0, %l 0, [%fp-40] int. Fmt, %o 0 [%fp-40], %l 0 [%l 0], %o 1 printf ! base of my. Arr[x] – Note difference! ! add offset of "7" ! tmp 10 (address) ! size of "INTEGER" ! get addr of my. Arr[x][7] ! load value
Resulting Code ! my. Arr[1] : = my. Arr[x] set 1, %l 0 st %l 0, [%fp-44] ld [%fp-44], %o 0 set 40, %o 1 call. mul nop sub %l 7, 204, %l 0 add %l 0, %o 0, %l 0 st %l 0, [%fp-48] ld [%l 7 -4], %l 0 st %l 0, [%fp-52] ld [%fp-52], %o 0 set 40, %o 1 call. mul nop sub %l 7, 204, %l 0 add %l 0, %o 0, %l 0 st %l 0, [%fp-56] ld ld set call nop [%fp-48], %o 0 [%fp-56], %o 1 40, %o 2 memcpy ! set 1 ! tmp 11 (value) ! size of "arr" ! ! ! base of my. Arr add offset of "1" tmp 12 (address) get x tmp 13 (value) ! size of "arr" ! ! ! ! base of my. Arr add offset of "x" tmp 14 (address) do memcpy for array assignment dest address src address num bytes (size of "arr") ! WRITE set st ld set call nop sub add st set st ld set call nop ld my. Arr[1][7] 1, %l 0, [%fp-60], %o 0 40, %o 1. mul add st set ld ld call nop %l 0, %o 0, %l 0, [%fp-72] int. Fmt, %o 0 [%fp-72], %l 0 [%l 0], %o 1 printf ! set 1 ! tmp 15 (value) ! size of "arr" %l 7, 204, %l 0, %o 0, %l 0, [%fp-64] 7, %l 0, [%fp-68], %o 0 4, %o 1. mul ! ! ! [%fp-64], %l 0 ! ! ret restore SAVE. main = -(92 + 72) & -8 base of my. Arr add offset of "1" tmp 16 (address) set 7 tmp 17 (value) ! size of "INTEGER" base of my. Arr[1] Note difference! add offset of "7" tmp 18 (address) ! get addr of my. Arr[1][7] ! load value ! 18 temp vars (4 bytes each)
Is it an address or a value? w Similar to VAR parameters, your objects (temp mem or STOs) may be holding either a value or an address. In the prior example, some of the temps were holding addresses. In that example, the resulting Var. STO from the Designator 2 rule has a temp %fp-XX address, which itself also hold an address. w It may be useful to have some sort of indicator in your STOs, similar to how you did VAR parameters.
Example of Pointers TYPE rec = RECORD x, y : INTEGER; VAR my. Ptr 1, my. Ptr 2 : POINTER to rec; BEGIN my. Ptr 1 : = NIL; my. Ptr 2 : = NIL; NEW my. Ptr 1; IF (my. Ptr 1 # NIL) THEN my. Ptr 1. y : = 77; my. Ptr 2 : = my. Ptr 1; my. Ptr 1 : = NIL; END; WRITE my. Ptr 2. y; END.
Resulting Code. section ". rodata" int. Fmt: . asciz "%d" ! (my. Ptr 1 # NIL) ld [%l 7 -4], %l 0 mov %g 0, %l 1 cmp %l 0, %l 1 mov 0, %l 2 be L 1 nop mov 1, %l 2 . section ". bss". align 4. skip 8 ! 4 for my. Ptr 1, 4 for my. Ptr 2 globals: ! my. Ptr 1 is at %l 7 -4 ! my. Ptr 2 is at %l 7 -8. section ". text". align 4. global main st ! my. Ptr 2 : = NIL mov %g 0, %l 0 st %l 0, [%fp-8] ld [%fp-8], %l 0 st %l 0, [%l 7 -8] ! NEW my. Ptr 1 set 1, %o 0 set 8, %o 1 calloc nop st %o 0, [%l 7 -4] ! NIL is address "0" ! tmp 1 (address) ! assign address into my. Ptr 1 ! NIL is address "0" ! tmp 2 (address) ! assign address into my. Ptr 2 ! 1 element ! 8 bytes wide ! dynamically allocate ! make my. Ptr 1 point to new mem %l 2, [%fp-12] ! IF (my. Ptr 1 # NIL) ld [%fp-12], %l 0 cmp %l 0, %g 0 be L 2 nop ! my. Ptr 1. y : = 77 ld [%l 7 -4], %l 0 set 4, %l 1 add %l 0, %l 1, %l 0 st %l 0, [%fp-16] set 77, %l 0 st %l 0, [%fp-20] ld [%fp-20], %l 0 ld [%fp-16], %l 1 st %l 0, [%l 1] ! my. Ptr 2 : = my. Ptr 1 ld [%l 7 -4], %l 0 st %l 0, [%fp-28] ld [%fp-28], %l 0 st %l 0, [%l 7 -8] ! my. Ptr 1 : = NIL mov %g 0, %l 0 st %l 0, [%fp-32] ld [%fp-32], %l 0 st %l 0, [%l 7 -4] SAVE. main, %g 1 %sp, %g 1, %sp globals, %l 7 ! my. Ptr 1 : = NIL mov %g 0, %l 0 st %l 0, [%fp-4] ld [%fp-4], %l 0 st %l 0, [%l 7 -4] ! result initially FALSE ! opposite logic ! change result to TRUE L 1: main: set save set ! get my. Ptr 1 ! set NIL L 2: ! tmp 3 (value) ! get IF condition ! compare with FALSE ! opposite logic ! ! ! ! ! get my. Ptr 1 base address offset of "y" my. Ptr 1. y's address tmp 4 (address) set 77 tmp 5 (value) get 77 get my. Ptr 1. y's address do assign ! ! get my. Ptr 1 base address tmp 7 (address) get my. Ptr 1's address assign into my. Ptr 2 ! NIL is address "0" ! tmp 8 (address) ! assign address into my. Ptr 1 ! End of IF Body
Resulting Code ! WRITE my. Ptr 2. y ld [%l 7 -8], %l 0 set 4, %l 1 add %l 0, %l 1, %l 0 st %l 0, [%fp-36] set int. Fmt, %o 0 ld [%fp-36], %l 0 ld [%l 0], %o 1 call printf nop ret restore SAVE. main = -(92 + 36) & -8 ! ! my. Ptr 2 base address y's offset my. Ptr 2. y's address tmp 9 (address) ! get my. Ptr 2. y's address ! get my. Ptr 2. y's value
Value vs VAR Thoughts TYPE ptr = POINTER TO RECORD x, y, z : INTEGER; END; VAR global. Ptr : ptr; PROCEDURE foo(VAR xxx : ptr); BEGIN xxx : = NIL; (* works *) NEW xxx; (* works *) xxx. x : = 99; (* works *) END foo; PROCEDURE baz(xxx : ptr); BEGIN xxx : = NIL; (* no side effect *) NEW xxx; (* no side effect *) xxx. x : = 99; (* works *) END baz;
What to do Next! 1. Finish Phase 3. 2. Thoroughly test and re-test Phase 1, 2, and 3. 3. Come to lab hours and ask questions.
Topics/Questions you may have w Anything else you would like me to go over now? w Anything in particular you would like to see next week?
- Slides: 11