Index: include/llvm/Analysis/NaCl/PNaClABITypeChecker.h |
diff --git a/include/llvm/Analysis/NaCl/PNaClABITypeChecker.h b/include/llvm/Analysis/NaCl/PNaClABITypeChecker.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..257f512ef125e8afdc6bffa9d7a9413c8e71be58 |
--- /dev/null |
+++ b/include/llvm/Analysis/NaCl/PNaClABITypeChecker.h |
@@ -0,0 +1,80 @@ |
+//===- PNaClABITypeChecker.h - Verify PNaCl ABI rules -----------*- C++ -*-===// |
+// |
+// The LLVM Compiler Infrastructure |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+// |
+// Common type-checking code for module and function-level passes |
+// |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#ifndef LLVM_ANALYSIS_NACL_PNACLABITYPECHECKER_H |
+#define LLVM_ANALYSIS_NACL_PNACLABITYPECHECKER_H |
+ |
+#include "llvm/ADT/DenseSet.h" |
+#include "llvm/IR/Type.h" |
+#include "llvm/Support/raw_ostream.h" |
+ |
+namespace llvm { |
+class FunctionType; |
+ |
+class PNaClABITypeChecker { |
+ PNaClABITypeChecker(const PNaClABITypeChecker&) LLVM_DELETED_FUNCTION; |
+ void operator=(const PNaClABITypeChecker&) LLVM_DELETED_FUNCTION; |
+public: |
+ // Returns true if Ty is a valid argument or return value type for PNaCl. |
+ static bool isValidParamType(const Type *Ty); |
+ |
+ // Returns true if Ty is a valid function type for PNaCl. |
+ static bool isValidFunctionType(const FunctionType *FTy); |
+ |
+ // Returns true if Ty is a valid non-derived type for PNaCl. |
+ static bool isValidScalarType(const Type *Ty); |
+ |
+ // Returns true if Ty is a valid vector type for PNaCl. |
+ static bool isValidVectorType(const Type *Ty); |
+ |
+ // Returns true if type Ty can be used in (integer) arithmetic operations. |
+ static bool isValidIntArithmeticType(const Type *Ty); |
+ |
+ // Returns true if type Ty can be used to define the test condition of |
+ // a switch instruction. |
+ static bool isValidSwitchConditionType(const Type *Ty) { |
+ return PNaClABITypeChecker::isValidIntArithmeticType(Ty); |
+ } |
+ // Returns error message showing what was expected when given the |
+ // switch condition type Ty. Assumes isValidSwitchConditionType(Ty) |
+ // returned false. |
+ static const char *ExpectedSwitchConditionType(const Type *Ty) { |
+ if (!Ty->isIntegerTy()) |
+ return "switch not on integer type"; |
+ if (Ty->isIntegerTy(1)) |
+ return "switch on i1 not allowed"; |
+ return "switch disallowed for integer type"; |
+ } |
+ |
+ // There's no built-in way to get the name of a type, so use a |
+ // string ostream to print it. |
+ static std::string getTypeName(const Type *T) { |
+ std::string TypeName; |
+ raw_string_ostream N(TypeName); |
+ T->print(N); |
+ return N.str(); |
+ } |
+ |
+ // Returns true if T1 is equivalent to T2, converting to i32 if |
+ // a pointer type. |
+ static bool IsPointerEquivType(Type *T1, Type *T2) { |
+ if (T1->isPointerTy()) return T2->isIntegerTy(32); |
+ if (T2->isPointerTy()) return T1->isIntegerTy(32); |
+ return T1 == T2; |
+ } |
+ |
+}; |
+} // namespace llvm |
+ |
+#endif // LLVM_ANALYSIS_NACL_PNACLABITYPECHECKER_H |