[lld] r287789 - Limit default maximum number of errors to 20.
Sean Silva via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 23 20:12:41 PST 2016
Can you also make sure that the "too many errors emitted" message includes
something like "use --error-limit=0 to see all errors"? Otherwise users may
spend a lot of time to find this feature (or not find it).
-- Sean Silva
On Wed, Nov 23, 2016 at 10:15 AM, Rui Ueyama via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: ruiu
> Date: Wed Nov 23 12:15:37 2016
> New Revision: 287789
>
> URL: http://llvm.org/viewvc/llvm-project?rev=287789&view=rev
> Log:
> Limit default maximum number of errors to 20.
>
> This is in the context of https://llvm.org/bugs/show_bug.cgi?id=31109.
> When LLD prints out errors for relocations, it tends to print out
> extremely large number of errors (like millions) because it would
> print out one error per relocation.
>
> This patch makes LLD bail out if it prints out more than 20 errors.
> You can configure the limitation using -error-limit argument.
> -error-limit=0 means no limit.
>
> I chose the flag name because Clang has the same feature as -ferror-limit.
> "f" doesn't make sense to us, so I omitted it.
>
> Differential Revision: https://reviews.llvm.org/D26981
>
> Added:
> lld/trunk/test/ELF/error-limit.test
> Modified:
> lld/trunk/ELF/Config.h
> lld/trunk/ELF/Driver.cpp
> lld/trunk/ELF/Error.cpp
> lld/trunk/ELF/Error.h
> lld/trunk/ELF/Options.td
>
> Modified: lld/trunk/ELF/Config.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.
> h?rev=287789&r1=287788&r2=287789&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Config.h (original)
> +++ lld/trunk/ELF/Config.h Wed Nov 23 12:15:37 2016
> @@ -145,6 +145,7 @@ struct Configuration {
> uint16_t DefaultSymbolVersion = llvm::ELF::VER_NDX_GLOBAL;
> uint16_t EMachine = llvm::ELF::EM_NONE;
> uint64_t EntryAddr = 0;
> + uint64_t ErrorLimit;
> uint64_t ImageBase;
> uint64_t MaxPageSize;
> uint64_t ZStackSize;
>
> Modified: lld/trunk/ELF/Driver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.
> cpp?rev=287789&r1=287788&r2=287789&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Driver.cpp (original)
> +++ lld/trunk/ELF/Driver.cpp Wed Nov 23 12:15:37 2016
> @@ -43,6 +43,7 @@ LinkerDriver *elf::Driver;
> bool elf::link(ArrayRef<const char *> Args, bool CanExitEarly,
> raw_ostream &Error) {
> HasError = false;
> + ErrorCount = 0;
> ErrorOS = &Error;
> Argv0 = Args[0];
>
> @@ -490,6 +491,7 @@ void LinkerDriver::readConfigs(opt::Inpu
> Config->Discard = getDiscardOption(Args);
> Config->EhFrameHdr = Args.hasArg(OPT_eh_frame_hdr);
> Config->EnableNewDtags = !Args.hasArg(OPT_disable_new_dtags);
> + Config->ErrorLimit = getInteger(Args, OPT_error_limit, 20);
> Config->ExportDynamic = Args.hasArg(OPT_export_dynamic);
> Config->FatalWarnings = Args.hasArg(OPT_fatal_warnings);
> Config->GcSections = getArg(Args, OPT_gc_sections, OPT_no_gc_sections,
> false);
>
> Modified: lld/trunk/ELF/Error.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Error.
> cpp?rev=287789&r1=287788&r2=287789&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Error.cpp (original)
> +++ lld/trunk/ELF/Error.cpp Wed Nov 23 12:15:37 2016
> @@ -24,6 +24,7 @@ using namespace llvm;
> namespace lld {
>
> bool elf::HasError;
> +uint64_t elf::ErrorCount;
> raw_ostream *elf::ErrorOS;
> StringRef elf::Argv0;
>
> @@ -40,8 +41,16 @@ void elf::warn(const Twine &Msg) {
> }
>
> void elf::error(const Twine &Msg) {
> - *ErrorOS << Argv0 << ": error: " << Msg << "\n";
> + if (Config->ErrorLimit == 0 || ErrorCount < Config->ErrorLimit) {
> + *ErrorOS << Argv0 << ": error: " << Msg << "\n";
> + } else if (ErrorCount == Config->ErrorLimit) {
> + *ErrorOS << Argv0 << ": error: too many errors emitted, stopping
> now\n";
> + if (Config->ExitEarly)
> + exitLld(1);
> + }
> +
> HasError = true;
> + ++ErrorCount;
> }
>
> void elf::error(std::error_code EC, const Twine &Prefix) {
>
> Modified: lld/trunk/ELF/Error.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Error.h?
> rev=287789&r1=287788&r2=287789&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Error.h (original)
> +++ lld/trunk/ELF/Error.h Wed Nov 23 12:15:37 2016
> @@ -32,6 +32,7 @@ namespace lld {
> namespace elf {
>
> extern bool HasError;
> +extern uint64_t ErrorCount;
> extern llvm::raw_ostream *ErrorOS;
> extern llvm::StringRef Argv0;
>
>
> Modified: lld/trunk/ELF/Options.td
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.
> td?rev=287789&r1=287788&r2=287789&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/Options.td (original)
> +++ lld/trunk/ELF/Options.td Wed Nov 23 12:15:37 2016
> @@ -68,6 +68,9 @@ def end_lib: F<"end-lib">,
> def entry: S<"entry">, MetaVarName<"<entry>">,
> HelpText<"Name of entry point symbol">;
>
> +def error_limit: S<"error-limit">,
> + HelpText<"Maximum number of errors to emit before stopping (0 = no
> limit)">;
> +
> def export_dynamic: F<"export-dynamic">,
> HelpText<"Put symbols in the dynamic symbol table">;
>
> @@ -240,6 +243,7 @@ def alias_discard_locals_X: Flag<["-"],
> def alias_dynamic_list: J<"dynamic-list=">, Alias<dynamic_list>;
> def alias_entry_e: JoinedOrSeparate<["-"], "e">, Alias<entry>;
> def alias_entry_entry: J<"entry=">, Alias<entry>;
> +def alias_error_limit: J<"error-limit=">, Alias<error_limit>;
> def alias_export_dynamic_E: Flag<["-"], "E">, Alias<export_dynamic>;
> def alias_export_dynamic_symbol: J<"export-dynamic-symbol=">,
> Alias<export_dynamic_symbol>;
>
> Added: lld/trunk/test/ELF/error-limit.test
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> error-limit.test?rev=287789&view=auto
> ============================================================
> ==================
> --- lld/trunk/test/ELF/error-limit.test (added)
> +++ lld/trunk/test/ELF/error-limit.test Wed Nov 23 12:15:37 2016
> @@ -0,0 +1,26 @@
> +RUN: not ld.lld 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=DEFAULT %s
> +
> +DEFAULT: cannot open 01
> +DEFAULT: cannot open 20
> +DEFAULT-NEXT: too many errors emitted, stopping now
> +DEFAULT-NOT: cannot open 21
> +
> +RUN: not ld.lld -error-limit=5 01 02 03 04 05 06 07 08 09 10 2>&1 \
> +RUN: | FileCheck -check-prefix=LIMIT5 %s
> +RUN: not ld.lld -error-limit 5 01 02 03 04 05 06 07 08 09 10 2>&1 \
> +RUN: | FileCheck -check-prefix=LIMIT5 %s
> +
> +LIMIT5: cannot open 01
> +LIMIT5: cannot open 05
> +LIMIT5-NEXT: too many errors emitted, stopping now
> +LIMIT5-NOT: cannot open 06
> +
> +RUN: not ld.lld -error-limit=0 01 02 03 04 05 06 07 08 09 10 11 12 13 14
> 15 \
> +RUN: 16 17 18 19 20 21 22 2>&1 | FileCheck -check-prefix=UNLIMITED %s
> +
> +UNLIMITED: cannot open 01
> +UNLIMITED: cannot open 20
> +UNLIMITED: cannot open 21
> +UNLIMITED: cannot open 22
> +UNLIMITED-NOT: too many errors emitted, stopping now
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161123/61939f72/attachment.html>
More information about the llvm-commits
mailing list