123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- //===------ 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 "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 "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();
- LLVM_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");
- LLVM_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);
- LLVM_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();
- LLVM_DEBUG(dbgs() << "Dump file " << Dumpfile << " written successfully\n");
- }
- class DumpFunctionWrapperPass : public FunctionPass {
- private:
- DumpFunctionWrapperPass(const DumpFunctionWrapperPass &) = delete;
- const DumpFunctionWrapperPass &
- operator=(const DumpFunctionWrapperPass &) = delete;
- std::string Suffix;
- public:
- static char ID;
- explicit DumpFunctionWrapperPass() : FunctionPass(ID), Suffix("-dump") {}
- explicit DumpFunctionWrapperPass(std::string Suffix)
- : FunctionPass(ID), Suffix(std::move(Suffix)) {}
- /// @name FunctionPass interface
- //@{
- virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override {
- AU.setPreservesAll();
- }
- virtual bool runOnFunction(llvm::Function &F) override {
- runDumpFunction(F, Suffix);
- return false;
- }
- //@}
- };
- char DumpFunctionWrapperPass::ID;
- } // namespace
- FunctionPass *polly::createDumpFunctionWrapperPass(std::string Suffix) {
- return new DumpFunctionWrapperPass(std::move(Suffix));
- }
- llvm::PreservedAnalyses DumpFunctionPass::run(Function &F,
- FunctionAnalysisManager &AM) {
- runDumpFunction(F, Suffix);
- return PreservedAnalyses::all();
- }
- INITIALIZE_PASS_BEGIN(DumpFunctionWrapperPass, "polly-dump-function",
- "Polly - Dump Function", false, false)
- INITIALIZE_PASS_END(DumpFunctionWrapperPass, "polly-dump-function",
- "Polly - Dump Function", false, false)
|