Defer generation of tentative definitions.
 - PR3980.

 - <rdar://problem/6762287> [irgen] crash when generating tentative
   definition of incomplete structure

 - This also avoids creating common definitions for things which are
   later overwritten.

 - XFAIL'ed external-defs.c, it isn't completing types properly yet.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69231 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h
index a1fc715..e7a587f 100644
--- a/lib/CodeGen/CodeGenModule.h
+++ b/lib/CodeGen/CodeGenModule.h
@@ -117,6 +117,14 @@
   /// that *are* actually referenced.  These get code generated when the module
   /// is done.
   std::vector<const ValueDecl*> DeferredDeclsToEmit;
+
+  /// TentativeDefinitions - A list of declarations which are
+  /// tentative definitions. Code generation for these must be
+  /// deferred because they are allowed to have incomplete type when
+  /// they are seen. This also allows us to avoid generating an extra
+  /// common definiton in situations where the tentative definition is
+  /// followed by an actual definition.
+  std::vector<const VarDecl*> TentativeDefinitions;
   
   /// LLVMUsed - List of global values which are required to be
   /// present in the object file; bitcast to i8*. This is used for
@@ -357,6 +365,7 @@
   void EmitGlobalDefinition(const ValueDecl *D);
 
   void EmitGlobalFunctionDefinition(const FunctionDecl *D);
+  void EmitTentativeDefinition(const VarDecl *D);
   void EmitGlobalVarDefinition(const VarDecl *D);
   void EmitAliasDefinition(const ValueDecl *D);
   void EmitObjCPropertyImplementations(const ObjCImplementationDecl *D);