How to jextract

Mitsuru Matsushima m-matsushima at bk.jp.nec.com
Wed Dec 19 05:23:42 UTC 2018


Thank you for your work!
I will try it and give feedback if other problems are found.

Mitsuru

> -----Original Message-----
> From: Maurizio Cimadamore <maurizio.cimadamore at oracle.com>
> Sent: Tuesday, December 18, 2018 9:01 PM
> To: Matsushima Mitsuru(松島 充) <m-matsushima at bk.jp.nec.com>; 'panama-dev at openjdk.java.net'
> <panama-dev at openjdk.java.net>
> Subject: Re: How to jextract
> 
> Hi,
> this has been fixed by a somewhat larger jextract rewrite [1].
> 
> Now, your very first command line:
> 
> jdk-12/bin/jextract /usr/include/x86_64-linux-gnu/sys/sysinfo.h
> 
> 
> Should be enough to generate a self-contained artifact; if I do that locally, I get this:
> 
> classes/
> ├── cdefs.class
> ├── META-INF
> │   └── jextract.properties
> ├── sysinfo.class
> └── usr
>      └── include
>          ├── asm_generic
>          │   ├── bitsperlong.class
>          │   ├── int_ll64.class
>          │   ├── int_ll64$__s16.class
>          │   ├── int_ll64$__s32.class
>          │   ├── int_ll64$__s64.class
>          │   ├── int_ll64$__s8.class
>          │   ├── int_ll64$__u16.class
>          │   ├── int_ll64$__u32.class
>          │   ├── int_ll64$__u64.class
>          │   ├── int_ll64$__u8.class
>          │   ├── posix_types.class
>          │   ├── posix_types$__kernel_caddr_t.class
>          │   ├── posix_types$__kernel_clockid_t.class
>          │   ├── posix_types$__kernel_clock_t.class
>          │   ├── posix_types$__kernel_daddr_t.class
>          │   ├── posix_types$__kernel_fsid_t.class
>          │   ├── posix_types$__kernel_gid16_t.class
>          │   ├── posix_types$__kernel_gid32_t.class
>          │   ├── posix_types$__kernel_gid_t.class
>          │   ├── posix_types$__kernel_ino_t.class
>          │   ├── posix_types$__kernel_ipc_pid_t.class
>          │   ├── posix_types$__kernel_loff_t.class
>          │   ├── posix_types$__kernel_long_t.class
>          │   ├── posix_types$__kernel_mode_t.class
>          │   ├── posix_types$__kernel_off_t.class
>          │   ├── posix_types$__kernel_pid_t.class
>          │   ├── posix_types$__kernel_ptrdiff_t.class
>          │   ├── posix_types$__kernel_size_t.class
>          │   ├── posix_types$__kernel_ssize_t.class
>          │   ├── posix_types$__kernel_suseconds_t.class
>          │   ├── posix_types$__kernel_timer_t.class
>          │   ├── posix_types$__kernel_time_t.class
>          │   ├── posix_types$__kernel_uid16_t.class
>          │   ├── posix_types$__kernel_uid32_t.class
>          │   ├── posix_types$__kernel_uid_t.class
>          │   ├── posix_types$__kernel_ulong_t.class
>          │   └── types.class
>          ├── features.class
>          ├── linux
>          │   ├── kernel.class
>          │   ├── posix_types.class
>          │   ├── posix_types$FI1.class
>          │   ├── posix_types$__kernel_fd_set.class
>          │   ├── posix_types$__kernel_key_t.class
>          │   ├── posix_types$__kernel_mqd_t.class
>          │   ├── posix_types$__kernel_sighandler_t.class
>          │   ├── sysinfo.class
>          │   ├── sysinfo$sysinfo.class
>          │   ├── types$__be16.class
>          │   ├── types$__be32.class
>          │   ├── types$__be64.class
>          │   ├── types.class
>          │   ├── types$__le16.class
>          │   ├── types$__le32.class
>          │   ├── types$__le64.class
>          │   ├── types$__sum16.class
>          │   └── types$__wsum.class
>          ├── stdc_predef.class
>          └── x86_64_linux_gnu
>              ├── asm
>              │   ├── bitsperlong.class
>              │   ├── posix_types_64.class
>              │   ├── posix_types_64$__kernel_old_dev_t.class
>              │   ├── posix_types_64$__kernel_old_gid_t.class
>              │   ├── posix_types_64$__kernel_old_uid_t.class
>              │   └── types.class
>              ├── bits
>              │   └── wordsize.class
>              └── gnu
>                  └── stubs_64.class
> 
> 
> And, if I look at classes/sysinfo.class with javap:
> 
> $ javap classes/sysinfo.class
> public interface sysinfo {
>    public abstract int
> sysinfo(java.foreign.memory.Pointer<usr.include.linux.sysinfo$sysinfo>);
>    public abstract int get_nprocs_conf();
>    public abstract int get_nprocs();
>    public abstract long get_phys_pages();
>    public abstract long get_avphys_pages();
>    public int _SYS_SYSINFO_H();
> }
> 
> You can see that the sysinfo function takes a pointer to usr/include/linux/sysinfo$sysinfo, where that is the struct you
> want:
> 
> $ javap classes/usr/include/linux/sysinfo\$sysinfo.class
> public interface usr.include.linux.sysinfo$sysinfo extends
> java.foreign.memory.Struct<usr.include.linux.sysinfo$sysinfo> {
>    public abstract long uptime$get();
>    public abstract void uptime$set(long);
>    public abstract java.foreign.memory.Pointer<java.lang.Long> uptime$ptr();
>    public abstract java.foreign.memory.Array<java.lang.Long> loads$get();
>    public abstract void
> loads$set(java.foreign.memory.Array<java.lang.Long>);
>    public abstract
> java.foreign.memory.Pointer<java.foreign.memory.Array<java.lang.Long>>
> loads$ptr();
>    public abstract long totalram$get();
>    public abstract void totalram$set(long);
>    public abstract java.foreign.memory.Pointer<java.lang.Long>
> totalram$ptr();
>    public abstract long freeram$get();
>    public abstract void freeram$set(long);
>    public abstract java.foreign.memory.Pointer<java.lang.Long>
> freeram$ptr();
>    public abstract long sharedram$get();
>    public abstract void sharedram$set(long);
>    public abstract java.foreign.memory.Pointer<java.lang.Long>
> sharedram$ptr();
>    public abstract long bufferram$get();
>    public abstract void bufferram$set(long);
>    public abstract java.foreign.memory.Pointer<java.lang.Long>
> bufferram$ptr();
>    public abstract long totalswap$get();
>    public abstract void totalswap$set(long);
>    public abstract java.foreign.memory.Pointer<java.lang.Long>
> totalswap$ptr();
>    public abstract long freeswap$get();
>    public abstract void freeswap$set(long);
>    public abstract java.foreign.memory.Pointer<java.lang.Long>
> freeswap$ptr();
>    public abstract short procs$get();
>    public abstract void procs$set(short);
>    public abstract java.foreign.memory.Pointer<java.lang.Short> procs$ptr();
>    public abstract short pad$get();
>    public abstract void pad$set(short);
>    public abstract java.foreign.memory.Pointer<java.lang.Short> pad$ptr();
>    public abstract long totalhigh$get();
>    public abstract void totalhigh$set(long);
>    public abstract java.foreign.memory.Pointer<java.lang.Long>
> totalhigh$ptr();
>    public abstract long freehigh$get();
>    public abstract void freehigh$set(long);
>    public abstract java.foreign.memory.Pointer<java.lang.Long>
> freehigh$ptr();
>    public abstract int mem_unit$get();
>    public abstract void mem_unit$set(int);
>    public abstract java.foreign.memory.Pointer<java.lang.Integer>
> mem_unit$ptr();
>    public abstract java.foreign.memory.Array<java.lang.Byte> _f$get();
>    public abstract void _f$set(java.foreign.memory.Array<java.lang.Byte>);
>    public abstract
> java.foreign.memory.Pointer<java.foreign.memory.Array<java.lang.Byte>>
> _f$ptr();
> }
> 
> I hope this helps.
> 
> Cheers
> Maurizio
> 
> 
> 
> On 07/12/2018 04:06, Mitsuru Matsushima wrote:
> > Thank you for your response.
> > I hope this bug will be fixed :)
> >
> > Mitsuru
> >
> >> -----Original Message-----
> >> From: Maurizio Cimadamore <maurizio.cimadamore at oracle.com>
> >> Sent: Friday, December 07, 2018 2:31 AM
> >> To: Matsushima Mitsuru(松島 充) <m-matsushima at bk.jp.nec.com>; 'panama-dev at openjdk.java.net'
> >> <panama-dev at openjdk.java.net>
> >> Subject: Re: How to jextract
> >>
> >> Looking closer at the code, the issue with -m not generating anything
> >> is caused by the fact that the various Context::collectXYZ methods
> >> are filtering away all packages that are not the 'target' one (the one set by -t). This is  buggy behavior - we should just
> generate all packages we have got up to that point; there's no reason to do the filtering.
> >>
> >> Maurizio
> >>
> >> On 06/12/2018 11:21, Maurizio Cimadamore wrote:
> >>> I can see that this is indeed an issue - jextract doesn't seem to
> >>> follow the include <kernel.h>...
> >>>
> >>> https://bugs.openjdk.java.net/browse/JDK-8214948
> >>>
> >>> Thanks for the report. Your workaround seems ok, but really, this
> >>> should just work.
> >>>
> >>> Maurizio
> >>>
> >>>
> >>> On 06/12/2018 10:25, Mitsuru Matsushima wrote:
> >>>>    jdk-12/bin/jextract /usr/include/x86_64-linux-gnu/sys/sysinfo.h



More information about the panama-dev mailing list