Fix clients like this:
authorChris Lattner <sabre@nondot.org>
Fri, 9 Feb 2007 22:24:04 +0000 (22:24 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 9 Feb 2007 22:24:04 +0000 (22:24 +0000)
  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

lib/VMCore/Type.cpp

index a6e57971bd5a463bc095e060e8ddfb86ac3dfec0..6bfdfd7a1843175efd9582706ac5de19c311db8f 100644 (file)
@@ -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);
 
 
 //===----------------------------------------------------------------------===//