For the sake of the mailing list: Off-list, we confirmed that Nikhil is using 1.12. I remember hearing that support for c_void_ptr had gotten better since the last release, and believe that the difference we're seeing is the result of that.
Meanwhile, I'm starting the process of taking a quick look into what it would take to dump (at least simple) export'ed routines into their own header file (and/or protecting things in chpl__header.h that can't afford to be #included twice. (That said, I am close to timing out for the night). -Brad On Fri, 18 Mar 2016, Nikhil Padmanabhan wrote: > 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
