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

Filip Krakowski krakowski at hhu.de
Thu Aug 27 13:01:02 UTC 2020


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://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