Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/make make(1): fix endless loop when resolving circul...



details:   https://anonhg.NetBSD.org/src/rev/a988243e1bb8
branches:  trunk
changeset: 957288:a988243e1bb8
user:      rillig <rillig%NetBSD.org@localhost>
date:      Mon Nov 23 14:47:12 2020 +0000

description:
make(1): fix endless loop when resolving circular suffix rules

diffstat:

 usr.bin/make/suff.c                                |  26 ++++++++++++++++---
 usr.bin/make/unit-tests/suff-transform-endless.exp |  28 ++++++++++++++++++---
 usr.bin/make/unit-tests/suff-transform-endless.mk  |   5 ++-
 usr.bin/make/unit-tests/suff-transform-select.exp  |  25 ++++++++++++++++---
 usr.bin/make/unit-tests/suff-transform-select.mk   |   5 ++-
 5 files changed, 72 insertions(+), 17 deletions(-)

diffs (168 lines):

diff -r 44cd2ac9861e -r a988243e1bb8 usr.bin/make/suff.c
--- a/usr.bin/make/suff.c       Mon Nov 23 14:13:39 2020 +0000
+++ b/usr.bin/make/suff.c       Mon Nov 23 14:47:12 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: suff.c,v 1.305 2020/11/23 14:04:28 rillig Exp $        */
+/*     $NetBSD: suff.c,v 1.306 2020/11/23 14:47:12 rillig Exp $        */
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -114,7 +114,7 @@
 #include "dir.h"
 
 /*     "@(#)suff.c     8.4 (Berkeley) 3/21/94" */
-MAKE_RCSID("$NetBSD: suff.c,v 1.305 2020/11/23 14:04:28 rillig Exp $");
+MAKE_RCSID("$NetBSD: suff.c,v 1.306 2020/11/23 14:47:12 rillig Exp $");
 
 #define SUFF_DEBUG0(text) DEBUG0(SUFF, text)
 #define SUFF_DEBUG1(fmt, arg1) DEBUG1(SUFF, fmt, arg1)
@@ -1060,6 +1060,9 @@
 static Candidate *
 FindThem(CandidateList *srcs, CandidateSearcher *cs)
 {
+    HashTable seen;
+
+    HashTable_Init(&seen);
 
     while (!Lst_IsEmpty(srcs)) {
        Candidate *src = Lst_Dequeue(srcs);
@@ -1074,6 +1077,8 @@
         * graph for it or the file actually exists.
         */
        if (Targ_FindNode(src->file) != NULL) {
+       found:
+           HashTable_Done(&seen);
            SUFF_DEBUG0("got it\n");
            return src;
        }
@@ -1082,17 +1087,28 @@
            char *file = Dir_FindFile(src->file, src->suff->searchPath);
            if (file != NULL) {
                free(file);
-               SUFF_DEBUG0("got it\n");
-               return src;
+               goto found;
            }
        }
 
        SUFF_DEBUG0("not there\n");
 
-       CandidateList_AddCandidatesFor(srcs, src);
+       {
+           Boolean isNew;
+
+           HashTable_CreateEntry(&seen, src->file, &isNew);
+           if (isNew)
+               CandidateList_AddCandidatesFor(srcs, src);
+           else {
+               DEBUG1(SUFF, "FindThem: skipping duplicate \"%s\"\n",
+                      src->file);
+           }
+       }
+
        CandidateSearcher_Add(cs, src);
     }
 
+    HashTable_Done(&seen);
     return NULL;
 }
 
diff -r 44cd2ac9861e -r a988243e1bb8 usr.bin/make/unit-tests/suff-transform-endless.exp
--- a/usr.bin/make/unit-tests/suff-transform-endless.exp        Mon Nov 23 14:13:39 2020 +0000
+++ b/usr.bin/make/unit-tests/suff-transform-endless.exp        Mon Nov 23 14:47:12 2020 +0000
@@ -17,7 +17,27 @@
 defining transformation from `.f' to `.e'
 inserting ".f" (4) at end of list
 inserting ".e" (3) at end of list
-make: "suff-transform-endless.mk" line 38: prevent endless loop
-
-make: stopped in unit-tests
-exit status 1
+transformation .e complete
+transformation .e.f complete
+transformation .f.e complete
+Wildcard expanding "all"...
+SuffFindDeps "all"
+       No known suffix on all. Using .NULL suffix
+adding suffix rules
+       trying all.e...not there
+       trying all.d...not there
+       trying all.f...not there
+       trying all.c...not there
+       trying all.e...not there
+FindThem: skipping duplicate "all.e"
+Wildcard expanding "issue6.f"...suffix is ".f"...
+SuffFindDeps "issue6.f"
+       trying issue6.e...not there
+       trying issue6.d...not there
+       trying issue6.f...got it
+       applying .f -> .e to "issue6.e"
+       applying .e -> .f to "issue6.f"
+suffix is ".e"...
+make: Graph cycles through issue6.f
+`all' not remade because of errors.
+exit status 0
diff -r 44cd2ac9861e -r a988243e1bb8 usr.bin/make/unit-tests/suff-transform-endless.mk
--- a/usr.bin/make/unit-tests/suff-transform-endless.mk Mon Nov 23 14:13:39 2020 +0000
+++ b/usr.bin/make/unit-tests/suff-transform-endless.mk Mon Nov 23 14:47:12 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: suff-transform-endless.mk,v 1.3 2020/11/23 14:13:39 rillig Exp $
+# $NetBSD: suff-transform-endless.mk,v 1.4 2020/11/23 14:47:12 rillig Exp $
 
 # https://gnats.netbsd.org/49086, issue 6:
 # Transformation search can end up in an infinite loop.
@@ -35,4 +35,5 @@
 # XXX: Found 'all' as '(not found)'
 # XXX: trying all.e, all.e, all.f, all.e, all.e, repeatedly.
 #.MAKEFLAGS: -dg1
-.error prevent endless loop
+
+# Before 24-11-2020, resolving all.e ran into an endless loop.
diff -r 44cd2ac9861e -r a988243e1bb8 usr.bin/make/unit-tests/suff-transform-select.exp
--- a/usr.bin/make/unit-tests/suff-transform-select.exp Mon Nov 23 14:13:39 2020 +0000
+++ b/usr.bin/make/unit-tests/suff-transform-select.exp Mon Nov 23 14:47:12 2020 +0000
@@ -21,7 +21,24 @@
 transformation .e complete
 transformation .e.f complete
 transformation .f.e complete
-make: "suff-transform-select.mk" line 30: prevent endless loop
-
-make: stopped in unit-tests
-exit status 1
+Wildcard expanding "all"...
+SuffFindDeps "all"
+       No known suffix on all. Using .NULL suffix
+adding suffix rules
+       trying all.e...not there
+       trying all.d...not there
+       trying all.f...not there
+       trying all.c...not there
+       trying all.e...not there
+FindThem: skipping duplicate "all.e"
+Wildcard expanding "issue10.e"...suffix is ".e"...
+SuffFindDeps "issue10.e"
+       trying issue10.d...got it
+suffix is ".d"...
+SuffFindDeps "issue10.d"
+       trying issue10.c...not there
+suffix is ".d"...
+: 'Making issue10.d out of nothing.'
+make: don't know how to make issue10.e (continuing)
+`all' not remade because of errors.
+exit status 0
diff -r 44cd2ac9861e -r a988243e1bb8 usr.bin/make/unit-tests/suff-transform-select.mk
--- a/usr.bin/make/unit-tests/suff-transform-select.mk  Mon Nov 23 14:13:39 2020 +0000
+++ b/usr.bin/make/unit-tests/suff-transform-select.mk  Mon Nov 23 14:47:12 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: suff-transform-select.mk,v 1.2 2020/11/23 14:13:39 rillig Exp $
+# $NetBSD: suff-transform-select.mk,v 1.3 2020/11/23 14:47:12 rillig Exp $
 #
 # https://gnats.netbsd.org/49086, issue 10:
 # Explicit dependencies affect transformation rule selection.
@@ -27,4 +27,5 @@
 
 # XXX: see suff-bug-endless, which must be fixed first.
 #.MAKEFLAGS: -dg1
-.error prevent endless loop
+
+# Before 24-11-2020, resolving all.e ran into an endless loop.



Home | Main Index | Thread Index | Old Index