Utility routines for simpler access to the value of an integer constant.
authorVikram S. Adve <vadve@cs.uiuc.edu>
Sat, 21 Jul 2001 12:44:00 +0000 (12:44 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Sat, 21 Jul 2001 12:44:00 +0000 (12:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/ConstPoolVals.cpp [new file with mode: 0644]

diff --git a/lib/VMCore/ConstPoolVals.cpp b/lib/VMCore/ConstPoolVals.cpp
new file mode 100644 (file)
index 0000000..f778a37
--- /dev/null
@@ -0,0 +1,108 @@
+//===-- llvm/ConstPoolVals.cpp - Implement Constant Value nodes -*- C++ -*--=//
+//
+// This file implements the ConstPoolVal class and associated functions.
+//
+//===---------------------------------------------------------------------===//
+
+#include "llvm/Type.h"
+#include "llvm/Value.h"
+#include "llvm/ConstPoolVals.h"
+
+
+//===--------------------------------------------------------------------------
+// External functions
+//
+
+// Convenience functions to get the value of an integer constant, for an
+// appropriate integer or non-integer type that can be held in an integer.
+// The type of the argument must be the following:
+//   GetSignedIntConstantValue:   signed integer or bool
+//   GetUnsignedIntConstantValue: unsigned integer, bool, or pointer
+//   GetConstantValueAsSignedInt: any of the above, but the value
+//                               must fit into a int64_t.
+// 
+// isValidConstant is set to true if a valid constant was found.
+// 
+
+int64_t
+GetSignedIntConstantValue(const Value* val, bool& isValidConstant)
+{
+  int64_t intValue = 0;
+  isValidConstant = false;
+  
+  if (val->getValueType() == Value::ConstantVal)
+    {
+      switch(val->getType()->getPrimitiveID())
+       {
+       case Type::BoolTyID:
+         intValue = ((ConstPoolBool*) val)->getValue()? 1 : 0;
+         isValidConstant = true;
+         break;
+       case Type::SByteTyID:
+       case Type::ShortTyID:
+       case Type::IntTyID:
+       case Type::LongTyID:
+         intValue = ((ConstPoolSInt*) val)->getValue();
+         isValidConstant = true;
+         break;
+       default:
+         break;
+       }
+    }
+  
+  return intValue;
+}
+
+uint64_t
+GetUnsignedIntConstantValue(const Value* val, bool& isValidConstant)
+{
+  uint64_t intValue = 0;
+  isValidConstant = false;
+  
+  if (val->getValueType() == Value::ConstantVal)
+    {
+      switch(val->getType()->getPrimitiveID())
+       {
+       case Type::BoolTyID:
+         intValue = ((ConstPoolBool*) val)->getValue()? 1 : 0;
+         isValidConstant = true;
+         break;
+       case Type::UByteTyID:
+       case Type::UShortTyID:
+       case Type::UIntTyID:
+       case Type::ULongTyID:
+       case Type::PointerTyID:
+         intValue = ((ConstPoolUInt*) val)->getValue();
+         isValidConstant = true;
+         break;
+       default:
+         break;
+       }
+    }
+  
+  return intValue;
+}
+
+
+int64_t
+GetConstantValueAsSignedInt(const Value* val, bool& isValidConstant)
+{
+  int64_t intValue = 0;
+  
+  if (val->getType()->isSigned())
+    {
+      intValue = GetSignedIntConstantValue(val, isValidConstant);
+    }
+  else                         // non-numeric types will fall here
+    {
+      uint64_t uintValue = GetUnsignedIntConstantValue(val, isValidConstant);
+      if (isValidConstant && uintValue < INT64_MAX)    // then safe to cast to signed
+       intValue = (int64_t) uintValue;
+      else 
+       isValidConstant = false;
+    }
+  
+  return intValue;
+}
+
+//===--------------------------------------------------------------------------