//===------ DumpModulePass.cpp ----------------------------------*- 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
//
//===----------------------------------------------------------------------===//
//
// Write a module to a file.
//
//===----------------------------------------------------------------------===//

#include "polly/Support/DumpModulePass.h"
#include "polly/Support/PollyDebug.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/ToolOutputFile.h"

#define DEBUG_TYPE "polly-dump-module"

using namespace llvm;
using namespace polly;

namespace {

static void runDumpModule(llvm::Module &M, StringRef Filename, bool IsSuffix) {
  std::string Dumpfile;
  if (IsSuffix) {
    StringRef ModuleName = M.getName();
    StringRef Stem = sys::path::stem(ModuleName);
    Dumpfile = (Twine(Stem) + Filename + ".ll").str();
  } else {
    Dumpfile = Filename.str();
  }
  POLLY_DEBUG(dbgs() << "Dumping module to " << Dumpfile << '\n');

  std::unique_ptr<ToolOutputFile> Out;
  std::error_code EC;
  Out.reset(new ToolOutputFile(Dumpfile, EC, sys::fs::OF_None));
  if (EC) {
    errs() << EC.message() << '\n';
    return;
  }

  M.print(Out->os(), nullptr);
  Out->keep();
}
} // namespace

llvm::PreservedAnalyses DumpModulePass::run(llvm::Module &M,
                                            llvm::ModuleAnalysisManager &AM) {
  runDumpModule(M, Filename, IsSuffix);
  return PreservedAnalyses::all();
}
