1e4292bf0SMichael Kruse //===------ DumpModulePass.cpp ----------------------------------*- C++ -*-===//
2e4292bf0SMichael Kruse //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e4292bf0SMichael Kruse //
7e4292bf0SMichael Kruse //===----------------------------------------------------------------------===//
8e4292bf0SMichael Kruse //
9e4292bf0SMichael Kruse // Write a module to a file.
10e4292bf0SMichael Kruse //
11e4292bf0SMichael Kruse //===----------------------------------------------------------------------===//
12e4292bf0SMichael Kruse
13e4292bf0SMichael Kruse #include "polly/Support/DumpModulePass.h"
14e4292bf0SMichael Kruse #include "llvm/IR/Module.h"
15e4292bf0SMichael Kruse #include "llvm/Pass.h"
16e4292bf0SMichael Kruse #include "llvm/Support/Debug.h"
17e4292bf0SMichael Kruse #include "llvm/Support/FileSystem.h"
18e4292bf0SMichael Kruse #include "llvm/Support/Path.h"
19e4292bf0SMichael Kruse #include "llvm/Support/ToolOutputFile.h"
20031bb165SMichael Kruse
21e4292bf0SMichael Kruse #define DEBUG_TYPE "polly-dump-module"
22e4292bf0SMichael Kruse
23e4292bf0SMichael Kruse using namespace llvm;
24e4292bf0SMichael Kruse using namespace polly;
25e4292bf0SMichael Kruse
26e4292bf0SMichael Kruse namespace {
27e4292bf0SMichael Kruse
runDumpModule(llvm::Module & M,StringRef Filename,bool IsSuffix)2829bef8e4SMichael Kruse static void runDumpModule(llvm::Module &M, StringRef Filename, bool IsSuffix) {
2929bef8e4SMichael Kruse std::string Dumpfile;
3029bef8e4SMichael Kruse if (IsSuffix) {
3129bef8e4SMichael Kruse StringRef ModuleName = M.getName();
3229bef8e4SMichael Kruse StringRef Stem = sys::path::stem(ModuleName);
3329bef8e4SMichael Kruse Dumpfile = (Twine(Stem) + Filename + ".ll").str();
3429bef8e4SMichael Kruse } else {
3529bef8e4SMichael Kruse Dumpfile = Filename.str();
3629bef8e4SMichael Kruse }
3729bef8e4SMichael Kruse LLVM_DEBUG(dbgs() << "Dumping module to " << Dumpfile << '\n');
3829bef8e4SMichael Kruse
3929bef8e4SMichael Kruse std::unique_ptr<ToolOutputFile> Out;
4029bef8e4SMichael Kruse std::error_code EC;
4129bef8e4SMichael Kruse Out.reset(new ToolOutputFile(Dumpfile, EC, sys::fs::OF_None));
4229bef8e4SMichael Kruse if (EC) {
4329bef8e4SMichael Kruse errs() << EC.message() << '\n';
4429bef8e4SMichael Kruse return;
4529bef8e4SMichael Kruse }
4629bef8e4SMichael Kruse
4729bef8e4SMichael Kruse M.print(Out->os(), nullptr);
4829bef8e4SMichael Kruse Out->keep();
4929bef8e4SMichael Kruse }
5029bef8e4SMichael Kruse
51bd93df93SMichael Kruse class DumpModuleWrapperPass final : public ModulePass {
52e4292bf0SMichael Kruse private:
5329bef8e4SMichael Kruse DumpModuleWrapperPass(const DumpModuleWrapperPass &) = delete;
5429bef8e4SMichael Kruse const DumpModuleWrapperPass &
5529bef8e4SMichael Kruse operator=(const DumpModuleWrapperPass &) = delete;
56e4292bf0SMichael Kruse
57e4292bf0SMichael Kruse std::string Filename;
58e4292bf0SMichael Kruse bool IsSuffix;
59e4292bf0SMichael Kruse
60e4292bf0SMichael Kruse public:
61e4292bf0SMichael Kruse static char ID;
62e4292bf0SMichael Kruse
63e4292bf0SMichael Kruse /// This constructor is used e.g. if using opt -polly-dump-module.
64e4292bf0SMichael Kruse ///
65e4292bf0SMichael Kruse /// Provide a default suffix to not overwrite the original file.
DumpModuleWrapperPass()6629bef8e4SMichael Kruse explicit DumpModuleWrapperPass()
6729bef8e4SMichael Kruse : ModulePass(ID), Filename("-dump"), IsSuffix(true) {}
68e4292bf0SMichael Kruse
DumpModuleWrapperPass(std::string Filename,bool IsSuffix)6929bef8e4SMichael Kruse explicit DumpModuleWrapperPass(std::string Filename, bool IsSuffix)
7029bef8e4SMichael Kruse : ModulePass(ID), Filename(std::move(Filename)), IsSuffix(IsSuffix) {}
71e4292bf0SMichael Kruse
72e4292bf0SMichael Kruse /// @name ModulePass interface
73e4292bf0SMichael Kruse //@{
getAnalysisUsage(llvm::AnalysisUsage & AU) const74*3f3930a4SKazu Hirata void getAnalysisUsage(llvm::AnalysisUsage &AU) const override {
75e4292bf0SMichael Kruse AU.setPreservesAll();
76e4292bf0SMichael Kruse }
77e4292bf0SMichael Kruse
runOnModule(llvm::Module & M)78*3f3930a4SKazu Hirata bool runOnModule(llvm::Module &M) override {
7929bef8e4SMichael Kruse runDumpModule(M, Filename, IsSuffix);
80e4292bf0SMichael Kruse return false;
81e4292bf0SMichael Kruse }
82e4292bf0SMichael Kruse //@}
83e4292bf0SMichael Kruse };
84e4292bf0SMichael Kruse
8529bef8e4SMichael Kruse char DumpModuleWrapperPass::ID;
86e4292bf0SMichael Kruse } // namespace
87e4292bf0SMichael Kruse
createDumpModuleWrapperPass(std::string Filename,bool IsSuffix)8829bef8e4SMichael Kruse ModulePass *polly::createDumpModuleWrapperPass(std::string Filename,
89e4292bf0SMichael Kruse bool IsSuffix) {
9029bef8e4SMichael Kruse return new DumpModuleWrapperPass(std::move(Filename), IsSuffix);
91e4292bf0SMichael Kruse }
92e4292bf0SMichael Kruse
run(llvm::Module & M,llvm::ModuleAnalysisManager & AM)9329bef8e4SMichael Kruse llvm::PreservedAnalyses DumpModulePass::run(llvm::Module &M,
9429bef8e4SMichael Kruse llvm::ModuleAnalysisManager &AM) {
9529bef8e4SMichael Kruse runDumpModule(M, Filename, IsSuffix);
9629bef8e4SMichael Kruse return PreservedAnalyses::all();
9729bef8e4SMichael Kruse }
9829bef8e4SMichael Kruse
9929bef8e4SMichael Kruse INITIALIZE_PASS_BEGIN(DumpModuleWrapperPass, "polly-dump-module",
10029bef8e4SMichael Kruse "Polly - Dump Module", false, false)
10129bef8e4SMichael Kruse INITIALIZE_PASS_END(DumpModuleWrapperPass, "polly-dump-module",
10229bef8e4SMichael Kruse "Polly - Dump Module", false, false)
103