Index: llvm/trunk/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp =================================================================== --- llvm/trunk/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ llvm/trunk/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -149,11 +149,6 @@ "in a thread-local ring buffer"), cl::Hidden, cl::init(true)); static cl::opt - ClCreateFrameDescriptions("hwasan-create-frame-descriptions", - cl::desc("create static frame descriptions"), - cl::Hidden, cl::init(true)); - -static cl::opt ClInstrumentMemIntrinsics("hwasan-instrument-mem-intrinsics", cl::desc("instrument memory intrinsics"), cl::Hidden, cl::init(true)); @@ -228,24 +223,6 @@ FunctionCallee HWAsanMemmove, HWAsanMemcpy, HWAsanMemset; FunctionCallee HWAsanHandleVfork; - // Frame description is a way to pass names/sizes of local variables - // to the run-time w/o adding extra executable code in every function. - // We do this by creating a separate section with {PC,Descr} pairs and passing - // the section beg/end to __hwasan_init_frames() at module init time. - std::string createFrameString(ArrayRef Allocas); - void createFrameGlobal(Function &F, const std::string &FrameString); - // Get the section name for frame descriptions. Currently ELF-only. - const char *getFrameSection() { return "__hwasan_frames"; } - const char *getFrameSectionBeg() { return "__start___hwasan_frames"; } - const char *getFrameSectionEnd() { return "__stop___hwasan_frames"; } - GlobalVariable *createFrameSectionBound(Module &M, Type *Ty, - const char *Name) { - auto GV = new GlobalVariable(M, Ty, false, GlobalVariable::ExternalLinkage, - nullptr, Name); - GV->setVisibility(GlobalValue::HiddenVisibility); - return GV; - } - /// This struct defines the shadow mapping using the rule: /// shadow = (mem >> Scale) + Offset. /// If InGlobal is true, then @@ -372,31 +349,7 @@ Comdat *CtorComdat = M.getOrInsertComdat(kHwasanModuleCtorName); Ctor->setComdat(CtorComdat); appendToGlobalCtors(M, Ctor, 0, Ctor); - - IRBuilder<> IRBCtor(Ctor->getEntryBlock().getTerminator()); - IRBCtor.CreateCall( - declareSanitizerInitFunction(M, "__hwasan_init_frames", - {Int8PtrTy, Int8PtrTy}), - {createFrameSectionBound(M, Int8Ty, getFrameSectionBeg()), - createFrameSectionBound(M, Int8Ty, getFrameSectionEnd())}); }); - - // Create a zero-length global in __hwasan_frame so that the linker will - // always create start and stop symbols. - // - // N.B. If we ever start creating associated metadata in this pass this - // global will need to be associated with the ctor. - Type *Int8Arr0Ty = ArrayType::get(Int8Ty, 0); - M.getOrInsertGlobal("__hwasan", Int8Arr0Ty, [&] { - auto *GV = new GlobalVariable( - M, Int8Arr0Ty, /*isConstantGlobal=*/true, GlobalValue::PrivateLinkage, - Constant::getNullValue(Int8Arr0Ty), "__hwasan"); - GV->setSection(getFrameSection()); - Comdat *CtorComdat = M.getOrInsertComdat(kHwasanModuleCtorName); - GV->setComdat(CtorComdat); - appendToCompilerUsed(M, GV); - return GV; - }); } if (!TargetTriple.isAndroid()) { @@ -861,36 +814,6 @@ return nullptr; } -// Creates a string with a description of the stack frame (set of Allocas). -// The string is intended to be human readable. -// The current form is: Size1 Name1; Size2 Name2; ... -std::string -HWAddressSanitizer::createFrameString(ArrayRef Allocas) { - std::ostringstream Descr; - for (auto AI : Allocas) - Descr << getAllocaSizeInBytes(*AI) << " " << AI->getName().str() << "; "; - return Descr.str(); -} - -// Creates a global in the frame section which consists of two pointers: -// the function PC and the frame string constant. -void HWAddressSanitizer::createFrameGlobal(Function &F, - const std::string &FrameString) { - Module &M = *F.getParent(); - auto DescrGV = createPrivateGlobalForString(M, FrameString, true); - auto PtrPairTy = StructType::get(F.getType(), DescrGV->getType()); - auto GV = new GlobalVariable( - M, PtrPairTy, /*isConstantGlobal*/ true, GlobalVariable::PrivateLinkage, - ConstantStruct::get(PtrPairTy, (Constant *)&F, (Constant *)DescrGV), - "__hwasan"); - GV->setSection(getFrameSection()); - appendToCompilerUsed(M, GV); - // Put GV into the F's Comadat so that if F is deleted GV can be deleted too. - if (auto Comdat = - GetOrCreateFunctionComdat(F, TargetTriple, CurModuleUniqueId)) - GV->setComdat(Comdat); -} - void HWAddressSanitizer::emitPrologue(IRBuilder<> &IRB, bool WithFrameRecord) { if (!Mapping.InTls) { LocalDynamicShadow = getDynamicShadowNonTls(IRB); @@ -1129,10 +1052,6 @@ if (AllocasToInstrument.empty() && ToInstrument.empty()) return false; - if (ClCreateFrameDescriptions && !AllocasToInstrument.empty()) - createFrameGlobal(F, createFrameString(AllocasToInstrument)); - - assert(!LocalDynamicShadow); Instruction *InsertPt = &*F.getEntryBlock().begin(); Index: llvm/trunk/test/Instrumentation/HWAddressSanitizer/basic.ll =================================================================== --- llvm/trunk/test/Instrumentation/HWAddressSanitizer/basic.ll +++ llvm/trunk/test/Instrumentation/HWAddressSanitizer/basic.ll @@ -12,7 +12,6 @@ ; RUN: opt < %s -passes='function(hwasan)' -hwasan-recover=1 -hwasan-mapping-offset=0 -S | FileCheck %s --check-prefixes=CHECK,RECOVER,RECOVER-ZERO-BASED-SHADOW ; CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 0, void ()* @hwasan.module_ctor, i8* bitcast (void ()* @hwasan.module_ctor to i8*) }] -; CHECK: @__hwasan = private constant [0 x i8] zeroinitializer, section "__hwasan_frames", comdat($hwasan.module_ctor) target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" target triple = "aarch64--linux-android" @@ -371,6 +370,5 @@ ; CHECK: define internal void @hwasan.module_ctor() comdat { ; CHECK-NEXT: call void @__hwasan_init() -; CHECK-NEXT: call void @__hwasan_init_frames( ; CHECK-NEXT: ret void ; CHECK-NEXT: } Index: llvm/trunk/test/Instrumentation/HWAddressSanitizer/frame-descriptor.ll =================================================================== --- llvm/trunk/test/Instrumentation/HWAddressSanitizer/frame-descriptor.ll +++ llvm/trunk/test/Instrumentation/HWAddressSanitizer/frame-descriptor.ll @@ -1,27 +0,0 @@ -; Test frame descriptors -; -; RUN: opt < %s -hwasan -S | FileCheck %s - -target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" -target triple = "aarch64--linux-android" - -declare void @use32(i32*, i64*) - -define void @test_alloca() sanitize_hwaddress { -entry: - %XYZ = alloca i32, align 4 - %ABC = alloca i64, align 4 - call void @use32(i32* nonnull %XYZ, i64 *nonnull %ABC) - ret void -} - -; CHECK: @[[STR:[0-9]*]] = private unnamed_addr constant [15 x i8] c"4 XYZ; 8 ABC; \00", align 1 -; CHECK: private constant { void ()*, [15 x i8]* } { void ()* @test_alloca, [15 x i8]* @[[STR]] }, section "__hwasan_frames", comdat($test_alloca) - -; CHECK-LABEL: @test_alloca( -; CHECK: ret void - -; CHECK-LABEL: @hwasan.module_ctor -; CHECK: call void @__hwasan_init_frames(i8* @__start___hwasan_frames, i8* @__stop___hwasan_frames) -; CHECK: ret void - Index: llvm/trunk/test/Instrumentation/HWAddressSanitizer/with-calls.ll =================================================================== --- llvm/trunk/test/Instrumentation/HWAddressSanitizer/with-calls.ll +++ llvm/trunk/test/Instrumentation/HWAddressSanitizer/with-calls.ll @@ -199,6 +199,5 @@ ; CHECK: define internal void @hwasan.module_ctor() comdat { ; CHECK-NEXT: call void @__hwasan_init() -; CHECK-NEXT: call void @__hwasan_init_frames( ; CHECK-NEXT: ret void ; CHECK-NEXT: }