1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 19:52:54 +01:00

Make ConstantInt::getTrue/getFalse be llvm_shutdown safe.

llvm-svn: 34443
This commit is contained in:
Chris Lattner 2007-02-20 06:11:36 +00:00
parent 08e1470365
commit adb16a1a53
2 changed files with 32 additions and 11 deletions

View File

@ -40,6 +40,7 @@ struct ConvertConstantType;
/// represents both boolean and integral constants.
/// @brief Class for constant integers.
class ConstantInt : public Constant {
static ConstantInt *TheTrueVal, *TheFalseVal;
protected:
uint64_t Val;
protected:
@ -73,14 +74,12 @@ public:
/// getTrue/getFalse - Return the singleton true/false values.
static inline ConstantInt *getTrue() {
static ConstantInt *T = 0;
if (T) return T;
return T = new ConstantInt(Type::Int1Ty, 1);
if (TheTrueVal) return TheTrueVal;
return CreateTrueFalseVals(true);
}
static inline ConstantInt *getFalse() {
static ConstantInt *F = 0;
if (F) return F;
return F = new ConstantInt(Type::Int1Ty, 0);
if (TheFalseVal) return TheFalseVal;
return CreateTrueFalseVals(false);
}
/// Return a ConstantInt with the specified value for the specified type. The
@ -165,6 +164,9 @@ public:
static bool classof(const Value *V) {
return V->getValueType() == ConstantIntVal;
}
static void ResetTrueFalse() { TheTrueVal = TheFalseVal = 0; }
private:
static ConstantInt *CreateTrueFalseVals(bool WhichOne);
};

View File

@ -800,6 +800,7 @@ public:
//
static ManagedStatic<ValueMap<uint64_t, IntegerType, ConstantInt> >IntConstants;
// Get a ConstantInt from an int64_t. Note here that we canoncialize the value
// to a uint64_t value that has been zero extended down to the size of the
// integer type of the ConstantInt. This allows the getZExtValue method to
@ -807,14 +808,32 @@ static ManagedStatic<ValueMap<uint64_t, IntegerType, ConstantInt> >IntConstants;
// extended. getZExtValue is more common in LLVM than getSExtValue().
ConstantInt *ConstantInt::get(const Type *Ty, int64_t V) {
const IntegerType *ITy = cast<IntegerType>(Ty);
if (Ty == Type::Int1Ty)
if (V & 1)
return getTrue();
else
return getFalse();
return IntConstants->getOrCreate(ITy, V & ITy->getBitMask());
}
ConstantInt *ConstantInt::TheTrueVal = 0;
ConstantInt *ConstantInt::TheFalseVal = 0;
void CleanupTrueFalse(void *) {
ConstantInt::ResetTrueFalse();
}
static ManagedCleanup<CleanupTrueFalse> TrueFalseCleanup;
ConstantInt *ConstantInt::CreateTrueFalseVals(bool WhichOne) {
assert(TheTrueVal == 0 && TheFalseVal == 0);
TheTrueVal = get(Type::Int1Ty, 1);
TheFalseVal = get(Type::Int1Ty, 0);
// Ensure that llvm_shutdown nulls out TheTrueVal/TheFalseVal.
TrueFalseCleanup.Register();
return WhichOne ? TheTrueVal : TheFalseVal;
}
//---- ConstantFP::get() implementation...
//
namespace llvm {