rewrite some of the type refinement code to eliminate dangling pointers
simplify the code and generally make it more robust.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46745 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp
index 9de5d34..eff26f9 100644
--- a/CodeGen/CodeGenModule.cpp
+++ b/CodeGen/CodeGenModule.cpp
@@ -261,6 +261,27 @@
     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);
+}
+
+
 /// getBuiltinLibFunction
 llvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) {
   if (BuiltinID > BuiltinFunctions.size())