91 lines · cpp
1//===------ DumpFunctionPass.cpp --------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Write a function to a file.10//11//===----------------------------------------------------------------------===//12 13#include "polly/Support/DumpFunctionPass.h"14#include "llvm/IR/Module.h"15#include "llvm/IR/PassInstrumentation.h"16#include "llvm/Support/Debug.h"17#include "llvm/Support/FileSystem.h"18#include "llvm/Support/Path.h"19#include "llvm/Support/ToolOutputFile.h"20#include "llvm/Transforms/IPO/GlobalDCE.h"21#include "llvm/Transforms/IPO/StripDeadPrototypes.h"22#include "llvm/Transforms/Utils/Cloning.h"23 24#define DEBUG_TYPE "polly-dump-func"25 26using namespace llvm;27using namespace polly;28 29namespace {30 31static void runDumpFunction(llvm::Function &F, StringRef Suffix) {32 StringRef FName = F.getName();33 Module *M = F.getParent();34 35 StringRef ModuleName = M->getName();36 StringRef Stem = sys::path::stem(ModuleName);37 std::string Dumpfile = (Twine(Stem) + "-" + FName + Suffix + ".ll").str();38 LLVM_DEBUG(dbgs() << "Dumping function '" << FName << "' to '" << Dumpfile39 << "'...\n");40 41 ValueToValueMapTy VMap;42 auto ShouldCloneDefinition = [&F](const GlobalValue *GV) -> bool {43 return GV == &F;44 };45 std::unique_ptr<Module> CM = CloneModule(*M, VMap, ShouldCloneDefinition);46 Function *NewF = cast<Function>(VMap.lookup(&F));47 assert(NewF && "Expected selected function to be cloned");48 49 LLVM_DEBUG(dbgs() << "Global DCE...\n");50 51 // Stop F itself from being pruned52 GlobalValue::LinkageTypes OrigLinkage = NewF->getLinkage();53 NewF->setLinkage(GlobalValue::ExternalLinkage);54 55 {56 ModuleAnalysisManager MAM;57 ModulePassManager MPM;58 59 PassInstrumentationCallbacks PIC;60 MAM.registerPass([&] { return PassInstrumentationAnalysis(&PIC); });61 62 MPM.addPass(GlobalDCEPass());63 MPM.addPass(StripDeadPrototypesPass());64 MPM.run(*CM, MAM);65 }66 67 // Restore old linkage68 NewF->setLinkage(OrigLinkage);69 70 LLVM_DEBUG(dbgs() << "Write to file '" << Dumpfile << "'...\n");71 72 std::unique_ptr<ToolOutputFile> Out;73 std::error_code EC;74 Out.reset(new ToolOutputFile(Dumpfile, EC, sys::fs::OF_None));75 if (EC) {76 errs() << EC.message() << '\n';77 return;78 }79 80 CM->print(Out->os(), nullptr);81 Out->keep();82 LLVM_DEBUG(dbgs() << "Dump file " << Dumpfile << " written successfully\n");83}84} // namespace85 86llvm::PreservedAnalyses DumpFunctionPass::run(Function &F,87 FunctionAnalysisManager &AM) {88 runDumpFunction(F, Suffix);89 return PreservedAnalyses::all();90}91