Index: ELF/Driver.cpp =================================================================== --- ELF/Driver.cpp +++ ELF/Driver.cpp @@ -43,6 +43,7 @@ bool elf::link(ArrayRef Args, bool CanExitEarly, raw_ostream &Error) { HasError = false; + ErrorCount = 0; ErrorOS = &Error; Argv0 = Args[0]; Index: ELF/Error.h =================================================================== --- ELF/Error.h +++ ELF/Error.h @@ -31,7 +31,12 @@ namespace lld { namespace elf { +// The maximum number of errors. If error() is called more than +// this number, LLD bails out. 0 means no limit. +const unsigned ErrorLimit = 1000; + extern bool HasError; +extern unsigned ErrorCount; extern llvm::raw_ostream *ErrorOS; extern llvm::StringRef Argv0; Index: ELF/Error.cpp =================================================================== --- ELF/Error.cpp +++ ELF/Error.cpp @@ -24,6 +24,7 @@ namespace lld { bool elf::HasError; +unsigned elf::ErrorCount; raw_ostream *elf::ErrorOS; StringRef elf::Argv0; @@ -40,8 +41,13 @@ } void elf::error(const Twine &Msg) { - *ErrorOS << Argv0 << ": error: " << Msg << "\n"; + if (ErrorLimit == 0 || ErrorCount <= ErrorLimit) + *ErrorOS << Argv0 << ": error: " << Msg << "\n"; + else if (Config->ExitEarly) + exitLld(1); + HasError = true; + ErrorCount++; } void elf::error(std::error_code EC, const Twine &Prefix) {