diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1475,6 +1475,9 @@ // Handle /lldmingw early, since it can potentially affect how other // options are handled. config->mingw = args.hasArg(OPT_lldmingw); + if (config->mingw) + ctx.e.errorLimitExceededMsg = "too many errors emitted, stopping now" + " (use --error-limit=0 to see all errors)"; // Handle /linkrepro and /reproduce. if (Optional path = getReproduceFile(args)) { diff --git a/lld/MinGW/Driver.cpp b/lld/MinGW/Driver.cpp --- a/lld/MinGW/Driver.cpp +++ b/lld/MinGW/Driver.cpp @@ -390,6 +390,15 @@ " only takes effect when used with --guard-cf"); } + if (auto *a = args.getLastArg(OPT_error_limit)) { + int n; + StringRef s = a->getValue(); + if (s.getAsInteger(10, n)) + error(a->getSpelling() + " number expected, but got " + s); + else + add("-errorlimit:" + s); + } + for (auto *a : args.filtered(OPT_mllvm)) add("-mllvm:" + StringRef(a->getValue())); diff --git a/lld/MinGW/Options.td b/lld/MinGW/Options.td --- a/lld/MinGW/Options.td +++ b/lld/MinGW/Options.td @@ -146,6 +146,8 @@ defm guard_longjmp : B<"guard-longjmp", "Enable Control Flow Guard long jump hardening (default for --guard-cf)" , "Do not enable Control Flow Guard long jump hardening">; +defm error_limit: + EqLong<"error-limit", "Maximum number of errors to emit before stopping (0 = no limit)">; // Alias def alias_Bdynamic_call_shared: Flag<["-"], "call_shared">, Alias; diff --git a/lld/test/COFF/error-limit.test b/lld/test/COFF/error-limit.test --- a/lld/test/COFF/error-limit.test +++ b/lld/test/COFF/error-limit.test @@ -27,3 +27,11 @@ RUN: 15 16 17 18 19 20 21 22 2>&1 | FileCheck -check-prefix=WRONG %s WRONG: /errorlimit: number expected, but got XYZ + +RUN: not lld-link -lldmingw 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 \ +RUN: 21 22 2>&1 | FileCheck -check-prefix=MINGW-DEFAULT %s + +MINGW-DEFAULT: could not open '01' +MINGW-DEFAULT: could not open '20' +MINGW-DEFAULT-NEXT: too many errors emitted, stopping now (use --error-limit=0 to see all errors) +MINGW-DEFAULT-NOT: could not open '21' diff --git a/lld/test/MinGW/error-limit.test b/lld/test/MinGW/error-limit.test new file mode 100644 --- /dev/null +++ b/lld/test/MinGW/error-limit.test @@ -0,0 +1,19 @@ +RUN: ld.lld -### foo.o -m i386pep 2>&1 | FileCheck -check-prefix=DEFAULT %s +DEFAULT-NOT: -errorlimit: +DEFAULT-NOT: /errorlimit: + +RUN: ld.lld -### foo.o -m i386pep --error-limit=5 2>&1 | FileCheck -check-prefix=NUMERIC %s +NUMERIC: -errorlimit:5 + +RUN: ld.lld -### foo.o -m i386pep --error-limit=0 2>&1 | FileCheck -check-prefix=UNLIMITED %s +UNLIMITED: -errorlimit:0 + +RUN: not ld.lld -### foo.o -m i386pep --error-limit=XYZ 2>&1 | FileCheck -check-prefix=WRONG %s +WRONG: --error-limit number expected, but got XYZ + +RUN: not ld.lld -m i386pep --error-limit=5 01 02 03 04 05 06 07 08 09 10 2>&1 \ +RUN: | FileCheck -check-prefix=LIMIT5 %s +LIMIT5: could not open '01' +LIMIT5: could not open '05' +LIMIT5-NEXT: too many errors emitted, stopping now (use --error-limit=0 to see all errors) +LIMIT5-NOT: could not open '06'