diff options
author | Nico Weber <nicolasweber@gmx.de> | 2016-09-21 18:25:43 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2016-09-21 18:25:43 +0000 |
commit | a4894388490d2422e00491847e7b48f06fda6e8e (patch) | |
tree | b81bebcafaaefac2f5d75b1f32b7e63fec1e36f6 /llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | |
parent | b097c8fa2bae50d8935143a9ec54d1f6db2157d4 (diff) | |
download | bcm5719-llvm-a4894388490d2422e00491847e7b48f06fda6e8e.tar.gz bcm5719-llvm-a4894388490d2422e00491847e7b48f06fda6e8e.zip |
revert 281908 because 281909 got reverted
llvm-svn: 282097
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp')
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp | 53 |
1 files changed, 7 insertions, 46 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index c5bcb39992f..992920ff1e5 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -67,7 +67,6 @@ using namespace llvm; static const uint64_t kDefaultShadowScale = 3; static const uint64_t kDefaultShadowOffset32 = 1ULL << 29; static const uint64_t kDefaultShadowOffset64 = 1ULL << 44; -static const uint64_t kDynamicShadowSentinel = ~(uint64_t)0; static const uint64_t kIOSShadowOffset32 = 1ULL << 30; static const uint64_t kIOSShadowOffset64 = 0x120200000; static const uint64_t kIOSSimShadowOffset32 = 1ULL << 30; @@ -82,8 +81,8 @@ static const uint64_t kAArch64_ShadowOffset64 = 1ULL << 36; static const uint64_t kFreeBSD_ShadowOffset32 = 1ULL << 30; static const uint64_t kFreeBSD_ShadowOffset64 = 1ULL << 46; static const uint64_t kWindowsShadowOffset32 = 3ULL << 28; -// The shadow memory space is dynamically allocated. -static const uint64_t kWindowsShadowOffset64 = kDynamicShadowSentinel; +// TODO(wwchrome): Experimental for asan Win64, may change. +static const uint64_t kWindowsShadowOffset64 = 0x1ULL << 45; // 32TB. static const size_t kMinStackMallocSize = 1 << 6; // 64B static const size_t kMaxStackMallocSize = 1 << 16; // 64K @@ -126,9 +125,6 @@ static const char *const kAsanGlobalsRegisteredFlagName = static const char *const kAsanOptionDetectUseAfterReturn = "__asan_option_detect_stack_use_after_return"; -static const char *const kAsanShadowMemoryDynamicAddress = - "__asan_shadow_memory_dynamic_address"; - static const char *const kAsanAllocaPoison = "__asan_alloca_poison"; static const char *const kAsanAllocasUnpoison = "__asan_allocas_unpoison"; @@ -161,11 +157,6 @@ 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)); - // This flag limits the number of instructions to be instrumented // in any given BB. Normally, this should be set to unlimited (INT_MAX), // but due to http://llvm.org/bugs/show_bug.cgi?id=12652 we temporary @@ -456,8 +447,7 @@ static ShadowMapping getShadowMapping(Triple &TargetTriple, int LongSize, // we could OR the constant in a single instruction, but it's more // efficient to load it once and use indexed addressing. Mapping.OrShadowOffset = !IsAArch64 && !IsPPC64 && !IsSystemZ - && !(Mapping.Offset & (Mapping.Offset - 1)) - && Mapping.Offset != kDynamicShadowSentinel; + && !(Mapping.Offset & (Mapping.Offset - 1)); return Mapping; } @@ -474,8 +464,7 @@ struct AddressSanitizer : public FunctionPass { bool UseAfterScope = false) : FunctionPass(ID), CompileKernel(CompileKernel || ClEnableKasan), Recover(Recover || ClRecover), - UseAfterScope(UseAfterScope || ClUseAfterScope), - LocalDynamicShadow(nullptr) { + UseAfterScope(UseAfterScope || ClUseAfterScope) { initializeAddressSanitizerPass(*PassRegistry::getPassRegistry()); } const char *getPassName() const override { @@ -523,7 +512,6 @@ struct AddressSanitizer : public FunctionPass { Value *memToShadow(Value *Shadow, IRBuilder<> &IRB); bool runOnFunction(Function &F) override; bool maybeInsertAsanInitAtFunctionEntry(Function &F); - void maybeInsertDynamicShadowAtFunctionEntry(Function &F); void markEscapedLocalAllocas(Function &F); bool doInitialization(Module &M) override; bool doFinalization(Module &M) override; @@ -545,12 +533,8 @@ struct AddressSanitizer : public FunctionPass { FunctionStateRAII(AddressSanitizer *Pass) : Pass(Pass) { assert(Pass->ProcessedAllocas.empty() && "last pass forgot to clear cache"); - assert(!Pass->LocalDynamicShadow); - } - ~FunctionStateRAII() { - Pass->LocalDynamicShadow = nullptr; - Pass->ProcessedAllocas.clear(); } + ~FunctionStateRAII() { Pass->ProcessedAllocas.clear(); } }; LLVMContext *C; @@ -574,7 +558,6 @@ struct AddressSanitizer : public FunctionPass { Function *AsanMemoryAccessCallbackSized[2][2]; Function *AsanMemmove, *AsanMemcpy, *AsanMemset; InlineAsm *EmptyAsm; - Value *LocalDynamicShadow; GlobalsMetadata GlobalsMD; DenseMap<const AllocaInst *, bool> ProcessedAllocas; @@ -938,15 +921,10 @@ Value *AddressSanitizer::memToShadow(Value *Shadow, IRBuilder<> &IRB) { Shadow = IRB.CreateLShr(Shadow, Mapping.Scale); if (Mapping.Offset == 0) return Shadow; // (Shadow >> scale) | offset - Value *ShadowBase; - if (LocalDynamicShadow) - ShadowBase = LocalDynamicShadow; - else - ShadowBase = ConstantInt::get(IntptrTy, Mapping.Offset); if (Mapping.OrShadowOffset) - return IRB.CreateOr(Shadow, ShadowBase); + return IRB.CreateOr(Shadow, ConstantInt::get(IntptrTy, Mapping.Offset)); else - return IRB.CreateAdd(Shadow, ShadowBase); + return IRB.CreateAdd(Shadow, ConstantInt::get(IntptrTy, Mapping.Offset)); } // Instrument memset/memmove/memcpy @@ -999,10 +977,6 @@ Value *AddressSanitizer::isInterestingMemoryAccess(Instruction *I, // Skip memory accesses inserted by another instrumentation. if (I->getMetadata("nosanitize")) return nullptr; - // Do not instrument the load fetching the dynamic shadow address. - if (LocalDynamicShadow == I) - return nullptr; - Value *PtrOperand = nullptr; const DataLayout &DL = I->getModule()->getDataLayout(); if (LoadInst *LI = dyn_cast<LoadInst>(I)) { @@ -1807,17 +1781,6 @@ bool AddressSanitizer::maybeInsertAsanInitAtFunctionEntry(Function &F) { return false; } -void AddressSanitizer::maybeInsertDynamicShadowAtFunctionEntry(Function &F) { - // Generate code only when dynamic addressing is needed. - if (!ClForceDynamicShadow && Mapping.Offset != kDynamicShadowSentinel) - return; - - IRBuilder<> IRB(&F.front().front()); - Value *GlobalDynamicAddress = F.getParent()->getOrInsertGlobal( - kAsanShadowMemoryDynamicAddress, IntptrTy); - LocalDynamicShadow = IRB.CreateLoad(GlobalDynamicAddress); -} - void AddressSanitizer::markEscapedLocalAllocas(Function &F) { // Find the one possible call to llvm.localescape and pre-mark allocas passed // to it as uninteresting. This assumes we haven't started processing allocas @@ -1870,8 +1833,6 @@ bool AddressSanitizer::runOnFunction(Function &F) { FunctionStateRAII CleanupObj(this); - maybeInsertDynamicShadowAtFunctionEntry(F); - // We can't instrument allocas used with llvm.localescape. Only static allocas // can be passed to that intrinsic. markEscapedLocalAllocas(F); |