mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-24 20:30:06 +00:00
[PM] Port BoundsChecking to the new PM.
Registers it and everything, updates all the references, etc. Next patch will add support to Clang's `-fexperimental-new-pass-manager` path to actually enable BoundsChecking correctly. Differential Revision: https://reviews.llvm.org/D39084 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@318128 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
79f20d27db
commit
8dd352a12f
@ -75,7 +75,7 @@ void initializeBarrierNoopPass(PassRegistry&);
|
||||
void initializeBasicAAWrapperPassPass(PassRegistry&);
|
||||
void initializeBlockExtractorPassPass(PassRegistry&);
|
||||
void initializeBlockFrequencyInfoWrapperPassPass(PassRegistry&);
|
||||
void initializeBoundsCheckingPass(PassRegistry&);
|
||||
void initializeBoundsCheckingLegacyPassPass(PassRegistry&);
|
||||
void initializeBranchFolderPassPass(PassRegistry&);
|
||||
void initializeBranchProbabilityInfoWrapperPassPass(PassRegistry&);
|
||||
void initializeBranchRelaxationPass(PassRegistry&);
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include "llvm/Transforms/IPO/AlwaysInliner.h"
|
||||
#include "llvm/Transforms/IPO/FunctionAttrs.h"
|
||||
#include "llvm/Transforms/Instrumentation.h"
|
||||
#include "llvm/Transforms/Instrumentation/BoundsChecking.h"
|
||||
#include "llvm/Transforms/ObjCARC.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Scalar/GVN.h"
|
||||
@ -70,7 +71,7 @@ namespace {
|
||||
(void) llvm::createSCEVAAWrapperPass();
|
||||
(void) llvm::createTypeBasedAAWrapperPass();
|
||||
(void) llvm::createScopedNoAliasAAWrapperPass();
|
||||
(void) llvm::createBoundsCheckingPass();
|
||||
(void) llvm::createBoundsCheckingLegacyPass();
|
||||
(void) llvm::createBreakCriticalEdgesPass();
|
||||
(void) llvm::createCallGraphDOTPrinterPass();
|
||||
(void) llvm::createCallGraphViewerPass();
|
||||
|
@ -202,10 +202,6 @@ inline ModulePass *createDataFlowSanitizerPassForJIT(
|
||||
}
|
||||
#endif
|
||||
|
||||
// BoundsChecking - This pass instruments the code to perform run-time bounds
|
||||
// checking on loads, stores, and other memory intrinsics.
|
||||
FunctionPass *createBoundsCheckingPass();
|
||||
|
||||
/// \brief Calculate what to divide by to scale counts.
|
||||
///
|
||||
/// Given the maximum count, calculate a divisor that will scale all the
|
||||
|
29
include/llvm/Transforms/Instrumentation/BoundsChecking.h
Normal file
29
include/llvm/Transforms/Instrumentation/BoundsChecking.h
Normal file
@ -0,0 +1,29 @@
|
||||
//===- BoundsChecking.h - Bounds checking instrumentation -------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_BOUNDSCHECKING_H
|
||||
#define LLVM_TRANSFORMS_INSTRUMENTATION_BOUNDSCHECKING_H
|
||||
|
||||
#include "llvm/IR/PassManager.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// A pass to instrument code and perform run-time bounds checking on loads,
|
||||
/// stores, and other memory intrinsics.
|
||||
struct BoundsCheckingPass : PassInfoMixin<BoundsCheckingPass> {
|
||||
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
|
||||
};
|
||||
|
||||
|
||||
/// Legacy pass creation function for the above pass.
|
||||
FunctionPass *createBoundsCheckingLegacyPass();
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_TRANSFORMS_INSTRUMENTATION_BOUNDSCHECKING_H
|
@ -84,6 +84,7 @@
|
||||
#include "llvm/Transforms/IPO/WholeProgramDevirt.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombine.h"
|
||||
#include "llvm/Transforms/InstrProfiling.h"
|
||||
#include "llvm/Transforms/Instrumentation/BoundsChecking.h"
|
||||
#include "llvm/Transforms/PGOInstrumentation.h"
|
||||
#include "llvm/Transforms/SampleProfile.h"
|
||||
#include "llvm/Transforms/Scalar/ADCE.h"
|
||||
|
@ -139,6 +139,7 @@ FUNCTION_PASS("adce", ADCEPass())
|
||||
FUNCTION_PASS("add-discriminators", AddDiscriminatorsPass())
|
||||
FUNCTION_PASS("alignment-from-assumptions", AlignmentFromAssumptionsPass())
|
||||
FUNCTION_PASS("bdce", BDCEPass())
|
||||
FUNCTION_PASS("bounds-checking", BoundsCheckingPass())
|
||||
FUNCTION_PASS("break-crit-edges", BreakCriticalEdgesPass())
|
||||
FUNCTION_PASS("callsite-splitting", CallSiteSplittingPass())
|
||||
FUNCTION_PASS("consthoist", ConstantHoistingPass())
|
||||
|
@ -6,12 +6,8 @@
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements a pass that instruments the code to perform run-time
|
||||
// bounds checking on loads, stores, and other memory intrinsics.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Transforms/Instrumentation/BoundsChecking.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Analysis/MemoryBuiltins.h"
|
||||
@ -34,7 +30,6 @@
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/Instrumentation.h"
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
@ -51,29 +46,6 @@ STATISTIC(ChecksUnable, "Bounds checks unable to add");
|
||||
|
||||
using BuilderTy = IRBuilder<TargetFolder>;
|
||||
|
||||
namespace {
|
||||
|
||||
struct BoundsChecking : public FunctionPass {
|
||||
static char ID;
|
||||
|
||||
BoundsChecking() : FunctionPass(ID) {
|
||||
initializeBoundsCheckingPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
bool runOnFunction(Function &F) override;
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
char BoundsChecking::ID = 0;
|
||||
|
||||
INITIALIZE_PASS(BoundsChecking, "bounds-checking", "Run-time bounds checking",
|
||||
false, false)
|
||||
|
||||
/// Adds run-time bounds checks to memory accessing instructions.
|
||||
///
|
||||
/// \p Ptr is the pointer that will be read/written, and \p InstVal is either
|
||||
@ -151,10 +123,8 @@ static bool instrumentMemAccess(Value *Ptr, Value *InstVal,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool BoundsChecking::runOnFunction(Function &F) {
|
||||
static bool addBoundsChecking(Function &F, TargetLibraryInfo &TLI) {
|
||||
const DataLayout &DL = F.getParent()->getDataLayout();
|
||||
auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
|
||||
|
||||
ObjectSizeOffsetEvaluator ObjSizeEval(DL, &TLI, F.getContext(),
|
||||
/*RoundToAlign=*/true);
|
||||
|
||||
@ -218,6 +188,41 @@ bool BoundsChecking::runOnFunction(Function &F) {
|
||||
return MadeChange;
|
||||
}
|
||||
|
||||
FunctionPass *llvm::createBoundsCheckingPass() {
|
||||
return new BoundsChecking();
|
||||
PreservedAnalyses BoundsCheckingPass::run(Function &F, FunctionAnalysisManager &AM) {
|
||||
auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
|
||||
|
||||
if (!addBoundsChecking(F, TLI))
|
||||
return PreservedAnalyses::all();
|
||||
|
||||
return PreservedAnalyses::none();
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct BoundsCheckingLegacyPass : public FunctionPass {
|
||||
static char ID;
|
||||
|
||||
BoundsCheckingLegacyPass() : FunctionPass(ID) {
|
||||
initializeBoundsCheckingLegacyPassPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
bool runOnFunction(Function &F) override {
|
||||
auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
|
||||
return addBoundsChecking(F, TLI);
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
}
|
||||
};
|
||||
} // namespace
|
||||
|
||||
char BoundsCheckingLegacyPass::ID = 0;
|
||||
INITIALIZE_PASS_BEGIN(BoundsCheckingLegacyPass, "bounds-checking",
|
||||
"Run-time bounds checking", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
|
||||
INITIALIZE_PASS_END(BoundsCheckingLegacyPass, "bounds-checking",
|
||||
"Run-time bounds checking", false, false)
|
||||
|
||||
FunctionPass *llvm::createBoundsCheckingLegacyPass() {
|
||||
return new BoundsCheckingLegacyPass();
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ BasicBlock::iterator llvm::PrepareToSplitEntryBlock(BasicBlock &BB,
|
||||
void llvm::initializeInstrumentation(PassRegistry &Registry) {
|
||||
initializeAddressSanitizerPass(Registry);
|
||||
initializeAddressSanitizerModulePass(Registry);
|
||||
initializeBoundsCheckingPass(Registry);
|
||||
initializeBoundsCheckingLegacyPassPass(Registry);
|
||||
initializeGCOVProfilerLegacyPassPass(Registry);
|
||||
initializePGOInstrumentationGenLegacyPassPass(Registry);
|
||||
initializePGOInstrumentationUseLegacyPassPass(Registry);
|
||||
|
@ -1,4 +1,5 @@
|
||||
; RUN: opt < %s -bounds-checking -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=bounds-checking -S | FileCheck %s
|
||||
target datalayout = "e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
||||
|
||||
@.str = private constant [8 x i8] c"abcdefg\00" ; <[8 x i8]*>
|
||||
|
Loading…
Reference in New Issue
Block a user