[foreign-jextract] Function pointer typedef name clashes with existing function name
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Wed Feb 10 14:20:32 UTC 2021
Hi Filip,
thanks for the report - I've filed this:
https://bugs.openjdk.java.net/browse/JDK-8261511
I believe jextract adds constants to the constant holder
sources/classes on a name-based basis. So if you happen to have two
descriptors that are required for different things (e.g. a function and
an upcall which happen to have same name), there is a chance that one
constant will be re-used for the other.
The solution is, of course, to use a more robust keying scheme when
adding constants, rather than just using the name.
Maurizio
On Wed, 2021-02-10 at 15:05 +0100, Filip Krakowski wrote:
> Hi,
>
> I think I found another bug regarding name clashes with typedefs for
> function pointers.
>
> The library I use declares a function pointer within a struct's
> field
> named "read" [1]. I think you see where this is going...
>
> typedef struct ucs_config_parser {
> int (*read) (const char *buf, void
> *dest,
> const void *arg);
> int (*write)(char *buf, size_t max,
> const void *src, const
> void
> *arg);
> ucs_status_t (*clone)(const void *src, void
> *dest,
> const void *arg);
> void (*release)(void *ptr, const void
> *arg);
> void (*help)(char *buf, size_t max,
> const
> void *arg);
> const void *arg;
> } ucs_config_parser_t;
>
>
> Since "unistd.h" also declares a "read" function [2], jextract then
> (correctly) generates a MethodHandle for it
> but uses the wrong FunctionDescriptor belonging to ucx's "read" in
> the
> process.
>
> static final FunctionDescriptor read$FUNC_ =
> FunctionDescriptor.of(C_INT,
> C_POINTER,
> C_POINTER,
> C_POINTER
> );
>
> static final MethodHandle read$MH_ =
> RuntimeHelper.downcallHandle(
> LIBRARIES, "read",
> "(ILjdk/incubator/foreign/MemoryAddress;J)J",
> read$FUNC_, false
> );
>
>
> As you can see the generated FunctionDescriptor and the descriptor
> string ("(ILjdk/incubator/foreign/MemoryAddress;J)J")
> do not match. On startup, I immediately get the following Exception
> originating from the downcallHandle call.
>
> Caused by: java.lang.IllegalArgumentException: Carrier size
> mismatch: int != b64[abi/kind=POINTER]
>
> My guess is that the FunctionDescriptor is generated correctly at
> first,
> but gets overridden once the parser reaches the
> function pointer declared within the struct in [1].
>
>
> Best regards
> Filip
>
> [1]
> https://github.com/openucx/ucx/blob/16ad2cc56b6c63a0fdc39bac3dce03463d6d137f/src/ucs/config/parser.h#L40-L48
> [2] https://linux.die.net/man/2/read
More information about the panama-dev
mailing list