1 // RUN: %clang_cc1 -std=c++2a -emit-llvm %s -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK,CHECK-ITANIUM,CHECK-64BIT 2 // RUN: %clang_cc1 -std=c++2a -emit-llvm %s -triple x86_64-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI64,CHECK-64BIT 3 // RUN: %clang_cc1 -std=c++2a -emit-llvm %s -triple i386-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI32,CHECK-32BIT 4 5 // PR46908: ensure the IR passes the verifier with optimizations enabled. 6 // RUN: %clang_cc1 -std=c++2a -emit-llvm-only %s -triple x86_64-linux-gnu -O2 7 // RUN: %clang_cc1 -std=c++2a -emit-llvm-only %s -triple x86_64-windows -O2 8 // RUN: %clang_cc1 -std=c++2a -emit-llvm-only %s -triple i386-windows -O2 9 10 namespace std { 11 using size_t = decltype(sizeof(0)); 12 enum class align_val_t : size_t; 13 struct destroying_delete_t {}; 14 } 15 16 struct A { 17 void *data; 18 ~A(); 19 void operator delete(A*, std::destroying_delete_t); 20 }; 21 void delete_A(A *a) { delete a; } 22 // CHECK-LABEL: define {{.*}}delete_A 23 // CHECK: %[[a:.*]] = load 24 // CHECK: icmp eq %{{.*}} %[[a]], null 25 // CHECK: br i1 26 // 27 // Ensure that we call the destroying delete and not the destructor. 28 // CHECK-NOT: call 29 // CHECK-ITANIUM: call void @_ZN1AdlEPS_St19destroying_delete_t(%{{.*}}* %[[a]]) 30 // CHECK-MSABI64: call void @"??3A@@SAXPEAU0@Udestroying_delete_t@std@@@Z"(%{{.*}}* %[[a]], i8 31 // CHECK-MSABI32: call void @"??3A@@SAXPAU0@Udestroying_delete_t@std@@@Z"(%{{.*}}* %[[a]], %{{.*}}* byval(%{{.*}}) align 4 %{{.*}}) 32 // CHECK-NOT: call 33 // CHECK: } 34 35 struct B { 36 virtual ~B(); 37 void operator delete(B*, std::destroying_delete_t); 38 }; 39 void delete_B(B *b) { delete b; } 40 // CHECK-LABEL: define {{.*}}delete_B 41 // CHECK: %[[b:.*]] = load 42 // CHECK: icmp eq %{{.*}} %[[b]], null 43 // CHECK: br i1 44 // 45 // Ensure that we call the virtual destructor and not the operator delete. 46 // CHECK-NOT: call 47 // CHECK: %[[VTABLE:.*]] = load 48 // CHECK: %[[DTOR:.*]] = load 49 // CHECK: call {{void|i8\*|x86_thiscallcc i8\*}} %[[DTOR]](%{{.*}}* %[[b]] 50 // CHECK-MSABI-SAME: , i32 1) 51 // CHECK-NOT: call 52 // CHECK: } 53 54 struct Padding { 55 virtual void f(); 56 }; 57 58 struct C : Padding, A {}; 59 void delete_C(C *c) { delete c; } 60 // Check that we perform a derived-to-base conversion on the parameter to 'operator delete'. 61 // CHECK-LABEL: define {{.*}}delete_C 62 // CHECK: %[[c:.*]] = load 63 // CHECK: icmp eq %{{.*}} %[[c]], null 64 // CHECK: br i1 65 // 66 // CHECK-64BIT: %[[base:.*]] = getelementptr {{.*}}, i64 8 67 // CHECK-32BIT: %[[base:.*]] = getelementptr {{.*}}, i32 4 68 // CHECK: %[[castbase:.*]] = bitcast {{.*}} %[[base]] 69 // 70 // CHECK: %[[a:.*]] = phi {{.*}} %[[castbase]] 71 // CHECK: icmp eq %{{.*}} %[[a]], null 72 // CHECK: br i1 73 // 74 // CHECK-NOT: call 75 // CHECK-ITANIUM: call void @_ZN1AdlEPS_St19destroying_delete_t(%{{.*}}* %[[a]]) 76 // CHECK-MSABI64: call void @"??3A@@SAXPEAU0@Udestroying_delete_t@std@@@Z"(%{{.*}}* %[[a]], i8 77 // CHECK-MSABI32: call void @"??3A@@SAXPAU0@Udestroying_delete_t@std@@@Z"(%{{.*}}* %[[a]], %{{.*}}* byval(%{{.*}}) align 4 %{{.*}}) 78 // CHECK-NOT: call 79 // CHECK: } 80 81 struct VDel { virtual ~VDel(); }; 82 struct D : Padding, VDel, B {}; 83 void delete_D(D *d) { delete d; } 84 // CHECK-LABEL: define {{.*}}delete_D 85 // CHECK: %[[d:.*]] = load 86 // CHECK: icmp eq %{{.*}} %[[d]], null 87 // CHECK: br i1 88 // 89 // CHECK-NOT: call 90 // For MS, we don't add a new vtable slot to the primary vtable for the virtual 91 // destructor. Instead we cast to the VDel base class. 92 // CHECK-MSABI: bitcast {{.*}} %[[d]] 93 // CHECK-MSABI64-NEXT: getelementptr {{.*}}, i64 8 94 // CHECK-MSABI32-NEXT: getelementptr {{.*}}, i32 4 95 // CHECK-MSABI-NEXT: %[[d:.*]] = bitcast i8* 96 // 97 // CHECK: %[[VTABLE:.*]] = load 98 // CHECK: %[[DTOR:.*]] = load 99 // 100 // CHECK: call {{void|i8\*|x86_thiscallcc i8\*}} %[[DTOR]](%{{.*}}* %[[d]] 101 // CHECK-MSABI-SAME: , i32 1) 102 // CHECK-NOT: call 103 // CHECK: } 104 105 struct E { void *data; }; 106 struct F { void operator delete(F *, std::destroying_delete_t, std::size_t, std::align_val_t); void *data; }; 107 struct alignas(16) G : E, F { void *data; }; 108 109 void delete_G(G *g) { delete g; } 110 // CHECK-LABEL: define {{.*}}delete_G 111 // CHECK-NOT: call 112 // CHECK-ITANIUM: call void @_ZN1FdlEPS_St19destroying_delete_tmSt11align_val_t(%{{.*}}* %[[a]], i64 32, i64 16) 113 // CHECK-MSABI64: call void @"??3F@@SAXPEAU0@Udestroying_delete_t@std@@_KW4align_val_t@2@@Z"(%{{.*}}* %[[a]], i8 {{[^,]*}}, i64 32, i64 16) 114 // CHECK-MSABI32: call void @"??3F@@SAXPAU0@Udestroying_delete_t@std@@IW4align_val_t@2@@Z"(%{{.*}}* %[[a]], %{{.*}}* byval(%{{.*}}) align 4 %{{.*}}, i32 16, i32 16) 115 // CHECK-NOT: call 116 // CHECK: } 117 118 void call_in_dtor(); 119 120 struct H : G { virtual ~H(); } h; 121 H::~H() { call_in_dtor(); } 122 // CHECK-ITANIUM-LABEL: define void @_ZN1HD0Ev( 123 // CHECK-ITANIUM-NOT: call 124 // CHECK-ITANIUM: getelementptr {{.*}}, i64 24 125 // CHECK-ITANIUM-NOT: call 126 // CHECK-ITANIUM: call void @_ZN1FdlEPS_St19destroying_delete_tmSt11align_val_t({{.*}}, i64 48, i64 16) 127 // CHECK-ITANIUM-NOT: call 128 // CHECK-ITANIUM: } 129 130 // CHECK-MSABI64: define {{.*}} @"??_GH@@UEAAPEAXI@Z"( 131 // CHECK-MSABI32: define {{.*}} @"??_GH@@UAEPAXI@Z"( 132 // CHECK-MSABI-NOT: call{{ }} 133 // CHECK-MSABI: load i32 134 // CHECK-MSABI: icmp eq i32 {{.*}}, 0 135 // CHECK-MSABI: br i1 136 // 137 // CHECK-MSABI-NOT: call{{ }} 138 // CHECK-MSABI64: getelementptr {{.*}}, i64 24 139 // CHECK-MSABI32: getelementptr {{.*}}, i32 20 140 // CHECK-MSABI-NOT: call{{ }} 141 // CHECK-MSABI64: call void @"??3F@@SAXPEAU0@Udestroying_delete_t@std@@_KW4align_val_t@2@@Z"({{.*}}, i64 48, i64 16) 142 // CHECK-MSABI32: call void @"??3F@@SAXPAU0@Udestroying_delete_t@std@@IW4align_val_t@2@@Z"({{.*}}, i32 32, i32 16) 143 // CHECK-MSABI: br label %[[RETURN:.*]] 144 // 145 // CHECK-MSABI64: call void @"??1H@@UEAA@XZ"( 146 // CHECK-MSABI32: call x86_thiscallcc void @"??1H@@UAE@XZ"( 147 // CHECK-MSABI: br label %[[RETURN]] 148 // 149 // CHECK-MSABI: } 150 151 struct I : H { virtual ~I(); alignas(32) char buffer[32]; } i; 152 I::~I() { call_in_dtor(); } 153 // CHECK-ITANIUM-LABEL: define void @_ZN1ID0Ev( 154 // CHECK-ITANIUM-NOT: call 155 // CHECK-ITANIUM: getelementptr {{.*}}, i64 24 156 // CHECK-ITANIUM-NOT: call 157 // CHECK-ITANIUM: call void @_ZN1FdlEPS_St19destroying_delete_tmSt11align_val_t({{.*}}, i64 96, i64 32) 158 // CHECK-ITANIUM-NOT: call 159 // CHECK-ITANIUM: } 160 161 // CHECK-MSABI64: define {{.*}} @"??_GI@@UEAAPEAXI@Z"( 162 // CHECK-MSABI32: define {{.*}} @"??_GI@@UAEPAXI@Z"( 163 // CHECK-MSABI-NOT: call{{ }} 164 // CHECK-MSABI: load i32 165 // CHECK-MSABI: icmp eq i32 {{.*}}, 0 166 // CHECK-MSABI: br i1 167 // 168 // CHECK-MSABI-NOT: call{{ }} 169 // CHECK-MSABI64: getelementptr {{.*}}, i64 24 170 // CHECK-MSABI32: getelementptr {{.*}}, i32 20 171 // CHECK-MSABI-NOT: call{{ }} 172 // CHECK-MSABI64: call void @"??3F@@SAXPEAU0@Udestroying_delete_t@std@@_KW4align_val_t@2@@Z"({{.*}}, i64 96, i64 32) 173 // CHECK-MSABI32: call void @"??3F@@SAXPAU0@Udestroying_delete_t@std@@IW4align_val_t@2@@Z"({{.*}}, i32 64, i32 32) 174 // CHECK-MSABI: br label %[[RETURN:.*]] 175 // 176 // CHECK-MSABI64: call void @"??1I@@UEAA@XZ"( 177 // CHECK-MSABI32: call x86_thiscallcc void @"??1I@@UAE@XZ"( 178 // CHECK-MSABI: br label %[[RETURN]] 179 // 180 // CHECK-MSABI: } 181