From 3afd410eaa2e55f47b42508ac0b86390a7b4c711 Mon Sep 17 00:00:00 2001 From: Bill Fischofer Date: Thu, 3 Sep 2015 13:59:22 -0500 Subject: linux-generic: general: add odp_forward_typedefs to resolve clang issue With the addition of ordered queues, there is a circular typedef relationship between odp_queue_internal.h and odp_buffer_internal.h. The standard forward declaration technique that GCC accepts is strictly not acceptable to C99 and is flagged by clang. The solution is to create a common header file that can contain these forward declarations. Signed-off-by: Bill Fischofer Reviewed-by: Mike Holmes Signed-off-by: Maxim Uvarov --- platform/linux-generic/Makefile.am | 1 + .../linux-generic/include/odp_buffer_internal.h | 11 ++------ .../include/odp_forward_typedefs_internal.h | 32 ++++++++++++++++++++++ .../linux-generic/include/odp_queue_internal.h | 5 ++-- 4 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 platform/linux-generic/include/odp_forward_typedefs_internal.h diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index f2c081a..4c79730 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -122,6 +122,7 @@ noinst_HEADERS = \ ${srcdir}/include/odp_classification_internal.h \ ${srcdir}/include/odp_crypto_internal.h \ ${srcdir}/include/odp_debug_internal.h \ + ${srcdir}/include/odp_forward_typedefs_internal.h \ ${srcdir}/include/odp_internal.h \ ${srcdir}/include/odp_packet_internal.h \ ${srcdir}/include/odp_packet_io_internal.h \ diff --git a/platform/linux-generic/include/odp_buffer_internal.h b/platform/linux-generic/include/odp_buffer_internal.h index 6badeba..4cacca1 100644 --- a/platform/linux-generic/include/odp_buffer_internal.h +++ b/platform/linux-generic/include/odp_buffer_internal.h @@ -29,7 +29,7 @@ extern "C" { #include #include #include - +#include #define ODP_BITSIZE(x) \ ((x) <= 2 ? 1 : \ @@ -101,13 +101,8 @@ typedef union odp_buffer_bits_t { }; } odp_buffer_bits_t; -/* forward declaration */ -struct odp_buffer_hdr_t; -union queue_entry_u; -typedef union queue_entry_u queue_entry_t; - /* Common buffer header */ -typedef struct odp_buffer_hdr_t { +struct odp_buffer_hdr_t { struct odp_buffer_hdr_t *next; /* next buf in a list--keep 1st */ union { /* Multi-use secondary link */ struct odp_buffer_hdr_t *prev; @@ -144,7 +139,7 @@ typedef struct odp_buffer_hdr_t { queue_entry_t *target_qe; /* ordered queue target */ uint64_t sync; /* for ordered synchronization */ }; -} odp_buffer_hdr_t; +}; /** @internal Compile time assert that the * allocator field can handle any allocator id*/ diff --git a/platform/linux-generic/include/odp_forward_typedefs_internal.h b/platform/linux-generic/include/odp_forward_typedefs_internal.h new file mode 100644 index 0000000..f8832f7 --- /dev/null +++ b/platform/linux-generic/include/odp_forward_typedefs_internal.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2015, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODP forward typedefs - implementation internal + * + * This needs to be a separate file because it is needed by both + * odp_queue_internal.h and odp_buffer_internal.h and clang prohibits forward + * "redefining" typedefs. Note that this file can be extended with additional + * forward typedefs as needed. + */ + +#ifndef ODP_FORWARD_TYPEDEFS_INTERNAL_H_ +#define ODP_FORWARD_TYPEDEFS_INTERNAL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct odp_buffer_hdr_t odp_buffer_hdr_t; +typedef union queue_entry_u queue_entry_t; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/platform/linux-generic/include/odp_queue_internal.h b/platform/linux-generic/include/odp_queue_internal.h index 0f30965..19a0f07 100644 --- a/platform/linux-generic/include/odp_queue_internal.h +++ b/platform/linux-generic/include/odp_queue_internal.h @@ -19,6 +19,7 @@ extern "C" { #endif #include +#include #include #include #include @@ -86,10 +87,10 @@ struct queue_entry_s { odp_atomic_u64_t sync_out; }; -typedef union queue_entry_u { +union queue_entry_u { struct queue_entry_s s; uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct queue_entry_s))]; -} queue_entry_t; +}; queue_entry_t *get_qentry(uint32_t queue_id); -- cgit v1.2.3