diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/IR/RemarkStreamer.cpp | 37 | ||||
-rw-r--r-- | llvm/lib/LTO/LTO.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/LTO/LTOBackend.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/LTO/LTOCodeGenerator.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/LTO/ThinLTOCodeGenerator.cpp | 3 |
5 files changed, 51 insertions, 13 deletions
diff --git a/llvm/lib/IR/RemarkStreamer.cpp b/llvm/lib/IR/RemarkStreamer.cpp index e0f9a9d70c3..2c3bc8406e5 100644 --- a/llvm/lib/IR/RemarkStreamer.cpp +++ b/llvm/lib/IR/RemarkStreamer.cpp @@ -109,10 +109,37 @@ void RemarkStreamer::emit(const DiagnosticInfoOptimizationBase &Diag) { char RemarkSetupFileError::ID = 0; char RemarkSetupPatternError::ID = 0; +char RemarkSetupFormatError::ID = 0; + +static std::unique_ptr<remarks::Serializer> +formatToSerializer(RemarksSerializerFormat RemarksFormat, raw_ostream &OS) { + switch (RemarksFormat) { + default: + llvm_unreachable("Unknown remark serializer format."); + return nullptr; + case RemarksSerializerFormat::YAML: + return llvm::make_unique<remarks::YAMLSerializer>(OS); + }; +} + +Expected<RemarksSerializerFormat> +llvm::parseSerializerFormat(StringRef StrFormat) { + auto Format = StringSwitch<RemarksSerializerFormat>(StrFormat) + .Cases("", "yaml", RemarksSerializerFormat::YAML) + .Default(RemarksSerializerFormat::Unknown); + + if (Format == RemarksSerializerFormat::Unknown) + return createStringError(std::make_error_code(std::errc::invalid_argument), + "Unknown remark serializer format: '%s'", + StrFormat.data()); + + return Format; +} Expected<std::unique_ptr<ToolOutputFile>> llvm::setupOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename, - StringRef RemarksPasses, bool RemarksWithHotness, + StringRef RemarksPasses, StringRef RemarksFormat, + bool RemarksWithHotness, unsigned RemarksHotnessThreshold) { if (RemarksWithHotness) Context.setDiagnosticsHotnessRequested(true); @@ -131,9 +158,13 @@ llvm::setupOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename, if (EC) return make_error<RemarkSetupFileError>(errorCodeToError(EC)); + Expected<RemarksSerializerFormat> Format = + parseSerializerFormat(RemarksFormat); + if (Error E = Format.takeError()) + return make_error<RemarkSetupFormatError>(std::move(E)); + Context.setRemarkStreamer(llvm::make_unique<RemarkStreamer>( - RemarksFilename, - llvm::make_unique<remarks::YAMLSerializer>(RemarksFile->os()))); + RemarksFilename, formatToSerializer(*Format, RemarksFile->os()))); if (!RemarksPasses.empty()) if (Error E = Context.getRemarkStreamer()->setFilter(RemarksPasses)) diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index fe1bdfcaa96..4ed13701aa9 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -1339,14 +1339,14 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache, Expected<std::unique_ptr<ToolOutputFile>> lto::setupOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename, - StringRef RemarksPasses, bool RemarksWithHotness, - int Count) { + StringRef RemarksPasses, StringRef RemarksFormat, + bool RemarksWithHotness, int Count) { std::string Filename = RemarksFilename; if (!Filename.empty() && Count != -1) Filename += ".thin." + llvm::utostr(Count) + ".yaml"; auto ResultOrErr = llvm::setupOptimizationRemarks( - Context, Filename, RemarksPasses, RemarksWithHotness); + Context, Filename, RemarksPasses, RemarksFormat, RemarksWithHotness); if (Error E = ResultOrErr.takeError()) return std::move(E); diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp index b0a7c434b67..7456e717516 100644 --- a/llvm/lib/LTO/LTOBackend.cpp +++ b/llvm/lib/LTO/LTOBackend.cpp @@ -431,9 +431,9 @@ Error lto::backend(Config &C, AddStreamFn AddStream, std::unique_ptr<TargetMachine> TM = createTargetMachine(C, *TOrErr, *Mod); // Setup optimization remarks. - auto DiagFileOrErr = - lto::setupOptimizationRemarks(Mod->getContext(), C.RemarksFilename, - C.RemarksPasses, C.RemarksWithHotness); + auto DiagFileOrErr = lto::setupOptimizationRemarks( + Mod->getContext(), C.RemarksFilename, C.RemarksPasses, C.RemarksFormat, + C.RemarksWithHotness); if (!DiagFileOrErr) return DiagFileOrErr.takeError(); auto DiagnosticOutputFile = std::move(*DiagFileOrErr); @@ -488,7 +488,7 @@ Error lto::thinBackend(Config &Conf, unsigned Task, AddStreamFn AddStream, // Setup optimization remarks. auto DiagFileOrErr = lto::setupOptimizationRemarks( Mod.getContext(), Conf.RemarksFilename, Conf.RemarksPasses, - Conf.RemarksWithHotness, Task); + Conf.RemarksFormat, Conf.RemarksWithHotness, Task); if (!DiagFileOrErr) return DiagFileOrErr.takeError(); auto DiagnosticOutputFile = std::move(*DiagFileOrErr); diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp index ebc4cc5794a..6bb3bfaefc9 100644 --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -97,6 +97,11 @@ cl::opt<std::string> "names match the given regular expression"), cl::value_desc("regex")); +cl::opt<std::string> RemarksFormat( + "lto-pass-remarks-format", + cl::desc("The format used for serializing remarks (default: YAML)"), + cl::value_desc("format"), cl::init("yaml")); + cl::opt<std::string> LTOStatsFile( "lto-stats-file", cl::desc("Save statistics to the specified file"), @@ -517,8 +522,9 @@ bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline, if (!this->determineTarget()) return false; - auto DiagFileOrErr = lto::setupOptimizationRemarks( - Context, RemarksFilename, RemarksPasses, RemarksWithHotness); + auto DiagFileOrErr = + lto::setupOptimizationRemarks(Context, RemarksFilename, RemarksPasses, + RemarksFormat, RemarksWithHotness); if (!DiagFileOrErr) { errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n"; report_fatal_error("Can't get an output file for the remarks"); diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp index 5d9aa8e571b..b5dbab0ca8f 100644 --- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp @@ -73,6 +73,7 @@ extern cl::opt<bool> LTODiscardValueNames; extern cl::opt<std::string> RemarksFilename; extern cl::opt<std::string> RemarksPasses; extern cl::opt<bool> RemarksWithHotness; +extern cl::opt<std::string> RemarksFormat; } namespace { @@ -1020,7 +1021,7 @@ void ThinLTOCodeGenerator::run() { Context.setDiscardValueNames(LTODiscardValueNames); Context.enableDebugTypeODRUniquing(); auto DiagFileOrErr = lto::setupOptimizationRemarks( - Context, RemarksFilename, RemarksPasses, + Context, RemarksFilename, RemarksPasses, RemarksFormat, RemarksWithHotness, count); if (!DiagFileOrErr) { errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n"; |