mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2026-01-31 01:35:20 +01:00
Summary: This is the first step in also serializing the index out to LLVM assembly. The per-module summary written to bitcode is moved out of the bitcode writer and to a new analysis pass (ModuleSummaryIndexWrapperPass). The pass itself uses a new builder class to compute index, and the builder class is used directly in places where we don't have a pass manager (e.g. llvm-as). Because we are computing summaries outside of the bitcode writer, we no longer can use value ids created by the bitcode writer's ValueEnumerator. This required changing the reference graph edge type to use a new ValueInfo class holding a union between a GUID (combined index) and Value* (permodule index). The Value* are converted to the appropriate value ID during bitcode writing. Also, this enables removal of the BitWriter library's dependence on the Analysis library that was previously required for the summary computation. Reviewers: joker.eph Subscribers: joker.eph, llvm-commits Differential Revision: http://reviews.llvm.org/D18763 llvm-svn: 265941
87 lines
2.7 KiB
C++
87 lines
2.7 KiB
C++
//===- ModuleSummaryAnalysis.h - Module summary index builder ---*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
/// This is the interface to build a ModuleSummaryIndex for a module.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H
|
|
#define LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H
|
|
|
|
#include "llvm/ADT/STLExtras.h"
|
|
#include "llvm/IR/ModuleSummaryIndex.h"
|
|
#include "llvm/Pass.h"
|
|
|
|
namespace llvm {
|
|
|
|
class BlockFrequencyInfo;
|
|
|
|
/// Class to build a module summary index for the given Module, possibly from
|
|
/// a Pass.
|
|
class ModuleSummaryIndexBuilder {
|
|
/// The index being built
|
|
std::unique_ptr<ModuleSummaryIndex> Index;
|
|
/// The module for which we are building an index
|
|
const Module *M;
|
|
|
|
public:
|
|
/// Default constructor
|
|
ModuleSummaryIndexBuilder() = default;
|
|
|
|
/// Constructor that builds an index for the given Module. An optional
|
|
/// callback can be supplied to obtain the frequency info for a function.
|
|
ModuleSummaryIndexBuilder(
|
|
const Module *M,
|
|
std::function<BlockFrequencyInfo *(const Function &F)> Ftor = nullptr);
|
|
|
|
/// Get a reference to the index owned by builder
|
|
ModuleSummaryIndex &getIndex() const { return *Index; }
|
|
|
|
/// Take ownership of the built index
|
|
std::unique_ptr<ModuleSummaryIndex> takeIndex() { return std::move(Index); }
|
|
|
|
private:
|
|
/// Compute info for given function with optional frequency information
|
|
void computeFunctionInfo(const Function &F,
|
|
BlockFrequencyInfo *BFI = nullptr);
|
|
|
|
/// Compute info for given variable with optional frequency information
|
|
void computeVariableInfo(const GlobalVariable &V);
|
|
};
|
|
|
|
/// Legacy wrapper pass to provide the ModuleSummaryIndex object.
|
|
class ModuleSummaryIndexWrapperPass : public ModulePass {
|
|
std::unique_ptr<ModuleSummaryIndexBuilder> IndexBuilder;
|
|
|
|
public:
|
|
static char ID;
|
|
|
|
ModuleSummaryIndexWrapperPass();
|
|
|
|
/// Get the index built by pass
|
|
ModuleSummaryIndex &getIndex() { return IndexBuilder->getIndex(); }
|
|
const ModuleSummaryIndex &getIndex() const {
|
|
return IndexBuilder->getIndex();
|
|
}
|
|
|
|
bool runOnModule(Module &M) override;
|
|
bool doFinalization(Module &M) override;
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
|
};
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
//
|
|
// createModuleSummaryIndexWrapperPass - This pass builds a ModuleSummaryIndex
|
|
// object for the module, to be written to bitcode or LLVM assembly.
|
|
//
|
|
ModulePass *createModuleSummaryIndexWrapperPass();
|
|
}
|
|
|
|
#endif
|