diff options
author | Chris Lattner <sabre@nondot.org> | 2007-02-09 22:24:04 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-02-09 22:24:04 +0000 |
commit | d2e8e55ae0d7b9099a2354e8a29bc762adf5f0c1 (patch) | |
tree | 4f6db24ecb4b3825b5781f9be00730a957074464 /llvm/lib | |
parent | 8b7700f14661c5d31981b3219327a9a0c596dabf (diff) | |
download | bcm5719-llvm-d2e8e55ae0d7b9099a2354e8a29bc762adf5f0c1.tar.gz bcm5719-llvm-d2e8e55ae0d7b9099a2354e8a29bc762adf5f0c1.zip |
Fix clients like this:
delete ParseBytecodeFile(InputFilename, 0, &ErrorMessage);
llvm_shutdown();
delete ParseBytecodeFile(InputFilename, 0, &ErrorMessage);
The primitive type objects failed to ressurect themselves after shutdown, leading
to crashes in clients that used them after llvm_shutdown().
This solution isn't wonderful, because we clearly have static ctors. However,
the code it replaces was just as bad, so it's not a regression.
llvm-svn: 34106
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/VMCore/Type.cpp | 43 |
1 files changed, 15 insertions, 28 deletions
diff --git a/llvm/lib/VMCore/Type.cpp b/llvm/lib/VMCore/Type.cpp index a6e57971bd5..6bfdfd7a184 100644 --- a/llvm/lib/VMCore/Type.cpp +++ b/llvm/lib/VMCore/Type.cpp @@ -347,34 +347,21 @@ const Type *StructType::getTypeAtIndex(const Value *V) const { // Primitive 'Type' data //===----------------------------------------------------------------------===// -#define DeclarePrimType(TY, Str) \ - namespace { \ - struct VISIBILITY_HIDDEN TY##Type : public Type { \ - TY##Type() : Type(Str, Type::TY##TyID) {} \ - }; \ - } \ - static ManagedStatic<TY##Type> The##TY##Ty; \ - const Type *Type::TY##Ty = &*The##TY##Ty - -#define DeclareIntegerType(TY, BitWidth) \ - namespace { \ - struct VISIBILITY_HIDDEN TY##Type : public IntegerType { \ - TY##Type() : IntegerType(BitWidth) {} \ - }; \ - } \ - static ManagedStatic<TY##Type> The##TY##Ty; \ - const IntegerType *Type::TY##Ty = &*The##TY##Ty - -DeclarePrimType(Void, "void"); -DeclarePrimType(Float, "float"); -DeclarePrimType(Double, "double"); -DeclarePrimType(Label, "label"); -DeclareIntegerType(Int1, 1); -DeclareIntegerType(Int8, 8); -DeclareIntegerType(Int16, 16); -DeclareIntegerType(Int32, 32); -DeclareIntegerType(Int64, 64); -#undef DeclarePrimType +const Type *Type::VoidTy = new Type("void", Type::VoidTyID); +const Type *Type::FloatTy = new Type("float", Type::FloatTyID); +const Type *Type::DoubleTy = new Type("double", Type::DoubleTyID); +const Type *Type::LabelTy = new Type("label", Type::LabelTyID); + +namespace { + struct BuiltinIntegerType : public IntegerType { + BuiltinIntegerType(unsigned W) : IntegerType(W) {} + }; +} +const IntegerType *Type::Int1Ty = new BuiltinIntegerType(1); +const IntegerType *Type::Int8Ty = new BuiltinIntegerType(8); +const IntegerType *Type::Int16Ty = new BuiltinIntegerType(16); +const IntegerType *Type::Int32Ty = new BuiltinIntegerType(32); +const IntegerType *Type::Int64Ty = new BuiltinIntegerType(64); //===----------------------------------------------------------------------===// |