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 | d1f711fa6df3903f72ea4db503f576b2dc227faa (patch) | |
tree | 411893b34e84a7a7c8ede17075c836957f928a81 /lib/VMCore/Type.cpp | |
parent | c99ef085b90b32952b484e8843fb66ad65215b61 (diff) | |
download | external_llvm-d1f711fa6df3903f72ea4db503f576b2dc227faa.zip external_llvm-d1f711fa6df3903f72ea4db503f576b2dc227faa.tar.gz external_llvm-d1f711fa6df3903f72ea4db503f576b2dc227faa.tar.bz2 |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34106 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Type.cpp')
-rw-r--r-- | lib/VMCore/Type.cpp | 43 |
1 files changed, 15 insertions, 28 deletions
diff --git a/lib/VMCore/Type.cpp b/lib/VMCore/Type.cpp index a6e5797..6bfdfd7 100644 --- a/lib/VMCore/Type.cpp +++ b/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); //===----------------------------------------------------------------------===// |