<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Doing the following change seems to fix the issue:</div><div><br></div><div>diff --git a/src/cffi-ecl.lisp b/src/cffi-ecl.lisp</div><div>index 9f9500b..a31d069 100644</div><div>--- a/src/cffi-ecl.lisp</div><div>+++ b/src/cffi-ecl.lisp</div><div>@@ -290,9 +290,10 @@ WITH-POINTER-TO-VECTOR-DATA."</div><div>                 ;; On AMD64, the following code only works with the extra</div><div>                 ;; argument ",...". If this is not present, functions</div><div>                 ;; like sprintf do not work</div><div>-                (format s "extern ~A ~A(~@[~{~A~^, ~}~]);</div><div>-@(return) = ~A(~A);"</div><div>+                (format s "{extern ~A ~A(~@[~{~A~^, ~}~]);</div><div>+~A~A(~A);}"</div><div>                         (ecl-type->c-type return-type) pointer types</div><div>+                        (if (eq return-type :void) "" "@(return) =")</div><div>                         pointer</div><div>                         (subseq +ecl-inline-codes+ 0</div><div>                                 (max 0 (1- (* (length values) 3)))))))</div><div><br></div><div><br></div><div><div>On Nov 22, 2012, at 3:05 PM, Sylvain Ageneau <<a href="mailto:ageneau@gmail.com">ageneau@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Sorry that should have been:</div><div>(cffi:foreign-funcall "srand" :unsigned-int 55 :void)</div><div><br></div><div>But the issue happens the same.</div><br><div><div>On Nov 22, 2012, at 2:41 PM, Sylvain Ageneau <<a href="mailto:ageneau@gmail.com">ageneau@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">I think there's an issue with void functions, for example:<div><br></div><div>(cffi:defcfun ("srand" c-srand) :void '(:unsigned-int))</div><div><br></div><div><div>(defun test-srand ()</div><div>  "invokes srand function"</div><div>  (cffi:foreign-funcall "srand"))</div><div><br></div><div>(test-srand)</div><div><br></div><div><br></div><div><div>;;;</div><div>;;; Compiling cffi-test.lisp.</div><div>;;; OPTIMIZE levels: Safety=2, Space=0, Speed=3, Debug=0</div><div>;;;</div><div>;;; Compiling (CFFI:DEFCFUN ("srand" C-SRAND) ...).</div><div>;;; Compiling (DEFUN TEST-SRAND ...).</div><div>;;; End of Pass 1.</div><div>;;; Emitting code for C-SRAND.</div><div>;;; Error:</div><div>;;;   in file cffi-test.lisp, position 415</div><div>;;;   at (DEFCFUN (srand C-SRAND) ...)</div><div>;;;   * Used @(RETURN 0) in a C-INLINE form with 0 output values</div><div>;;; Loading "/Users/sylvain/src/LISP/cffi_ecl/cffi-test.fas"</div></div><div><br></div><div><br></div><div><br><div><div>On Nov 22, 2012, at 11:53 AM, Sylvain Ageneau <<a href="mailto:ageneau@gmail.com">ageneau@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Great!<div><br></div><div>I'll try that and report back. Many thanks.</div><div><br><div><div>On Nov 22, 2012, at 11:16 AM, Juan Jose Garcia-Ripoll <<a href="mailto:juanjose.garciaripoll@gmail.com">juanjose.garciaripoll@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">I am attaching a patch for CFFI that allows ECL to build code that does not use dlopen() but rather uses the function symbols as they are know to the C compiler. This is best explained in the code comments, which I reproduce below, and in the example.<div>

<br></div><div>The patched CFFI is available at my github account</div><div><a href="https://github.com/juanjosegarciaripoll/cffi">https://github.com/juanjosegarciaripoll/cffi</a><br><div><br></div><div>This is how the example is used<br clear="all">

<div><br></div><div><div>bash-3.2$ ecl -norc</div><div>ECL (Embeddable Common-Lisp) 12.7.1 (git:e95fa190ccab10a5dcca791658d7d3ff24a77240)</div><div>Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya</div><div>Copyright (C) 1993 Giuseppe Attardi</div>

<div>Copyright (C) 2000 Juan J. Garcia-Ripoll</div><div>ECL is free software, and you are welcome to redistribute it</div><div>under certain conditions; see file 'Copyright' for details.</div><div>Type :h for Help.  </div>

<div>Top level in: #<process TOP-LEVEL>.</div><div>> (load "build")</div><div>[...]</div><div>To load "cffi":</div><div>  Load 1 ASDF system:</div><div>    cffi</div><div>; Loading "cffi"</div>

<div><br></div><div>;;;</div><div>;;; Compiling cffi-test.lisp.</div><div>;;; OPTIMIZE levels: Safety=2, Space=0, Speed=3, Debug=0</div><div>;;;</div><div>;;; Compiling (CFFI:DEFCFUN ("sin" C-SINE) ...).</div><div>

;;; Compiling (DEFUN FF-C-SINE ...).</div><div>;;; End of Pass 1.</div><div>;;; Emitting code for C-SINE.</div><div>;;; Emitting code for FF-C-SINE.</div><div>;;; Finished compiling cffi-test.lisp.</div><div>;;;</div><div>

;;; Loading "/Users/jjgarcia/build/cffi-static/cffi-test.fas"</div><div><br></div><div> sin(pi) = 1.22464679914735320720000000000000d-16</div><div>#P"/Users/jjgarcia/build/cffi-static/build.lisp"</div>

</div><div><br></div><div>This is the self-explanatory comment</div><div><br></div><div><div>;;;</div><div>;;; ECL allows many ways of calling a foreign function, and also many</div><div>;;; ways of finding the pointer associated to a function name. They</div>

<div>;;; depend on whether the FFI relies on libffi or on the C/C++ compiler,</div><div>;;; and whether they use the shared library loader to locate symbols</div><div>;;; or they are linked by the linker.</div><div>;;;</div>

<div>;;;  :DFFI</div><div>;;;</div><div>;;;  ECL uses libffi to call foreign functions. The only way to find out</div><div>;;;  foreign symbols is by loading shared libraries and using dlopen()</div><div>;;;  or similar.</div>

<div>;;;</div><div>;;;  :DLOPEN</div><div>;;;</div><div>;;;  ECL compiles FFI code as C/C++ statements. The names are resolved</div><div>;;;  at run time by the shared library loader every time the function</div><div>;;;  is called</div>

<div>;;;</div><div>;;;  :C/C++</div><div>;;;</div><div>;;;  ECL compiles FFI code as C/C++ statements, but the name resolution</div><div>;;;  happens at link time. In this case you have to tell the ECL</div><div>;;;  compiler which are the right ld-flags (c:*ld-flags*) to link in</div>

<div>;;;  the library.</div><div>;;;</div><div>(defvar *cffi-ecl-method*</div><div>  #+dffi :dffi</div><div>  #+(and dlopen (not dffi)) :dlopen</div><div>  #-(or dffi dlopen) :c/c++</div><div>  "The type of code that CFFI generates for ECL: :DFFI when using the</div>

<div>dynamical foreign function interface; :DLOPEN when using C code and</div><div>dynamical references to symbols; :C/C++ for C/C++ code with static</div><div>references to symbols.")</div></div><div><br></div><div>

<br></div>-- <br>Instituto de Física Fundamental, CSIC<br>c/ Serrano, 113b, Madrid 28006 (Spain) <br><a href="http://juanjose.garciaripoll.googlepages.com/" target="_blank">http://juanjose.garciaripoll.googlepages.com</a><br>


</div></div>
<span><build.lisp></span><span><cffi-test.lisp></span><span><0001-Allow-the-ECL-backend-to-support-different-combinati.patch></span></blockquote></div><br></div></div></blockquote></div><br></div></div></div></blockquote></div><br></div></blockquote></div><br></body></html>