brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · 9565e21 Raw
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