diff --git a/lib/IRGen/IRGenSIL.cpp b/lib/IRGen/IRGenSIL.cpp index c1dabec314a35..e58e77be09dc0 100644 --- a/lib/IRGen/IRGenSIL.cpp +++ b/lib/IRGen/IRGenSIL.cpp @@ -746,9 +746,19 @@ class IRGenSILFunction : getEarliestInsertionPoint()->getIterator()); // No debug location is how LLVM marks prologue instructions. ZeroInitBuilder.SetCurrentDebugLocation(nullptr); - ZeroInitBuilder.CreateMemSet( - AI, llvm::ConstantInt::get(IGM.Int8Ty, 0), - Size, llvm::MaybeAlign(AI->getAlign())); + // note that this memset is before lifetime.start which is Undefined + // Behaviour in LLVM + llvm::CallInst *Memset = + ZeroInitBuilder.CreateMemSet(AI, llvm::ConstantInt::get(IGM.Int8Ty, 0), + Size, llvm::MaybeAlign(AI->getAlign())); + + // memtag-stack tagging needs to use this metadata to determine whether to + // delay tagging until after the memset. This can be removed if the memset + // is removed or moved after the lifetime.start + llvm::LLVMContext *Ctx = &Memset->getContext(); + llvm::MDNode *Meta = + llvm::MDNode::get(*Ctx, llvm::MDString::get(*Ctx, "true")); + Memset->setMetadata("Swift.isSwiftLLDBpreinit", Meta); } /// Try to emit an inline assembly gadget which extends the lifetime of diff --git a/test/DebugInfo/guard-let.swift b/test/DebugInfo/guard-let.swift index 5b5cf832b5d4c..7547035fefaf3 100644 --- a/test/DebugInfo/guard-let.swift +++ b/test/DebugInfo/guard-let.swift @@ -23,7 +23,7 @@ public func f(_ i : Int?) // CHECK1: %[[alloca:.*]] = alloca %TSiSg // CHECK1: #dbg_declare(ptr %i.debug // CHECK1: call void @llvm.memset{{.*}}(ptr align {{(4|8)}} %[[alloca]], - // CHECK1-SAME: i8 0, i64 {{(5|9)}}, i1 false){{$}} + // CHECK1-SAME: i8 0, i64 {{(5|9)}}, i1 false), !Swift.isSwiftLLDBpreinit // CHECK1: #dbg_declare(ptr %val.debug, !{{.*}}, !DIExpression{{.*}}, // CHECK1-SAME: ![[DBG0:.*]]) // CHECK1-LABEL: define {{.*}}@"$s4main1gyySSSgF" diff --git a/test/DebugInfo/uninitialized.swift b/test/DebugInfo/uninitialized.swift index 77df41a31e0ae..0196d02ede5ad 100644 --- a/test/DebugInfo/uninitialized.swift +++ b/test/DebugInfo/uninitialized.swift @@ -9,7 +9,7 @@ public func f() { // CHECK: %[[OBJ:.*]] = alloca ptr, align // CHECK: #dbg_declare(ptr %[[OBJ]], // CHECK: void @llvm.memset.{{.*}}(ptr align {{(4|8)}} %[[OBJ]], i8 0, - // CHECK-SAME: ){{$}} + // CHECK-SAME: ), !Swift.isSwiftLLDBpreinit // OPT-NOT: @llvm.memset // OPT: ret } @@ -21,7 +21,7 @@ public func g() { // CHECK: %[[DICT:.*]] = alloca // CHECK: #dbg_declare(ptr %[[DICT]], // CHECK: void @llvm.memset.{{.*}}(ptr align {{(4|8)}} %[[DICT]], i8 0, - // CHECK-SAME: ){{$}} + // CHECK-SAME: ), !Swift.isSwiftLLDBpreinit // OPT-NOT: @llvm.memset // OPT: ret }