Dmitry Eremin-Solenikov(lumag) replied on github web page: platform/linux-generic/odp_packet.c line 28 @@ -49,15 +49,14 @@ const _odp_packet_inline_offset_t ODP_ALIGNED_CACHE _odp_packet_inline = { #include <odp/visibility_end.h> -static inline odp_buffer_t buffer_handle(odp_packet_hdr_t *pkt_hdr) -{ - return (odp_buffer_t)pkt_hdr; -} - -static inline odp_packet_hdr_t *buf_to_packet_hdr(odp_buffer_t buf) -{ - return (odp_packet_hdr_t *)buf_hdl_to_hdr(buf); -} +/* Check that invalid values are the same. Some versions of Clang have trouble + * with the strong type casting, and complain that these invalid values are not + * integral constants. */ +#ifndef __clang__ +ODP_STATIC_ASSERT(ODP_PACKET_INVALID == 0, "Packet invalid not 0"); +ODP_STATIC_ASSERT(ODP_BUFFER_INVALID == 0, "Buffer invalid not 0"); +ODP_STATIC_ASSERT(ODP_EVENT_INVALID == 0, "Event invalid not 0");
Comment: Maybe `(uintptr_t)(handle) == (uintptr_t)0` would do the trick? > Bill Fischofer(Bill-Fischofer-Linaro) wrote: > Very strange. I'm Ok with this workaround, but a comment about clang version > might be appropriate. Don't know if it's worth doing a clang version check. > We do things like that in the `ODP_STATIC_ASSERT()` macro itself for similar > reasons. >> Petri Savolainen(psavol) wrote: >> odp_packet.c:52:19: error: static_assert expression is not an integral >> constant >> expression >> ODP_STATIC_ASSERT(_odp_typeval(ODP_BUFFER_INVALID) == 0, "Buffer inval not >> 0"); >> ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> ../../platform/linux-generic/include/odp/api/plat/strong_types.h:32:30: >> note: >> expanded from macro '_odp_typeval' >> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle)) >> ^ >> ../../include/odp/api/abi-default/debug.h:26:53: note: expanded from macro >> 'ODP_STATIC_ASSERT' >> #define ODP_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg) >> ^~~~ >> odp_packet.c:52:19: note: cast that performs the conversions of a >> reinterpret_cast is not allowed in a constant expression >> ../../platform/linux-generic/include/odp/api/plat/strong_types.h:32:41: >> note: >> expanded from macro '_odp_typeval' >> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle)) >>> Petri Savolainen(psavol) wrote: >>> static_assert() seems special. The clang version in Travis does not accept >>> type casts with static_assert(). The cast confuses it to think that >>> (uintptr_t)0 == 0 is not an integral constant. >>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote: >>>> `_odp_typeval()` is defined as: >>>> ``` >>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle)) >>>> ``` >>>> It's used elsewhere in the ODP code and clang doesn't have any problem >>>> with it. I've verified this works for clang 4.2.1. Since it works >>>> elsewhere on Travis I'm not sure why it wouldn't in this instance. >>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote: >>>>> I'm OK with just a modified commit name. I agree we needn't be too >>>>> granular about these things. >>>>>> Petri Savolainen(psavol) wrote: >>>>>> I could rename the patch to: >>>>>> "linux-gen: packet: use inlined flow hash and ts set" >>>>>> >>>>>> ... if necessary. The comment says already that also ts set is modified >>>>>> the same way. >>>>>>> Petri Savolainen(psavol) wrote: >>>>>>> I did try several combinations of type casts of invalid values, also >>>>>>> cast to uintptr_t. The problem is that gcc and clang (clang version >>>>>>> 3.8.0-2ubuntu4) of my machine accepted all of those casts, but the >>>>>>> clang version in Travis (clang version 3.8.0-2ubuntu3~trusty5) does not >>>>>>> accept anything. >>>>>>> >>>>>>> Maybe it's a bug in the particular version of clang. Anyway, addition >>>>>>> of this check even only on gcc side is improvement against what we >>>>>>> currently have (no check). Packet invalid is currently 0xfffffff in ABI >>>>>>> spec, but event/buffer invalid are 0. >>>>>>> >>>>>>> odp_packet.c:55:19: error: static_assert expression is not an integral >>>>>>> constant >>>>>>> expression >>>>>>> ODP_STATIC_ASSERT(((uintptr_t)ODP_PACKET_INVALID) == 0, "Packet invalid >>>>>>> not 0"); >>>>>>> ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>>>>>> ../../include/odp/api/abi-default/debug.h:26:53: note: expanded from >>>>>>> macro >>>>>>> 'ODP_STATIC_ASSERT' >>>>>>> #define ODP_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg) >>>>>>> ^~~~ >>>>>>> odp_packet.c:55:20: note: cast that performs the conversions of a >>>>>>> reinterpret_cast is not allowed in a constant expression >>>>>>> ODP_STATIC_ASSERT(((uintptr_t)ODP_PACKET_INVALID) == 0, "Packet invalid >>>>>>> not 0"); >>>>>>> ^ >>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote: >>>>>>>> Since you want to breech the strong type you need to use the internal >>>>>>>> `odp_typeval()` macro here. >>>>>>>> ``` >>>>>>>> ODP_STATIC_ASSERT(_odp_typeval(ODP_EVENT_INVALID) == 0, "Event invalid >>>>>>>> not 0"); >>>>>>>> ``` >>>>>>>> etc. I've verified that this works fine for clang, so no need for the >>>>>>>> conditional compilation. >>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote: >>>>>>>>> Should this be in its own commit? Different function. https://github.com/Linaro/odp/pull/437#discussion_r165111717 updated_at 2018-01-31 16:38:56