Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #lang racket
- (require sham/private/jit)
- (require sham/private/llvm/ffi/all
- sham/private/llvm/adjunct
- sham/private/llvm/pass-table)
- (require sham/private/env
- sham/private/init
- sham/private/types
- sham/private/ast
- sham/private/mod-env-info
- sham/private/rator
- sham/private/dump
- sham/private/utils)
- (require racket/unsafe/ops)
- (require rackunit)
- (require disassemble)
- (require sham/private/optimize)
- (require (submod sham/ast utils))
- (define i32 (sham:type:ref 'i32))
- (define icmp-eq (sham:rator:symbol 'icmp-eq))
- (define (build-app rator . rands)
- (sham:expr:app rator rands))
- (define (ui32 v)
- (sham:expr:ui-value v i32))
- (define ret sham:stmt:return)
- (define v sham:expr:var)
- (define rs sham:rator:symbol)
- (define (defn n args types ret-type stmt) (sham:def:function (make-hash) n args types ret-type stmt))
- (define module-env
- (compile-module
- (sham:module
- (empty-module-info)
- (list
- (defn 'fact '(x) (list i32) i32
- (sham:stmt:if (build-app icmp-eq (v 'x) (ui32 0))
- (ret (ui32 1))
- (ret (build-app (rs 'mul)
- (v 'x)
- (build-app (rs 'fact)
- (build-app (rs 'sub)
- (v 'x) (ui32 1)))))))))))
- (optimize-module module-env #:opt-level 3)
- (initialize-jit! module-env #:opt-level 3)
- (jit-dump-module module-env)
- (printf "verifying module: ~a\n" (jit-verify-module module-env))
- (disassemble-ffi-function (jit-get-function-ptr 'fact module-env)
- #:size 50)
- (printf "running tests\n")
- (define fact (jit-get-function 'fact module-env))
- (check-eq? (fact 5) 120)
Add Comment
Please, Sign In to add comment