Index: lld/ELF/Driver.cpp =================================================================== --- lld/ELF/Driver.cpp +++ lld/ELF/Driver.cpp @@ -530,17 +530,8 @@ } if (config->timeTraceEnabled) { - // Write the result of the time trace profiler. - std::string path = args.getLastArgValue(OPT_time_trace_file_eq).str(); - if (path.empty()) - path = (config->outputFile + ".time-trace").str(); - std::error_code ec; - raw_fd_ostream os(path, ec, sys::fs::OF_Text); - if (ec) { - error("cannot open " + path + ": " + ec.message()); - return; - } - timeTraceProfilerWrite(os); + timeTraceProfilerWrite(args.getLastArgValue(OPT_time_trace_file_eq).str(), + config->outputFile); timeTraceProfilerCleanup(); } } Index: llvm/include/llvm/Support/TimeProfiler.h =================================================================== --- llvm/include/llvm/Support/TimeProfiler.h +++ llvm/include/llvm/Support/TimeProfiler.h @@ -33,11 +33,18 @@ return getTimeTraceProfilerInstance() != nullptr; } -/// Write profiling data to output file. +/// Write profiling data to output stream. /// Data produced is JSON, in Chrome "Trace Event" format, see /// https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview void timeTraceProfilerWrite(raw_pwrite_stream &OS); +/// Write profiling data to a file. +/// The function will write to \p PreferredFileName if provided, if not +/// then will write to \p FallbackFileName appending .time-trace. +/// Triggers a fatal error if a file cannot be opened for writing. +void timeTraceProfilerWrite(StringRef PreferredFileName, + StringRef FallbackFileName); + /// Manually begin a time section, with the given \p Name and \p Detail. /// Profiler copies the string data, so the pointers can be given into /// temporaries. Time sections can be hierarchical; every Begin must have a Index: llvm/lib/Support/TimeProfiler.cpp =================================================================== --- llvm/lib/Support/TimeProfiler.cpp +++ llvm/lib/Support/TimeProfiler.cpp @@ -279,6 +279,25 @@ TimeTraceProfilerInstance->Write(OS); } +void timeTraceProfilerWrite(StringRef PreferredFileName, + StringRef FallbackFileName) { + assert(TimeTraceProfilerInstance != nullptr && + "Profiler object can't be null"); + + std::string Path = PreferredFileName.str(); + if (Path.empty()) { + Path = FallbackFileName == "-" ? "out" : FallbackFileName.str(); + Path += ".time-trace"; + } + + std::error_code EC; + raw_fd_ostream OS(Path, EC, sys::fs::OF_Text); + if (EC) + report_fatal_error("Could not open " + Path + ": " + EC.message()); + + timeTraceProfilerWrite(OS); +} + void timeTraceProfilerBegin(StringRef Name, StringRef Detail) { if (TimeTraceProfilerInstance != nullptr) TimeTraceProfilerInstance->begin(std::string(Name),