[foreign-jextract] Wrong MemoryLayout and VarHandle carrier for integer field
Filip Krakowski
krakowski at hhu.de
Thu Aug 27 14:45:50 UTC 2020
Hi,
could you search for "MemoryLayout sq_sig_all$LAYOUT_" within your
generated sources? There should be only one match which gets assigned
C_BOOL.
Best regards,
Filip
On 27.08.20 16:41, Maurizio Cimadamore wrote:
> For clarity - I'm on Ubuntu 20.04; my clang version was built from
> sources, and should be 10.0.1.
>
> Maurizio
>
> On 27/08/2020 15:37, Maurizio Cimadamore wrote:
>> Ok, turns out I also needed libibverbs-dev.
>>
>> With that I can get it to work, but still no boolean:
>>
>> 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");
>>
>> Maurizio
>>
>> On 27/08/2020 15:32, Maurizio Cimadamore wrote:
>>> I've installed this:
>>>
>>> https://packages.ubuntu.com/source/focal/rdma-core
>>>
>>> but I can't find no <infiniband> folder. I get a <rdma> folder; if I
>>> tweak the header to replace infiniband with rdma, it doesn't compile
>>> - missing stuff.
>>>
>>> Maurizio
>>>
>>> On 27/08/2020 15:19, Filip Krakowski wrote:
>>>> Hi,
>>>>
>>>> sure! The package is called "rdma-core" and should be available on
>>>> many distros
>>>> (https://urldefense.com/v3/__https://pkgs.org/search/?q=rdma-core__;!!GqivPVa7Brio!KvTpGEO88DbqCuVNTA77UCHg1jfDGC5wUTy3fBsvgu9H1zspqvCt-URsvPOCKIerejtGBj0$
>>>> ). Alternatively, you could compile the library from source using
>>>> the GitHub repository
>>>> (https://urldefense.com/v3/__https://github.com/linux-rdma/rdma-core__;!!GqivPVa7Brio!KvTpGEO88DbqCuVNTA77UCHg1jfDGC5wUTy3fBsvgu9H1zspqvCt-URsvPOCKIeraUzJ14I$
>>>> ). It should be as simple as cloning the repository and running the
>>>> "build.sh" script inside of it. Of course some dependencies (listed
>>>> inside README.md) must be installed first in this case. After this
>>>> the headers should be located inside "build/include/infiniband".
>>>>
>>>> Best regards,
>>>> Filip
>>>>
>>>> On 27.08.20 16: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?
>>>>>
>>>>> 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