//===-- examples/flang-omp-report-plugin/flang-omp-report.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
//
//===----------------------------------------------------------------------===//
// This plugin parses a Fortran source file and generates a YAML
// report with all the OpenMP constructs and clauses and which
// line they're located on.
//
// The plugin may be invoked as:
// ./bin/flang-new -fc1 -load lib/flangOmpReport.so -plugin
// flang-omp-report -fopenmp -o - <source_file.f90>
//
//===----------------------------------------------------------------------===//

#include "flang-omp-report-visitor.h"

#include "flang/Frontend/CompilerInstance.h"
#include "flang/Frontend/FrontendActions.h"
#include "flang/Frontend/FrontendPluginRegistry.h"
#include "flang/Parser/dump-parse-tree.h"
#include "llvm/Support/YAMLParser.h"
#include "llvm/Support/YAMLTraits.h"

using namespace Fortran::frontend;
using namespace Fortran::parser;

LLVM_YAML_IS_SEQUENCE_VECTOR(LogRecord)
LLVM_YAML_IS_SEQUENCE_VECTOR(ClauseInfo)
namespace llvm {
namespace yaml {
using llvm::yaml::IO;
using llvm::yaml::MappingTraits;
template <> struct MappingTraits<ClauseInfo> {
  static void mapping(IO &io, ClauseInfo &info) {
    io.mapRequired("clause", info.clause);
    io.mapRequired("details", info.clauseDetails);
  }
};
template <> struct MappingTraits<LogRecord> {
  static void mapping(IO &io, LogRecord &info) {
    io.mapRequired("file", info.file);
    io.mapRequired("line", info.line);
    io.mapRequired("construct", info.construct);
    io.mapRequired("clauses", info.clauses);
  }
};
} // namespace yaml
} // namespace llvm

class FlangOmpReport : public PluginParseTreeAction {
  void ExecuteAction() override {
    // Prepare the parse tree and the visitor
    CompilerInstance &ci = this->instance();
    Parsing &parsing = ci.parsing();
    const Program &parseTree = *parsing.parseTree();
    OpenMPCounterVisitor visitor;
    visitor.parsing = &parsing;

    // Walk the parse tree
    Walk(parseTree, visitor);

    // Dump the output
    std::unique_ptr<llvm::raw_pwrite_stream> OS{ci.CreateDefaultOutputFile(
        /*Binary=*/true, /*InFile=*/GetCurrentFileOrBufferName(),
        /*Extension=*/".yaml")};
    llvm::yaml::Output yout(*OS);
    yout << visitor.constructClauses;
  }
};

static FrontendPluginRegistry::Add<FlangOmpReport> X("flang-omp-report",
    "Generate a YAML summary of OpenMP constructs and clauses");
