aboutsummaryrefslogtreecommitdiffstats
path: root/lib/VMCore/Type.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-02-09 22:24:04 +0000
committerChris Lattner <sabre@nondot.org>2007-02-09 22:24:04 +0000
commitd1f711fa6df3903f72ea4db503f576b2dc227faa (patch)
tree411893b34e84a7a7c8ede17075c836957f928a81 /lib/VMCore/Type.cpp
parentc99ef085b90b32952b484e8843fb66ad65215b61 (diff)
downloadexternal_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.cpp43
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);
//===----------------------------------------------------------------------===//