Index: lld/COFF/Driver.cpp =================================================================== --- lld/COFF/Driver.cpp +++ lld/COFF/Driver.cpp @@ -64,6 +64,9 @@ errorHandler().ErrorLimitExceededMsg = "too many errors emitted, stopping now" " (use /errorlimit:0 to see all errors)"; + errorHandler().WarningLimitExceededMsg = + "too many warnings emitted, stopping now" + " (use /warninglimit:0 to see all warnings)"; errorHandler().ExitEarly = CanExitEarly; Config = make(); @@ -1009,6 +1012,13 @@ error(Arg->getSpelling() + " number expected, but got " + S); errorHandler().ErrorLimit = N; } + if (auto *Arg = Args.getLastArg(OPT_warninglimit)) { + int N = 20; + StringRef S = Arg->getValue(); + if (S.getAsInteger(10, N)) + error(Arg->getSpelling() + " number expected, but got " + S); + errorHandler().WarningLimit = N; + } // Handle /help if (Args.hasArg(OPT_help)) { Index: lld/COFF/Options.td =================================================================== --- lld/COFF/Options.td +++ lld/COFF/Options.td @@ -27,8 +27,6 @@ def defaultlib : P<"defaultlib", "Add the library to the list of input files">; def delayload : P<"delayload", "Delay loaded DLL name">; def entry : P<"entry", "Name of entry point symbol">; -def errorlimit : P<"errorlimit", - "Maximum number of errors to emit before stopping (0 = no limit)">; def export : P<"export", "Export a function">; // No help text because /failifmismatch is not intended to be used by the user. def failifmismatch : P<"failifmismatch", "">; @@ -161,6 +159,10 @@ def help_q : Flag<["/??", "-??", "/?", "-?"], "">, Alias; // LLD extensions +def errorlimit : P<"errorlimit", + "Maximum number of errors to emit before stopping (0 = no limit)">; +def warninglimit : P<"warninglimit", + "Maximum number of warnings to emit before stopping (0 = no limit)">; def exclude_all_symbols : F<"exclude-all-symbols">; def export_all_symbols : F<"export-all-symbols">; defm demangle : B<"demangle", @@ -170,7 +172,7 @@ def lldmingw : F<"lldmingw">; def output_def : Joined<["/", "-", "/?", "-?"], "output-def:">; def pdb_source_path : P<"pdbsourcepath", - "Base path used to make relative source file path absolute in PDB">; + "Base path used to make relative source file path absolute in PDB">; def rsp_quoting : Joined<["--"], "rsp-quoting=">, HelpText<"Quoting style for response files, 'windows' (default) or 'posix'">; def dash_dash_version : Flag<["--"], "version">, Index: lld/Common/ErrorHandler.cpp =================================================================== --- lld/Common/ErrorHandler.cpp +++ lld/Common/ErrorHandler.cpp @@ -116,8 +116,17 @@ std::lock_guard Lock(Mu); newline(ErrorOS, Msg); - print("warning: ", raw_ostream::MAGENTA); - *ErrorOS << Msg << "\n"; + + + if (WarningLimit == 0 || WarningCount < WarningLimit) { + print("warning: ", raw_ostream::MAGENTA); + *ErrorOS << Msg << "\n"; + } else if (WarningCount == WarningLimit) { + print("warning: ", raw_ostream::MAGENTA); + *ErrorOS << WarningLimitExceededMsg << "\n"; + } + + ++WarningCount; } void ErrorHandler::error(const Twine &Msg) { Index: lld/ELF/Driver.cpp =================================================================== --- lld/ELF/Driver.cpp +++ lld/ELF/Driver.cpp @@ -78,6 +78,9 @@ errorHandler().ErrorLimitExceededMsg = "too many errors emitted, stopping now (use " "-error-limit=0 to see all errors)"; + errorHandler().WarningLimitExceededMsg = + "too many warnings emitted, stopping now (use " + "-warning-limit=0 to see all warnings)"; errorHandler().ErrorOS = &Error; errorHandler().ExitEarly = CanExitEarly; errorHandler().ColorDiagnostics = Error.has_colors(); @@ -380,6 +383,7 @@ // Interpret this flag early because error() depends on them. errorHandler().ErrorLimit = args::getInteger(Args, OPT_error_limit, 20); + errorHandler().WarningLimit = args::getInteger(Args, OPT_warning_limit, 20); checkZOptions(Args); // Handle -help Index: lld/ELF/Options.td =================================================================== --- lld/ELF/Options.td +++ lld/ELF/Options.td @@ -137,8 +137,11 @@ defm entry: Eq<"entry", "Name of entry point symbol">, MetaVarName<"">; -defm error_limit: - Eq<"error-limit", "Maximum number of errors to emit before stopping (0 = no limit)">; +defm error_limit: Eq<"error-limit", + "Maximum number of errors to emit before stopping (0 = no limit)">; +defm warning_limit: Eq<"warning-limit", + "Maximum number of warnings to emit before stopping (0 = no limit)">; + def error_unresolved_symbols: F<"error-unresolved-symbols">, HelpText<"Report unresolved symbols as errors">; Index: lld/include/lld/Common/ErrorHandler.h =================================================================== --- lld/include/lld/Common/ErrorHandler.h +++ lld/include/lld/Common/ErrorHandler.h @@ -85,6 +85,9 @@ uint64_t ErrorCount = 0; uint64_t ErrorLimit = 20; StringRef ErrorLimitExceededMsg = "too many errors emitted, stopping now"; + uint64_t WarningCount = 0; + uint64_t WarningLimit = 20; + StringRef WarningLimitExceededMsg = "too many warnings emitted, stopping now"; StringRef LogName = "lld"; llvm::raw_ostream *ErrorOS = &llvm::errs(); bool ColorDiagnostics = llvm::errs().has_colors(); Index: lld/lib/Driver/DarwinLdDriver.cpp =================================================================== --- lld/lib/Driver/DarwinLdDriver.cpp +++ lld/lib/Driver/DarwinLdDriver.cpp @@ -335,6 +335,8 @@ errorHandler().Verbose = parsedArgs.hasArg(OPT_v); errorHandler().ErrorLimit = args::getInteger(parsedArgs, OPT_error_limit, 20); + errorHandler().WarningLimit = + args::getInteger(parsedArgs, OPT_warning_limit, 20); // Figure out output kind ( -dylib, -r, -bundle, -preload, or -static ) llvm::MachO::HeaderFileType fileType = llvm::MachO::MH_EXECUTE; @@ -1149,6 +1151,9 @@ errorHandler().ErrorLimitExceededMsg = "too many errors emitted, stopping now (use " "'-error-limit 0' to see all errors)"; + errorHandler().ErrorLimitExceededMsg = + "too many warnings emitted, stopping now (use " + "'-warning-limit 0' to see all warnings)"; errorHandler().ErrorOS = &Error; errorHandler().ExitEarly = CanExitEarly; errorHandler().ColorDiagnostics = Error.has_colors(); Index: lld/lib/Driver/DarwinLdOptions.td =================================================================== --- lld/lib/Driver/DarwinLdOptions.td +++ lld/lib/Driver/DarwinLdOptions.td @@ -228,8 +228,11 @@ def v : Flag<["-"], "v">, HelpText<"Print linker information">; def error_limit : Separate<["-", "--"], "error-limit">, - MetaVarName<"">, - HelpText<"Maximum number of errors to emit before stopping (0 = no limit)">; + MetaVarName<"">, + HelpText<"Maximum number of errors to emit before stopping (0 = no limit)">; +def warning_limit : Separate<["-", "--"], "warning-limit">, + MetaVarName<"">, + HelpText<"Maximum number of warnings to emit before stopping (0 = no limit)">; // Ignored options def lto_library : Separate<["-"], "lto_library">, Index: lld/test/ELF/linkerscript/orphan-report.s =================================================================== --- lld/test/ELF/linkerscript/orphan-report.s +++ lld/test/ELF/linkerscript/orphan-report.s @@ -13,7 +13,7 @@ ## Check --orphan-handling=error reports errors about orphans. # RUN: not ld.lld -shared --orphan-handling=error -o %t.out --script %t.script \ -# RUN: %t.o 2>&1 -verbose -error-limit=0 | FileCheck %s --check-prefix=REPORT +# RUN: %t.o 2>&1 -verbose -error-limit=0 | FileCheck %s --check-prefix=REPORT # REPORT: {{.*}}.o:(.text) is being placed in '.text' # REPORT-NEXT: {{.*}}.o:(.text.2) is being placed in '.text' # REPORT-NEXT: :(.comment) is being placed in '.comment' @@ -42,7 +42,7 @@ ## Check --orphan-handling=warn reports warnings about orphans. # RUN: ld.lld -shared --orphan-handling=warn -o %t.out --script %t.script \ -# RUN: %t.o 2>&1 -verbose | FileCheck %s --check-prefix=REPORT +# RUN: %t.o 2>&1 -verbose -warning-limit=0 | FileCheck %s --check-prefix=REPORT # RUN: not ld.lld --orphan-handling=foo -o %t.out --script %t.script %t.o 2>&1 \ # RUN: | FileCheck %s --check-prefix=UNKNOWN Index: lld/wasm/Driver.cpp =================================================================== --- lld/wasm/Driver.cpp +++ lld/wasm/Driver.cpp @@ -85,6 +85,9 @@ errorHandler().ErrorLimitExceededMsg = "too many errors emitted, stopping now (use " "-error-limit=0 to see all errors)"; + errorHandler().WarningLimitExceededMsg = + "too many warnings emitted, stopping now (use " + "-warning-limit=0 to see all warnings)"; Config = make(); Symtab = make(); @@ -513,6 +516,7 @@ cl::ParseCommandLineOptions(V.size(), V.data()); errorHandler().ErrorLimit = args::getInteger(Args, OPT_error_limit, 20); + errorHandler().WarningLimit = args::getInteger(Args, OPT_warning_limit, 20); setConfigs(Args); checkOptions(Args); Index: lld/wasm/Options.td =================================================================== --- lld/wasm/Options.td +++ lld/wasm/Options.td @@ -40,6 +40,8 @@ def error_limit: J<"error-limit=">, HelpText<"Maximum number of errors to emit before stopping (0 = no limit)">; +def warning_limit: J<"warning-limit=">, + HelpText<"Maximum number of warnings to emit before stopping (0 = no limit)">; def fatal_warnings: F<"fatal-warnings">, HelpText<"Treat warnings as errors">;