This is a new version of a patch I sent out last year to stop gcc from
trying to do a link when creating precompiled headers and a linker
flag is also given.

When I build and test GCC I also build glibc and then I run the GCC tests
with -Wl,-rpath and -Wl,--dynamic-linker so that I don't have to install
glibc and the compiler in the default locations.  When I do this some
precompiled header tests fail because the existance of the linker flags
causes the compiler to try and call the linker when we really just want to
create pch files.

I tracked this down to driver::maybe_run_linker where it sees the linker
flags and increments num_linker_inputs, this causes the routine to call
the linker.   This patch checks to see if we are creating precompiled
header files and avoids calling the linker in that case.

I tested this with the GCC testsuite and got no regressions, OK to checkin?

Steve Ellcey
sell...@cavium.com


2018-05-02  Steve Ellcey  <sell...@cavium.com>

        * gcc.c (create_pch_flag): New variable.
        (driver::prepare_infiles): Set create_pch_flag
        when we are creating precompiled headers.
        (driver::maybe_run_linker): Do not link if
        create_pch_flag is set.
        (driver::finalize): Reset create_pch_flag.


diff --git a/gcc/gcc.c b/gcc/gcc.c
index a716f70..ca986cf 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -208,6 +208,9 @@ int is_cpp_driver;
 /* Flag set to nonzero if an @file argument has been supplied to gcc.  */
 static bool at_file_supplied;
 
+/* Flag set to nonzero if we are generating a precompiled header.  */
+static bool create_pch_flag;
+
 /* Definition of string containing the arguments given to configure.  */
 #include "configargs.h"
 
@@ -8095,8 +8098,15 @@ driver::prepare_infiles ()
                                                   strlen (name),
                                                   infiles[i].language);
 
-      if (compiler && !(compiler->combinable))
-       combine_inputs = false;
+      if (compiler)
+       {
+         if (!(compiler->combinable))
+           combine_inputs = false;
+
+         if ((strcmp(compiler->suffix, "@c-header") == 0)
+             || (strcmp(compiler->suffix, "@c++-header") == 0))
+           create_pch_flag = true;
+       }
 
       if (lang_n_infiles > 0 && compiler != input_file_compiler
          && infiles[i].language && infiles[i].language[0] != '*')
@@ -8282,6 +8292,10 @@ driver::maybe_run_linker (const char *argv0) const
   int linker_was_run = 0;
   int num_linker_inputs;
 
+  /* If we are creating a precompiled header, do not run the linker.  */
+  if (create_pch_flag)
+    return;
+
   /* Determine if there are any linker input files.  */
   num_linker_inputs = 0;
   for (i = 0; (int) i < n_infiles; i++)
@@ -10052,6 +10066,7 @@ driver::finalize ()
 
   is_cpp_driver = 0;
   at_file_supplied = 0;
+  create_pch_flag = 0;
   print_help_list = 0;
   print_version = 0;
   verbose_only_flag = 0;

Reply via email to