[dpdk-dev] compilation error on Suse 11 - LPM init of anon union

Adrien Mazarguil adrien.mazarguil at 6wind.com
Mon Jan 15 17:18:37 CET 2018


On Sat, Jan 13, 2018 at 08:14:06PM +0100, Thomas Monjalon wrote:
> Hi,
> 
> There is a new compilation error since this commit in LPM:
> 	http://dpdk.org/commit/b2e1c99
> The brace has been removed because unnecessary with anonymous union.
> 
> This union is declared with RTE_STD_C11 for compatibility
> with old compilers:
> 	/** C extension macro for environments lacking C11 features. */
> 	#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L
> 	#define RTE_STD_C11 __extension__                                                                    
> 	#else
> 	#define RTE_STD_C11
> 	#endif

Yes, however not only for old compilers, e.g. explicitly specifying -std=c99
on the command-line disables C11 extensions for newer compilers as well.

Not specifying anything (like most applications do) simply defaults to
whatever standard is deemed "current" for it.

In short, RTE_STD_C11 gets expanded as __extension__ when the compiler isn't
in C11 mode, and what follows is therefore an extension to the standard in
use (be it C90 or C99).

__extension__ remains explicitly used in place of RTE_STD_C11 for things
that are not even found in C11, namely GNU syntax extensions fall under this
category. Keep in mind the __extension__ keyword is itself a GNU extension.

> Unfortunately, it does not work on Suse 11 SP2 with GCC 4.5.1:
> 	lib/librte_lpm/rte_lpm.c: In function ‘add_depth_big_v20’:
> 	lib/librte_lpm/rte_lpm.c:886:4: error:
> 	unknown field ‘group_idx’ specified in initializer
> 
> Curiously, the error is exactly the same with ICC 16.0.2:
> 	http://dpdk.org/ml/archives/test-report/2018-January/038443.html
> Is it really using different compilers in those 2 tests?
> 
> Someone to check the value of __STDC_VERSION__ with those compilers?
> 	gcc -dM -E -xc /dev/null | grep STDC_VERSION
> 
> Thanks for the help

Since this problem only appears in big endian, my suggestion would be to add
RTE_STD_C11 to the anonymous union of struct rte_lpm_tbl_entry_v20
(rte_lpm.h), like its little endian counterpart:

 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
 [...]
         RTE_STD_C11
         union {
                 uint8_t next_hop;
                 uint8_t group_idx;
         };
 [...]
 #else
 __extension__
 struct rte_lpm_tbl_entry_v20 {
         uint8_t depth       :6;
         uint8_t valid_group :1;
         uint8_t valid       :1;
         RTE_STD_C11 // <<< Should be added here
         union {
                 uint8_t group_idx;
                 uint8_t next_hop;
         };
 };

I don't have the adequate test environment to validate this, so please
report if it helps and/or submit a patch, thanks.

-- 
Adrien Mazarguil
6WIND


More information about the dev mailing list