forked from OSchip/llvm-project
[LegacyPM] Remove AddressSanitizerLegacyPass
Using the legacy PM for the optimization pipeline was deprecated in 13.0.0. Following recent changes to remove non-core features of the legacy PM/optimization pipeline, remove AddressSanitizerLegacyPass, ModuleAddressSanitizerLegacyPass, and ASanGlobalsMetadataWrapperPass. MemorySanitizerLegacyPass was removed in D123894. Reviewed By: #sanitizers, vitalybuka Differential Revision: https://reviews.llvm.org/D124216
This commit is contained in:
parent
caf5ad5da7
commit
e68c589e53
|
@ -16,20 +16,11 @@
|
|||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Transforms/Instrumentation.h"
|
||||
#include "llvm/Transforms/Instrumentation/AddressSanitizer.h"
|
||||
#include "llvm/Transforms/Instrumentation/MemorySanitizer.h"
|
||||
#include "llvm/Transforms/Instrumentation/ThreadSanitizer.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
void LLVMAddAddressSanitizerFunctionPass(LLVMPassManagerRef PM) {
|
||||
unwrap(PM)->add(createAddressSanitizerFunctionPass());
|
||||
}
|
||||
|
||||
void LLVMAddAddressSanitizerModulePass(LLVMPassManagerRef PM) {
|
||||
unwrap(PM)->add(createModuleAddressSanitizerLegacyPassPass());
|
||||
}
|
||||
|
||||
void LLVMAddThreadSanitizerPass(LLVMPassManagerRef PM) {
|
||||
unwrap(PM)->add(createThreadSanitizerLegacyPassPass());
|
||||
}
|
||||
|
|
|
@ -23,8 +23,6 @@ extern "C" {
|
|||
// a (somewhat) less stable collection of C APIs for use in creating bindings of
|
||||
// LLVM in other languages.
|
||||
|
||||
void LLVMAddAddressSanitizerFunctionPass(LLVMPassManagerRef PM);
|
||||
void LLVMAddAddressSanitizerModulePass(LLVMPassManagerRef PM);
|
||||
void LLVMAddThreadSanitizerPass(LLVMPassManagerRef PM);
|
||||
void LLVMAddDataFlowSanitizerPass(LLVMPassManagerRef PM, int ABIListFilesNum,
|
||||
const char **ABIListFiles);
|
||||
|
|
|
@ -19,14 +19,6 @@ package llvm
|
|||
import "C"
|
||||
import "unsafe"
|
||||
|
||||
func (pm PassManager) AddAddressSanitizerFunctionPass() {
|
||||
C.LLVMAddAddressSanitizerFunctionPass(pm.C)
|
||||
}
|
||||
|
||||
func (pm PassManager) AddAddressSanitizerModulePass() {
|
||||
C.LLVMAddAddressSanitizerModulePass(pm.C)
|
||||
}
|
||||
|
||||
func (pm PassManager) AddThreadSanitizerPass() {
|
||||
C.LLVMAddThreadSanitizerPass(pm.C)
|
||||
}
|
||||
|
|
|
@ -62,9 +62,6 @@ void initializeAAResultsWrapperPassPass(PassRegistry&);
|
|||
void initializeADCELegacyPassPass(PassRegistry&);
|
||||
void initializeAddDiscriminatorsLegacyPassPass(PassRegistry&);
|
||||
void initializeAddFSDiscriminatorsPass(PassRegistry &);
|
||||
void initializeModuleAddressSanitizerLegacyPassPass(PassRegistry &);
|
||||
void initializeASanGlobalsMetadataWrapperPassPass(PassRegistry &);
|
||||
void initializeAddressSanitizerLegacyPassPass(PassRegistry &);
|
||||
void initializeAggressiveInstCombinerLegacyPassPass(PassRegistry&);
|
||||
void initializeAliasSetPrinterPass(PassRegistry&);
|
||||
void initializeAlignmentFromAssumptionsPass(PassRegistry&);
|
||||
|
|
|
@ -126,17 +126,6 @@ private:
|
|||
AsanDtorKind DestructorKind;
|
||||
};
|
||||
|
||||
// Insert AddressSanitizer (address basic correctness checking) instrumentation
|
||||
FunctionPass *createAddressSanitizerFunctionPass(
|
||||
bool CompileKernel = false, bool Recover = false,
|
||||
bool UseAfterScope = false,
|
||||
AsanDetectStackUseAfterReturnMode UseAfterReturn =
|
||||
AsanDetectStackUseAfterReturnMode::Runtime);
|
||||
ModulePass *createModuleAddressSanitizerLegacyPassPass(
|
||||
bool CompileKernel = false, bool Recover = false, bool UseGlobalsGC = true,
|
||||
bool UseOdrIndicator = true,
|
||||
AsanDtorKind DestructorKind = AsanDtorKind::Global);
|
||||
|
||||
struct ASanAccessInfo {
|
||||
const int32_t Packed;
|
||||
const uint8_t AccessSizeIndex;
|
||||
|
|
|
@ -623,37 +623,6 @@ static uint64_t GetCtorAndDtorPriority(Triple &TargetTriple) {
|
|||
|
||||
namespace {
|
||||
|
||||
/// Module analysis for getting various metadata about the module.
|
||||
class ASanGlobalsMetadataWrapperPass : public ModulePass {
|
||||
public:
|
||||
static char ID;
|
||||
|
||||
ASanGlobalsMetadataWrapperPass() : ModulePass(ID) {
|
||||
initializeASanGlobalsMetadataWrapperPassPass(
|
||||
*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
bool runOnModule(Module &M) override {
|
||||
GlobalsMD = GlobalsMetadata(M);
|
||||
return false;
|
||||
}
|
||||
|
||||
StringRef getPassName() const override {
|
||||
return "ASanGlobalsMetadataWrapperPass";
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesAll();
|
||||
}
|
||||
|
||||
GlobalsMetadata &getGlobalsMD() { return GlobalsMD; }
|
||||
|
||||
private:
|
||||
GlobalsMetadata GlobalsMD;
|
||||
};
|
||||
|
||||
char ASanGlobalsMetadataWrapperPass::ID = 0;
|
||||
|
||||
/// AddressSanitizer: instrument the code in module to find memory bugs.
|
||||
struct AddressSanitizer {
|
||||
AddressSanitizer(Module &M, const GlobalsMetadata *GlobalsMD,
|
||||
|
@ -789,52 +758,6 @@ private:
|
|||
FunctionCallee AMDGPUAddressPrivate;
|
||||
};
|
||||
|
||||
class AddressSanitizerLegacyPass : public FunctionPass {
|
||||
public:
|
||||
static char ID;
|
||||
|
||||
explicit AddressSanitizerLegacyPass(
|
||||
bool CompileKernel = false, bool Recover = false,
|
||||
bool UseAfterScope = false,
|
||||
AsanDetectStackUseAfterReturnMode UseAfterReturn =
|
||||
AsanDetectStackUseAfterReturnMode::Runtime)
|
||||
: FunctionPass(ID), CompileKernel(CompileKernel), Recover(Recover),
|
||||
UseAfterScope(UseAfterScope), UseAfterReturn(UseAfterReturn) {
|
||||
initializeAddressSanitizerLegacyPassPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
StringRef getPassName() const override {
|
||||
return "AddressSanitizerFunctionPass";
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<ASanGlobalsMetadataWrapperPass>();
|
||||
if (ClUseStackSafety)
|
||||
AU.addRequired<StackSafetyGlobalInfoWrapperPass>();
|
||||
AU.addRequired<TargetLibraryInfoWrapperPass>();
|
||||
}
|
||||
|
||||
bool runOnFunction(Function &F) override {
|
||||
GlobalsMetadata &GlobalsMD =
|
||||
getAnalysis<ASanGlobalsMetadataWrapperPass>().getGlobalsMD();
|
||||
const StackSafetyGlobalInfo *const SSGI =
|
||||
ClUseStackSafety
|
||||
? &getAnalysis<StackSafetyGlobalInfoWrapperPass>().getResult()
|
||||
: nullptr;
|
||||
const TargetLibraryInfo *TLI =
|
||||
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
|
||||
AddressSanitizer ASan(*F.getParent(), &GlobalsMD, SSGI, CompileKernel,
|
||||
Recover, UseAfterScope, UseAfterReturn);
|
||||
return ASan.instrumentFunction(F, TLI);
|
||||
}
|
||||
|
||||
private:
|
||||
bool CompileKernel;
|
||||
bool Recover;
|
||||
bool UseAfterScope;
|
||||
AsanDetectStackUseAfterReturnMode UseAfterReturn;
|
||||
};
|
||||
|
||||
class ModuleAddressSanitizer {
|
||||
public:
|
||||
ModuleAddressSanitizer(Module &M, const GlobalsMetadata *GlobalsMD,
|
||||
|
@ -933,44 +856,6 @@ private:
|
|||
Function *AsanDtorFunction = nullptr;
|
||||
};
|
||||
|
||||
class ModuleAddressSanitizerLegacyPass : public ModulePass {
|
||||
public:
|
||||
static char ID;
|
||||
|
||||
explicit ModuleAddressSanitizerLegacyPass(
|
||||
bool CompileKernel = false, bool Recover = false, bool UseGlobalGC = true,
|
||||
bool UseOdrIndicator = false,
|
||||
AsanDtorKind DestructorKind = AsanDtorKind::Global)
|
||||
: ModulePass(ID), CompileKernel(CompileKernel), Recover(Recover),
|
||||
UseGlobalGC(UseGlobalGC), UseOdrIndicator(UseOdrIndicator),
|
||||
DestructorKind(DestructorKind) {
|
||||
initializeModuleAddressSanitizerLegacyPassPass(
|
||||
*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
StringRef getPassName() const override { return "ModuleAddressSanitizer"; }
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<ASanGlobalsMetadataWrapperPass>();
|
||||
}
|
||||
|
||||
bool runOnModule(Module &M) override {
|
||||
GlobalsMetadata &GlobalsMD =
|
||||
getAnalysis<ASanGlobalsMetadataWrapperPass>().getGlobalsMD();
|
||||
ModuleAddressSanitizer ASanModule(M, &GlobalsMD, CompileKernel, Recover,
|
||||
UseGlobalGC, UseOdrIndicator,
|
||||
DestructorKind);
|
||||
return ASanModule.instrumentModule(M);
|
||||
}
|
||||
|
||||
private:
|
||||
bool CompileKernel;
|
||||
bool Recover;
|
||||
bool UseGlobalGC;
|
||||
bool UseOdrIndicator;
|
||||
AsanDtorKind DestructorKind;
|
||||
};
|
||||
|
||||
// Stack poisoning does not play well with exception handling.
|
||||
// When an exception is thrown, we essentially bypass the code
|
||||
// that unpoisones the stack. This is why the run-time library has
|
||||
|
@ -1309,49 +1194,6 @@ PreservedAnalyses ModuleAddressSanitizerPass::run(Module &M,
|
|||
return Modified ? PreservedAnalyses::none() : PreservedAnalyses::all();
|
||||
}
|
||||
|
||||
INITIALIZE_PASS(ASanGlobalsMetadataWrapperPass, "asan-globals-md",
|
||||
"Read metadata to mark which globals should be instrumented "
|
||||
"when running ASan.",
|
||||
false, true)
|
||||
|
||||
char AddressSanitizerLegacyPass::ID = 0;
|
||||
|
||||
INITIALIZE_PASS_BEGIN(
|
||||
AddressSanitizerLegacyPass, "asan",
|
||||
"AddressSanitizer: detects use-after-free and out-of-bounds bugs.", false,
|
||||
false)
|
||||
INITIALIZE_PASS_DEPENDENCY(ASanGlobalsMetadataWrapperPass)
|
||||
INITIALIZE_PASS_DEPENDENCY(StackSafetyGlobalInfoWrapperPass)
|
||||
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
|
||||
INITIALIZE_PASS_END(
|
||||
AddressSanitizerLegacyPass, "asan",
|
||||
"AddressSanitizer: detects use-after-free and out-of-bounds bugs.", false,
|
||||
false)
|
||||
|
||||
FunctionPass *llvm::createAddressSanitizerFunctionPass(
|
||||
bool CompileKernel, bool Recover, bool UseAfterScope,
|
||||
AsanDetectStackUseAfterReturnMode UseAfterReturn) {
|
||||
assert(!CompileKernel || Recover);
|
||||
return new AddressSanitizerLegacyPass(CompileKernel, Recover, UseAfterScope,
|
||||
UseAfterReturn);
|
||||
}
|
||||
|
||||
char ModuleAddressSanitizerLegacyPass::ID = 0;
|
||||
|
||||
INITIALIZE_PASS(
|
||||
ModuleAddressSanitizerLegacyPass, "asan-module",
|
||||
"AddressSanitizer: detects use-after-free and out-of-bounds bugs."
|
||||
"ModulePass",
|
||||
false, false)
|
||||
|
||||
ModulePass *llvm::createModuleAddressSanitizerLegacyPassPass(
|
||||
bool CompileKernel, bool Recover, bool UseGlobalsGC, bool UseOdrIndicator,
|
||||
AsanDtorKind Destructor) {
|
||||
assert(!CompileKernel || Recover);
|
||||
return new ModuleAddressSanitizerLegacyPass(
|
||||
CompileKernel, Recover, UseGlobalsGC, UseOdrIndicator, Destructor);
|
||||
}
|
||||
|
||||
static size_t TypeSizeToSizeIndex(uint32_t TypeSize) {
|
||||
size_t Res = countTrailingZeros(TypeSize / 8);
|
||||
assert(Res < kNumberOfAccessSizes);
|
||||
|
|
|
@ -91,8 +91,6 @@ Comdat *llvm::getOrCreateFunctionComdat(Function &F, Triple &T) {
|
|||
/// initializeInstrumentation - Initialize all passes in the TransformUtils
|
||||
/// library.
|
||||
void llvm::initializeInstrumentation(PassRegistry &Registry) {
|
||||
initializeAddressSanitizerLegacyPassPass(Registry);
|
||||
initializeModuleAddressSanitizerLegacyPassPass(Registry);
|
||||
initializeMemProfilerLegacyPassPass(Registry);
|
||||
initializeModuleMemProfilerLegacyPassPass(Registry);
|
||||
initializeBoundsCheckingLegacyPassPass(Registry);
|
||||
|
|
Loading…
Reference in New Issue