//===------ DumpFunctionPass.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 function to a file.
//
//===----------------------------------------------------------------------===//

#include "polly/Support/DumpFunctionPass.h"
#include "polly/Support/PollyDebug.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassInstrumentation.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Transforms/IPO/GlobalDCE.h"
#include "llvm/Transforms/IPO/StripDeadPrototypes.h"
#include "llvm/Transforms/Utils/Cloning.h"

#define DEBUG_TYPE "polly-dump-func"

using namespace llvm;
using namespace polly;

namespace {

static void runDumpFunction(llvm::Function &F, StringRef Suffix) {
  StringRef FName = F.getName();
  Module *M = F.getParent();

  StringRef ModuleName = M->getName();
  StringRef Stem = sys::path::stem(ModuleName);
  std::string Dumpfile = (Twine(Stem) + "-" + FName + Suffix + ".ll").str();
  POLLY_DEBUG(dbgs() << "Dumping function '" << FName << "' to '" << Dumpfile
                     << "'...\n");

  ValueToValueMapTy VMap;
  auto ShouldCloneDefinition = [&F](const GlobalValue *GV) -> bool {
    return GV == &F;
  };
  std::unique_ptr<Module> CM = CloneModule(*M, VMap, ShouldCloneDefinition);
  Function *NewF = cast<Function>(VMap.lookup(&F));
  assert(NewF && "Expected selected function to be cloned");

  POLLY_DEBUG(dbgs() << "Global DCE...\n");

  // Stop F itself from being pruned
  GlobalValue::LinkageTypes OrigLinkage = NewF->getLinkage();
  NewF->setLinkage(GlobalValue::ExternalLinkage);

  {
    ModuleAnalysisManager MAM;
    ModulePassManager MPM;

    PassInstrumentationCallbacks PIC;
    MAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); });

    MPM.addPass(GlobalDCEPass());
    MPM.addPass(StripDeadPrototypesPass());
    MPM.run(*CM, MAM);
  }

  // Restore old linkage
  NewF->setLinkage(OrigLinkage);

  POLLY_DEBUG(dbgs() << "Write to file '" << 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;
  }

  CM->print(Out->os(), nullptr);
  Out->keep();
  POLLY_DEBUG(dbgs() << "Dump file " << Dumpfile << " written successfully\n");
}
} // namespace

llvm::PreservedAnalyses DumpFunctionPass::run(Function &F,
                                              FunctionAnalysisManager &AM) {
  runDumpFunction(F, Suffix);
  return PreservedAnalyses::all();
}
