]> git.droids-corp.org - dpdk.git/commitdiff
eal: fix compiler detection in public headers
authorThomas Monjalon <thomas@monjalon.net>
Mon, 16 Mar 2020 12:04:53 +0000 (13:04 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 17 Mar 2020 23:59:17 +0000 (00:59 +0100)
RTE_TOOLCHAIN_* macros are defining the target compiler.
Some API may be used in a host application like pmdinfogen.
That's why the the public headers should check the effective compiler
in use instead of the target compiler.

Detecting the compiler with macros is easy, except for __GNUC__
which is defined in all compilers supporting some GNU compatibility.

It is improved by defining RTE_CC_CLANG, RTE_CC_ICC and RTE_CC_GCC.
The extra macro RTE_CC_IS_GNU is defined to 0 or 1 in GCC case,
so it can be used simply with #if.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
lib/librte_eal/common/include/arch/arm/rte_memcpy_64.h
lib/librte_eal/common/include/arch/arm/rte_vect.h
lib/librte_eal/common/include/rte_common.h
lib/librte_table/rte_lru_x86.h

index beb97a71ef0cefc62892b7e0981fd3746b3c1e27..85ad587bd3bd6ec0376ce61109eae0145460028a 100644 (file)
@@ -89,7 +89,7 @@ n <= (size_t)RTE_ARM64_MEMCPY_UNALIGNED_THRESHOLD)
  **************************************/
 
 
-#if defined(RTE_TOOLCHAIN_GCC) && !defined(RTE_ARM64_MEMCPY_SKIP_GCC_VER_CHECK)
+#if RTE_CC_IS_GNU && !defined RTE_ARM64_MEMCPY_SKIP_GCC_VER_CHECK
 #if (GCC_VERSION < 50400)
 #warning "The GCC version is quite old, which may result in sub-optimal \
 performance of the compiled code. It is suggested that at least GCC 5.4.0 \
index 2a18a68546d3e706a1f442e6c7a75cf0a2409faa..454ac7e578f88f1c2aa9bf825c522844b4dc972f 100644 (file)
@@ -62,7 +62,7 @@ vaddvq_u16(uint16x8_t a)
 
 #endif
 
-#if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION < 70000)
+#if RTE_CC_IS_GNU && (GCC_VERSION < 70000)
 static inline uint32x4_t
 vcopyq_laneq_u32(uint32x4_t a, const int lane_a,
                 uint32x4_t b, const int lane_b)
@@ -72,7 +72,7 @@ vcopyq_laneq_u32(uint32x4_t a, const int lane_a,
 #endif
 
 #if defined(RTE_ARCH_ARM64)
-#if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION < 70000)
+#if RTE_CC_IS_GNU && (GCC_VERSION < 70000)
 
 #if (GCC_VERSION < 40900)
 typedef uint64_t poly64_t;
index 3662545d2092b7462631b2ac102b67167252b774..17f2d0291fd9ef707a647362bac71edc72758379 100644 (file)
@@ -42,8 +42,23 @@ extern "C" {
 #define RTE_STD_C11
 #endif
 
-/** Define GCC_VERSION **/
-#ifdef RTE_TOOLCHAIN_GCC
+/*
+ * RTE_TOOLCHAIN_GCC is defined if the target is built with GCC,
+ * while a host application (like pmdinfogen) may have another compiler.
+ * RTE_CC_IS_GNU is true if the file is compiled with GCC,
+ * no matter it is a target or host application.
+ */
+#define RTE_CC_IS_GNU 0
+#if defined __clang__
+#define RTE_CC_CLANG
+#elif defined __INTEL_COMPILER
+#define RTE_CC_ICC
+#elif defined __GNUC__
+#define RTE_CC_GCC
+#undef RTE_CC_IS_GNU
+#define RTE_CC_IS_GNU 1
+#endif
+#if RTE_CC_IS_GNU
 #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + \
                __GNUC_PATCHLEVEL__)
 #endif
index 7a67ee8bd580660a8d78d84660587fdab8443178..0e24906c2cd11d8ca560ae43e2634fe974963168 100644 (file)
@@ -19,7 +19,7 @@ extern "C" {
 
 #if RTE_TABLE_HASH_LRU_STRATEGY == 2
 
-#if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION > 40306)
+#if RTE_CC_IS_GNU && (GCC_VERSION > 40306)
 #include <x86intrin.h>
 #else
 #include <emmintrin.h>
@@ -63,7 +63,7 @@ do {                                                                  \
 
 #elif RTE_TABLE_HASH_LRU_STRATEGY == 3
 
-#if defined(RTE_TOOLCHAIN_GCC) && (GCC_VERSION > 40306)
+#if RTE_CC_IS_GNU && (GCC_VERSION > 40306)
 #include <x86intrin.h>
 #else
 #include <emmintrin.h>