[foreign-jextract] Wrong MemoryLayout and VarHandle carrier for integer field

sundararajan.athijegannathan at oracle.com sundararajan.athijegannathan at oracle.com
Thu Aug 27 16:54:46 UTC 2020


Filed https://bugs.openjdk.java.net/browse/JDK-8252465

-Sundar

On 27/08/20 8:25 pm, Maurizio Cimadamore wrote:
> We got at the bottom of this; there are multiple structs defining 
> fields with same name, and in that case jextract always resolves the 
> var handle to the first one.
>
> Thanks for catching this and helping us reproducing.
>
> Cheers
> Maurizio
>
> On 27/08/2020 15:45, Maurizio Cimadamore wrote:
>> I see now
>>
>> we have two:
>>
>> sources/rdmi/verbs_h$constants$2.java: C_BOOL.withName("sq_sig_all"),
>> sources/rdmi/verbs_h$constants$6.java: C_INT.withName("sq_sig_all"),
>> sources/rdmi/verbs_h$constants$6.java: C_INT.withName("sq_sig_all"),
>>
>> Maurizio
>>
>> On 27/08/2020 15:42, Filip Krakowski wrote:
>>> Hi,
>>>
>>> the layout looks the same in my case (C_INT.withName("sq_sig_all")). 
>>> Getters and setters use byte and the VarHandles MemoryLayout is C_BOOL.
>>>
>>> I think I found out what happens. Another struct named 
>>> "ib_uverbs_ex_create_qp" uses the same field name 
>>> (https://urldefense.com/v3/__https://github.com/linux-rdma/rdma-core/blob/b4d8c5a8102316476c44829db1a91b672fbfef5d/kernel-headers/rdma/ib_user_verbs.h*L613__;Iw!!GqivPVa7Brio!IQvwdAz0HL_NhTchq2aUomxq3y3bMMzDaj3s_BukxhHoRqWh1Yt0LhGUM6MbU4B5KI3R0oE$ 
>>> ). It seems the getters and setters for the field inside 
>>> "ibv_qp_init_attr" 
>>> (https://urldefense.com/v3/__https://github.com/linux-rdma/rdma-core/blob/master/libibverbs/verbs.h*L887__;Iw!!GqivPVa7Brio!IQvwdAz0HL_NhTchq2aUomxq3y3bMMzDaj3s_BukxhHoRqWh1Yt0LhGUM6MbU4B5ClheUYc$ 
>>> ) use the VarHandle generated for the field inside 
>>> "ib_uverbs_ex_create_qp" (which is correctly using byte).
>>>
>>> Best regards,
>>> Filip
>>>
>>> On 27.08.20 16:20, Maurizio Cimadamore wrote:
>>>>
>>>> On 27/08/2020 15:07, Maurizio Cimadamore wrote:
>>>>> What do I need to have installed to try this out? It seems like 
>>>>> the header you linked has some dependencies on <infiniband> 
>>>>> headers which are not in the github repo. Could you please point 
>>>>> me at how you set up your machine to get those?
>>>>
>>>> To get around it, I redefined in place a bunch of enums which were 
>>>> defined elsewhere and was able to get jextract working; this is 
>>>> what I got:
>>>>
>>>>
>>>> private static final MemoryLayout ibv_qp_init_attr$struct$LAYOUT_ = 
>>>> MemoryLayout.ofStruct(
>>>>         C_POINTER.withName("qp_context"),
>>>>         C_POINTER.withName("send_cq"),
>>>>         C_POINTER.withName("recv_cq"),
>>>>         C_POINTER.withName("srq"),
>>>>         MemoryLayout.ofStruct(
>>>>             C_INT.withName("max_send_wr"),
>>>>             C_INT.withName("max_recv_wr"),
>>>>             C_INT.withName("max_send_sge"),
>>>>             C_INT.withName("max_recv_sge"),
>>>>             C_INT.withName("max_inline_data")
>>>>         ).withName("cap"),
>>>>         C_INT.withName("qp_type"),
>>>>         C_INT.withName("sq_sig_all"),
>>>>         MemoryLayout.ofPaddingBits(32)
>>>>     ).withName("ibv_qp_init_attr");
>>>>
>>>>
>>>> No C_BOOL here... odd
>>>>
>>>> Maurizio
>>>>
>>>>
>>>>>
>>>>> Maurizio
>>>>>
>>>>> On 27/08/2020 14:01, Filip Krakowski wrote:
>>>>>> Hi,
>>>>>>
>>>>>> this is source file generation. I noticed that the constants 
>>>>>> class file is no longer generated (in source mode) and instead 
>>>>>> several constants source files are created.
>>>>>>
>>>>>> Best regards,
>>>>>> Filip
>>>>>>
>>>>>> On 27.08.20 14:54, Maurizio Cimadamore wrote:
>>>>>>> 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://urldefense.com/v3/__https://coconucos.cs.hhu.de/forschung/jdk/panama-20200826202808-06675b.zip__;!!GqivPVa7Brio!LZ_9YbqVSPqVFBgvUpbtN5NZ8u_rK2LJJ7qkmpZ3wI-4vNinKdeqRIz1TVuiE2o7wL_IUwA$ 
>>>>>>>> ). 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://urldefense.com/v3/__https://github.com/linux-rdma/rdma-core/blob/master/libibverbs/verbs.h__;!!GqivPVa7Brio!LZ_9YbqVSPqVFBgvUpbtN5NZ8u_rK2LJJ7qkmpZ3wI-4vNinKdeqRIz1TVuiE2o7emilnN0$ 
>>>>>>>>>> ) 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