boot2

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

038-arrow.scm (1827B)


      1 ;; tests/cc-cg/38-arrow.scm — pointer-to-struct field access via cg.
      2 ;; Models p->a / p->b through:
      3 ;;   cg-push-sym sym-p     ; lval (frame), holds ptr-value
      4 ;;   cg-load               ; rval ptr
      5 ;;   cg-push-deref         ; lval struct (indirect)
      6 ;;   cg-push-field "a"     ; lval int at p+0
      7 ;;
      8 ;;   struct S { int a; int b; }; struct S s;
      9 ;;   struct S *p = &s; p->a = 4; p->b = 9; return p->b - p->a;
     10 ;; (The cg fixture takes &s into a frame slot directly so we don't
     11 ;; depend on parser-only address-of plumbing.)
     12 ;;
     13 ;; Expected: 9 - 4 == 5.
     14 
     15 (let* ((cg     (cg-init))
     16        (st-ty  (%ctype 'struct 8 4
     17                        (list "S" #t
     18                              (list (list "a" %t-i32 0)
     19                                    (list "b" %t-i32 4)))))
     20        (pt-ty  (%ctype 'ptr 8 8 st-ty)))
     21   (cg-fn-begin cg "main" '() %t-i32)
     22   (let* ((off-s (cg-alloc-slot cg 8 4))
     23          (off-p (cg-alloc-slot cg 8 8))
     24          (sym-s (%sym "s" 'var 'auto st-ty off-s))
     25          (sym-p (%sym "p" 'var 'auto pt-ty off-p)))
     26     ;; p = &s
     27     (cg-push-sym cg sym-p)
     28     (cg-push-sym cg sym-s)
     29     (cg-take-addr cg)
     30     (cg-assign cg) (cg-pop cg)
     31     ;; p->a = 4
     32     (cg-push-sym cg sym-p)
     33     (cg-load cg)
     34     (cg-push-deref cg)
     35     (cg-push-field cg "a")
     36     (cg-push-imm cg %t-i32 4)
     37     (cg-assign cg) (cg-pop cg)
     38     ;; p->b = 9
     39     (cg-push-sym cg sym-p)
     40     (cg-load cg)
     41     (cg-push-deref cg)
     42     (cg-push-field cg "b")
     43     (cg-push-imm cg %t-i32 9)
     44     (cg-assign cg) (cg-pop cg)
     45     ;; return p->b - p->a
     46     (cg-push-sym cg sym-p)
     47     (cg-load cg)
     48     (cg-push-deref cg)
     49     (cg-push-field cg "b")
     50     (cg-load cg)
     51     (cg-push-sym cg sym-p)
     52     (cg-load cg)
     53     (cg-push-deref cg)
     54     (cg-push-field cg "a")
     55     (cg-load cg)
     56     (cg-binop cg 'sub)
     57     (cg-return cg))
     58   (cg-fn-end cg)
     59   (write-bv-fd 1 (cg-finish cg)))