Path: blob/main/contrib/llvm-project/llvm/tools/llvm-remarkutil/RemarkConvert.cpp
35231 views
//===- RemarkConvert.cpp -------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// Convert remarks from bitstream to yaml and the other way around.9//10//===----------------------------------------------------------------------===//1112#include "RemarkUtilHelpers.h"13#include "RemarkUtilRegistry.h"1415using namespace llvm;16using namespace remarks;17using namespace llvm::remarkutil;1819extern ExitOnError ExitOnErr;20static cl::SubCommand21YAML2Bitstream("yaml2bitstream",22"Convert YAML remarks to bitstream remarks");23static cl::SubCommand24Bitstream2YAML("bitstream2yaml",25"Convert bitstream remarks to YAML remarks");2627namespace yaml2bitstream {28/// Remark format to parse.29static constexpr Format InputFormat = Format::YAML;30/// Remark format to output.31static constexpr Format OutputFormat = Format::Bitstream;32INPUT_OUTPUT_COMMAND_LINE_OPTIONS(YAML2Bitstream)33} // namespace yaml2bitstream3435namespace bitstream2yaml {36/// Remark format to parse.37static constexpr Format InputFormat = Format::Bitstream;38/// Remark format to output.39static constexpr Format OutputFormat = Format::YAML;40INPUT_OUTPUT_COMMAND_LINE_OPTIONS(Bitstream2YAML)41} // namespace bitstream2yaml4243namespace yaml2bitstream {44/// Parses all remarks in the input YAML file.45/// \p [out] ParsedRemarks - Filled with remarks parsed from the input file.46/// \p [out] StrTab - A string table populated for later remark serialization.47/// \returns Error::success() if all remarks were successfully parsed, and an48/// Error otherwise.49static Error50tryParseRemarksFromYAMLFile(std::vector<std::unique_ptr<Remark>> &ParsedRemarks,51StringTable &StrTab) {52auto MaybeBuf = getInputMemoryBuffer(InputFileName);53if (!MaybeBuf)54return MaybeBuf.takeError();55auto MaybeParser = createRemarkParser(InputFormat, (*MaybeBuf)->getBuffer());56if (!MaybeParser)57return MaybeParser.takeError();58auto &Parser = **MaybeParser;59auto MaybeRemark = Parser.next();60for (; MaybeRemark; MaybeRemark = Parser.next()) {61StrTab.internalize(**MaybeRemark);62ParsedRemarks.push_back(std::move(*MaybeRemark));63}64auto E = MaybeRemark.takeError();65if (!E.isA<EndOfFileError>())66return E;67consumeError(std::move(E));68return Error::success();69}7071/// Reserialize a list of parsed YAML remarks into bitstream remarks.72/// \p ParsedRemarks - A list of remarks.73/// \p StrTab - The string table for the remarks.74/// \returns Error::success() on success.75static Error tryReserializeYAML2Bitstream(76const std::vector<std::unique_ptr<Remark>> &ParsedRemarks,77StringTable &StrTab) {78auto MaybeOF = getOutputFileForRemarks(OutputFileName, OutputFormat);79if (!MaybeOF)80return MaybeOF.takeError();81auto OF = std::move(*MaybeOF);82auto MaybeSerializer = createRemarkSerializer(83OutputFormat, SerializerMode::Standalone, OF->os(), std::move(StrTab));84if (!MaybeSerializer)85return MaybeSerializer.takeError();86auto Serializer = std::move(*MaybeSerializer);87for (const auto &Remark : ParsedRemarks)88Serializer->emit(*Remark);89OF->keep();90return Error::success();91}9293/// Parse YAML remarks and reserialize as bitstream remarks.94/// \returns Error::success() on success, and an Error otherwise.95static Error tryYAML2Bitstream() {96StringTable StrTab;97std::vector<std::unique_ptr<Remark>> ParsedRemarks;98ExitOnErr(tryParseRemarksFromYAMLFile(ParsedRemarks, StrTab));99return tryReserializeYAML2Bitstream(ParsedRemarks, StrTab);100}101} // namespace yaml2bitstream102103namespace bitstream2yaml {104/// Parse bitstream remarks and reserialize as YAML remarks.105/// \returns An Error if reserialization fails, or Error::success() on success.106static Error tryBitstream2YAML() {107// Create the serializer.108auto MaybeOF = getOutputFileForRemarks(OutputFileName, OutputFormat);109if (!MaybeOF)110return MaybeOF.takeError();111auto OF = std::move(*MaybeOF);112auto MaybeSerializer = createRemarkSerializer(113OutputFormat, SerializerMode::Standalone, OF->os());114if (!MaybeSerializer)115return MaybeSerializer.takeError();116117// Create the parser.118auto MaybeBuf = getInputMemoryBuffer(InputFileName);119if (!MaybeBuf)120return MaybeBuf.takeError();121auto Serializer = std::move(*MaybeSerializer);122auto MaybeParser = createRemarkParser(InputFormat, (*MaybeBuf)->getBuffer());123if (!MaybeParser)124return MaybeParser.takeError();125auto &Parser = **MaybeParser;126127// Parse + reserialize all remarks.128auto MaybeRemark = Parser.next();129for (; MaybeRemark; MaybeRemark = Parser.next())130Serializer->emit(**MaybeRemark);131auto E = MaybeRemark.takeError();132if (!E.isA<EndOfFileError>())133return E;134consumeError(std::move(E));135return Error::success();136}137} // namespace bitstream2yaml138139static CommandRegistration Bitstream2YamlReg(&Bitstream2YAML,140bitstream2yaml::tryBitstream2YAML);141static CommandRegistration Yaml2Bitstream(&YAML2Bitstream,142yaml2bitstream::tryYAML2Bitstream);143144145