Index: include/llvm/IR/NaClAtomicIntrinsics.h |
diff --git a/include/llvm/IR/NaClAtomicIntrinsics.h b/include/llvm/IR/NaClAtomicIntrinsics.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..680c6440249210d2d1d043b5bd6e5df31d077dd2 |
--- /dev/null |
+++ b/include/llvm/IR/NaClAtomicIntrinsics.h |
@@ -0,0 +1,110 @@ |
+//===-- llvm/IR/NaClAtomicIntrinsics.h - NaCl Atomic Intrinsics -*- C++ -*-===// |
+// |
+// The LLVM Compiler Infrastructure |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+// |
+// This file describes atomic intrinsic functions that are specific to NaCl. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#ifndef LLVM_IR_NACL_ATOMIC_INTRINSICS_H |
+#define LLVM_IR_NACL_ATOMIC_INTRINSICS_H |
+ |
+#include "llvm/IR/Intrinsics.h" |
+#include "llvm/Support/Compiler.h" |
+#include <cstddef> |
+ |
+namespace llvm { |
+ |
+namespace NaCl { |
+ |
+static const size_t NumAtomicIntrinsics = 5; |
+static const size_t NumAtomicIntrinsicOverloadTypes = 4; |
+static const size_t MaxAtomicIntrinsicsParameters = 5; |
+ |
+/// Describe all the atomic intrinsics and their type signature. Most |
+/// can be overloaded on a type. |
+class AtomicIntrinsics { |
+public: |
+ enum ParamType { |
+ NoP, /// No parameter. |
+ Int, /// Overloaded. |
+ Ptr, /// Overloaded. |
+ RMW, /// Atomic RMW operation type. |
+ Mem /// Memory order. |
+ }; |
+ |
+ struct AtomicIntrinsic { |
+ Type *OverloadedType; |
+ Intrinsic::ID ID : 16; |
+ uint8_t Overloaded : 1; |
+ uint8_t NumParams : 7; |
+ uint8_t ParamType[MaxAtomicIntrinsicsParameters]; |
+ |
+ Function *getDeclaration(Module *M) const { |
+ // The atomic intrinsic can be overloaded on zero or one type, |
+ // which is needed to create the function's declaration. |
+ return Intrinsic::getDeclaration( |
+ M, ID, ArrayRef<Type *>(&OverloadedType, Overloaded ? 1 : 0)); |
+ } |
+ }; |
+ |
+ AtomicIntrinsics(LLVMContext &C); |
+ ~AtomicIntrinsics() {} |
+ |
+ typedef ArrayRef<AtomicIntrinsic> View; |
+ |
+ /// The following three methods give access to atomic intrinsics, or a |
+ /// subset of them, and allows iteration through them. |
+ View allIntrinsicsAndOverloads() const; |
+ View overloadsFor(Intrinsic::ID ID) const; |
+ const AtomicIntrinsic *find(Intrinsic::ID ID, Type *OverloadedType) const; |
+ |
+private: |
+ AtomicIntrinsic I[NumAtomicIntrinsics][NumAtomicIntrinsicOverloadTypes]; |
+ |
+ AtomicIntrinsics() LLVM_DELETED_FUNCTION; |
+ AtomicIntrinsics(const AtomicIntrinsics &) LLVM_DELETED_FUNCTION; |
+ AtomicIntrinsics &operator=(const AtomicIntrinsics &) LLVM_DELETED_FUNCTION; |
+}; |
+ |
+/// Operations that can be represented by the @llvm.nacl.atomic.rmw |
+/// intrinsic. |
+/// |
+/// Do not reorder these values: their order offers forward |
+/// compatibility of bitcode targeted to NaCl. |
+enum AtomicRMWOperation { |
+ AtomicInvalid = 0, // Invalid, keep first. |
+ AtomicAdd, |
+ AtomicSub, |
+ AtomicOr, |
+ AtomicAnd, |
+ AtomicXor, |
+ AtomicExchange, |
+ AtomicNum // Invalid, keep last. |
+}; |
+ |
+/// Memory orderings supported by C11/C++11. |
+/// |
+/// Do not reorder these values: their order offers forward |
+/// compatibility of bitcode targeted to NaCl. |
+enum MemoryOrder { |
+ MemoryOrderInvalid = 0, // Invalid, keep first. |
+ MemoryOrderRelaxed, |
+ MemoryOrderConsume, |
+ MemoryOrderAcquire, |
+ MemoryOrderRelease, |
+ MemoryOrderAcquireRelease, |
+ MemoryOrderSequentiallyConsistent, |
+ MemoryOrderNum // Invalid, keep last. |
+}; |
+ |
+} // End NaCl namespace |
+ |
+} // End llvm namespace |
+ |
+#endif |