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

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Aug 27 14:28:59 UTC 2020


On 27/08/2020 15:28, Filip Krakowski wrote:
> Hi,
>
> using just these works fine for me, too. Throwing <infiniband/verbs.h> 
> at jextract gives C_BOOL... strange. Could this be related to the 
> clang version I use? I am currently at version 10.0.0.

I'm also on 10.0.0

Maurizio


>
> Best regards,
> Filip
>
> On 27.08.20 16:10, sundararajan.athijegannathan at oracle.com wrote:
>> I tried the following header - just enough to have that struct and 
>> dependencies
>>
>>
>> #include <stdint.h>
>>
>> enum ibv_qp_type {
>>         IBV_QPT_RC = 2,
>>         IBV_QPT_UC,
>>         IBV_QPT_UD,
>>         IBV_QPT_RAW_PACKET = 8,
>>         IBV_QPT_XRC_SEND = 9,
>>         IBV_QPT_XRC_RECV,
>>         IBV_QPT_DRIVER = 0xff,
>> };
>>
>> struct ibv_qp_cap {
>>         uint32_t                max_send_wr;
>>         uint32_t                max_recv_wr;
>>         uint32_t                max_send_sge;
>>         uint32_t                max_recv_sge;
>>         uint32_t                max_inline_data;
>> };
>>
>> 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;
>> };
>>
>> I don't see C_BOOL for sq_sig_all. Perhaps something more from the 
>> context of header is needed (although I wonder what could that be)
>>
>> Thanks
>>
>> -Sundar
>>
>> On 27/08/20 6:31 pm, 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!PqNKiqbDqj0SFxL5xXRhPFFm26L9JWRjRQoMohU1AsbMK4qDV6nMzOj3-9DvCcu_Qlru8N8$ 
>>>>> ). 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!PqNKiqbDqj0SFxL5xXRhPFFm26L9JWRjRQoMohU1AsbMK4qDV6nMzOj3-9DvCcu_3uhS2l8$ 
>>>>>>> ) 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