[foreign-jextract] Wrong MemoryLayout and VarHandle carrier for integer field
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Thu Aug 27 12:54:54 UTC 2020
Out of curiousity - is this source or classfile generation?
Maurizio
On 27/08/2020 12:56, Filip Krakowski wrote:
> Hi,
>
> I already use the latest build (commit 06675b build yesterday 10:28PM
> -
> https://coconucos.cs.hhu.de/forschung/jdk/panama-20200826202808-06675b.zip).
> Other structs containing "int" fields (for example "ibv_device_attr")
> work well and use "C_INT". I also checked my local header files.
>
> Best regards,
> Filip
>
> On 27.08.20 13:26, sundararajan.athijegannathan at oracle.com wrote:
>> I don't have the complete dependencies on my machine
>>
>> I locally filled the struct definition you gave with appropriate
>> dependencies (dummy struct, enum declarations) and jextracted it.
>>
>> I see C_INT is being generated as layout for sq_sig_all. I suspect
>> most likely you're using old panama build. I'd recommend building
>> latest panama build from repo and trying your header with the same.
>>
>> -Sundar
>>
>> On 27/08/20 4:14 pm, Filip Krakowski wrote:
>>> Hi,
>>>
>>> I would like to report a bug regarding jextract. The header file
>>> (https://github.com/linux-rdma/rdma-core/blob/master/libibverbs/verbs.h)
>>> I give to jextract contains the following struct.
>>>
>>> struct ibv_qp_init_attr {
>>> void *qp_context;
>>> struct ibv_cq *send_cq;
>>> struct ibv_cq *recv_cq;
>>> struct ibv_srq *srq;
>>> struct ibv_qp_cap cap;
>>> enum ibv_qp_type qp_type;
>>> int sq_sig_all;
>>> };
>>>
>>>
>>> The Code generated for the "sq_sig_all" field looks like this.
>>>
>>> private static final MemoryLayout sq_sig_all$LAYOUT_ =C_BOOL;
>>> private static final VarHandle sq_sig_all$VH_
>>> =sq_sig_all$LAYOUT_.varHandle(byte.class);
>>>
>>> public static int sq_sig_all$get(MemorySegment seg) {
>>> return (int)verbs_h$constants$3.sq_sig_all$VH().get(seg);
>>> }
>>>
>>> public static void
>>> sq_sig_all$set(jdk.incubator.foreign.MemorySegment seg,int x) {
>>> verbs_h$constants$3.sq_sig_all$VH().set(seg, x);
>>> }
>>>
>>> As you can see jextract chooses "C_BOOL" as the MemoryLayout for the
>>> "sq_sig_all" field and uses "byte" for the VarHandle's carrier. In
>>> contrast to this, getters and setters work with "int" which leads to
>>> an Exception during runtime.
>>>
>>> java.lang.invoke.WrongMethodTypeException: cannot convert
>>> MethodHandle(VarHandle,MemorySegment,byte)void to
>>> (VarHandle,MemorySegment,int)void
>>>
>>>
>
More information about the panama-dev
mailing list