199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 299a2dd95SBruce Richardson * Copyright(c) 2015 Neil Horman <nhorman@tuxdriver.com>. 399a2dd95SBruce Richardson * All rights reserved. 499a2dd95SBruce Richardson */ 599a2dd95SBruce Richardson 699a2dd95SBruce Richardson #ifndef _RTE_COMPAT_H_ 799a2dd95SBruce Richardson #define _RTE_COMPAT_H_ 899a2dd95SBruce Richardson 999a2dd95SBruce Richardson #ifndef ALLOW_EXPERIMENTAL_API 1099a2dd95SBruce Richardson 11*51574a4fSTyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 12*51574a4fSTyler Retzlaff #define __rte_experimental 13*51574a4fSTyler Retzlaff #else 1499a2dd95SBruce Richardson #define __rte_experimental \ 1599a2dd95SBruce Richardson __attribute__((deprecated("Symbol is not yet part of stable ABI"), \ 1699a2dd95SBruce Richardson section(".text.experimental"))) 17*51574a4fSTyler Retzlaff #endif 1899a2dd95SBruce Richardson 1999a2dd95SBruce Richardson #else 2099a2dd95SBruce Richardson 21*51574a4fSTyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 22*51574a4fSTyler Retzlaff #define __rte_experimental 23*51574a4fSTyler Retzlaff #else 2499a2dd95SBruce Richardson #define __rte_experimental \ 2599a2dd95SBruce Richardson __attribute__((section(".text.experimental"))) 26*51574a4fSTyler Retzlaff #endif 2799a2dd95SBruce Richardson 2899a2dd95SBruce Richardson #endif 2999a2dd95SBruce Richardson 3099a2dd95SBruce Richardson #ifndef __has_attribute 3199a2dd95SBruce Richardson /* if no has_attribute assume no support for attribute too */ 3299a2dd95SBruce Richardson #define __has_attribute(x) 0 3399a2dd95SBruce Richardson #endif 3499a2dd95SBruce Richardson 3599a2dd95SBruce Richardson #if !defined ALLOW_INTERNAL_API && __has_attribute(error) /* For GCC */ 3699a2dd95SBruce Richardson 37*51574a4fSTyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 38*51574a4fSTyler Retzlaff #define __rte_internal 39*51574a4fSTyler Retzlaff #else 4099a2dd95SBruce Richardson #define __rte_internal \ 4199a2dd95SBruce Richardson __attribute__((error("Symbol is not public ABI"), \ 4299a2dd95SBruce Richardson section(".text.internal"))) 43*51574a4fSTyler Retzlaff #endif 4499a2dd95SBruce Richardson 4599a2dd95SBruce Richardson #elif !defined ALLOW_INTERNAL_API && __has_attribute(diagnose_if) /* For clang */ 4699a2dd95SBruce Richardson 47*51574a4fSTyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 48*51574a4fSTyler Retzlaff #define __rte_internal 49*51574a4fSTyler Retzlaff #else 5099a2dd95SBruce Richardson #define __rte_internal \ 51ed57d08dSMichael Barker _Pragma("GCC diagnostic push") \ 52ed57d08dSMichael Barker _Pragma("GCC diagnostic ignored \"-Wgcc-compat\"") \ 5399a2dd95SBruce Richardson __attribute__((diagnose_if(1, "Symbol is not public ABI", "error"), \ 54ed57d08dSMichael Barker section(".text.internal"))) \ 55ed57d08dSMichael Barker _Pragma("GCC diagnostic pop") 56*51574a4fSTyler Retzlaff #endif 5799a2dd95SBruce Richardson 5899a2dd95SBruce Richardson #else 5999a2dd95SBruce Richardson 60*51574a4fSTyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 61*51574a4fSTyler Retzlaff #define __rte_internal 62*51574a4fSTyler Retzlaff #else 6399a2dd95SBruce Richardson #define __rte_internal \ 6499a2dd95SBruce Richardson __attribute__((section(".text.internal"))) 65*51574a4fSTyler Retzlaff #endif 6699a2dd95SBruce Richardson 6799a2dd95SBruce Richardson #endif 6899a2dd95SBruce Richardson 6999a2dd95SBruce Richardson #endif /* _RTE_COMPAT_H_ */ 70