1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00

[StackSafety] Pass summary into codegen

Summary:
The patch wraps ThinLTO index into immutable
pass which can be used by StackSafety analysis.

Reviewers: eugenis, pcc

Reviewed By: eugenis

Subscribers: hiraditya, steven_wu, dexonsmith, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D80985
This commit is contained in:
Vitaly Buka 2020-06-02 01:19:57 -07:00
parent 7911fd637b
commit 436769363c
6 changed files with 85 additions and 17 deletions

View File

@ -78,6 +78,27 @@ public:
// //
ModulePass *createModuleSummaryIndexWrapperPass(); ModulePass *createModuleSummaryIndexWrapperPass();
/// Legacy wrapper pass to provide the ModuleSummaryIndex object.
class ImmutableModuleSummaryIndexWrapperPass : public ImmutablePass {
const ModuleSummaryIndex *Index;
public:
static char ID;
ImmutableModuleSummaryIndexWrapperPass(
const ModuleSummaryIndex *Index = nullptr);
const ModuleSummaryIndex *getIndex() const { return Index; }
void getAnalysisUsage(AnalysisUsage &AU) const override;
};
//===--------------------------------------------------------------------===//
//
// ImmutableModuleSummaryIndexWrapperPass - This pass wrap provided
// ModuleSummaryIndex object for the module, to be used by other passes.
//
ImmutablePass *
createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index);
} // end namespace llvm } // end namespace llvm
#endif // LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H #endif // LLVM_ANALYSIS_MODULESUMMARYANALYSIS_H

View File

@ -55,13 +55,15 @@ public:
private: private:
Module *M = nullptr; Module *M = nullptr;
std::function<const StackSafetyInfo &(Function &F)> GetSSI; std::function<const StackSafetyInfo &(Function &F)> GetSSI;
const ModuleSummaryIndex *Index = nullptr;
mutable std::unique_ptr<InfoTy> Info; mutable std::unique_ptr<InfoTy> Info;
const InfoTy &getInfo() const; const InfoTy &getInfo() const;
public: public:
StackSafetyGlobalInfo(); StackSafetyGlobalInfo();
StackSafetyGlobalInfo( StackSafetyGlobalInfo(
Module *M, std::function<const StackSafetyInfo &(Function &F)> GetSSI); Module *M, std::function<const StackSafetyInfo &(Function &F)> GetSSI,
const ModuleSummaryIndex *Index);
StackSafetyGlobalInfo(StackSafetyGlobalInfo &&); StackSafetyGlobalInfo(StackSafetyGlobalInfo &&);
StackSafetyGlobalInfo &operator=(StackSafetyGlobalInfo &&); StackSafetyGlobalInfo &operator=(StackSafetyGlobalInfo &&);
~StackSafetyGlobalInfo(); ~StackSafetyGlobalInfo();

View File

@ -183,6 +183,7 @@ void initializeIRCELegacyPassPass(PassRegistry&);
void initializeIRTranslatorPass(PassRegistry&); void initializeIRTranslatorPass(PassRegistry&);
void initializeIVUsersWrapperPassPass(PassRegistry&); void initializeIVUsersWrapperPassPass(PassRegistry&);
void initializeIfConverterPass(PassRegistry&); void initializeIfConverterPass(PassRegistry&);
void initializeImmutableModuleSummaryIndexWrapperPassPass(PassRegistry&);
void initializeImplicitNullChecksPass(PassRegistry&); void initializeImplicitNullChecksPass(PassRegistry&);
void initializeIndVarSimplifyLegacyPassPass(PassRegistry&); void initializeIndVarSimplifyLegacyPassPass(PassRegistry&);
void initializeIndirectBrExpandPassPass(PassRegistry&); void initializeIndirectBrExpandPassPass(PassRegistry&);

View File

@ -909,3 +909,25 @@ void ModuleSummaryIndexWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<ProfileSummaryInfoWrapperPass>(); AU.addRequired<ProfileSummaryInfoWrapperPass>();
AU.addRequired<StackSafetyInfoWrapperPass>(); AU.addRequired<StackSafetyInfoWrapperPass>();
} }
char ImmutableModuleSummaryIndexWrapperPass::ID = 0;
ImmutableModuleSummaryIndexWrapperPass::ImmutableModuleSummaryIndexWrapperPass(
const ModuleSummaryIndex *Index)
: ImmutablePass(ID), Index(Index) {
initializeImmutableModuleSummaryIndexWrapperPassPass(
*PassRegistry::getPassRegistry());
}
void ImmutableModuleSummaryIndexWrapperPass::getAnalysisUsage(
AnalysisUsage &AU) const {
AU.setPreservesAll();
}
ImmutablePass *llvm::createImmutableModuleSummaryIndexWrapperPass(
const ModuleSummaryIndex *Index) {
return new ImmutableModuleSummaryIndexWrapperPass(Index);
}
INITIALIZE_PASS(ImmutableModuleSummaryIndexWrapperPass, "module-summary-info",
"Module summary info", false, true)

View File

@ -12,6 +12,7 @@
#include "llvm/ADT/APInt.h" #include "llvm/ADT/APInt.h"
#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/Statistic.h" #include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
#include "llvm/Analysis/ScalarEvolutionExpressions.h" #include "llvm/Analysis/ScalarEvolutionExpressions.h"
#include "llvm/IR/ConstantRange.h" #include "llvm/IR/ConstantRange.h"
#include "llvm/IR/DerivedTypes.h" #include "llvm/IR/DerivedTypes.h"
@ -571,7 +572,8 @@ template <typename CalleeTy> void resolveAllCalls(UseInfo<CalleeTy> &Use) {
} }
GVToSSI createGlobalStackSafetyInfo( GVToSSI createGlobalStackSafetyInfo(
std::map<const GlobalValue *, FunctionInfo<GlobalValue>> Functions) { std::map<const GlobalValue *, FunctionInfo<GlobalValue>> Functions,
const ModuleSummaryIndex *Index) {
GVToSSI SSI; GVToSSI SSI;
if (Functions.empty()) if (Functions.empty())
return SSI; return SSI;
@ -647,8 +649,8 @@ const StackSafetyGlobalInfo::InfoTy &StackSafetyGlobalInfo::getInfo() const {
Functions.emplace(&F, std::move(FI)); Functions.emplace(&F, std::move(FI));
} }
} }
Info.reset( Info.reset(new InfoTy{
new InfoTy{createGlobalStackSafetyInfo(std::move(Functions)), {}}); createGlobalStackSafetyInfo(std::move(Functions), Index), {}});
for (auto &FnKV : Info->Info) { for (auto &FnKV : Info->Info) {
for (auto &KV : FnKV.second.Allocas) { for (auto &KV : FnKV.second.Allocas) {
++NumAllocaTotal; ++NumAllocaTotal;
@ -695,8 +697,9 @@ StackSafetyInfo::getParamAccesses() const {
StackSafetyGlobalInfo::StackSafetyGlobalInfo() = default; StackSafetyGlobalInfo::StackSafetyGlobalInfo() = default;
StackSafetyGlobalInfo::StackSafetyGlobalInfo( StackSafetyGlobalInfo::StackSafetyGlobalInfo(
Module *M, std::function<const StackSafetyInfo &(Function &F)> GetSSI) Module *M, std::function<const StackSafetyInfo &(Function &F)> GetSSI,
: M(M), GetSSI(GetSSI) { const ModuleSummaryIndex *Index)
: M(M), GetSSI(GetSSI), Index(Index) {
if (StackSafetyRun) if (StackSafetyRun)
getInfo(); getInfo();
} }
@ -770,11 +773,14 @@ AnalysisKey StackSafetyGlobalAnalysis::Key;
StackSafetyGlobalInfo StackSafetyGlobalInfo
StackSafetyGlobalAnalysis::run(Module &M, ModuleAnalysisManager &AM) { StackSafetyGlobalAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
// FIXME: Lookup Module Summary.
FunctionAnalysisManager &FAM = FunctionAnalysisManager &FAM =
AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
return {&M, [&FAM](Function &F) -> const StackSafetyInfo & { return {&M,
[&FAM](Function &F) -> const StackSafetyInfo & {
return FAM.getResult<StackSafetyAnalysis>(F); return FAM.getResult<StackSafetyAnalysis>(F);
}}; },
nullptr};
} }
PreservedAnalyses StackSafetyGlobalPrinterPass::run(Module &M, PreservedAnalyses StackSafetyGlobalPrinterPass::run(Module &M,
@ -806,13 +812,22 @@ void StackSafetyGlobalInfoWrapperPass::getAnalysisUsage(
} }
bool StackSafetyGlobalInfoWrapperPass::runOnModule(Module &M) { bool StackSafetyGlobalInfoWrapperPass::runOnModule(Module &M) {
SSGI = {&M, [this](Function &F) -> const StackSafetyInfo & { const ModuleSummaryIndex *ImportSummary = nullptr;
if (auto *IndexWrapperPass =
getAnalysisIfAvailable<ImmutableModuleSummaryIndexWrapperPass>())
ImportSummary = IndexWrapperPass->getIndex();
SSGI = {&M,
[this](Function &F) -> const StackSafetyInfo & {
return getAnalysis<StackSafetyInfoWrapperPass>(F).getResult(); return getAnalysis<StackSafetyInfoWrapperPass>(F).getResult();
}}; },
ImportSummary};
return false; return false;
} }
bool llvm::needsParamAccessSummary(const Module &M) { bool llvm::needsParamAccessSummary(const Module &M) {
if (StackSafetyRun)
return true;
for (auto &F : M.functions()) for (auto &F : M.functions())
if (F.hasFnAttribute(Attribute::SanitizeMemTag)) if (F.hasFnAttribute(Attribute::SanitizeMemTag))
return true; return true;
@ -831,5 +846,6 @@ static const char GlobalPassName[] = "Stack Safety Analysis";
INITIALIZE_PASS_BEGIN(StackSafetyGlobalInfoWrapperPass, DEBUG_TYPE, INITIALIZE_PASS_BEGIN(StackSafetyGlobalInfoWrapperPass, DEBUG_TYPE,
GlobalPassName, false, true) GlobalPassName, false, true)
INITIALIZE_PASS_DEPENDENCY(StackSafetyInfoWrapperPass) INITIALIZE_PASS_DEPENDENCY(StackSafetyInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(ImmutableModuleSummaryIndexWrapperPass)
INITIALIZE_PASS_END(StackSafetyGlobalInfoWrapperPass, DEBUG_TYPE, INITIALIZE_PASS_END(StackSafetyGlobalInfoWrapperPass, DEBUG_TYPE,
GlobalPassName, false, true) GlobalPassName, false, true)

View File

@ -16,6 +16,7 @@
#include "llvm/LTO/LTOBackend.h" #include "llvm/LTO/LTOBackend.h"
#include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/CGSCCPassManager.h" #include "llvm/Analysis/CGSCCPassManager.h"
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
#include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/Bitcode/BitcodeReader.h"
@ -363,7 +364,8 @@ static void EmitBitcodeSection(Module &M, const Config &Conf) {
} }
void codegen(const Config &Conf, TargetMachine *TM, AddStreamFn AddStream, void codegen(const Config &Conf, TargetMachine *TM, AddStreamFn AddStream,
unsigned Task, Module &Mod) { unsigned Task, Module &Mod,
const ModuleSummaryIndex &CombinedIndex) {
if (Conf.PreCodeGenModuleHook && !Conf.PreCodeGenModuleHook(Task, Mod)) if (Conf.PreCodeGenModuleHook && !Conf.PreCodeGenModuleHook(Task, Mod))
return; return;
@ -392,6 +394,8 @@ void codegen(const Config &Conf, TargetMachine *TM, AddStreamFn AddStream,
auto Stream = AddStream(Task); auto Stream = AddStream(Task);
legacy::PassManager CodeGenPasses; legacy::PassManager CodeGenPasses;
CodeGenPasses.add(
createImmutableModuleSummaryIndexWrapperPass(&CombinedIndex));
if (TM->addPassesToEmitFile(CodeGenPasses, *Stream->OS, if (TM->addPassesToEmitFile(CodeGenPasses, *Stream->OS,
DwoOut ? &DwoOut->os() : nullptr, DwoOut ? &DwoOut->os() : nullptr,
Conf.CGFileType)) Conf.CGFileType))
@ -404,7 +408,8 @@ void codegen(const Config &Conf, TargetMachine *TM, AddStreamFn AddStream,
void splitCodeGen(const Config &C, TargetMachine *TM, AddStreamFn AddStream, void splitCodeGen(const Config &C, TargetMachine *TM, AddStreamFn AddStream,
unsigned ParallelCodeGenParallelismLevel, unsigned ParallelCodeGenParallelismLevel,
std::unique_ptr<Module> Mod) { std::unique_ptr<Module> Mod,
const ModuleSummaryIndex &CombinedIndex) {
ThreadPool CodegenThreadPool( ThreadPool CodegenThreadPool(
heavyweight_hardware_concurrency(ParallelCodeGenParallelismLevel)); heavyweight_hardware_concurrency(ParallelCodeGenParallelismLevel));
unsigned ThreadCount = 0; unsigned ThreadCount = 0;
@ -437,7 +442,8 @@ void splitCodeGen(const Config &C, TargetMachine *TM, AddStreamFn AddStream,
std::unique_ptr<TargetMachine> TM = std::unique_ptr<TargetMachine> TM =
createTargetMachine(C, T, *MPartInCtx); createTargetMachine(C, T, *MPartInCtx);
codegen(C, TM.get(), AddStream, ThreadId, *MPartInCtx); codegen(C, TM.get(), AddStream, ThreadId, *MPartInCtx,
CombinedIndex);
}, },
// Pass BC using std::move to ensure that it get moved rather than // Pass BC using std::move to ensure that it get moved rather than
// copied into the thread's context. // copied into the thread's context.
@ -493,10 +499,10 @@ Error lto::backend(const Config &C, AddStreamFn AddStream,
} }
if (ParallelCodeGenParallelismLevel == 1) { if (ParallelCodeGenParallelismLevel == 1) {
codegen(C, TM.get(), AddStream, 0, *Mod); codegen(C, TM.get(), AddStream, 0, *Mod, CombinedIndex);
} else { } else {
splitCodeGen(C, TM.get(), AddStream, ParallelCodeGenParallelismLevel, splitCodeGen(C, TM.get(), AddStream, ParallelCodeGenParallelismLevel,
std::move(Mod)); std::move(Mod), CombinedIndex);
} }
return Error::success(); return Error::success();
} }
@ -546,7 +552,7 @@ Error lto::thinBackend(const Config &Conf, unsigned Task, AddStreamFn AddStream,
Mod.setPartialSampleProfileRatio(CombinedIndex); Mod.setPartialSampleProfileRatio(CombinedIndex);
if (Conf.CodeGenOnly) { if (Conf.CodeGenOnly) {
codegen(Conf, TM.get(), AddStream, Task, Mod); codegen(Conf, TM.get(), AddStream, Task, Mod, CombinedIndex);
return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile)); return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
} }
@ -597,6 +603,6 @@ Error lto::thinBackend(const Config &Conf, unsigned Task, AddStreamFn AddStream,
/*ExportSummary=*/nullptr, /*ImportSummary=*/&CombinedIndex)) /*ExportSummary=*/nullptr, /*ImportSummary=*/&CombinedIndex))
return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile)); return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
codegen(Conf, TM.get(), AddStream, Task, Mod); codegen(Conf, TM.get(), AddStream, Task, Mod, CombinedIndex);
return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile)); return finalizeOptimizationRemarks(std::move(DiagnosticOutputFile));
} }