#include "llvm/Transforms/Instrumentation/AddressSanitizer.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/MemoryBuiltins.h"
#include "llvm/Analysis/StackSafetyAnalysis.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/BinaryFormat/MachO.h"
#include "llvm/Demangle/Demangle.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Comdat.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/EHPersonalities.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/InstVisitor.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/Value.h"
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/Transforms/Instrumentation/AddressSanitizerCommon.h"
#include "llvm/Transforms/Instrumentation/AddressSanitizerOptions.h"
#include "llvm/Transforms/Utils/ASanStackFrameLayout.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Instrumentation.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/ModuleUtils.h"
#include "llvm/Transforms/Utils/PromoteMemToReg.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <iomanip>
#include <limits>
#include <sstream>
#include <string>
#include <tuple>
usingnamespacellvm;
#define DEBUG_TYPE …
static const uint64_t kDefaultShadowScale = …;
static const uint64_t kDefaultShadowOffset32 = …;
static const uint64_t kDefaultShadowOffset64 = …;
static const uint64_t kDynamicShadowSentinel = …;
static const uint64_t kSmallX86_64ShadowOffsetBase = …;
static const uint64_t kSmallX86_64ShadowOffsetAlignMask = …;
static const uint64_t kLinuxKasan_ShadowOffset64 = …;
static const uint64_t kPPC64_ShadowOffset64 = …;
static const uint64_t kSystemZ_ShadowOffset64 = …;
static const uint64_t kMIPS_ShadowOffsetN32 = …;
static const uint64_t kMIPS32_ShadowOffset32 = …;
static const uint64_t kMIPS64_ShadowOffset64 = …;
static const uint64_t kAArch64_ShadowOffset64 = …;
static const uint64_t kLoongArch64_ShadowOffset64 = …;
static const uint64_t kRISCV64_ShadowOffset64 = …;
static const uint64_t kFreeBSD_ShadowOffset32 = …;
static const uint64_t kFreeBSD_ShadowOffset64 = …;
static const uint64_t kFreeBSDAArch64_ShadowOffset64 = …;
static const uint64_t kFreeBSDKasan_ShadowOffset64 = …;
static const uint64_t kNetBSD_ShadowOffset32 = …;
static const uint64_t kNetBSD_ShadowOffset64 = …;
static const uint64_t kNetBSDKasan_ShadowOffset64 = …;
static const uint64_t kPS_ShadowOffset64 = …;
static const uint64_t kWindowsShadowOffset32 = …;
static const uint64_t kEmscriptenShadowOffset = …;
static const uint64_t kWindowsShadowOffset64 = …;
static const size_t kMinStackMallocSize = …;
static const size_t kMaxStackMallocSize = …;
static const uintptr_t kCurrentStackFrameMagic = …;
static const uintptr_t kRetiredStackFrameMagic = …;
const char kAsanModuleCtorName[] = …;
const char kAsanModuleDtorName[] = …;
static const uint64_t kAsanCtorAndDtorPriority = …;
static const uint64_t kAsanEmscriptenCtorAndDtorPriority = …;
const char kAsanReportErrorTemplate[] = …;
const char kAsanRegisterGlobalsName[] = …;
const char kAsanUnregisterGlobalsName[] = …;
const char kAsanRegisterImageGlobalsName[] = …;
const char kAsanUnregisterImageGlobalsName[] = …;
const char kAsanRegisterElfGlobalsName[] = …;
const char kAsanUnregisterElfGlobalsName[] = …;
const char kAsanPoisonGlobalsName[] = …;
const char kAsanUnpoisonGlobalsName[] = …;
const char kAsanInitName[] = …;
const char kAsanVersionCheckNamePrefix[] = …;
const char kAsanPtrCmp[] = …;
const char kAsanPtrSub[] = …;
const char kAsanHandleNoReturnName[] = …;
static const int kMaxAsanStackMallocSizeClass = …;
const char kAsanStackMallocNameTemplate[] = …;
const char kAsanStackMallocAlwaysNameTemplate[] = …;
const char kAsanStackFreeNameTemplate[] = …;
const char kAsanGenPrefix[] = …;
const char kODRGenPrefix[] = …;
const char kSanCovGenPrefix[] = …;
const char kAsanSetShadowPrefix[] = …;
const char kAsanPoisonStackMemoryName[] = …;
const char kAsanUnpoisonStackMemoryName[] = …;
const char kAsanGlobalsRegisteredFlagName[] = …;
const char kAsanOptionDetectUseAfterReturn[] = …;
const char kAsanShadowMemoryDynamicAddress[] = …;
const char kAsanAllocaPoison[] = …;
const char kAsanAllocasUnpoison[] = …;
const char kAMDGPUAddressSharedName[] = …;
const char kAMDGPUAddressPrivateName[] = …;
const char kAMDGPUBallotName[] = …;
const char kAMDGPUUnreachableName[] = …;
static const size_t kNumberOfAccessSizes = …;
static const uint64_t kAllocaRzSize = …;
constexpr size_t kCompileKernelShift = …;
constexpr size_t kCompileKernelMask = …;
constexpr size_t kAccessSizeIndexShift = …;
constexpr size_t kAccessSizeIndexMask = …;
constexpr size_t kIsWriteShift = …;
constexpr size_t kIsWriteMask = …;
static cl::opt<bool> ClEnableKasan(
"asan-kernel", cl::desc("Enable KernelAddressSanitizer instrumentation"),
cl::Hidden, cl::init(false));
static cl::opt<bool> ClRecover(
"asan-recover",
cl::desc("Enable recovery mode (continue-after-error)."),
cl::Hidden, cl::init(false));
static cl::opt<bool> ClInsertVersionCheck(
"asan-guard-against-version-mismatch",
cl::desc("Guard against compiler/runtime version mismatch."), cl::Hidden,
cl::init(true));
static cl::opt<bool> ClInstrumentReads("asan-instrument-reads",
cl::desc("instrument read instructions"),
cl::Hidden, cl::init(true));
static cl::opt<bool> ClInstrumentWrites(
"asan-instrument-writes", cl::desc("instrument write instructions"),
cl::Hidden, cl::init(true));
static cl::opt<bool>
ClUseStackSafety("asan-use-stack-safety", cl::Hidden, cl::init(true),
cl::Hidden, cl::desc("Use Stack Safety analysis results"),
cl::Optional);
static cl::opt<bool> ClInstrumentAtomics(
"asan-instrument-atomics",
cl::desc("instrument atomic instructions (rmw, cmpxchg)"), cl::Hidden,
cl::init(true));
static cl::opt<bool>
ClInstrumentByval("asan-instrument-byval",
cl::desc("instrument byval call arguments"), cl::Hidden,
cl::init(true));
static cl::opt<bool> ClAlwaysSlowPath(
"asan-always-slow-path",
cl::desc("use instrumentation with slow path for all accesses"), cl::Hidden,
cl::init(false));
static cl::opt<bool> ClForceDynamicShadow(
"asan-force-dynamic-shadow",
cl::desc("Load shadow address into a local variable for each function"),
cl::Hidden, cl::init(false));
static cl::opt<bool>
ClWithIfunc("asan-with-ifunc",
cl::desc("Access dynamic shadow through an ifunc global on "
"platforms that support this"),
cl::Hidden, cl::init(true));
static cl::opt<bool> ClWithIfuncSuppressRemat(
"asan-with-ifunc-suppress-remat",
cl::desc("Suppress rematerialization of dynamic shadow address by passing "
"it through inline asm in prologue."),
cl::Hidden, cl::init(true));
static cl::opt<int> ClMaxInsnsToInstrumentPerBB(
"asan-max-ins-per-bb", cl::init(10000),
cl::desc("maximal number of instructions to instrument in any given BB"),
cl::Hidden);
static cl::opt<bool> ClStack("asan-stack", cl::desc("Handle stack memory"),
cl::Hidden, cl::init(true));
static cl::opt<uint32_t> ClMaxInlinePoisoningSize(
"asan-max-inline-poisoning-size",
cl::desc(
"Inline shadow poisoning for blocks up to the given size in bytes."),
cl::Hidden, cl::init(64));
static cl::opt<AsanDetectStackUseAfterReturnMode> ClUseAfterReturn(
"asan-use-after-return",
cl::desc("Sets the mode of detection for stack-use-after-return."),
cl::values(
clEnumValN(AsanDetectStackUseAfterReturnMode::Never, "never",
"Never detect stack use after return."),
clEnumValN(
AsanDetectStackUseAfterReturnMode::Runtime, "runtime",
"Detect stack use after return if "
"binary flag 'ASAN_OPTIONS=detect_stack_use_after_return' is set."),
clEnumValN(AsanDetectStackUseAfterReturnMode::Always, "always",
"Always detect stack use after return.")),
cl::Hidden, cl::init(AsanDetectStackUseAfterReturnMode::Runtime));
static cl::opt<bool> ClRedzoneByvalArgs("asan-redzone-byval-args",
cl::desc("Create redzones for byval "
"arguments (extra copy "
"required)"), cl::Hidden,
cl::init(true));
static cl::opt<bool> ClUseAfterScope("asan-use-after-scope",
cl::desc("Check stack-use-after-scope"),
cl::Hidden, cl::init(false));
static cl::opt<bool> ClGlobals("asan-globals",
cl::desc("Handle global objects"), cl::Hidden,
cl::init(true));
static cl::opt<bool> ClInitializers("asan-initialization-order",
cl::desc("Handle C++ initializer order"),
cl::Hidden, cl::init(true));
static cl::opt<bool> ClInvalidPointerPairs(
"asan-detect-invalid-pointer-pair",
cl::desc("Instrument <, <=, >, >=, - with pointer operands"), cl::Hidden,
cl::init(false));
static cl::opt<bool> ClInvalidPointerCmp(
"asan-detect-invalid-pointer-cmp",
cl::desc("Instrument <, <=, >, >= with pointer operands"), cl::Hidden,
cl::init(false));
static cl::opt<bool> ClInvalidPointerSub(
"asan-detect-invalid-pointer-sub",
cl::desc("Instrument - operations with pointer operands"), cl::Hidden,
cl::init(false));
static cl::opt<unsigned> ClRealignStack(
"asan-realign-stack",
cl::desc("Realign stack to the value of this flag (power of two)"),
cl::Hidden, cl::init(32));
static cl::opt<int> ClInstrumentationWithCallsThreshold(
"asan-instrumentation-with-call-threshold",
cl::desc("If the function being instrumented contains more than "
"this number of memory accesses, use callbacks instead of "
"inline checks (-1 means never use callbacks)."),
cl::Hidden, cl::init(7000));
static cl::opt<std::string> ClMemoryAccessCallbackPrefix(
"asan-memory-access-callback-prefix",
cl::desc("Prefix for memory access callbacks"), cl::Hidden,
cl::init("__asan_"));
static cl::opt<bool> ClKasanMemIntrinCallbackPrefix(
"asan-kernel-mem-intrinsic-prefix",
cl::desc("Use prefix for memory intrinsics in KASAN mode"), cl::Hidden,
cl::init(false));
static cl::opt<bool>
ClInstrumentDynamicAllocas("asan-instrument-dynamic-allocas",
cl::desc("instrument dynamic allocas"),
cl::Hidden, cl::init(true));
static cl::opt<bool> ClSkipPromotableAllocas(
"asan-skip-promotable-allocas",
cl::desc("Do not instrument promotable allocas"), cl::Hidden,
cl::init(true));
static cl::opt<AsanCtorKind> ClConstructorKind(
"asan-constructor-kind",
cl::desc("Sets the ASan constructor kind"),
cl::values(clEnumValN(AsanCtorKind::None, "none", "No constructors"),
clEnumValN(AsanCtorKind::Global, "global",
"Use global constructors")),
cl::init(AsanCtorKind::Global), cl::Hidden);
static cl::opt<int> ClMappingScale("asan-mapping-scale",
cl::desc("scale of asan shadow mapping"),
cl::Hidden, cl::init(0));
static cl::opt<uint64_t>
ClMappingOffset("asan-mapping-offset",
cl::desc("offset of asan shadow mapping [EXPERIMENTAL]"),
cl::Hidden, cl::init(0));
static cl::opt<bool> ClOpt("asan-opt", cl::desc("Optimize instrumentation"),
cl::Hidden, cl::init(true));
static cl::opt<bool> ClOptimizeCallbacks("asan-optimize-callbacks",
cl::desc("Optimize callbacks"),
cl::Hidden, cl::init(false));
static cl::opt<bool> ClOptSameTemp(
"asan-opt-same-temp", cl::desc("Instrument the same temp just once"),
cl::Hidden, cl::init(true));
static cl::opt<bool> ClOptGlobals("asan-opt-globals",
cl::desc("Don't instrument scalar globals"),
cl::Hidden, cl::init(true));
static cl::opt<bool> ClOptStack(
"asan-opt-stack", cl::desc("Don't instrument scalar stack variables"),
cl::Hidden, cl::init(false));
static cl::opt<bool> ClDynamicAllocaStack(
"asan-stack-dynamic-alloca",
cl::desc("Use dynamic alloca to represent stack variables"), cl::Hidden,
cl::init(true));
static cl::opt<uint32_t> ClForceExperiment(
"asan-force-experiment",
cl::desc("Force optimization experiment (for testing)"), cl::Hidden,
cl::init(0));
static cl::opt<bool>
ClUsePrivateAlias("asan-use-private-alias",
cl::desc("Use private aliases for global variables"),
cl::Hidden, cl::init(true));
static cl::opt<bool>
ClUseOdrIndicator("asan-use-odr-indicator",
cl::desc("Use odr indicators to improve ODR reporting"),
cl::Hidden, cl::init(true));
static cl::opt<bool>
ClUseGlobalsGC("asan-globals-live-support",
cl::desc("Use linker features to support dead "
"code stripping of globals"),
cl::Hidden, cl::init(true));
static cl::opt<bool>
ClWithComdat("asan-with-comdat",
cl::desc("Place ASan constructors in comdat sections"),
cl::Hidden, cl::init(true));
static cl::opt<AsanDtorKind> ClOverrideDestructorKind(
"asan-destructor-kind",
cl::desc("Sets the ASan destructor kind. The default is to use the value "
"provided to the pass constructor"),
cl::values(clEnumValN(AsanDtorKind::None, "none", "No destructors"),
clEnumValN(AsanDtorKind::Global, "global",
"Use global destructors")),
cl::init(AsanDtorKind::Invalid), cl::Hidden);
static cl::opt<int> ClDebug("asan-debug", cl::desc("debug"), cl::Hidden,
cl::init(0));
static cl::opt<int> ClDebugStack("asan-debug-stack", cl::desc("debug stack"),
cl::Hidden, cl::init(0));
static cl::opt<std::string> ClDebugFunc("asan-debug-func", cl::Hidden,
cl::desc("Debug func"));
static cl::opt<int> ClDebugMin("asan-debug-min", cl::desc("Debug min inst"),
cl::Hidden, cl::init(-1));
static cl::opt<int> ClDebugMax("asan-debug-max", cl::desc("Debug max inst"),
cl::Hidden, cl::init(-1));
STATISTIC(NumInstrumentedReads, "Number of instrumented reads");
STATISTIC(NumInstrumentedWrites, "Number of instrumented writes");
STATISTIC(NumOptimizedAccessesToGlobalVar,
"Number of optimized accesses to global vars");
STATISTIC(NumOptimizedAccessesToStackVar,
"Number of optimized accesses to stack vars");
namespace {
struct ShadowMapping { … };
}
static ShadowMapping getShadowMapping(const Triple &TargetTriple, int LongSize,
bool IsKasan) { … }
namespace llvm {
void getAddressSanitizerParams(const Triple &TargetTriple, int LongSize,
bool IsKasan, uint64_t *ShadowBase,
int *MappingScale, bool *OrShadowOffset) { … }
ASanAccessInfo::ASanAccessInfo(int32_t Packed)
: … { … }
ASanAccessInfo::ASanAccessInfo(bool IsWrite, bool CompileKernel,
uint8_t AccessSizeIndex)
: … { … }
}
static uint64_t getRedzoneSizeForScale(int MappingScale) { … }
static uint64_t GetCtorAndDtorPriority(Triple &TargetTriple) { … }
static Twine genName(StringRef suffix) { … }
namespace {
class RuntimeCallInserter { … };
struct AddressSanitizer { … };
class ModuleAddressSanitizer { … };
struct FunctionStackPoisoner : public InstVisitor<FunctionStackPoisoner> { … };
}
void AddressSanitizerPass::printPipeline(
raw_ostream &OS, function_ref<StringRef(StringRef)> MapClassName2PassName) { … }
AddressSanitizerPass::AddressSanitizerPass(
const AddressSanitizerOptions &Options, bool UseGlobalGC,
bool UseOdrIndicator, AsanDtorKind DestructorKind,
AsanCtorKind ConstructorKind)
: … { … }
PreservedAnalyses AddressSanitizerPass::run(Module &M,
ModuleAnalysisManager &MAM) { … }
static size_t TypeStoreSizeToSizeIndex(uint32_t TypeSize) { … }
static bool GlobalWasGeneratedByCompiler(GlobalVariable *G) { … }
static bool isUnsupportedAMDGPUAddrspace(Value *Addr) { … }
Value *AddressSanitizer::memToShadow(Value *Shadow, IRBuilder<> &IRB) { … }
void AddressSanitizer::instrumentMemIntrinsic(MemIntrinsic *MI,
RuntimeCallInserter &RTCI) { … }
bool AddressSanitizer::isInterestingAlloca(const AllocaInst &AI) { … }
bool AddressSanitizer::ignoreAccess(Instruction *Inst, Value *Ptr) { … }
void AddressSanitizer::getInterestingMemoryOperands(
Instruction *I, SmallVectorImpl<InterestingMemoryOperand> &Interesting) { … }
static bool isPointerOperand(Value *V) { … }
static bool isInterestingPointerComparison(Instruction *I) { … }
static bool isInterestingPointerSubtraction(Instruction *I) { … }
bool AddressSanitizer::GlobalIsLinkerInitialized(GlobalVariable *G) { … }
void AddressSanitizer::instrumentPointerComparisonOrSubtraction(
Instruction *I, RuntimeCallInserter &RTCI) { … }
static void doInstrumentAddress(AddressSanitizer *Pass, Instruction *I,
Instruction *InsertBefore, Value *Addr,
MaybeAlign Alignment, unsigned Granularity,
TypeSize TypeStoreSize, bool IsWrite,
Value *SizeArgument, bool UseCalls,
uint32_t Exp, RuntimeCallInserter &RTCI) { … }
void AddressSanitizer::instrumentMaskedLoadOrStore(
AddressSanitizer *Pass, const DataLayout &DL, Type *IntptrTy, Value *Mask,
Value *EVL, Value *Stride, Instruction *I, Value *Addr,
MaybeAlign Alignment, unsigned Granularity, Type *OpType, bool IsWrite,
Value *SizeArgument, bool UseCalls, uint32_t Exp,
RuntimeCallInserter &RTCI) { … }
void AddressSanitizer::instrumentMop(ObjectSizeOffsetVisitor &ObjSizeVis,
InterestingMemoryOperand &O, bool UseCalls,
const DataLayout &DL,
RuntimeCallInserter &RTCI) { … }
Instruction *AddressSanitizer::generateCrashCode(Instruction *InsertBefore,
Value *Addr, bool IsWrite,
size_t AccessSizeIndex,
Value *SizeArgument,
uint32_t Exp,
RuntimeCallInserter &RTCI) { … }
Value *AddressSanitizer::createSlowPathCmp(IRBuilder<> &IRB, Value *AddrLong,
Value *ShadowValue,
uint32_t TypeStoreSize) { … }
Instruction *AddressSanitizer::instrumentAMDGPUAddress(
Instruction *OrigIns, Instruction *InsertBefore, Value *Addr,
uint32_t TypeStoreSize, bool IsWrite, Value *SizeArgument) { … }
Instruction *AddressSanitizer::genAMDGPUReportBlock(IRBuilder<> &IRB,
Value *Cond, bool Recover) { … }
void AddressSanitizer::instrumentAddress(Instruction *OrigIns,
Instruction *InsertBefore, Value *Addr,
MaybeAlign Alignment,
uint32_t TypeStoreSize, bool IsWrite,
Value *SizeArgument, bool UseCalls,
uint32_t Exp,
RuntimeCallInserter &RTCI) { … }
void AddressSanitizer::instrumentUnusualSizeOrAlignment(
Instruction *I, Instruction *InsertBefore, Value *Addr,
TypeSize TypeStoreSize, bool IsWrite, Value *SizeArgument, bool UseCalls,
uint32_t Exp, RuntimeCallInserter &RTCI) { … }
void ModuleAddressSanitizer::poisonOneInitializer(Function &GlobalInit) { … }
void ModuleAddressSanitizer::createInitializerPoisonCalls() { … }
const GlobalVariable *
ModuleAddressSanitizer::getExcludedAliasedGlobal(const GlobalAlias &GA) const { … }
bool ModuleAddressSanitizer::shouldInstrumentGlobal(GlobalVariable *G) const { … }
bool ModuleAddressSanitizer::ShouldUseMachOGlobalsSection() const { … }
StringRef ModuleAddressSanitizer::getGlobalMetadataSection() const { … }
void ModuleAddressSanitizer::initializeCallbacks() { … }
void ModuleAddressSanitizer::SetComdatForGlobalMetadata(
GlobalVariable *G, GlobalVariable *Metadata, StringRef InternalSuffix) { … }
GlobalVariable *
ModuleAddressSanitizer::CreateMetadataGlobal(Constant *Initializer,
StringRef OriginalName) { … }
Instruction *ModuleAddressSanitizer::CreateAsanModuleDtor() { … }
void ModuleAddressSanitizer::InstrumentGlobalsCOFF(
IRBuilder<> &IRB, ArrayRef<GlobalVariable *> ExtendedGlobals,
ArrayRef<Constant *> MetadataInitializers) { … }
void ModuleAddressSanitizer::instrumentGlobalsELF(
IRBuilder<> &IRB, ArrayRef<GlobalVariable *> ExtendedGlobals,
ArrayRef<Constant *> MetadataInitializers,
const std::string &UniqueModuleId) { … }
void ModuleAddressSanitizer::InstrumentGlobalsMachO(
IRBuilder<> &IRB, ArrayRef<GlobalVariable *> ExtendedGlobals,
ArrayRef<Constant *> MetadataInitializers) { … }
void ModuleAddressSanitizer::InstrumentGlobalsWithMetadataArray(
IRBuilder<> &IRB, ArrayRef<GlobalVariable *> ExtendedGlobals,
ArrayRef<Constant *> MetadataInitializers) { … }
void ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> &IRB,
bool *CtorComdat) { … }
uint64_t
ModuleAddressSanitizer::getRedzoneSizeForGlobal(uint64_t SizeInBytes) const { … }
int ModuleAddressSanitizer::GetAsanVersion() const { … }
GlobalVariable *ModuleAddressSanitizer::getOrCreateModuleName() { … }
bool ModuleAddressSanitizer::instrumentModule() { … }
void AddressSanitizer::initializeCallbacks(const TargetLibraryInfo *TLI) { … }
bool AddressSanitizer::maybeInsertAsanInitAtFunctionEntry(Function &F) { … }
bool AddressSanitizer::maybeInsertDynamicShadowAtFunctionEntry(Function &F) { … }
void AddressSanitizer::markEscapedLocalAllocas(Function &F) { … }
bool AddressSanitizer::suppressInstrumentationSiteForDebug(int &Instrumented) { … }
bool AddressSanitizer::instrumentFunction(Function &F,
const TargetLibraryInfo *TLI) { … }
bool AddressSanitizer::LooksLikeCodeInBug11395(Instruction *I) { … }
void FunctionStackPoisoner::initializeCallbacks(Module &M) { … }
void FunctionStackPoisoner::copyToShadowInline(ArrayRef<uint8_t> ShadowMask,
ArrayRef<uint8_t> ShadowBytes,
size_t Begin, size_t End,
IRBuilder<> &IRB,
Value *ShadowBase) { … }
void FunctionStackPoisoner::copyToShadow(ArrayRef<uint8_t> ShadowMask,
ArrayRef<uint8_t> ShadowBytes,
IRBuilder<> &IRB, Value *ShadowBase) { … }
void FunctionStackPoisoner::copyToShadow(ArrayRef<uint8_t> ShadowMask,
ArrayRef<uint8_t> ShadowBytes,
size_t Begin, size_t End,
IRBuilder<> &IRB, Value *ShadowBase) { … }
static int StackMallocSizeClass(uint64_t LocalStackSize) { … }
void FunctionStackPoisoner::copyArgsPassedByValToAllocas() { … }
PHINode *FunctionStackPoisoner::createPHI(IRBuilder<> &IRB, Value *Cond,
Value *ValueIfTrue,
Instruction *ThenTerm,
Value *ValueIfFalse) { … }
Value *FunctionStackPoisoner::createAllocaForLayout(
IRBuilder<> &IRB, const ASanStackFrameLayout &L, bool Dynamic) { … }
void FunctionStackPoisoner::createDynamicAllocasInitStorage() { … }
void FunctionStackPoisoner::processDynamicAllocas() { … }
static void findStoresToUninstrumentedArgAllocas(
AddressSanitizer &ASan, Instruction &InsBefore,
SmallVectorImpl<Instruction *> &InitInsts) { … }
void FunctionStackPoisoner::processStaticAllocas() { … }
void FunctionStackPoisoner::poisonAlloca(Value *V, uint64_t Size,
IRBuilder<> &IRB, bool DoPoison) { … }
void FunctionStackPoisoner::handleDynamicAllocaCall(AllocaInst *AI) { … }
bool AddressSanitizer::isSafeAccess(ObjectSizeOffsetVisitor &ObjSizeVis,
Value *Addr, TypeSize TypeStoreSize) const { … }