1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef _LIBCPP___ATOMIC_TO_GCC_ORDER_H
10#define _LIBCPP___ATOMIC_TO_GCC_ORDER_H
11
12#include <__atomic/memory_order.h>
13#include <__config>
14#include <__utility/unreachable.h>
15
16#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
17# pragma GCC system_header
18#endif
19
20_LIBCPP_BEGIN_NAMESPACE_STD
21
22#if defined(__ATOMIC_RELAXED) && defined(__ATOMIC_CONSUME) && defined(__ATOMIC_ACQUIRE) && \
23 defined(__ATOMIC_RELEASE) && defined(__ATOMIC_ACQ_REL) && defined(__ATOMIC_SEQ_CST)
24
25_LIBCPP_HIDE_FROM_ABI inline int __to_gcc_order(memory_order __order) {
26 switch (__order) {
27 case memory_order_relaxed:
28 return __ATOMIC_RELAXED;
29 case memory_order_acquire:
30 return __ATOMIC_ACQUIRE;
31 case memory_order_release:
32 return __ATOMIC_RELEASE;
33 case memory_order_acq_rel:
34 return __ATOMIC_ACQ_REL;
35 case memory_order_seq_cst:
36 return __ATOMIC_SEQ_CST;
37 case memory_order_consume:
38 return __ATOMIC_CONSUME;
39 }
40 std::__libcpp_unreachable();
41}
42
43_LIBCPP_HIDE_FROM_ABI inline int __to_gcc_failure_order(memory_order __order) {
44 switch (__order) {
45 case memory_order_relaxed:
46 return __ATOMIC_RELAXED;
47 case memory_order_acquire:
48 return __ATOMIC_ACQUIRE;
49 case memory_order_release:
50 return __ATOMIC_RELAXED;
51 case memory_order_seq_cst:
52 return __ATOMIC_SEQ_CST;
53 case memory_order_acq_rel:
54 return __ATOMIC_ACQUIRE;
55 case memory_order_consume:
56 return __ATOMIC_CONSUME;
57 }
58 std::__libcpp_unreachable();
59}
60
61#endif
62
63_LIBCPP_END_NAMESPACE_STD
64
65#endif // _LIBCPP___ATOMIC_TO_GCC_ORDER_H
66