]> granicus.if.org Git - clang/commitdiff
per john's advice, speculatively lower uses of forward-declared enums to
authorChris Lattner <sabre@nondot.org>
Wed, 13 Jul 2011 05:31:19 +0000 (05:31 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 13 Jul 2011 05:31:19 +0000 (05:31 +0000)
i32.  They almost always end up this way in the end anyway, and if we get
lucky, this avoids generating some bitcasts.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135032 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenTypes.cpp

index 8efe9e1eea17b42314b1f8d79fd16e34a643b535..8dae84e48f33717c8b3437d2e3e21c7f3ce629f0 100644 (file)
@@ -154,8 +154,13 @@ void CodeGenTypes::UpdateCompletedType(const TagDecl *TD) {
   // from the enum to be recomputed.
   if (const EnumDecl *ED = dyn_cast<EnumDecl>(TD)) {
     // Only flush the cache if we've actually already converted this type.
-    if (TypeCache.count(ED->getTypeForDecl()))
-      TypeCache.clear();
+    if (TypeCache.count(ED->getTypeForDecl())) {
+      // Okay, we formed some types based on this.  We speculated that the enum
+      // would be lowered to i32, so we only need to flush the cache if this
+      // didn't happen.
+      if (!ConvertType(ED->getIntegerType())->isIntegerTy(32))
+        TypeCache.clear();
+    }
     return;
   }
   
@@ -416,12 +421,14 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
     break;
   }
 
-   case Type::Enum: {
+  case Type::Enum: {
     const EnumDecl *ED = cast<EnumType>(Ty)->getDecl();
     if (ED->isDefinition() || ED->isFixed())
       return ConvertType(ED->getIntegerType());
-    // Return a placeholder '{}' type.
-    ResultType = llvm::StructType::get(getLLVMContext());
+    // Return a placeholder 'i32' type.  This can be changed later when the
+    // type is defined (see UpdateCompletedType), but is likely to be the
+    // "right" answer.
+    ResultType = llvm::Type::getInt32Ty(getLLVMContext());
     break;
   }