On Fri, Jan 03, 2025 at 12:39:38PM -0800, Andre Muezerie wrote: > __builtin_add_overflow is gcc specific. There's a need for a portable > version that can also be used with other compilers. > > This patch introduces rte_add_overflow. > > Signed-off-by: Andre Muezerie <andre...@linux.microsoft.com> > --- > lib/eal/include/meson.build | 1 + > lib/eal/include/rte_math.h | 46 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 47 insertions(+) > create mode 100644 lib/eal/include/rte_math.h > > diff --git a/lib/eal/include/meson.build b/lib/eal/include/meson.build > index d903577caa..041a4105b5 100644 > --- a/lib/eal/include/meson.build > +++ b/lib/eal/include/meson.build > @@ -31,6 +31,7 @@ headers += files( > 'rte_lcore_var.h', > 'rte_lock_annotations.h', > 'rte_malloc.h', > + 'rte_math.h', > 'rte_mcslock.h', > 'rte_memory.h', > 'rte_memzone.h', > diff --git a/lib/eal/include/rte_math.h b/lib/eal/include/rte_math.h > new file mode 100644 > index 0000000000..2f4581f81b > --- /dev/null > +++ b/lib/eal/include/rte_math.h > @@ -0,0 +1,46 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2025 Microsoft Corporation > + */ > + > +#ifndef _RTE_MATH_H_ > +#define _RTE_MATH_H_ > + > +/** > + * @file > + * > + * Math function definitions for DPDK. > + */ > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +/* > + * Function that allows performing simple arithmetic operations together with > + * checking whether the operation overflowed. > + * Example of usage: > + * uint8_t overflow; > + * uint16_t a, b, result; > + * a = 1; > + * b = 2; > + * overflow = rte_add_overflow(a, b, &result); > + */ > +#ifdef RTE_TOOLCHAIN_MSVC > +#define rte_add_overflow(a, b, res) _Generic((a), \ > + uint8_t : _addcarry_u8, \ > + uint16_t : _addcarry_u16, \ > + uint32_t : _addcarry_u32, \ > + uint64_t : _addcarry_u64)(0, a, b, res) > +#else > +#define rte_add_overflow(a, b, res) _Generic((a), \ > + uint8_t : __builtin_add_overflow, \ > + uint16_t : __builtin_add_overflow, \ > + uint32_t : __builtin_add_overflow, \ > + uint64_t : __builtin_add_overflow)(a, b, res) > +#endif
For the gcc version, can you just simplify to the one-line below? #define rte_add_overflow __builtin_add_overflow /Bruce