d: Fix missing dependencies in depfile for imported files (PR93038)
authorIain Buclaw <ibuclaw@gdcproject.org>
Sat, 21 Mar 2020 23:10:17 +0000 (00:10 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Sat, 21 Mar 2020 23:10:37 +0000 (00:10 +0100)
A new field for tracking imported files was added to the front-end, this
makes use of it by writing all such files in the make dependency list.

gcc/d/ChangeLog:

2020-03-22  Iain Buclaw  <ibuclaw@gdcproject.org>

PR d/93038
* d-lang.cc (deps_write): Add content imported files to the make
dependency list.

gcc/testsuite/ChangeLog:

2020-03-22  Iain Buclaw  <ibuclaw@gdcproject.org>

PR d/93038
* gdc.dg/fileimports/pr93038.txt: New test.
* gdc.dg/pr93038.d: New test.

gcc/d/ChangeLog
gcc/d/d-lang.cc
gcc/testsuite/ChangeLog
gcc/testsuite/gdc.dg/fileimports/pr93038.txt [new file with mode: 0644]
gcc/testsuite/gdc.dg/pr93038.d [new file with mode: 0644]

index 31c9c4b3a20c1dd0163e1053d7cfc775883e9c51..916319f6bf773adc11a843db2c520e46141dc301 100644 (file)
@@ -1,3 +1,9 @@
+2020-03-22  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       PR d/93038
+       * d-lang.cc (deps_write): Add content imported files to the make
+       dependency list.
+
 2020-03-21  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        PR d/94240
index 3f50b5f11041469bf8ceb69fb0861e07f2d639d6..514799d8e895dcd80260a6c02e4ab4c25963ae70 100644 (file)
@@ -151,7 +151,8 @@ deps_add_target (const char *target, bool quoted)
 static void
 deps_write (Module *module, OutBuffer *buffer, unsigned colmax = 72)
 {
-  hash_set <const char *> dependencies;
+  hash_set <const char *> seen_modules;
+  vec <const char *> dependencies = vNULL;
 
   Modules modlist;
   modlist.push (module);
@@ -179,38 +180,28 @@ deps_write (Module *module, OutBuffer *buffer, unsigned colmax = 72)
   buffer->writestring (":");
   column++;
 
-  /* Write out all make dependencies.  */
+  /* Search all modules for file dependencies.  */
   while (modlist.dim > 0)
     {
       Module *depmod = modlist.pop ();
 
       str = depmod->srcfile->name->str;
-      size = strlen (str);
 
-      /* Skip dependencies that have already been written.  */
-      if (dependencies.add (str))
+      /* Skip modules that have already been looked at.  */
+      if (seen_modules.add (str))
        continue;
 
-      column += size;
-
-      if (colmax && column > colmax)
-       {
-         buffer->writestring (" \\\n ");
-         column = size + 1;
-       }
-      else
-       {
-         buffer->writestring (" ");
-         column++;
-       }
-
-      buffer->writestring (str);
+      dependencies.safe_push (str);
 
       /* Add to list of phony targets if is not being compile.  */
       if (d_option.deps_phony && !depmod->isRoot ())
        phonylist.push (depmod);
 
-      /* Search all imports of the written dependency.  */
+      /* Add imported files to dependency list.  */
+      for (size_t i = 0; i < depmod->contentImportedFiles.dim; i++)
+       dependencies.safe_push (depmod->contentImportedFiles[i]);
+
+      /* Search all imports of the module.  */
       for (size_t i = 0; i < depmod->aimports.dim; i++)
        {
          Module *m = depmod->aimports[i];
@@ -244,6 +235,27 @@ deps_write (Module *module, OutBuffer *buffer, unsigned colmax = 72)
        }
     }
 
+  /* Write out all make dependencies.  */
+  for (size_t i = 0; i < dependencies.length (); i++)
+    {
+      str = dependencies[i];
+      size = strlen (str);
+      column += size;
+
+      if (colmax && column > colmax)
+       {
+         buffer->writestring (" \\\n ");
+         column = size + 1;
+       }
+      else
+       {
+         buffer->writestring (" ");
+         column++;
+       }
+
+      buffer->writestring (str);
+    }
+
   buffer->writenl ();
 
   /* Write out all phony targets.  */
index 3ff8b6936448d29e9b8053dcf7ba998ab2f57d6f..c8701caaf6f097b8aad7c5990312613637ce9a83 100644 (file)
@@ -1,3 +1,9 @@
+2020-03-22  Iain Buclaw  <ibuclaw@gdcproject.org>
+
+       PR d/93038
+       * gdc.dg/fileimports/pr93038.txt: New test.
+       * gdc.dg/pr93038.d: New test.
+
 2020-03-21  Patrick Palka  <ppalka@redhat.com>
 
        PR c++/94066
diff --git a/gcc/testsuite/gdc.dg/fileimports/pr93038.txt b/gcc/testsuite/gdc.dg/fileimports/pr93038.txt
new file mode 100644 (file)
index 0000000..9d1dc81
--- /dev/null
@@ -0,0 +1 @@
+v2.091.0
diff --git a/gcc/testsuite/gdc.dg/pr93038.d b/gcc/testsuite/gdc.dg/pr93038.d
new file mode 100644 (file)
index 0000000..4e09690
--- /dev/null
@@ -0,0 +1,8 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93038
+// { dg-options "-J $srcdir/gdc.dg/fileimports -MMD" }
+// { dg-do compile }
+// { dg-final { scan-file pr93038.deps "pr93038.o: \[^\n\]*/pr93038.d \[ \\\\\n\]*\[^\n\]*/fileimports/pr93038.txt" } }
+// { dg-final { file delete pr93038.deps } }
+module pr93038;
+
+const VERSION = import("pr93038.txt");