diff --git a/lib/IRGen/GenHeap.cpp b/lib/IRGen/GenHeap.cpp index 5aad98ecfd9aa..1b4a06e3748f7 100644 --- a/lib/IRGen/GenHeap.cpp +++ b/lib/IRGen/GenHeap.cpp @@ -423,12 +423,11 @@ void irgen::emitDeallocatePartialClassInstance(IRGenFunction &IGF, /// Create the destructor function for a layout. /// TODO: give this some reasonable name and possibly linkage. -static llvm::Function *createDtorFn(IRGenModule &IGM, - const HeapLayout &layout) { - llvm::Function *fn = - llvm::Function::Create(IGM.DeallocatingDtorTy, - llvm::Function::PrivateLinkage, - "objectdestroy", &IGM.Module); +static llvm::Function *createDtorFn(IRGenModule &IGM, const HeapLayout &layout, + const llvm::Twine &layoutName) { + llvm::Function *fn = llvm::Function::Create( + IGM.DeallocatingDtorTy, llvm::Function::InternalLinkage, + "__swift_" + layoutName + "_destructor", &IGM.Module); auto attrs = IGM.constructInitialAttributes(); IGM.addSwiftSelfAttributes(attrs, 0); fn->setAttributes(attrs); @@ -556,11 +555,12 @@ static llvm::Constant *buildPrivateMetadata(IRGenModule &IGM, llvm::Constant * HeapLayout::getPrivateMetadata(IRGenModule &IGM, - llvm::Constant *captureDescriptor) const { + llvm::Constant *captureDescriptor, + const llvm::Twine &name) const { if (!privateMetadata) - privateMetadata = buildPrivateMetadata(IGM, *this, createDtorFn(IGM, *this), - captureDescriptor, - MetadataKind::HeapLocalVariable); + privateMetadata = buildPrivateMetadata( + IGM, *this, createDtorFn(IGM, *this, name), captureDescriptor, + MetadataKind::HeapLocalVariable); return privateMetadata; } @@ -573,7 +573,8 @@ llvm::Value *IRGenFunction::emitUnmanagedAlloc(const HeapLayout &layout, return IGM.RefCountedNull; } - llvm::Value *metadata = layout.getPrivateMetadata(IGM, captureDescriptor); + llvm::Value *metadata = + layout.getPrivateMetadata(IGM, captureDescriptor, name); llvm::Value *size, *alignMask; if (offsets) { size = offsets->getSize(); diff --git a/lib/IRGen/GenHeap.h b/lib/IRGen/GenHeap.h index 2b35a56affd3a..7527605c6b758 100644 --- a/lib/IRGen/GenHeap.h +++ b/lib/IRGen/GenHeap.h @@ -76,7 +76,8 @@ class HeapLayout : public StructLayout { /// As a convenience, build a metadata object with internal linkage /// consisting solely of the standard heap metadata. llvm::Constant *getPrivateMetadata(IRGenModule &IGM, - llvm::Constant *captureDescriptor) const; + llvm::Constant *captureDescriptor, + const llvm::Twine &name) const; }; class HeapNonFixedOffsets : public NonFixedOffsetsImpl { diff --git a/test/IRGen/closure.swift b/test/IRGen/closure.swift index d387eab8848af..3b85324691b79 100644 --- a/test/IRGen/closure.swift +++ b/test/IRGen/closure.swift @@ -9,7 +9,7 @@ // -- partial_apply context metadata -// CHECK-DAG: [[METADATA:@.*]] = private constant %swift.full_boxmetadata { ptr {{.*}}@objectdestroy{{(\.ptrauth.*)?}}, ptr null, %swift.type { i64 1024 }, i32 16, ptr @"\01l__swift5_reflection_descriptor" } +// CHECK-DAG: [[METADATA:@.*]] = private constant %swift.full_boxmetadata { ptr {{.*}}@__swift_closure_destructor{{(\.ptrauth.*)?}}, ptr null, %swift.type { i64 1024 }, i32 16, ptr @"\01l__swift5_reflection_descriptor" } func a(i i: Int) -> (Int) -> Int { return { x in i } diff --git a/test/IRGen/empty-noncopyable-with-deinit.swift b/test/IRGen/empty-noncopyable-with-deinit.swift index 196f89f6c6ff2..fe29c6c22843f 100644 --- a/test/IRGen/empty-noncopyable-with-deinit.swift +++ b/test/IRGen/empty-noncopyable-with-deinit.swift @@ -1,9 +1,9 @@ // RUN: %target-swift-frontend -emit-irgen %s | %FileCheck %s -// CHECK: [[BOX_1:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_1:@[A-Za-z0-9.]+]], -// CHECK: [[BOX_2:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_2:@[A-Za-z0-9.]+]], -// CHECK: [[BOX_3:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_3:@[A-Za-z0-9.]+]], -// CHECK: [[BOX_4:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_4:@[A-Za-z0-9.]+]], +// CHECK: [[BOX_1:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_1:@[A-Za-z0-9._]+]], +// CHECK: [[BOX_2:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_2:@[A-Za-z0-9._]+]], +// CHECK: [[BOX_3:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_3:@[A-Za-z0-9._]+]], +// CHECK: [[BOX_4:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_4:@[A-Za-z0-9._]+]], // We don't really need to test arm64e, and doing so would mean tweaking the // test to cope with ptrauth. diff --git a/test/IRGen/fixed-noncopyable-with-deinit.swift b/test/IRGen/fixed-noncopyable-with-deinit.swift index b3b501082f1c9..63c7b56fd4062 100644 --- a/test/IRGen/fixed-noncopyable-with-deinit.swift +++ b/test/IRGen/fixed-noncopyable-with-deinit.swift @@ -1,9 +1,9 @@ // RUN: %target-swift-frontend -emit-irgen %s | %FileCheck %s -// CHECK: [[BOX_1:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_1:@[A-Za-z0-9.]+]], -// CHECK: [[BOX_2:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_2:@[A-Za-z0-9.]+]], -// CHECK: [[BOX_3:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_3:@[A-Za-z0-9.]+]], -// CHECK: [[BOX_4:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_4:@[A-Za-z0-9.]+]], +// CHECK: [[BOX_1:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_1:@[A-Za-z0-9._]+]], +// CHECK: [[BOX_2:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_2:@[A-Za-z0-9._]+]], +// CHECK: [[BOX_3:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_3:@[A-Za-z0-9._]+]], +// CHECK: [[BOX_4:@[A-Za-z0-9.]+]] = private constant %swift.full_boxmetadata { ptr [[DESTROY_BOX_4:@[A-Za-z0-9._]+]], // We don't really need to test arm64e, and doing so would mean tweaking the // test to cope with ptrauth.