summaryrefslogtreecommitdiffstats
path: root/polly/lib/Support/DumpModulePass.cpp
diff options
context:
space:
mode:
authorMichael Kruse <llvm@meinersbur.de>2017-03-09 22:29:58 +0000
committerMichael Kruse <llvm@meinersbur.de>2017-03-09 22:29:58 +0000
commite4292bf08660b2e945d68dd7c9918620ec25cf8a (patch)
tree4587bb742240c5d3a438ea0163d3ae9f4f0fdd41 /polly/lib/Support/DumpModulePass.cpp
parent544210304fbae675632c5a5bc54c7fa5b441f670 (diff)
downloadbcm5719-llvm-e4292bf08660b2e945d68dd7c9918620ec25cf8a.tar.gz
bcm5719-llvm-e4292bf08660b2e945d68dd7c9918620ec25cf8a.zip
[Support] Add -polly-dump-module pass.
This pass allows writing the LLVM-IR just before and after the Polly passes to a file. Dumping the IR before Polly helps reproducing bugs that occur in code generated by clang. It is the only reliable way to get the IR that triggers a bug. The alternative is to emit the IR with clang -c -emit-llvm -S -o dump.ll then pass it through all optimization passes opt dump.ll -basicaa -sroa ... -S -o optdump.ll to then reproduce the error with opt optdump.ll -polly-opt-isl -polly-codegen -analyze However, the IR is not the same. -O3 uses a PassBuilder than creates passes with different parameters than the default. Dumping the IR after Polly is useful to compare a miscompilation with a known-good configuration. Differential Revision: https://reviews.llvm.org/D30788 llvm-svn: 297415
Diffstat (limited to 'polly/lib/Support/DumpModulePass.cpp')
-rw-r--r--polly/lib/Support/DumpModulePass.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/polly/lib/Support/DumpModulePass.cpp b/polly/lib/Support/DumpModulePass.cpp
new file mode 100644
index 00000000000..558088cf898
--- /dev/null
+++ b/polly/lib/Support/DumpModulePass.cpp
@@ -0,0 +1,95 @@
+//===------ 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)
OpenPOWER on IntegriCloud