Hi Nikhil / all (Michael in particular may want to perk up as extern block
master) --
This may be a relatively simple fix. What I find (at least with my
version of gcc, which is... uh... Apple LLVM version 7.0.2) is that if I
compile with --savec on, the one thing that's missing is the prototype of
the 'export'ed function integrand within the 'extern block'ed code stored
in output/extern-code.c. That is, if I:
* paste the code you mailed into testit.chpl
* compile it with an LLVM-enabled copy of 'chpl' with:
chpl testit.chpl --savec output
* get the prototype for the export'ed function integrand:
grep integrand output/chpl__header.h
* paste it into the top of output/extern-code.c:
<use your favorite editor>
* recompile:
make -f output/Makefile
then things work for me (or at least the code compiles and generates:
(alpha = 1.0)
If you can reproduce this, I think that the fix in the compiler would be
as simple as:
* making sure to put all export'ed routines into a header of their own (we
should really be doing this anyway for other clients of the exported
routines... it's probably made slightly complicated by having to drag
over any types that they make use of as well
* #include-ing that routine in any code files that we generate for
extern blocks
I'm working on reproducing with a second copy of Chapel, but it means
having to re-build LLVM... (zzzzz...)
-Brad
On Fri, 18 Mar 2016, Nikhil Padmanabhan wrote:
> Hi ---
>
> I'm trying to get a call-back from C into Chapel working -- where the
> intermediate C routine needs to pass through some data from the function
> that called it to the function it's calling. (To be specific, the C routine
> does a numerical integration and it's calling the integrand).
>
> The problem here is that the Chapel callback needs to convert the void*
> back into its original form. Note that it knows exactly what the correct
> form is -- but Chapel doesn't let me convert a c_void_ptr into anything.....
>
> Appended is a relatively simple program (using the extern block feature)
> that demonstrates the issue. Any thoughts on how to work around this would
> be great. Ideally, it would be nice to just reconvert the c_void_ptr into a
> c_ptr that can be dereferences...
>
> Thanks in advance!
> -- Nikhil
>
> use SysCTypes;
>
> record R {
> var alpha : real;
> // There could be more complicated things here
> // I could define this record in C, but it would be nice
> // not to do so.
> }
>
> export proc integrand(x : real, ptr : c_void_ptr) : real {
> // THE LINE BELOW DOESN'T WORK
> var p = ptr : c_ptr(R); // How do I get this, or equivalent to work
> var r = p.deref();
> return r.alpha*x;
> }
>
> extern {
> static void integrate(void *p) {
> // A real integrator would do more
> double y;
> y = integrand(1,p);
> }
> }
>
> var r1 = new R(1.0);
> writeln(r1);
> var p1 = c_ptrTo(r1);
> integrate(p1:c_void_ptr);
> ---------------------------------
> Nikhil Padmanabhan
> [email protected]
>
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785231&iu=/4140
_______________________________________________
Chapel-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/chapel-users