//===------ DumpModulePass.cpp ----------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Write a module to a file.
//
//===----------------------------------------------------------------------===//

#include "polly/Support/DumpModulePass.h"

#include "polly/Options.h"
#include "llvm/IR/LegacyPassManagers.h"
#include "llvm/IR/Module.h"
#include "llvm/Pass.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/ToolOutputFile.h"
#include <string.h>
#define DEBUG_TYPE "polly-dump-module"

using namespace llvm;
using namespace polly;

namespace {

class DumpModule : public ModulePass {
private:
  DumpModule(const DumpModule &) = delete;
  const DumpModule &operator=(const DumpModule &) = delete;

  std::string Filename;
  bool IsSuffix;

public:
  static char ID;

  /// This constructor is used e.g. if using opt -polly-dump-module.
  ///
  /// Provide a default suffix to not overwrite the original file.
  explicit DumpModule() : ModulePass(ID), Filename("-dump"), IsSuffix(true) {}

  explicit DumpModule(llvm::StringRef Filename, bool IsSuffix)
      : ModulePass(ID), Filename(Filename), IsSuffix(IsSuffix) {}

  /// @name ModulePass interface
  //@{
  virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override {
    AU.setPreservesAll();
  }

  virtual bool runOnModule(llvm::Module &M) override {
    std::string Dumpfile;
    if (IsSuffix) {
      auto ModuleName = M.getName();
      auto Stem = sys::path::stem(ModuleName);
      Dumpfile = (Twine(Stem) + Filename + ".ll").str();
    } else {
      Dumpfile = Filename;
    }
    DEBUG(dbgs() << "Dumping module to " << Dumpfile << '\n');

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

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

    return false;
  }
  //@}
};

char DumpModule::ID;
} // namespace

ModulePass *polly::createDumpModulePass(llvm::StringRef Filename,
                                        bool IsSuffix) {
  return new DumpModule(Filename, IsSuffix);
}

INITIALIZE_PASS_BEGIN(DumpModule, "polly-dump-module", "Polly - Dump Module",
                      false, false)
INITIALIZE_PASS_END(DumpModule, "polly-dump-module", "Polly - Dump Module",
                    false, false)
