//===- llvm/Remarks/RemarkStreamer.cpp - Remark Streamer -*- C++ --------*-===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// This file contains the implementation of the main remark streamer.
//
//===----------------------------------------------------------------------===//

#include "llvm/Remarks/RemarkStreamer.h"
#include "llvm/Support/CommandLine.h"

using namespace llvm;
using namespace llvm::remarks;

static cl::opt<cl::boolOrDefault> EnableRemarksSection(
    "remarks-section",
    cl::desc(
        "Emit a section containing remark diagnostics metadata. By default, "
        "this is enabled for the following formats: yaml-strtab, bitstream."),
    cl::init(cl::BOU_UNSET), cl::Hidden);

RemarkStreamer::RemarkStreamer(
    std::unique_ptr<remarks::RemarkSerializer> RemarkSerializer,
    Optional<StringRef> FilenameIn)
    : PassFilter(), RemarkSerializer(std::move(RemarkSerializer)),
      Filename(FilenameIn ? Optional<std::string>(FilenameIn->str()) : None) {}

Error RemarkStreamer::setFilter(StringRef Filter) {
  Regex R = Regex(Filter);
  std::string RegexError;
  if (!R.isValid(RegexError))
    return createStringError(std::make_error_code(std::errc::invalid_argument),
                             RegexError.data());
  PassFilter = std::move(R);
  return Error::success();
}

bool RemarkStreamer::matchesFilter(StringRef Str) {
  if (PassFilter)
    return PassFilter->match(Str);
  // No filter means all strings pass.
  return true;
}

bool RemarkStreamer::needsSection() const {
  if (EnableRemarksSection == cl::BOU_TRUE)
    return true;

  if (EnableRemarksSection == cl::BOU_FALSE)
    return false;

  assert(EnableRemarksSection == cl::BOU_UNSET);

  // We only need a section if we're in separate mode.
  if (RemarkSerializer->Mode != remarks::SerializerMode::Separate)
    return false;

  // Only some formats need a section:
  // * bitstream
  // * yaml-strtab
  switch (RemarkSerializer->SerializerFormat) {
  case remarks::Format::YAMLStrTab:
  case remarks::Format::Bitstream:
    return true;
  default:
    return false;
  }
}
