sink more of the type related code into CodeGenTypes.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46801 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp
index eff26f9..e1aec69 100644
--- a/CodeGen/CodeGenModule.cpp
+++ b/CodeGen/CodeGenModule.cpp
@@ -261,24 +261,9 @@
     EmitGlobalVar(D);
 }
 
-void CodeGenModule::EmitType(const TypeDecl *D) {
-  if (isa<TypedefDecl>(D)) {
-    // TODO: Emit debug info.
-    return;
-  }
-  
-  assert(!isa<ObjCInterfaceDecl>(D) && "FIXME: ADD OBJC SUPPORT");
-  
-  // This must be a tag decl.
-  const TagDecl *TD = cast<TagDecl>(D);
-  
-  // Get the LLVM type for this TagDecl.  If it is non-opaque or if this decl
-  // is still a forward declaration, just return.
-  QualType NewTy = Context.getTagDeclType(const_cast<TagDecl *>(TD));
-  const llvm::Type *T = Types.ConvertType(NewTy);
-  if (isa<llvm::OpaqueType>(T) && TD->isDefinition())
-    // Make sure that this type is translated.
-    Types.ForceTypeCompilation(NewTy);
+void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
+  // Make sure that this type is translated.
+  Types.UpdateCompletedType(TD);
 }
 
 
diff --git a/CodeGen/CodeGenModule.h b/CodeGen/CodeGenModule.h
index 900ddf4..7c236e0 100644
--- a/CodeGen/CodeGenModule.h
+++ b/CodeGen/CodeGenModule.h
@@ -88,7 +88,7 @@
   void EmitFunction(const FunctionDecl *FD);
   void EmitGlobalVar(const FileVarDecl *D);
   void EmitGlobalVarDeclarator(const FileVarDecl *D);
-  void EmitType(const TypeDecl *D);
+  void UpdateCompletedType(const TagDecl *D);
   llvm::Constant *EmitGlobalInit(const Expr *E);
   llvm::Constant *EmitConstantExpr(const Expr *E);
     
diff --git a/CodeGen/CodeGenTypes.cpp b/CodeGen/CodeGenTypes.cpp
index 2e10cfc..6ef11db 100644
--- a/CodeGen/CodeGenTypes.cpp
+++ b/CodeGen/CodeGenTypes.cpp
@@ -125,11 +125,15 @@
   
 }
 
-/// ForceTypeCompilation - When we find the definition for a type, we require
-/// it to be recompiled, to update the lazy understanding of what it is in our
-/// maps.
-void CodeGenTypes::ForceTypeCompilation(QualType T) {
-  const TagDecl *TD = cast<TagType>(T)->getDecl();
+/// UpdateCompletedType - When we find the full definition for a TagDecl,
+/// replace the 'opaque' type we previously made for it if applicable.
+void CodeGenTypes::UpdateCompletedType(const TagDecl *TD) {
+  // Get the LLVM type for this TagDecl.  If it is non-opaque or if this decl
+  // is still a forward declaration, just return.
+  QualType NewTy = Context.getTagDeclType(const_cast<TagDecl *>(TD));
+  const llvm::Type *T = ConvertType(NewTy);
+  if (!isa<llvm::OpaqueType>(T))
+    return;
 
   // Remember the opaque LLVM type for this tagdecl.
   llvm::DenseMap<const TagDecl*, llvm::PATypeHolder>::iterator TDTI = 
@@ -141,7 +145,7 @@
   // Remove it from TagDeclTypes so that it will be regenerated.
   TagDeclTypes.erase(TDTI);
 
-  const llvm::Type *NT = ConvertNewType(T);
+  const llvm::Type *NT = ConvertNewType(NewTy);
 
   // If getting the type didn't itself refine it, refine it to its actual type
   // now.
diff --git a/CodeGen/CodeGenTypes.h b/CodeGen/CodeGenTypes.h
index b60b9ba..2ce7185 100644
--- a/CodeGen/CodeGenTypes.h
+++ b/CodeGen/CodeGenTypes.h
@@ -138,10 +138,9 @@
   unsigned getLLVMFieldNo(const FieldDecl *FD);
     
   
-  /// ForceTypeCompilation - When we find the definition for a type, we require
-  /// it to be recompiled, to update the lazy understanding of what it is in our
-  /// maps.
-  void ForceTypeCompilation(QualType T);
+  /// UpdateCompletedType - When we find the full definition for a TagDecl,
+  /// replace the 'opaque' type we previously made for it if applicable.
+  void UpdateCompletedType(const TagDecl *TD);
   
 public:  // These are internal details of CGT that shouldn't be used externally.
   void DecodeArgumentTypes(const FunctionTypeProto &FTP, 
diff --git a/CodeGen/ModuleBuilder.cpp b/CodeGen/ModuleBuilder.cpp
index 8d3207a..50d6fed 100644
--- a/CodeGen/ModuleBuilder.cpp
+++ b/CodeGen/ModuleBuilder.cpp
@@ -81,7 +81,7 @@
     /// hack on the type, which can occur at any point in the file (because these
     /// can be defined in declspecs).
     virtual void HandleTagDeclDefinition(TagDecl *D) {
-      Builder->EmitType(D);
+      Builder->UpdateCompletedType(D);
     }
     
   };