;; this was previously called __dynamic-bind
(define impc:ti:bind-lib
(lambda (library symname type calling-convention docstring)
(if (llvm:get-function (symbol->string symname)) ;; if already bound!
(begin
(impc:ti:register-new-nativefunc (symbol->string symname) (impc:ir:get-type-from-pretty-str (symbol->string type)) "" '())
(impc:compiler:print-lib-binding-details-to-log library symname type)
(impc:aot:insert-nativefunc-binding-details library symname type docstring))
(if (not (eval library))
(impc:compiler:print-compiler-error
(string-append "the " (symbol->string library) " dynamic library appears to have not been loaded correctly"))
(let* ((ctype (cdr (impc:ir:get-type-from-pretty-str (symbol->string type))))
(ir-string (string-append "declare "
"cc " (atom->string calling-convention)
" "
(impc:ir:get-type-str (car ctype))
" @"
(symbol->string symname)
"("
(if (null? (cdr ctype))
""
(apply string-append
(impc:ir:get-type-str (cadr ctype))
(map (lambda (v)
(string-append "," (impc:ir:get-type-str v)))
(cddr ctype))))
") nounwind")))
(if (and (llvm:compile-ir ir-string)
(llvm:bind-symbol (eval library) (symbol->string symname)))
(begin
(if (output-port? *impc:aot:current-output-port*) ;; *impc:compiler:aot:dll*)
(begin (write `(llvm:bind-symbol ,library ,(symbol->string symname)) *impc:aot:current-output-port*)
(newline *impc:aot:current-output-port*)))
(impc:ti:register-new-nativefunc (symbol->string symname) (impc:ir:get-type-from-pretty-str (symbol->string type)) "" '())
(impc:compiler:print-lib-binding-details-to-log library symname type)
(impc:aot:insert-nativefunc-binding-details library symname type docstring))
(impc:compiler:print-compiler-error (string-append "could not bind " (symbol->string symname)))))))))