Index: src/IceIntrinsics.h |
diff --git a/src/IceIntrinsics.h b/src/IceIntrinsics.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4f9f7ded0423dd0cf5ca31607434494e43e4ede4 |
--- /dev/null |
+++ b/src/IceIntrinsics.h |
@@ -0,0 +1,94 @@ |
+//===- subzero/src/IceIntrinsics.h - List of Ice Intrinsics -----*- C++ -*-===// |
+// |
+// The Subzero Code Generator |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+// |
+// This file declares the kinds of intrinsics supported by PNaCl. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#ifndef SUBZERO_SRC_ICEINTRINSICS_H |
+#define SUBZERO_SRC_ICEINTRINSICS_H |
+ |
+#include "IceDefs.h" |
+ |
+namespace Ice { |
+ |
+static const size_t kMaxIntrinsicParameters = 6; |
+ |
+class Intrinsics { |
+public: |
+ Intrinsics(); |
+ ~Intrinsics(); |
+ |
+ // Some intrinsics allow overloading by type. This enum collapses all |
+ // overloads into a single ID, but the type can still be recovered by the |
+ // type of the intrinsic function call's return value and parameters. |
+ enum IntrinsicID { |
+ UnknownIntrinsic = 0, |
+ // Arbitrary (alphabetical) order. |
+ AtomicCmpxchg, |
+ AtomicFence, |
+ AtomicFenceAll, |
+ AtomicIsLockFree, |
+ AtomicLoad, |
+ AtomicRMW, |
+ AtomicStore, |
+ Bswap, |
+ Ctlz, |
+ Ctpop, |
+ Cttz, |
+ Longjmp, |
+ Memcpy, |
+ Memmove, |
+ Memset, |
+ NaClReadTP, |
+ Setjmp, |
+ Sqrt, |
+ Stacksave, |
+ Stackrestore, |
+ Trap |
+ }; |
+ |
+ // Basic attributes related to each intrinsic, that are relevant to |
+ // code generation. We will want to have more attributes (e.g., Setjmp |
+ // returns twice and which affects stack coloring) once the lowering |
+ // cares about such attributes. Perhaps the attributes representation |
+ // can be shared with general function calls, though most functions |
+ // will be opaque. |
+ struct IntrinsicInfo { |
+ IntrinsicID ID : 31; |
+ bool HasSideEffects : 1; |
+ }; |
+ |
+ // The complete set of information about an intrinsic. |
+ struct FullIntrinsicInfo { |
+ struct IntrinsicInfo Info; // Information that CodeGen would care about. |
+ |
+ // Sanity check during parsing. |
+ Type Signature[kMaxIntrinsicParameters]; |
+ uint8_t NumTypes; |
+ }; |
+ |
+ // Find the information about a given intrinsic, based on function name. |
+ // The function name is expected to have the common "llvm." prefix |
+ // stripped. If found, returns a reference to a FullIntrinsicInfo entry |
+ // (valid for the lifetime of the map). Otherwise returns null. |
+ const FullIntrinsicInfo *find(const IceString &Name) const; |
+ |
+private: |
+ // TODO(jvoung): May want to switch to something like LLVM's StringMap. |
+ typedef std::map<IceString, FullIntrinsicInfo> IntrinsicMap; |
+ IntrinsicMap map; |
+ |
+ Intrinsics(const Intrinsics &) LLVM_DELETED_FUNCTION; |
+ Intrinsics &operator=(const Intrinsics &) LLVM_DELETED_FUNCTION; |
+}; |
+ |
+} // end of namespace Ice |
+ |
+#endif // SUBZERO_SRC_ICEINTRINSICS_H |