boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

054-init-struct-desig.scm (965B)


      1 ;; tests/cc-cg/54-init-struct-desig.scm — global struct designated init.
      2 ;; §E.6.
      3 ;;
      4 ;; Models: struct S { int a; int b; }; struct S s = {.b = 7};
      5 ;; Read b. With proper init, b == 7 and a == 0.
      6 ;; main returns *p where p = (int*)&s + 1 (== &s.b == 7).
      7 
      8 (let* ((cg  (cg-init))
      9        (sty (%ctype 'struct 8 4
     10                     (list "S" #t
     11                           (list (list "a" %t-i32 0)
     12                                 (list "b" %t-i32 4)))))
     13        (s   (%sym "s" 'var 'static sty #f))
     14        ;; Designated init: zero pad for a, then 7 for b.
     15        (pad (make-bytevector 4 0))
     16        (bvB (make-bytevector 4 0)) (_b (bytevector-u8-set! bvB 0 7)))
     17   (cg-emit-global cg s (list pad bvB))
     18   (cg-fn-begin cg "main" '() %t-i32)
     19   (cg-push-sym cg s) (cg-take-addr cg)
     20   (cg-cast cg (%ctype 'ptr 8 8 %t-i32))
     21   (cg-push-imm cg %t-i32 1)
     22   (cg-binop cg 'add)
     23   (cg-push-deref cg) (cg-load cg)
     24   (cg-return cg)
     25   (cg-fn-end cg)
     26   (write-bv-fd 1 (cg-finish cg)))