Make ASTContext explicitly keep track of the declaration for the C
FILE type, rather than using name lookup to find FILE within the
translation unit. Within precompiled headers, FILE is treated as yet
another "special type" (like __builtin_va_list).

This change should provide a performance improvement (not verified),
since the lookup into the translation unit declaration 
forces the (otherwise unneeded) construction of a large hash table.
More importantly, with precompiled headers, the construction
of that table requires deserializing most of the top-level
declarations from the precompiled header, which are then unused.

Fixes PR 4509.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74911 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/PCH/pr4489.c b/test/PCH/pr4489.c
index 5198811..7730819 100644
--- a/test/PCH/pr4489.c
+++ b/test/PCH/pr4489.c
@@ -1,7 +1,8 @@
 // RUN: clang -x c-header -o %t.pch %s &&
 // RUN: clang -include %t -x c /dev/null -emit-llvm -S -o -
 // PR 4489: Crash with PCH
-
+// PR 4492: Crash with PCH (round two)
+// PR 4509: Crash with PCH (round three)
 typedef struct _IO_FILE FILE;
 extern int fprintf (struct _IO_FILE *__restrict __stream,
                     __const char *__restrict __format, ...);
@@ -25,4 +26,15 @@
 {
   extern char z0;
   fprintf (0, "a");
+}
+
+void x1(void)
+{
+  fprintf (0, "asdf");
+}
+
+void y1(void)
+{
+  extern char e;
+  fprintf (0, "asdf");
 }
\ No newline at end of file