diff options
Diffstat (limited to 'clang/test/CodeGenCXX')
-rw-r--r-- | clang/test/CodeGenCXX/amdgcn_declspec_get.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/attr-likelihood-iteration-stmt.cpp | 40 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/destructors.cpp | 14 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/dynamic-cast-exact-disabled.cpp | 16 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/dynamic-cast-exact.cpp | 42 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle-class-nttp.cpp | 14 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/microsoft-abi-eh-cleanups.cpp | 6 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/modules-vtable.cppm | 2 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/pr70585.cppm | 2 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/stack-reuse-exceptions.cpp | 60 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/stack-reuse-miscompile.cpp | 6 |
11 files changed, 132 insertions, 74 deletions
diff --git a/clang/test/CodeGenCXX/amdgcn_declspec_get.cpp b/clang/test/CodeGenCXX/amdgcn_declspec_get.cpp index 0ce8801..c784e60 100644 --- a/clang/test/CodeGenCXX/amdgcn_declspec_get.cpp +++ b/clang/test/CodeGenCXX/amdgcn_declspec_get.cpp @@ -15,10 +15,10 @@ extern const A a; // CHECK-LABEL: define{{.*}} void @_Z4testv() // CHECK: %i = alloca i32, align 4, addrspace(5) // CHECK: %[[ii:.*]] = addrspacecast ptr addrspace(5) %i to ptr -// CHECK: call void @llvm.lifetime.start.p5(i64 4, ptr addrspace(5) %i) +// CHECK: call void @llvm.lifetime.start.p5(ptr addrspace(5) %i) // CHECK: %call = call noundef i32 @_ZN1A6_get_xEv() // CHECK: store i32 %call, ptr %[[ii]] -// CHECK: call void @llvm.lifetime.end.p5(i64 4, ptr addrspace(5) %i) +// CHECK: call void @llvm.lifetime.end.p5(ptr addrspace(5) %i) void test() { int i = a.x; diff --git a/clang/test/CodeGenCXX/attr-likelihood-iteration-stmt.cpp b/clang/test/CodeGenCXX/attr-likelihood-iteration-stmt.cpp index fd9786d..151b77a 100644 --- a/clang/test/CodeGenCXX/attr-likelihood-iteration-stmt.cpp +++ b/clang/test/CodeGenCXX/attr-likelihood-iteration-stmt.cpp @@ -68,7 +68,7 @@ void w_branch_elided(unsigned e){ // CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 4 // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 // CHECK-NEXT: store i32 [[E:%.*]], ptr [[E_ADDR]], align 4, !tbaa [[TBAA2]] -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3:[0-9]+]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3:[0-9]+]] // CHECK-NEXT: store i32 0, ptr [[I]], align 4, !tbaa [[TBAA2]] // CHECK-NEXT: br label [[FOR_COND:%.*]] // CHECK: for.cond: @@ -78,7 +78,7 @@ void w_branch_elided(unsigned e){ // CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 true) // CHECK-NEXT: br i1 [[CMP_EXPVAL]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]] // CHECK: for.cond.cleanup: -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]] // CHECK-NEXT: br label [[FOR_END:%.*]] // CHECK: for.body: // CHECK-NEXT: br label [[FOR_INC:%.*]] @@ -100,7 +100,7 @@ void fl(unsigned e) // CHECK-NEXT: [[E_ADDR:%.*]] = alloca i32, align 4 // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 // CHECK-NEXT: store i32 [[E:%.*]], ptr [[E_ADDR]], align 4, !tbaa [[TBAA2]] -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3]] // CHECK-NEXT: store i32 0, ptr [[I]], align 4, !tbaa [[TBAA2]] // CHECK-NEXT: br label [[FOR_COND:%.*]] // CHECK: for.cond: @@ -110,7 +110,7 @@ void fl(unsigned e) // CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 false) // CHECK-NEXT: br i1 [[CMP_EXPVAL]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]] // CHECK: for.cond.cleanup: -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]] // CHECK-NEXT: br label [[FOR_END:%.*]] // CHECK: for.body: // CHECK-NEXT: br label [[FOR_INC:%.*]] @@ -146,14 +146,14 @@ void f_branch_elided() // CHECK-NEXT: [[__END1:%.*]] = alloca ptr, align 8 // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 // CHECK-NEXT: store ptr [[E:%.*]], ptr [[E_ADDR]], align 8, !tbaa [[TBAA14:![0-9]+]] -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[__RANGE1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__RANGE1]]) #[[ATTR3]] // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8, !tbaa [[TBAA14]] // CHECK-NEXT: store ptr [[TMP0]], ptr [[__RANGE1]], align 8, !tbaa [[TBAA14]] -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[__BEGIN1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__BEGIN1]]) #[[ATTR3]] // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[TBAA14]] // CHECK-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP1]], i64 0, i64 0 // CHECK-NEXT: store ptr [[ARRAYDECAY]], ptr [[__BEGIN1]], align 8, !tbaa [[TBAA14]] -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[__END1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__END1]]) #[[ATTR3]] // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[TBAA14]] // CHECK-NEXT: [[ARRAYDECAY1:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP2]], i64 0, i64 0 // CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAYDECAY1]], i64 4 @@ -166,16 +166,16 @@ void f_branch_elided() // CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 true) // CHECK-NEXT: br i1 [[CMP_EXPVAL]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]] // CHECK: for.cond.cleanup: -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[__END1]]) #[[ATTR3]] -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[__BEGIN1]]) #[[ATTR3]] -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[__RANGE1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__END1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__BEGIN1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__RANGE1]]) #[[ATTR3]] // CHECK-NEXT: br label [[FOR_END:%.*]] // CHECK: for.body: -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3]] // CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[TBAA14]] // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4, !tbaa [[TBAA2]] // CHECK-NEXT: store i32 [[TMP6]], ptr [[I]], align 4, !tbaa [[TBAA2]] -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]] // CHECK-NEXT: br label [[FOR_INC:%.*]] // CHECK: for.inc: // CHECK-NEXT: [[TMP7:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[TBAA14]] @@ -198,14 +198,14 @@ void frl(int (&&e) [4]) // CHECK-NEXT: [[__END1:%.*]] = alloca ptr, align 8 // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4 // CHECK-NEXT: store ptr [[E:%.*]], ptr [[E_ADDR]], align 8, !tbaa [[TBAA14]] -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[__RANGE1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__RANGE1]]) #[[ATTR3]] // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8, !tbaa [[TBAA14]] // CHECK-NEXT: store ptr [[TMP0]], ptr [[__RANGE1]], align 8, !tbaa [[TBAA14]] -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[__BEGIN1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__BEGIN1]]) #[[ATTR3]] // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[TBAA14]] // CHECK-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP1]], i64 0, i64 0 // CHECK-NEXT: store ptr [[ARRAYDECAY]], ptr [[__BEGIN1]], align 8, !tbaa [[TBAA14]] -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 8, ptr [[__END1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[__END1]]) #[[ATTR3]] // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[__RANGE1]], align 8, !tbaa [[TBAA14]] // CHECK-NEXT: [[ARRAYDECAY1:%.*]] = getelementptr inbounds [4 x i32], ptr [[TMP2]], i64 0, i64 0 // CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAYDECAY1]], i64 4 @@ -218,16 +218,16 @@ void frl(int (&&e) [4]) // CHECK-NEXT: [[CMP_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CMP]], i1 false) // CHECK-NEXT: br i1 [[CMP_EXPVAL]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]] // CHECK: for.cond.cleanup: -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[__END1]]) #[[ATTR3]] -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[__BEGIN1]]) #[[ATTR3]] -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr [[__RANGE1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__END1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__BEGIN1]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[__RANGE1]]) #[[ATTR3]] // CHECK-NEXT: br label [[FOR_END:%.*]] // CHECK: for.body: -// CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[I]]) #[[ATTR3]] // CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[TBAA14]] // CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP5]], align 4, !tbaa [[TBAA2]] // CHECK-NEXT: store i32 [[TMP6]], ptr [[I]], align 4, !tbaa [[TBAA2]] -// CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]] +// CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[I]]) #[[ATTR3]] // CHECK-NEXT: br label [[FOR_INC:%.*]] // CHECK: for.inc: // CHECK-NEXT: [[TMP7:%.*]] = load ptr, ptr [[__BEGIN1]], align 8, !tbaa [[TBAA14]] diff --git a/clang/test/CodeGenCXX/destructors.cpp b/clang/test/CodeGenCXX/destructors.cpp index 99c82ec..1bf8b16 100644 --- a/clang/test/CodeGenCXX/destructors.cpp +++ b/clang/test/CodeGenCXX/destructors.cpp @@ -308,7 +308,7 @@ namespace test5 { // CHECK5: [[ELEMS:%.*]] = alloca [5 x [[A:%.*]]], align // CHECK5v03-NEXT: [[EXN:%.*]] = alloca ptr // CHECK5v03-NEXT: [[SEL:%.*]] = alloca i32 - // CHECK5-NEXT: call void @llvm.lifetime.start.p0(i64 5, ptr [[ELEMS]]) + // CHECK5-NEXT: call void @llvm.lifetime.start.p0(ptr [[ELEMS]]) // CHECK5-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x [[A]]], ptr [[ELEMS]], i32 0, i32 0 // CHECK5-NEXT: [[END:%.*]] = getelementptr inbounds [[A]], ptr [[BEGIN]], i64 5 // CHECK5-NEXT: br label @@ -482,24 +482,24 @@ namespace test11 { // CHECK6: {{^}}invoke.cont // CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T1]]) -// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T1]]) +// CHECK6: call void @llvm.lifetime.end.p0(ptr [[T1]]) // CHECK6: {{^}}lpad // CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T1]]) -// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T1]]) +// CHECK6: call void @llvm.lifetime.end.p0(ptr [[T1]]) // CHECK6: {{^}}invoke.cont // CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T2]]) -// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T2]]) +// CHECK6: call void @llvm.lifetime.end.p0(ptr [[T2]]) // CHECK6: {{^}}lpad // CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T2]]) -// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T2]]) +// CHECK6: call void @llvm.lifetime.end.p0(ptr [[T2]]) // CHECK6: {{^}}invoke.cont // CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T3]]) -// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T3]]) +// CHECK6: call void @llvm.lifetime.end.p0(ptr [[T3]]) // CHECK6: {{^}}lpad // CHECK6: call void @_ZN6test112S1D1Ev(ptr {{[^,]*}} [[T3]]) -// CHECK6: call void @llvm.lifetime.end.p0(i64 32, ptr [[T3]]) +// CHECK6: call void @llvm.lifetime.end.p0(ptr [[T3]]) struct S1 { ~S1(); diff --git a/clang/test/CodeGenCXX/dynamic-cast-exact-disabled.cpp b/clang/test/CodeGenCXX/dynamic-cast-exact-disabled.cpp index 19c2a9b..3156e1b 100644 --- a/clang/test/CodeGenCXX/dynamic-cast-exact-disabled.cpp +++ b/clang/test/CodeGenCXX/dynamic-cast-exact-disabled.cpp @@ -14,3 +14,19 @@ B *exact(A *a) { // EXACT-NOT: call {{.*}} @__dynamic_cast return dynamic_cast<B*>(a); } + +struct C { + virtual ~C(); +}; + +struct D final : private C { + +}; + +// CHECK-LABEL: @_Z5exactP1C +D *exact(C *a) { + // INEXACT: call {{.*}} @__dynamic_cast + // EXACT: entry: + // EXACT-NEXT: ret ptr null + return dynamic_cast<D*>(a); +} diff --git a/clang/test/CodeGenCXX/dynamic-cast-exact.cpp b/clang/test/CodeGenCXX/dynamic-cast-exact.cpp index 86e1965..588d808 100644 --- a/clang/test/CodeGenCXX/dynamic-cast-exact.cpp +++ b/clang/test/CodeGenCXX/dynamic-cast-exact.cpp @@ -9,6 +9,7 @@ struct E : A { int e; }; struct F : virtual A { int f; }; struct G : virtual A { int g; }; struct H final : C, D, E, F, G { int h; }; +struct H1 final: C, private D { int h1; }; // CHECK-LABEL: @_Z7inexactP1A C *inexact(A *a) { @@ -77,10 +78,49 @@ H *exact_multi(A *a) { return dynamic_cast<H*>(a); } +// CHECK-LABEL: @_Z19exact_invalid_multiP1D +H1 *exact_invalid_multi(D* d) { + // CHECK: entry: + // CHECK-NEXT: %d.addr = alloca ptr + // CHECK-NEXT: store ptr %d, ptr %d.addr + // CHECK-NEXT: load ptr, ptr %d.addr + // CHECK-NEXT: ret ptr null + return dynamic_cast<H1*>(d); +} + +// CHECK-LABEL: @_Z19exact_invalid_multiR1D +H1 &exact_invalid_multi(D& d) { + // CHECK: entry: + // CHECK-NEXT: %d.addr = alloca ptr + // CHECK-NEXT: store ptr %d, ptr %d.addr + // CHECK-NEXT: load ptr, ptr %d.addr + // CHECK-NEXT: call void @__cxa_bad_cast() + // CHECK-NEXT: unreachable + // CHECK: dynamic_cast.unreachable: + // CHECK-NEXT: ret ptr poison + return dynamic_cast<H1&>(d); +} + +namespace GH137518 { + class base { virtual void fn() = 0; }; + class test final : base { virtual void fn() { } }; + test* new_test() { return new test(); } + + // CHECK-LABEL: @_ZN8GH1375184castEPNS_4baseE( + test* cast(base* b) { + // CHECK: entry: + // CHECK-NEXT: %b.addr = alloca ptr + // CHECK-NEXT: store ptr %b, ptr %b.addr + // CHECK-NEXT: load ptr, ptr %b.addr + // CHECK-NEXT: ret ptr null + return dynamic_cast<test*>(b); + } +} + namespace GH64088 { // Ensure we mark the B vtable as used here, because we're going to emit a // reference to it. - // CHECK: define {{.*}} @_ZN7GH640881BD0 + // CHECK: define {{.*}} void @_ZN7GH640881BD0Ev( struct A { virtual ~A(); }; struct B final : A { virtual ~B() = default; }; B *cast(A *p) { return dynamic_cast<B*>(p); } diff --git a/clang/test/CodeGenCXX/mangle-class-nttp.cpp b/clang/test/CodeGenCXX/mangle-class-nttp.cpp index 12c81f2..536592c 100644 --- a/clang/test/CodeGenCXX/mangle-class-nttp.cpp +++ b/clang/test/CodeGenCXX/mangle-class-nttp.cpp @@ -27,12 +27,14 @@ template void f<B{nullptr}>(); // CHECK: define weak_odr void @_Z1fIXtl1BLPKi32EEEEvv( // MSABI: define {{.*}} @"??$f@$2UB@@PEBH0CA@H0A@@@@YAXXZ" template void f<B{fold((int*)32)}>(); -#ifndef _WIN32 -// FIXME: On MS ABI, we mangle this the same as nullptr, despite considering a -// null pointer and zero bitcast to a pointer to be distinct pointer values. -// CHECK: define weak_odr void @_Z1fIXtl1BrcPKiLi0EEEEvv( -template void f<B{fold(reinterpret_cast<int*>(0))}>(); -#endif + +// CHECK: define weak_odr void @_Z1fIXtl1BLPKi0ELi2EEEEvv( +// MSABI: define {{.*}} @"??$f@$2UB@@PEBH0A@H01@@@YAXXZ"( +template void f<B{fold(reinterpret_cast<int*>(0)), 2}>(); + +// CHECK: define weak_odr void @_Z1fIXtl1BLPKi12EEEEvv( +// MSABI: define {{.*}} @"??$f@$2UB@@PEBH0M@H0A@@@@YAXXZ"( +template void f<B{fold(reinterpret_cast<int*>(12))}>(); // Pointers to subobjects. struct Nested { union { int k; int arr[2]; }; } nested[2]; diff --git a/clang/test/CodeGenCXX/microsoft-abi-eh-cleanups.cpp b/clang/test/CodeGenCXX/microsoft-abi-eh-cleanups.cpp index 5e2403b..a60781c 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-eh-cleanups.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-eh-cleanups.cpp @@ -277,13 +277,13 @@ void f() { // WIN32-LIFETIME-LABEL: define dso_local void @"?f@lifetime_marker@@YAXXZ"() // WIN32-LIFETIME: %[[c:.*]] = alloca %"struct.lifetime_marker::C" -// WIN32-LIFETIME: call void @llvm.lifetime.start.p0(i64 1, ptr %c) +// WIN32-LIFETIME: call void @llvm.lifetime.start.p0(ptr %c) // WIN32-LIFETIME: invoke void @"?g@lifetime_marker@@YAXXZ"() // WIN32-LIFETIME-NEXT: to label %[[cont:[^ ]*]] unwind label %[[lpad0:[^ ]*]] // // WIN32-LIFETIME: [[cont]] // WIN32-LIFETIME: call x86_thiscallcc void @"??1C@lifetime_marker@@QAE@XZ"({{.*}}) -// WIN32-LIFETIME: call void @llvm.lifetime.end.p0(i64 1, ptr %[[c]]) +// WIN32-LIFETIME: call void @llvm.lifetime.end.p0(ptr %[[c]]) // // WIN32-LIFETIME: [[lpad0]] // WIN32-LIFETIME-NEXT: cleanuppad @@ -292,7 +292,7 @@ void f() { // // WIN32-LIFETIME: [[lpad1]] // WIN32-LIFETIME-NEXT: cleanuppad -// WIN32-LIFETIME: call void @llvm.lifetime.end.p0(i64 1, ptr %[[c]]) +// WIN32-LIFETIME: call void @llvm.lifetime.end.p0(ptr %[[c]]) } struct class_2 { diff --git a/clang/test/CodeGenCXX/modules-vtable.cppm b/clang/test/CodeGenCXX/modules-vtable.cppm index 6589b9f..75f7598 100644 --- a/clang/test/CodeGenCXX/modules-vtable.cppm +++ b/clang/test/CodeGenCXX/modules-vtable.cppm @@ -1,4 +1,4 @@ -// REQUIRES: !system-windows +// REQUIRES: !system-windows, !system-cygwin // RUN: rm -rf %t // RUN: split-file %s %t diff --git a/clang/test/CodeGenCXX/pr70585.cppm b/clang/test/CodeGenCXX/pr70585.cppm index ad4e135..d44a4f4 100644 --- a/clang/test/CodeGenCXX/pr70585.cppm +++ b/clang/test/CodeGenCXX/pr70585.cppm @@ -1,4 +1,4 @@ -// REQUIRES: !system-windows +// REQUIRES: !system-windows, !system-cygwin // RUN: rm -rf %t // RUN: split-file %s %t diff --git a/clang/test/CodeGenCXX/stack-reuse-exceptions.cpp b/clang/test/CodeGenCXX/stack-reuse-exceptions.cpp index e036bca..27123a6 100644 --- a/clang/test/CodeGenCXX/stack-reuse-exceptions.cpp +++ b/clang/test/CodeGenCXX/stack-reuse-exceptions.cpp @@ -20,32 +20,32 @@ struct NontrivialDtor { // CHECK-LABEL: define{{.*}} void @_Z33cleanupsAreEmittedWithoutTryCatchv void cleanupsAreEmittedWithoutTryCatch() { -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[CLEAN:.*]]) -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[T1:.*]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[CLEAN:.*]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[T1:.*]]) // CHECK-NEXT: invoke void @_Z8getLargev // CHECK-NEXT: to label %[[CONT:[^ ]+]] unwind label %[[LPAD:[^ ]+]] // // CHECK: [[CONT]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T1]]) -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[T2:.*]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T1]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[T2:.*]]) // CHECK-NEXT: invoke void @_Z8getLargev // CHECK-NEXT: to label %[[CONT2:[^ ]+]] unwind label %[[LPAD2:.+]] // // CHECK: [[CONT2]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T2]]) -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[CLEAN]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T2]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[CLEAN]]) // CHECK: ret void // // CHECK: [[LPAD]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T1]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T1]]) // CHECK: br label %[[EHCLEANUP:.+]] // // CHECK: [[LPAD2]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T2]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T2]]) // CHECK: br label %[[EHCLEANUP]] // // CHECK: [[EHCLEANUP]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[CLEAN]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[CLEAN]]) NontrivialDtor clean; @@ -55,27 +55,27 @@ void cleanupsAreEmittedWithoutTryCatch() { // CHECK-LABEL: define{{.*}} void @_Z30cleanupsAreEmittedWithTryCatchv void cleanupsAreEmittedWithTryCatch() { -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[CLEAN:.*]]) -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[T1:.*]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[CLEAN:.*]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[T1:.*]]) // CHECK-NEXT: invoke void @_Z8getLargev // CHECK-NEXT: to label %[[CONT:[^ ]+]] unwind label %[[LPAD:[^ ]+]] // // CHECK: [[CONT]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T1]]) -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[T2:.*]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T1]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[T2:.*]]) // CHECK-NEXT: invoke void @_Z8getLargev // CHECK-NEXT: to label %[[CONT2:[^ ]+]] unwind label %[[LPAD2:.+]] // // CHECK: [[CONT2]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T2]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T2]]) // CHECK: br label %[[TRY_CONT:.+]] // // CHECK: [[LPAD]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T1]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T1]]) // CHECK: br label %[[CATCH:.+]] // // CHECK: [[LPAD2]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T2]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T2]]) // CHECK: br label %[[CATCH]] // // CHECK: [[CATCH]]: @@ -84,13 +84,13 @@ void cleanupsAreEmittedWithTryCatch() { // CHECK-NEXT: to label %[[TRY_CONT]] unwind label %[[OUTER_LPAD:.+]] // // CHECK: [[TRY_CONT]]: -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[T_OUTER:.*]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[T_OUTER:.*]]) // CHECK-NEXT: invoke void @_Z8getLargev // CHECK-NEXT: to label %[[OUTER_CONT:[^ ]+]] unwind label %[[OUTER_LPAD2:.+]] // // CHECK: [[OUTER_CONT]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T_OUTER]]) -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[CLEAN]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T_OUTER]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[CLEAN]]) // CHECK: ret void // // CHECK: [[OUTER_LPAD]]: @@ -98,11 +98,11 @@ void cleanupsAreEmittedWithTryCatch() { // CHECK: br label %[[EHCLEANUP:.+]] // // CHECK: [[OUTER_LPAD2]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T_OUTER]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T_OUTER]]) // CHECK: br label %[[EHCLEANUP]] // // CHECK: [[EHCLEANUP]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[CLEAN]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[CLEAN]]) NontrivialDtor clean; @@ -116,44 +116,44 @@ void cleanupsAreEmittedWithTryCatch() { // CHECK-LABEL: define{{.*}} void @_Z39cleanupInTryHappensBeforeCleanupInCatchv void cleanupInTryHappensBeforeCleanupInCatch() { -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[T1:.*]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[T1:.*]]) // CHECK-NEXT: invoke void @_Z8getLargev // CHECK-NEXT: to label %[[CONT:[^ ]+]] unwind label %[[LPAD:[^ ]+]] // // CHECK: [[CONT]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T1]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T1]]) // CHECK: br label %[[TRY_CONT]] // // CHECK: [[LPAD]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T1]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T1]]) // CHECK: br i1 {{[^,]+}}, label %[[CATCH_INT_MATCH:[^,]+]], label %[[CATCH_ALL:.+]] // // CHECK: [[CATCH_INT_MATCH]]: -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[T2:.*]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[T2:.*]]) // CHECK-NEXT: invoke void @_Z8getLargev // CHECK-NEXT: to label %[[CATCH_INT_CONT:[^ ]+]] unwind label %[[CATCH_INT_LPAD:[^ ]+]] // // CHECK: [[CATCH_INT_CONT]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T2]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T2]]) // CHECK: br label %[[TRY_CONT]] // // CHECK: [[TRY_CONT]]: // CHECK: ret void // // CHECK: [[CATCH_ALL]]: -// CHECK: call void @llvm.lifetime.start.p0({{[^,]+}}, ptr nonnull %[[T3:.*]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr nonnull %[[T3:.*]]) // CHECK-NEXT: invoke void @_Z8getLargev // CHECK-NEXT: to label %[[CATCH_ALL_CONT:[^ ]+]] unwind label %[[CATCH_ALL_LPAD:[^ ]+]] // // CHECK: [[CATCH_ALL_CONT]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T3]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T3]]) // CHECK: br label %[[TRY_CONT]] // // CHECK: [[CATCH_ALL_LPAD]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T3]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T3]]) // // CHECK: [[CATCH_INT_LPAD]]: -// CHECK: call void @llvm.lifetime.end.p0({{[^,]+}}, ptr nonnull %[[T2]]) +// CHECK: call void @llvm.lifetime.end.p0(ptr nonnull %[[T2]]) // CHECK-NOT: call void @llvm.lifetime try { diff --git a/clang/test/CodeGenCXX/stack-reuse-miscompile.cpp b/clang/test/CodeGenCXX/stack-reuse-miscompile.cpp index 50a8d16..67fa9f9 100644 --- a/clang/test/CodeGenCXX/stack-reuse-miscompile.cpp +++ b/clang/test/CodeGenCXX/stack-reuse-miscompile.cpp @@ -28,12 +28,12 @@ const char * f(S s) // // FIXME: We could defer starting the lifetime of the return object of concat // until the call. -// CHECK: call void @llvm.lifetime.start.p0(i64 16, ptr [[T1]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr [[T1]]) // -// CHECK: call void @llvm.lifetime.start.p0(i64 16, ptr [[T2]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr [[T2]]) // CHECK: [[T4:%.*]] = call noundef ptr @_ZN1TC1EPKc(ptr {{[^,]*}} [[T2]], ptr noundef @.str) // -// CHECK: call void @llvm.lifetime.start.p0(i64 16, ptr [[T3]]) +// CHECK: call void @llvm.lifetime.start.p0(ptr [[T3]]) // CHECK: [[T5:%.*]] = call noundef ptr @_ZN1TC1E1S(ptr {{[^,]*}} [[T3]], [2 x i32] %{{.*}}) // // CHECK: call void @_ZNK1T6concatERKS_(ptr dead_on_unwind writable sret(%class.T) align 4 [[T1]], ptr {{[^,]*}} [[T2]], ptr noundef nonnull align 4 dereferenceable(16) [[T3]]) |