123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- //===------ 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 "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"
- #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();
- }
- LLVM_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();
- }
- class DumpModuleWrapperPass final : public ModulePass {
- private:
- DumpModuleWrapperPass(const DumpModuleWrapperPass &) = delete;
- const DumpModuleWrapperPass &
- operator=(const DumpModuleWrapperPass &) = 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 DumpModuleWrapperPass()
- : ModulePass(ID), Filename("-dump"), IsSuffix(true) {}
- explicit DumpModuleWrapperPass(std::string Filename, bool IsSuffix)
- : ModulePass(ID), Filename(std::move(Filename)), IsSuffix(IsSuffix) {}
- /// @name ModulePass interface
- //@{
- void getAnalysisUsage(llvm::AnalysisUsage &AU) const override {
- AU.setPreservesAll();
- }
- bool runOnModule(llvm::Module &M) override {
- runDumpModule(M, Filename, IsSuffix);
- return false;
- }
- //@}
- };
- char DumpModuleWrapperPass::ID;
- } // namespace
- ModulePass *polly::createDumpModuleWrapperPass(std::string Filename,
- bool IsSuffix) {
- return new DumpModuleWrapperPass(std::move(Filename), IsSuffix);
- }
- llvm::PreservedAnalyses DumpModulePass::run(llvm::Module &M,
- llvm::ModuleAnalysisManager &AM) {
- runDumpModule(M, Filename, IsSuffix);
- return PreservedAnalyses::all();
- }
- INITIALIZE_PASS_BEGIN(DumpModuleWrapperPass, "polly-dump-module",
- "Polly - Dump Module", false, false)
- INITIALIZE_PASS_END(DumpModuleWrapperPass, "polly-dump-module",
- "Polly - Dump Module", false, false)
|