[foreign-jextract] RFR: 8260976: investigate ways to filter jextract output

Duncan Gittins duncan.gittins at gmail.com
Sun Mar 14 13:37:39 UTC 2021


This works very well and I've abandoned my local jextract edits as I can 
use jextract as-is to filter out unused symbols. The per line #header 
comments are very helpful to filter with findstr/grep and to understand 
where symbols come from.

As you mentioned in JDK-8260976, point #7 will help to warn if there are 
un-used --includes, plus I think it would useful in all cases if 
jextract reported a one line totals summary "Generated X symbols of Y, 
filtered out (Y-X)" to give quick / easy feedback on the impact after a 
command line or config file change.

Kind regards


On 12/03/2021 14:14, Maurizio Cimadamore wrote:
> This patch adds new filtering capabilities to jextract, along the lines of what discussed in [1] (thanks Duncan for all the insightful comments on the topic!).
> The patch adds some new options:
> * `--include-{union, struct, var, function, typedef} = <symbol-name>`
> When one (or more) options like these are specified, jextract goes into some kind of avdanced filtering mode, and will only emit bindings for the specified symbols. Note: when no `--include-xyz` option is used, jextract behaves exactly like before - e.g. everything is extracted.
> To help the user with the filtering process, another option has been added:
> * `--dump-includes <file-name>`
> When this option is used, jextract will not emit any bindings - instead, it will dump all the included symbol on the specified file. The file is a simple text file, organized as follows (the following has been obtained extracting OpenGL):
> #### Extracted from: /usr/include/KHR/khrplatform.h
> --include-macro KHRONOS_BOOLEAN_ENUM_FORCE_SIZE    # header: /usr/include/KHR/khrplatform.h
> --include-macro KHRONOS_FALSE                      # header: /usr/include/KHR/khrplatform.h
> --include-macro KHRONOS_MAX_ENUM                   # header: /usr/include/KHR/khrplatform.h
> --include-macro KHRONOS_SUPPORT_FLOAT              # header: /usr/include/KHR/khrplatform.h
> --include-macro KHRONOS_SUPPORT_INT64              # header: /usr/include/KHR/khrplatform.h
> --include-macro KHRONOS_TRUE                       # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_boolean_enum_t           # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_float_t                  # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_int16_t                  # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_int32_t                  # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_int64_t                  # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_int8_t                   # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_intptr_t                 # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_ssize_t                  # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_stime_nanoseconds_t      # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_uint16_t                 # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_uint32_t                 # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_uint64_t                 # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_uint8_t                  # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_uintptr_t                # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_usize_t                  # header: /usr/include/KHR/khrplatform.h
> --include-typedef khronos_utime_nanoseconds_t      # header: /usr/include/KHR/khrplatform.h
> #### Extracted from: /usr/include/alloca.h
> --include-function alloca    # header: /usr/include/alloca.h
> --include-macro _ALLOCA_H    # header: /usr/include/alloca.h
> #### Extracted from: /usr/include/endian.h
> --include-macro BIG_ENDIAN       # header: /usr/include/endian.h
> --include-macro BYTE_ORDER       # header: /usr/include/endian.h
> --include-macro LITTLE_ENDIAN    # header: /usr/include/endian.h
> --include-macro PDP_ENDIAN       # header: /usr/include/endian.h
> --include-macro _ENDIAN_H        # header: /usr/include/endian.h
> In other words, the generated file contains all the symbols that have been inclided, in the form of "options". In fact, the generated file can be played back into jextract - assuming `foo.conf` is the name of our file, the we can do the following:
> `jextract @foo.conf Foo.h`
> Multiple `@file` can be used with jextract, and can also be mixed with explicit command-line options (all this support predates the work discussed in this patch, but makes it very worthwhile); this is also the same syntax supported by other launchers like `javac`.
> The output file should be stable - e.g. all entries are grouped by header file (and header files are sorted alphabetially); whithin each header, entries are sorted by category (e.g. variable vs. function) and _then_ also alphabetically within same category. This should help users finding things quickly.
> In addition, each line has a comment which states from which header is the symbol coming from. I found this super helpful to define custom header-based filtering scheme using `grep` and regex (similar to what `--filter` used to do).
> The implementation is relatively straightforward - other than adding support for the new option, it was mostly matter of making sure that OutputFactory does notgenerate the filtered out symbols.
> [1] - https://mail.openjdk.java.net/pipermail/panama-dev/2021-March/012429.html
> -------------
> Commit messages:
>   - Add filtering test
>   - Sort entries in include file alphabetically, and align them.
>   - Add support for dumping configuration
>   - Cleanup ImportHelper support and OutputFactory
>   - Initial push
> Changes: https://git.openjdk.java.net/panama-foreign/pull/469/files
>   Webrev: https://webrevs.openjdk.java.net/?repo=panama-foreign&pr=469&range=00
>    Issue: https://bugs.openjdk.java.net/browse/JDK-8260976
>    Stats: 462 lines in 8 files changed: 382 ins; 64 del; 16 mod
>    Patch: https://git.openjdk.java.net/panama-foreign/pull/469.diff
>    Fetch: git fetch https://git.openjdk.java.net/panama-foreign pull/469/head:pull/469
> PR: https://git.openjdk.java.net/panama-foreign/pull/469

More information about the panama-dev mailing list