aboutsummaryrefslogtreecommitdiff
path: root/lib/IR
diff options
context:
space:
mode:
authorEli Bendersky <eliben@chromium.org>2013-07-18 18:00:27 -0700
committerEli Bendersky <eliben@chromium.org>2013-07-18 18:00:27 -0700
commit4412ea4b8e019d00dc7574fe1723eea0473a8ec1 (patch)
tree2badd5ce0727bfad02f10d0d82c8bcfa65677676 /lib/IR
parent4a9f2a703db400ccf760f34101bcdd57642f96e4 (diff)
parent5b548094edef39376e17445aea28ad2b37d701c4 (diff)
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'lib/IR')
-rw-r--r--lib/IR/CMakeLists.txt1
-rw-r--r--lib/IR/NaClAtomicIntrinsics.cpp84
2 files changed, 85 insertions, 0 deletions
diff --git a/lib/IR/CMakeLists.txt b/lib/IR/CMakeLists.txt
index c2a4ee3aae..e60a04ae3b 100644
--- a/lib/IR/CMakeLists.txt
+++ b/lib/IR/CMakeLists.txt
@@ -25,6 +25,7 @@ add_llvm_library(LLVMCore
LeakDetector.cpp
Metadata.cpp
Module.cpp
+ NaClAtomicIntrinsics.cpp
Pass.cpp
PassManager.cpp
PassRegistry.cpp
diff --git a/lib/IR/NaClAtomicIntrinsics.cpp b/lib/IR/NaClAtomicIntrinsics.cpp
new file mode 100644
index 0000000000..5f463380c4
--- /dev/null
+++ b/lib/IR/NaClAtomicIntrinsics.cpp
@@ -0,0 +1,84 @@
+//=== llvm/IR/NaClAtomicIntrinsics.cpp - 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.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/IR/DerivedTypes.h"
+#include "llvm/IR/NaClAtomicIntrinsics.h"
+#include "llvm/IR/Type.h"
+
+namespace llvm {
+
+namespace NaCl {
+
+AtomicIntrinsics::AtomicIntrinsics(LLVMContext &C) {
+ Type *IT[NumAtomicIntrinsicOverloadTypes] = { Type::getInt8Ty(C),
+ Type::getInt16Ty(C),
+ Type::getInt32Ty(C),
+ Type::getInt64Ty(C) };
+ size_t CurIntrin = 0;
+
+ // Initialize each of the atomic intrinsics and their overloads. They
+ // have up to 5 parameters, the following macro will take care of
+ // overloading.
+#define INIT(P0, P1, P2, P3, P4, INTRIN) \
+ do { \
+ for (size_t CurType = 0; CurType != NumAtomicIntrinsicOverloadTypes; \
+ ++CurType) { \
+ size_t Param = 0; \
+ I[CurIntrin][CurType].OverloadedType = IT[CurType]; \
+ I[CurIntrin][CurType].ID = Intrinsic::nacl_atomic_##INTRIN; \
+ I[CurIntrin][CurType].Overloaded = \
+ P0 == Int || P0 == Ptr || P1 == Int || P1 == Ptr || P2 == Int || \
+ P2 == Ptr || P3 == Int || P3 == Ptr || P4 == Int || P4 == Ptr; \
+ I[CurIntrin][CurType].NumParams = \
+ (P0 != NoP) + (P1 != NoP) + (P2 != NoP) + (P3 != NoP) + (P4 != NoP); \
+ I[CurIntrin][CurType].ParamType[Param++] = P0; \
+ I[CurIntrin][CurType].ParamType[Param++] = P1; \
+ I[CurIntrin][CurType].ParamType[Param++] = P2; \
+ I[CurIntrin][CurType].ParamType[Param++] = P3; \
+ I[CurIntrin][CurType].ParamType[Param++] = P4; \
+ } \
+ ++CurIntrin; \
+ } while (0)
+
+ INIT(Ptr, Mem, NoP, NoP, NoP, load);
+ INIT(Ptr, Int, Mem, NoP, NoP, store);
+ INIT(RMW, Ptr, Int, Mem, NoP, rmw);
+ INIT(Ptr, Int, Int, Mem, Mem, cmpxchg);
+ INIT(Mem, NoP, NoP, NoP, NoP, fence);
+}
+
+AtomicIntrinsics::View AtomicIntrinsics::allIntrinsicsAndOverloads() const {
+ return View(&I[0][0], NumAtomicIntrinsics * NumAtomicIntrinsicOverloadTypes);
+}
+
+AtomicIntrinsics::View AtomicIntrinsics::overloadsFor(Intrinsic::ID ID) const {
+ // Overloads are stored consecutively.
+ View R = allIntrinsicsAndOverloads();
+ for (const AtomicIntrinsic *AI = R.begin(), *E = R.end(); AI != E; ++AI)
+ if (AI->ID == ID)
+ return View(AI, NumAtomicIntrinsicOverloadTypes);
+ llvm_unreachable("unhandled atomic intrinsic");
+}
+
+const AtomicIntrinsics::AtomicIntrinsic *
+AtomicIntrinsics::find(Intrinsic::ID ID, Type *OverloadedType) const {
+ View R = allIntrinsicsAndOverloads();
+ for (const AtomicIntrinsic *AI = R.begin(), *E = R.end(); AI != E; ++AI)
+ if (AI->ID == ID && AI->OverloadedType == OverloadedType)
+ return AI;
+ llvm_unreachable("unhandled atomic intrinsic");
+}
+
+} // End NaCl namespace
+
+} // End llvm namespace