前言
《LLVM ASAN【源码分析】(三)》讲述了ASAN运行前的Routine。
Pass运行
a. Legacy
从EmitAssembly
开始,最后进入AddressSanitizerLegacyPass
/ModuleAddressSanitizerLegacyPass
的runOnFunction
/runOnModule
。
b. New
运行每个Module Pass,进而运行每个Function Pass。
// llvm/include/llvm/IR/PassManager.h
PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM,
ExtraArgTs... ExtraArgs) {
...
PassPA = P->run(IR, AM, ExtraArgs...);
...
}
// llvm/include/llvm/IR/PassManagerInternal.h
PreservedAnalysesT run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs) override {
return Pass.run(IR, AM, ExtraArgs...);
}
// llvm/lib/IR/PassManager.cpp
PreservedAnalyses ModuleToFunctionPassAdaptor::run(Module &M, ModuleAnalysisManager &AM) {
...
PassPA = Pass->run(F, FAM);
...
}
// llvm/include/llvm/IR/PassManagerInternal.h
PreservedAnalysesT run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs) override {
return Pass.run(IR, AM, ExtraArgs...);
}
进入AddressSanitizerPass::run
,构造struct AddressSanitizer
实例进行插桩。
// llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
PreservedAnalyses AddressSanitizerPass::run(Function &F,
AnalysisManager<Function> &AM) {
...
if (Sanitizer.instrumentFunction(F, TLI)) ...
...
}
// llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
bool AddressSanitizer::instrumentFunction(Function &F, const TargetLibraryInfo *TLI) ...
后续
后续在《LLVM ASAN【源码分析】(五)》讲ASAN Pass代码插桩的具体过程。