| //===- RemarkFormat.cpp --------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Implementation of utilities to handle the different remark formats. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/Remarks/RemarkFormat.h" |
| #include "llvm/ADT/StringSwitch.h" |
| #include "llvm/Remarks/BitstreamRemarkContainer.h" |
| |
| using namespace llvm; |
| using namespace llvm::remarks; |
| |
| Expected<Format> llvm::remarks::parseFormat(StringRef FormatStr) { |
| auto Result = StringSwitch<Format>(FormatStr) |
| .Cases("", "yaml", Format::YAML) |
| .Case("bitstream", Format::Bitstream) |
| .Default(Format::Unknown); |
| |
| if (Result == Format::Unknown) |
| return createStringError(std::make_error_code(std::errc::invalid_argument), |
| "Unknown remark format: '%s'", |
| FormatStr.data()); |
| |
| return Result; |
| } |
| |
| Expected<Format> llvm::remarks::magicToFormat(StringRef MagicStr) { |
| auto Result = |
| StringSwitch<Format>(MagicStr) |
| .StartsWith("--- ", Format::YAML) // This is only an assumption. |
| .StartsWith(remarks::Magic, |
| Format::YAML) // Needed for remark meta section |
| .StartsWith(remarks::ContainerMagic, Format::Bitstream) |
| .Default(Format::Unknown); |
| |
| if (Result == Format::Unknown) |
| return createStringError(std::make_error_code(std::errc::invalid_argument), |
| "Automatic detection of remark format failed. " |
| "Unknown magic number: '%.4s'", |
| MagicStr.data()); |
| return Result; |
| } |
| |
| Expected<Format> llvm::remarks::detectFormat(Format Selected, |
| StringRef MagicStr) { |
| if (Selected == Format::Unknown) |
| return createStringError(std::make_error_code(std::errc::invalid_argument), |
| "Unknown remark parser format."); |
| if (Selected != Format::Auto) |
| return Selected; |
| |
| // Empty files are valid bitstream files |
| if (MagicStr.empty()) |
| return Format::Bitstream; |
| return magicToFormat(MagicStr); |
| } |