diff --git a/lib/VMCore/ConstPoolVals.cpp b/lib/VMCore/ConstPoolVals.cpp new file mode 100644 index 00000000000..f778a3716c7 --- /dev/null +++ b/lib/VMCore/ConstPoolVals.cpp @@ -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; +} + +//===--------------------------------------------------------------------------