aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Type.h11
-rw-r--r--lib/VMCore/Type.cpp35
2 files changed, 45 insertions, 1 deletions
diff --git a/include/llvm/Type.h b/include/llvm/Type.h
index 960af949b1..e1fef6c882 100644
--- a/include/llvm/Type.h
+++ b/include/llvm/Type.h
@@ -212,9 +212,18 @@ public:
///
unsigned getPrimitiveSize() const;
+ /// getUnsignedVersion - If this is an integer type, return the unsigned
+ /// variant of this type. For example int -> uint.
+ const Type *getUnsignedVersion() const;
+
+ /// getSignedVersion - If this is an integer type, return the signed variant
+ /// of this type. For example uint -> int.
+ const Type *getSignedVersion() const;
+
/// getForwaredType - Return the type that this type has been resolved to if
/// it has been resolved to anything. This is used to implement the
- /// union-find algorithm for type resolution.
+ /// union-find algorithm for type resolution, and shouldn't be used by general
+ /// purpose clients.
const Type *getForwardedType() const {
if (!ForwardType) return 0;
return getForwardedTypeInternal();
diff --git a/lib/VMCore/Type.cpp b/lib/VMCore/Type.cpp
index 1d265e1dd2..5b19cb01d0 100644
--- a/lib/VMCore/Type.cpp
+++ b/lib/VMCore/Type.cpp
@@ -113,6 +113,41 @@ bool Type::isLosslesslyConvertibleTo(const Type *Ty) const {
}
}
+/// getUnsignedVersion - If this is an integer type, return the unsigned
+/// variant of this type. For example int -> uint.
+const Type *Type::getUnsignedVersion() const {
+ switch (getPrimitiveID()) {
+ default:
+ assert(isInteger()&&"Type::getUnsignedVersion is only valid for integers!");
+ case Type::UByteTyID:
+ case Type::SByteTyID: return Type::UByteTy;
+ case Type::UShortTyID:
+ case Type::ShortTyID: return Type::UShortTy;
+ case Type::UIntTyID:
+ case Type::IntTyID: return Type::UIntTy;
+ case Type::ULongTyID:
+ case Type::LongTyID: return Type::ULongTy;
+ }
+}
+
+/// getSignedVersion - If this is an integer type, return the signed variant
+/// of this type. For example uint -> int.
+const Type *Type::getSignedVersion() const {
+ switch (getPrimitiveID()) {
+ default:
+ assert(isInteger() && "Type::getSignedVersion is only valid for integers!");
+ case Type::UByteTyID:
+ case Type::SByteTyID: return Type::SByteTy;
+ case Type::UShortTyID:
+ case Type::ShortTyID: return Type::ShortTy;
+ case Type::UIntTyID:
+ case Type::IntTyID: return Type::IntTy;
+ case Type::ULongTyID:
+ case Type::LongTyID: return Type::LongTy;
+ }
+}
+
+
// getPrimitiveSize - Return the basic size of this type if it is a primitive
// type. These are fixed by LLVM and are not target dependent. This will
// return zero if the type does not have a size or is not a primitive type.