This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] -fdump-tree, -save-temps=obj & subdirs


There's an unfortunate interaction between -save-temps=obj and -fdump-tree-<whatever> when subdirectories are in play.

Consider:
  g++ -fdump-tree-all -save-temps=obj -c -o tgt/x.o sub/x.cc
we end up with a bunch of errors of the form:
sub/x.cc:1:0: error: could not open dump file ‘tgt/tgt/x.046t.profile_estimate’: No such file or directory

you'll see it's added the 'tgt' sub directory twice. The reason is that cc1plus is invoked as:

/usr/libexec/gcc/x86_64-redhat-linux/7/cc1plus -E -quiet -v -D_GNU_SOURCE sub/x.cc -mtune=generic -march=x86-64 -ansi -Woverloaded-virtual -Wall -Wpointer-arith -Wwrite-strings -felide-constructors -fdump-tree-all -fpch-preprocess -o tgt/x.ii

to generate the preprocessed output, and then as:

/usr/libexec/gcc/x86_64-redhat-linux/7/cc1plus -fpreprocessed tgt/x.ii -quiet -dumpbase tgt/x -mtune=generic -march=x86-64 -auxbase-strip tgt/x.o -Woverloaded-virtual -Wall -Wpointer-arith -Wwrite-strings -ansi -version -felide-constructors -fdump-tree-all -o tgt/x.s

for the compilation itself. That has '-dumpbase tgt/x' and '-auxbase-strip tgt/x.o' passed in.

The options processing checks if dump-base is absolute, and if not prefixes dump_dir_name or aux_base_name's directory components.

It seems to me that the absolute path check is incomplete. We should check if dump-base has /any/ directory components. If it does, we shouldn't touch it. That's what this patch does:

1) remove the absolute dir check.  That's subsumed into ...
2) look for any DIR_SEPARATOR in the dump-base.  If so, no prefixing
3 & 4) existing prefix code
5) always set dump_base_name_prefixed, so we don't repeat #2 on a subsequent invocation.

With this patch we now get a successful compilation:

nathans@lyta:7>egcs/trunk/obj/x86_64/gcc/xg++ -B egcs/trunk/obj/x86_64/gcc/ -fdump-tree-all -save-temps=obj -c -o tgt/x.o sub/x.cc
nathans@lyta:8>ls tgt
total 100
4 x.003t.original 4 x.010t.eh 4 x.020t.ssa 4 x.049t.release_ssa 4 x.220t.switchlower 4 x.o 4 x.004t.gimple 4 x.011t.cfg 4 x.027t.fixup_cfg3 4 x.050t.local-fnsummary2 4 x.226t.resx 4 x.s 4 x.006t.omplower 4 x.012t.ompexp 4 x.028t.local-fnsummary1 4 x.087t.fixup_cfg4 4 x.228t.optimized 4 x.007t.lower 4 x.013t.printf-return-value1 4 x.029t.einline 4 x.218t.veclower 0 x.313t.statistics 4 x.009t.ehopt 4 x.019t.fixup_cfg1 0 x.046t.profile_estimate 4 x.219t.cplxlower0 4 x.ii

ok?

nathan
--
Nathan Sidwell
2017-12-06  Nathan Sidwell  <nathan@acm.org>

	* opts.c (finish_options): Don't prefix dump_base_name if it
	already contains directories.

Index: gcc/opts.c
===================================================================
--- gcc/opts.c	(revision 255442)
+++ gcc/opts.c	(working copy)
@@ -698,19 +698,27 @@ finish_options (struct gcc_options *opts
   enum unwind_info_type ui_except;
 
   if (opts->x_dump_base_name
-      && ! IS_ABSOLUTE_PATH (opts->x_dump_base_name)
       && ! opts->x_dump_base_name_prefixed)
     {
-      /* First try to make OPTS->X_DUMP_BASE_NAME relative to the
-	 OPTS->X_DUMP_DIR_NAME directory.  Then try to make
-	 OPTS->X_DUMP_BASE_NAME relative to the OPTS->X_AUX_BASE_NAME
-	 directory, typically the directory to contain the object
-	 file.  */
-      if (opts->x_dump_dir_name)
+      const char *sep = opts->x_dump_base_name;
+
+      for (; *sep; sep++)
+	if (IS_DIR_SEPARATOR (*sep))
+	  break;
+
+      if (*sep)
+	/* If dump_base_path contains subdirectories, don't prepend
+	   anything.  */;
+      else if (opts->x_dump_dir_name)
+	/* We have a DUMP_DIR_NAME, prepend that.  */
 	opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name,
 					      opts->x_dump_base_name, NULL);
       else if (opts->x_aux_base_name
 	       && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0)
+	/* AUX_BASE_NAME is set and is not the bit bucket.  If it
+	   contains a directory component, prepend those directories.
+	   Typically this places things in the same directory as the
+	   object file.  */
 	{
 	  const char *aux_base;
 
@@ -729,7 +737,9 @@ finish_options (struct gcc_options *opts
 	      opts->x_dump_base_name = new_dump_base_name;
 	    }
 	}
-	opts->x_dump_base_name_prefixed = true;
+
+      /* It is definitely prefixed now.  */
+      opts->x_dump_base_name_prefixed = true;
     }
 
   /* Handle related options for unit-at-a-time, toplevel-reorder, and

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]