1fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov//===-- sanitizer_atomic.h --------------------------------------*- C++ -*-===//
27ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
37ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//                     The LLVM Compiler Infrastructure
47ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
57ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// This file is distributed under the University of Illinois Open Source
67ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// License. See LICENSE.TXT for details.
77ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
87ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===----------------------------------------------------------------------===//
9a3eca8192505f4796194dd24eb051019f402de99Dmitry Vyukov//
10a3eca8192505f4796194dd24eb051019f402de99Dmitry Vyukov// This file is a part of ThreadSanitizer/AddressSanitizer runtime.
11a3eca8192505f4796194dd24eb051019f402de99Dmitry Vyukov//
12a3eca8192505f4796194dd24eb051019f402de99Dmitry Vyukov//===----------------------------------------------------------------------===//
137ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
14fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov#ifndef SANITIZER_ATOMIC_H
15fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov#define SANITIZER_ATOMIC_H
167ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
17fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov#include "sanitizer_internal_defs.h"
187ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
19fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukovnamespace __sanitizer {
207ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
217ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyenum memory_order {
227ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  memory_order_relaxed = 1 << 0,
237ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  memory_order_consume = 1 << 1,
247ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  memory_order_acquire = 1 << 2,
257ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  memory_order_release = 1 << 3,
267ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  memory_order_acq_rel = 1 << 4,
2762f294020ce5d60dc51883e7708a56247c366d14Alexey Samsonov  memory_order_seq_cst = 1 << 5
287ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany};
297ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
30fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukovstruct atomic_uint8_t {
31fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov  typedef u8 Type;
32fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov  volatile Type val_dont_use;
33fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov};
34fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov
35fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukovstruct atomic_uint16_t {
36fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov  typedef u16 Type;
37fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov  volatile Type val_dont_use;
38fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov};
39fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov
407ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanystruct atomic_uint32_t {
417ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  typedef u32 Type;
427ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  volatile Type val_dont_use;
437ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany};
447ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
457ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanystruct atomic_uint64_t {
467ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  typedef u64 Type;
472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // On 32-bit platforms u64 is not necessary aligned on 8 bytes.
482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  volatile ALIGNED(8) Type val_dont_use;
497ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany};
507ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
517ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanystruct atomic_uintptr_t {
527ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  typedef uptr Type;
537ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany  volatile Type val_dont_use;
547ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany};
557ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
56b6eb56f5a03b4dba8de79465274a73d1ecbca7f2Dmitry Vyukov}  // namespace __sanitizer
577ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
58b6eb56f5a03b4dba8de79465274a73d1ecbca7f2Dmitry Vyukov#if defined(__GNUC__)
59b6eb56f5a03b4dba8de79465274a73d1ecbca7f2Dmitry Vyukov# include "sanitizer_atomic_clang.h"
60b6eb56f5a03b4dba8de79465274a73d1ecbca7f2Dmitry Vyukov#elif defined(_MSC_VER)
61b6eb56f5a03b4dba8de79465274a73d1ecbca7f2Dmitry Vyukov# include "sanitizer_atomic_msvc.h"
62b6eb56f5a03b4dba8de79465274a73d1ecbca7f2Dmitry Vyukov#else
63b6eb56f5a03b4dba8de79465274a73d1ecbca7f2Dmitry Vyukov# error "Unsupported compiler"
64fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov#endif
657ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
66fce5bd4cc29fddb5e8f0cb9c12df7c10187a991dDmitry Vyukov#endif  // SANITIZER_ATOMIC_H
67