Hi Brad,
I'm missing something here.
When I try
chpl testit.chpl --savec output
I get
testit.chpl:12: error: illegal cast from c_void_ptr to c_ptr(R)
It only has two files in the output directory --- it doesn't look like it
even got to making the chpl__header.h file.
Hm.
-- Nikhil
---------------------------------
Nikhil Padmanabhan
[email protected]
On Fri, Mar 18, 2016 at 7:17 PM, Brad Chamberlain <[email protected]> wrote:
>
> 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