xref: /freebsd/contrib/llvm-project/libc/include/llvm-libc-macros/stdckdint-macros.h (revision bb722a7d0f1642bff6487f943ad0427799a6e5bf)
1*bb722a7dSDimitry Andric //===-- Definition of macros for stdckdint.h ------------------------------===//
2*bb722a7dSDimitry Andric //
3*bb722a7dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bb722a7dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*bb722a7dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bb722a7dSDimitry Andric //
7*bb722a7dSDimitry Andric //===----------------------------------------------------------------------===//
8*bb722a7dSDimitry Andric 
9*bb722a7dSDimitry Andric #ifndef LLVM_LIBC_MACROS_STDCKDINT_MACROS_H
10*bb722a7dSDimitry Andric #define LLVM_LIBC_MACROS_STDCKDINT_MACROS_H
11*bb722a7dSDimitry Andric 
12*bb722a7dSDimitry Andric // We need to use __builtin_*_overflow from GCC/Clang to implement the overflow
13*bb722a7dSDimitry Andric // macros. Check __GNUC__ or __clang__ for availability of such builtins.
14*bb722a7dSDimitry Andric // Note that clang-cl defines __clang__ only and does not define __GNUC__ so we
15*bb722a7dSDimitry Andric // have to check for both.
16*bb722a7dSDimitry Andric #if defined(__GNUC__) || defined(__clang__)
17*bb722a7dSDimitry Andric // clang/gcc overlay may provides similar macros, we need to avoid redefining
18*bb722a7dSDimitry Andric // them.
19*bb722a7dSDimitry Andric #ifndef __STDC_VERSION_STDCKDINT_H__
20*bb722a7dSDimitry Andric #define __STDC_VERSION_STDCKDINT_H__ 202311L
21*bb722a7dSDimitry Andric 
22*bb722a7dSDimitry Andric #define ckd_add(R, A, B) __builtin_add_overflow((A), (B), (R))
23*bb722a7dSDimitry Andric #define ckd_sub(R, A, B) __builtin_sub_overflow((A), (B), (R))
24*bb722a7dSDimitry Andric #define ckd_mul(R, A, B) __builtin_mul_overflow((A), (B), (R))
25*bb722a7dSDimitry Andric #endif // __STDC_VERSION_STDCKDINT_H__
26*bb722a7dSDimitry Andric #endif // __GNUC__
27*bb722a7dSDimitry Andric #endif // LLVM_LIBC_MACROS_STDCKDINT_MACROS_H
28