jextract woes
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Jan 27 11:16:45 UTC 2020
On 27/01/2020 11:00, Michael Zucchi wrote:
>
> Hi there,
>
> I had a look at using jextract for zcl while waiting for dinner to
> cook and basically banged it out in 5 minutes - then spent an hour on
> this email and the git bits.
>
> summary:
>
> - mostly trivial because the downcalls and downcall method handles
> were identical to what i had apart from the exception handling of the
> calls.
> - also because upcall wrappers are also identical apart from the
> function name to call
> - one of the upcalls is genericised in the high-level interface
> (CLNotify<>) over a few functions. my extractor just outputs one type
> for this but jextract creates one for each call. Since they share the
> same signature I just chose one (cl_h.clBuildProgram$x0$make)
>
> To reduce changes I edit the file in the makefile to delete the
> constants (already in CL.java and part of the public api), and make
> cl_h non-final (so i can subclass it to CLLib so I didn't need to
> change existing imports - ok just lazy on that one but it works). So
> infact apart from a couple of incorrect catch() clauses due to
> paste-o's that the method changes exposed, the only real changes i
> needed to make are the upcall resolution calls.
>
> It's on the foreign-jextract branch, or in diff form:
>
> https://code.zedzone.space/cvs?p=zcl;a=commitdiff;h=9455cfeb8c9097987819ada835b05d98a04abc07
>
> (trivia: this roughly doubles the time to compile the whole project).
>
> I did hit one problem with the generator but i hacked around it.
>
> This:
>
> extern CL_API_ENTRY cl_int CL_API_CALL
> clEnqueueSVMFree(cl_command_queue /* command_queue */,
> cl_uint /* num_svm_pointers */,
> void *[] /* svm_pointers[] */,
> void (CL_CALLBACK *
> /*pfn_free_func*/)(cl_command_queue /* queue */,
> cl_uint /* num_svm_pointers */,
> void
> *[] /* svm_pointers[] */,
> void
> * /* user_data */),
> void * /* user_data */,
> cl_uint /* num_events_in_wait_list */,
> const cl_event * /* event_wait_list */,
> cl_event * /* event */)
> CL_API_SUFFIX__VERSION_2_0;
>
>
> Gets turned into:
>
> public static final MethodHandle clEnqueueSVMFree =
> RuntimeHelper.downcallHandle(
> LIBRARIES, "clEnqueueSVMFree",
> "(Ljdk/incubator/foreign/MemoryAddress;ILjdk/incubator/foreign/MemorySegment;Ljdk/incubator/foreign/MemoryAddress;Ljdk/incubator/foreign/MemoryAddress;ILjdk/incubator/foreign/MemoryAddress;Ljdk/incubator/foreign/MemoryAddress;)I",
> FunctionDescriptor.of(MemoryLayouts.SysV.C_INT, false,
> MemoryLayouts.SysV.C_POINTER,
> MemoryLayouts.SysV.C_INT,
> *MemoryLayout.ofSequence(MemoryLayouts.SysV.C_POINTER),*
> MemoryLayouts.SysV.C_POINTER,
> MemoryLayouts.SysV.C_POINTER,
> MemoryLayouts.SysV.C_INT,
> MemoryLayouts.SysV.C_POINTER,
> MemoryLayouts.SysV.C_POINTER
> )
> );
>
> Which causes this at runtime:
>
> Failed to classify layout: [:b64]
> Exception in thread "main" java.lang.ExceptionInInitializerError
> at
> notzed.zcl/au.notzed.zcl.CLPlatform.getPlatforms(CLPlatform.java:90)
> at
> notzed.zcl.demo/au.notzed.zcl.tools.clinfo.main(clinfo.java:179)
> Caused by: java.lang.UnsupportedOperationException: Cannot compute
> size of a layout which is, or depends on a sequence layout with
> unspecified size
> at
> jdk.incubator.foreign/jdk.incubator.foreign.AbstractLayout.badSizeException(AbstractLayout.java:121)
> at
> java.base/java.util.OptionalLong.orElseThrow(OptionalLong.java:271)
> at
> jdk.incubator.foreign/jdk.incubator.foreign.AbstractLayout.bitSize(AbstractLayout.java:113)
> at
> jdk.incubator.foreign/jdk.incubator.foreign.SequenceLayout.bitSize(SequenceLayout.java:65)
> at
> jdk.incubator.foreign/jdk.incubator.foreign.MemoryLayout.byteSize(MemoryLayout.java:214)
> at
> jdk.incubator.foreign/jdk.internal.foreign.abi.x64.sysv.CallArranger.classifyArrayType(CallArranger.java:489)
> at
> jdk.incubator.foreign/jdk.internal.foreign.abi.x64.sysv.CallArranger.classifyType(CallArranger.java:641)
> at
> jdk.incubator.foreign/jdk.internal.foreign.abi.x64.sysv.CallArranger.classifyLayout(CallArranger.java:654)
> at
> jdk.incubator.foreign/jdk.internal.foreign.abi.x64.sysv.CallArranger$UnboxBindingCalculator.getBindings(CallArranger.java:350)
> at
> jdk.incubator.foreign/jdk.internal.foreign.abi.x64.sysv.CallArranger.arrangeDowncall(CallArranger.java:126)
> at
> jdk.incubator.foreign/jdk.internal.foreign.abi.x64.sysv.SysVx64ABI.downcallHandle(SysVx64ABI.java:72)
> at
> notzed.zcl/au.notzed.zcl.RuntimeHelper.lambda$downcallHandle$6(RuntimeHelper.java:74)
> at java.base/java.util.Optional.map(Optional.java:258)
> at
> notzed.zcl/au.notzed.zcl.RuntimeHelper.downcallHandle(RuntimeHelper.java:69)
> at notzed.zcl/au.notzed.zcl.cl_h.<clinit>(cl_h.java:1846)
> ... 2 more
>
> The ed script which makes the other edits just changes that sequence
> to a plain pointer.
I've also seen this.
We'll be fixing all these issues shortly - thanks for trying things out!
Maurizio
>
> Cheers,
> Michael
>
More information about the panama-dev
mailing list