diff --git a/lld/include/lld/ReaderWriter/ELFLinkingContext.h b/lld/include/lld/ReaderWriter/ELFLinkingContext.h index 7eef6da7dd46..31d73c821bbf 100644 --- a/lld/include/lld/ReaderWriter/ELFLinkingContext.h +++ b/lld/include/lld/ReaderWriter/ELFLinkingContext.h @@ -291,6 +291,10 @@ public: bool stripSymbols() const { return _stripSymbols; } void setStripSymbols(bool strip) { _stripSymbols = strip; } + /// \brief Collect statistics. + bool collectStats() const { return _collectStats; } + void setCollectStats(bool s) { _collectStats = s; } + // We can parse several linker scripts via command line whose ASTs are stored // in the current linking context via addLinkerScript(). void addLinkerScript(std::unique_ptr script) { @@ -329,6 +333,7 @@ protected: bool _stripSymbols; bool _alignSegments; bool _nostdlib; + bool _collectStats; llvm::Optional _maxPageSize; OutputMagic _outputMagic; diff --git a/lld/lib/Driver/GnuLdDriver.cpp b/lld/lib/Driver/GnuLdDriver.cpp index e23016474d1b..d382ca71ad34 100644 --- a/lld/lib/Driver/GnuLdDriver.cpp +++ b/lld/lib/Driver/GnuLdDriver.cpp @@ -32,6 +32,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Signals.h" +#include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -171,7 +172,15 @@ bool GnuLdDriver::linkELF(int argc, const char *argv[], raw_ostream &diag) { return false; if (!options) return true; - return link(*options, diag); + bool linked = link(*options, diag); + + // Handle --stats. + if (options->collectStats()) { + llvm::TimeRecord t = llvm::TimeRecord::getCurrentTime(true); + diag << "total time in link " << t.getProcessTime() << "\n"; + diag << "data size " << t.getMemUsed() << "\n"; + } + return linked; } static llvm::Optional @@ -445,6 +454,11 @@ bool GnuLdDriver::parse(int argc, const char *argv[], ctx->setAllowRemainingUndefines(true); } + // Handle --stats. + if (parsedArgs->hasArg(OPT_stats)) { + ctx->setCollectStats(true); + } + // Figure out if the output type is nmagic/omagic if (auto *arg = parsedArgs->getLastArg( OPT_nmagic, OPT_omagic, OPT_no_omagic)) { diff --git a/lld/lib/Driver/GnuLdOptions.td b/lld/lib/Driver/GnuLdOptions.td index a4329bb17a7c..cf694f42c651 100644 --- a/lld/lib/Driver/GnuLdOptions.td +++ b/lld/lib/Driver/GnuLdOptions.td @@ -277,6 +277,8 @@ def grp_tracingopts : OptionGroup<"opts">, def t : Flag<["-"], "t">, HelpText<"Print the names of the input files as ld processes them">, Group; +def stats : Flag<["--"], "stats">, + HelpText<"Print time and memory usage stats">, Group; //===----------------------------------------------------------------------===// /// Extensions diff --git a/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp b/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp index b4bf02dd7fb4..f458a809c559 100644 --- a/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp +++ b/lld/lib/ReaderWriter/ELF/ELFLinkingContext.cpp @@ -60,7 +60,7 @@ ELFLinkingContext::ELFLinkingContext( _mergeCommonStrings(false), _useShlibUndefines(true), _dynamicLinkerArg(false), _noAllowDynamicLibraries(false), _mergeRODataToTextSegment(true), _demangle(true), - _stripSymbols(false), _alignSegments(true), + _stripSymbols(false), _alignSegments(true), _collectStats(false), _outputMagic(OutputMagic::DEFAULT), _initFunction("_init"), _finiFunction("_fini"), _sysrootPath("") {}