/ tests / orcjit-test.scm
orcjit-test.scm
  1  #!/usr/bin/env -S guile --no-auto-compile -L . -L lib
  2  !#
  3  (define-module (tests rocjit-test)
  4    #:use-module(llvm)
  5    #:use-module(llvm orc)
  6    #:use-module(llvm lljit)
  7    #:use-module(llvm instruction)
  8    #:use-module(ice-9 binary-ports)
  9    #:use-module(ice-9 popen)
 10    #:use-module(rnrs bytevectors)
 11    #:use-module(llvm memory-buffer)
 12    #:use-module(llvm execution-engine)
 13    #:use-module(system repl server)
 14    #:use-module(system foreign)
 15    #:use-module(llvm object)
 16    #:use-module(llvm module)
 17    #:use-module(llvm attribute)
 18    #:use-module(llvm use)
 19    #:use-module(llvm types)
 20    #:use-module(llvm context)
 21    #:use-module(llvm pass-manager)
 22    #:use-module(llvm block)
 23    #:use-module(llvm raw)
 24    #:use-module((llvm type) #:hide (array-type))
 25    #:use-module((llvm type) #:select ((array-type . llvm-array-type)))
 26    #:use-module(llvm target-machine)
 27    #:use-module(oop goops)
 28    #:use-module(llvm value)
 29    #:use-module(llvm function)
 30    #:use-module(llvm builder)
 31    #:use-module(llvm utils)
 32    #:use-module(srfi srfi-1)
 33    #:use-module(srfi srfi-71)
 34    #:use-module (srfi srfi-64)
 35    #:use-module (llvm lljit)
 36    #:use-module (llvm orc)
 37    #:use-module (srfi srfi-64)
 38    #:use-module (ice-9 binary-ports)
 39    #:use-module (system foreign)
 40    #:use-module (llvm module)
 41    #:use-module (llvm use)
 42    #:use-module (llvm context)
 43    #:use-module (llvm pass-manager)
 44    #:use-module (llvm block)
 45    #:use-module (llvm raw)
 46    #:use-module (llvm types)
 47    #:use-module (llvm type)
 48    #:use-module (llvm target-machine)
 49    #:use-module (llvm value)
 50    #:use-module (llvm function)
 51    #:use-module (llvm builder)
 52    #:use-module (llvm utils)
 53    #:use-module (llvm execution-engine)
 54    #:use-module (llvm error)
 55    #:use-module (llvm memory-buffer)
 56    #:use-module (llvm object)
 57    #:use-module (llvm bitcode))
 58  
 59  (test-begin "orcjit-test")
 60  (init-llvm!)
 61  
 62  (define (create-demo-module)
 63    (let* ((ts-ctx (orc-create-thread-safe-context))
 64           (ctx (orc-thread-safe-context-get-context ts-ctx)))
 65  
 66      (parameterize ((current-llvm-context ctx))
 67        (let* ((module (module-create "demo"))
 68               (sum-function (add-function module #:name "sum"
 69                                           #:return (int32-type)
 70                                           #:arg-types
 71                                           (list (int32-type)
 72                                                 (int32-type))))
 73               (entrybb (append-block sum-function "entry"))
 74               (builder (builder-create))
 75               (_ (position-builder-at-end builder entrybb))
 76               (result (build-add builder (param sum-function 0)
 77                                  (param sum-function 1)
 78                                  #:name "result")))
 79          (build-return builder result)
 80          (pk 'a (module-verify module))
 81          (orc-create-thread-safe-module module ts-ctx)))))
 82  
 83  (test-assert "lljit"
 84    (let* ((context (context-create)))
 85      (parameterize ((current-llvm-context context))
 86        (let* ((jit (orc-create-lljit))
 87               (tm (create-target-machine))
 88               (m (create-demo-module)))
 89          (orc-lljit-add-llvm-ir-module!
 90           jit
 91           (orc-lljit-get-main-JITDylib jit)
 92           m)
 93          (let* ((p (orc-lljit-lookup jit "sum"))
 94                 (sum (pointer->procedure int32 p (list int32 int32))))
 95            (pk 'sum (sum 30 50)))
 96          (gc)))))
 97  
 98  (sleep 1)
 99  (test-end)
100  ;; Local Variables:
101  ;; mode: scheme
102  ;; End: