https://github.com/melver updated https://github.com/llvm/llvm-project/pull/156839
>From b3653330c2c39ebaa094670f11afb0f9d36b9de2 Mon Sep 17 00:00:00 2001 From: Marco Elver <[email protected]> Date: Thu, 4 Sep 2025 12:07:26 +0200 Subject: [PATCH 1/2] fixup! Insert AllocToken into index.rst Created using spr 1.3.8-beta.1 --- clang/docs/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/docs/index.rst b/clang/docs/index.rst index be654af57f890..aa2b3a73dc11b 100644 --- a/clang/docs/index.rst +++ b/clang/docs/index.rst @@ -40,6 +40,7 @@ Using Clang as a Compiler SanitizerCoverage SanitizerStats SanitizerSpecialCaseList + AllocToken BoundsSafety BoundsSafetyAdoptionGuide BoundsSafetyImplPlans >From 8dec1a6b643bb9e019007ce5acee6a1d5b5c18d6 Mon Sep 17 00:00:00 2001 From: Marco Elver <[email protected]> Date: Thu, 2 Oct 2025 19:04:38 +0200 Subject: [PATCH 2/2] fixup! switch Clang tests back to manually written Created using spr 1.3.8-beta.1 --- clang/test/CodeGen/alloc-token-lower.c | 50 +----- clang/test/CodeGen/alloc-token.c | 33 +--- clang/test/CodeGenCXX/alloc-token.cpp | 217 ++++--------------------- 3 files changed, 44 insertions(+), 256 deletions(-) diff --git a/clang/test/CodeGen/alloc-token-lower.c b/clang/test/CodeGen/alloc-token-lower.c index 722fd121440e4..75197bb3dbd44 100644 --- a/clang/test/CodeGen/alloc-token-lower.c +++ b/clang/test/CodeGen/alloc-token-lower.c @@ -1,58 +1,22 @@ -// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6 -// // Test optimization pipelines do not interfere with AllocToken lowering, and we // pass on function attributes correctly. // -// RUN: %clang_cc1 -fsanitize=alloc-token -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK-O0 %s -// RUN: %clang_cc1 -O1 -fsanitize=alloc-token -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK-O1 %s -// RUN: %clang_cc1 -O2 -fsanitize=alloc-token -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix=CHECK-O2 %s +// RUN: %clang_cc1 -fsanitize=alloc-token -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -O1 -fsanitize=alloc-token -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -O2 -fsanitize=alloc-token -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s typedef __typeof(sizeof(int)) size_t; void *malloc(size_t size); -// CHECK-O0-LABEL: define dso_local ptr @test_malloc( -// CHECK-O0-SAME: ) #[[ATTR0:[0-9]+]] { -// CHECK-O0-NEXT: [[ENTRY:.*:]] -// CHECK-O0-NEXT: [[TMP0:%.*]] = call ptr @__alloc_token_malloc(i64 noundef 4, i64 0) #[[ATTR3:[0-9]+]] -// CHECK-O0-NEXT: ret ptr [[TMP0]] -// -// CHECK-O1-LABEL: define dso_local noalias noundef ptr @test_malloc( -// CHECK-O1-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] { -// CHECK-O1-NEXT: [[ENTRY:.*:]] -// CHECK-O1-NEXT: [[TMP0:%.*]] = tail call dereferenceable_or_null(4) ptr @__alloc_token_malloc(i64 noundef 4, i64 0) #[[ATTR3:[0-9]+]] -// CHECK-O1-NEXT: ret ptr [[TMP0]] -// -// CHECK-O2-LABEL: define dso_local noalias noundef ptr @test_malloc( -// CHECK-O2-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] { -// CHECK-O2-NEXT: [[ENTRY:.*:]] -// CHECK-O2-NEXT: [[TMP0:%.*]] = tail call dereferenceable_or_null(4) ptr @__alloc_token_malloc(i64 noundef 4, i64 0) #[[ATTR3:[0-9]+]] -// CHECK-O2-NEXT: ret ptr [[TMP0]] -// +// CHECK-LABEL: @test_malloc( +// CHECK: call{{.*}} ptr @__alloc_token_malloc(i64 noundef 4, i64 0) void *test_malloc() { return malloc(sizeof(int)); } -// CHECK-O0-LABEL: define dso_local ptr @no_sanitize_malloc( -// CHECK-O0-SAME: i64 noundef [[SIZE:%.*]]) #[[ATTR2:[0-9]+]] { -// CHECK-O0-NEXT: [[ENTRY:.*:]] -// CHECK-O0-NEXT: [[SIZE_ADDR:%.*]] = alloca i64, align 8 -// CHECK-O0-NEXT: store i64 [[SIZE]], ptr [[SIZE_ADDR]], align 8 -// CHECK-O0-NEXT: [[CALL:%.*]] = call ptr @malloc(i64 noundef 4) #[[ATTR3]] -// CHECK-O0-NEXT: ret ptr [[CALL]] -// -// CHECK-O1-LABEL: define dso_local noalias noundef ptr @no_sanitize_malloc( -// CHECK-O1-SAME: i64 noundef [[SIZE:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] { -// CHECK-O1-NEXT: [[ENTRY:.*:]] -// CHECK-O1-NEXT: [[CALL:%.*]] = tail call dereferenceable_or_null(4) ptr @malloc(i64 noundef 4) #[[ATTR3]] -// CHECK-O1-NEXT: ret ptr [[CALL]] -// -// CHECK-O2-LABEL: define dso_local noalias noundef ptr @no_sanitize_malloc( -// CHECK-O2-SAME: i64 noundef [[SIZE:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] { -// CHECK-O2-NEXT: [[ENTRY:.*:]] -// CHECK-O2-NEXT: [[CALL:%.*]] = tail call dereferenceable_or_null(4) ptr @malloc(i64 noundef 4) #[[ATTR3]] -// CHECK-O2-NEXT: ret ptr [[CALL]] -// +// CHECK-LABEL: @no_sanitize_malloc( +// CHECK: call{{.*}} ptr @malloc(i64 noundef 4) void *no_sanitize_malloc(size_t size) __attribute__((no_sanitize("alloc-token"))) { return malloc(sizeof(int)); } diff --git a/clang/test/CodeGen/alloc-token.c b/clang/test/CodeGen/alloc-token.c index ec789c069f985..d1160adc060ba 100644 --- a/clang/test/CodeGen/alloc-token.c +++ b/clang/test/CodeGen/alloc-token.c @@ -1,4 +1,3 @@ -// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6 // RUN: %clang_cc1 -fsanitize=alloc-token -triple x86_64-linux-gnu -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s typedef __typeof(sizeof(int)) size_t; @@ -16,29 +15,15 @@ int posix_memalign(void **memptr, size_t alignment, size_t size); void *sink; // CHECK-LABEL: define dso_local void @test_malloc_like( -// CHECK-SAME: ) #[[ATTR0:[0-9]+]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[CALL:%.*]] = call ptr @malloc(i64 noundef 4) #[[ATTR5:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL1:%.*]] = call ptr @calloc(i64 noundef 3, i64 noundef 4) #[[ATTR6:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL1]], ptr @sink, align 8 -// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr @sink, align 8 -// CHECK-NEXT: [[CALL2:%.*]] = call ptr @realloc(ptr noundef [[TMP0]], i64 noundef 8) #[[ATTR7:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL2]], ptr @sink, align 8 -// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr @sink, align 8 -// CHECK-NEXT: [[CALL3:%.*]] = call ptr @reallocarray(ptr noundef [[TMP1]], i64 noundef 5, i64 noundef 8) -// CHECK-NEXT: store ptr [[CALL3]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL4:%.*]] = call align 128 ptr @aligned_alloc(i64 noundef 128, i64 noundef 1024) #[[ATTR7]] -// CHECK-NEXT: store ptr [[CALL4]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL5:%.*]] = call align 16 ptr @memalign(i64 noundef 16, i64 noundef 256) #[[ATTR7]] -// CHECK-NEXT: store ptr [[CALL5]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL6:%.*]] = call ptr @valloc(i64 noundef 4096) -// CHECK-NEXT: store ptr [[CALL6]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL7:%.*]] = call ptr @pvalloc(i64 noundef 8192) -// CHECK-NEXT: store ptr [[CALL7]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL8:%.*]] = call i32 @posix_memalign(ptr noundef @sink, i64 noundef 64, i64 noundef 4) -// CHECK-NEXT: ret void -// +// CHECK: call ptr @malloc(i64 noundef 4) +// CHECK: call ptr @calloc(i64 noundef 3, i64 noundef 4) +// CHECK: call ptr @realloc(ptr noundef {{.*}}, i64 noundef 8) +// CHECK: call ptr @reallocarray(ptr noundef {{.*}}, i64 noundef 5, i64 noundef 8) +// CHECK: call align 128 ptr @aligned_alloc(i64 noundef 128, i64 noundef 1024) +// CHECK: call align 16 ptr @memalign(i64 noundef 16, i64 noundef 256) +// CHECK: call ptr @valloc(i64 noundef 4096) +// CHECK: call ptr @pvalloc(i64 noundef 8192) +// CHECK: call i32 @posix_memalign(ptr noundef @sink, i64 noundef 64, i64 noundef 4) void test_malloc_like() { sink = malloc(sizeof(int)); sink = calloc(3, sizeof(int)); diff --git a/clang/test/CodeGenCXX/alloc-token.cpp b/clang/test/CodeGenCXX/alloc-token.cpp index 77efc6cf85ae1..52bad9c54fb3b 100644 --- a/clang/test/CodeGenCXX/alloc-token.cpp +++ b/clang/test/CodeGenCXX/alloc-token.cpp @@ -1,4 +1,3 @@ -// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 // RUN: %clang_cc1 -fsanitize=alloc-token -triple x86_64-linux-gnu -std=c++20 -fexceptions -fcxx-exceptions -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s #include "../Analysis/Inputs/system-header-simulator-cxx.h" @@ -27,29 +26,15 @@ __sized_ptr_t __size_returning_new_aligned_hot_cold(size_t, std::align_val_t, _ void *sink; // prevent optimizations from removing the calls // CHECK-LABEL: define dso_local void @_Z16test_malloc_likev( -// CHECK-SAME: ) #[[ATTR1:[0-9]+]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[CALL:%.*]] = call ptr @malloc(i64 noundef 4) #[[ATTR10:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL1:%.*]] = call ptr @calloc(i64 noundef 3, i64 noundef 4) #[[ATTR11:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL1]], ptr @sink, align 8 -// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr @sink, align 8 -// CHECK-NEXT: [[CALL2:%.*]] = call ptr @realloc(ptr noundef [[TMP0]], i64 noundef 8) #[[ATTR12:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL2]], ptr @sink, align 8 -// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr @sink, align 8 -// CHECK-NEXT: [[CALL3:%.*]] = call ptr @reallocarray(ptr noundef [[TMP1]], i64 noundef 5, i64 noundef 8) -// CHECK-NEXT: store ptr [[CALL3]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL4:%.*]] = call align 128 ptr @aligned_alloc(i64 noundef 128, i64 noundef 1024) #[[ATTR12]] -// CHECK-NEXT: store ptr [[CALL4]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL5:%.*]] = call ptr @memalign(i64 noundef 16, i64 noundef 256) -// CHECK-NEXT: store ptr [[CALL5]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL6:%.*]] = call ptr @valloc(i64 noundef 4096) -// CHECK-NEXT: store ptr [[CALL6]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL7:%.*]] = call ptr @pvalloc(i64 noundef 8192) -// CHECK-NEXT: store ptr [[CALL7]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL8:%.*]] = call i32 @posix_memalign(ptr noundef @sink, i64 noundef 64, i64 noundef 4) -// CHECK-NEXT: ret void -// +// CHECK: call ptr @malloc(i64 noundef 4) +// CHECK: call ptr @calloc(i64 noundef 3, i64 noundef 4) +// CHECK: call ptr @realloc(ptr noundef {{.*}}, i64 noundef 8) +// CHECK: call ptr @reallocarray(ptr noundef {{.*}}, i64 noundef 5, i64 noundef 8) +// CHECK: call align 128 ptr @aligned_alloc(i64 noundef 128, i64 noundef 1024) +// CHECK: call ptr @memalign(i64 noundef 16, i64 noundef 256) +// CHECK: call ptr @valloc(i64 noundef 4096) +// CHECK: call ptr @pvalloc(i64 noundef 8192) +// CHECK: call i32 @posix_memalign(ptr noundef @sink, i64 noundef 64, i64 noundef 4) void test_malloc_like() { sink = malloc(sizeof(int)); sink = calloc(3, sizeof(int)); @@ -63,122 +48,50 @@ void test_malloc_like() { } // CHECK-LABEL: define dso_local void @_Z17test_operator_newv( -// CHECK-SAME: ) #[[ATTR1]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znwm(i64 noundef 4) #[[ATTR13:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL1:%.*]] = call noalias noundef nonnull ptr @_Znwm(i64 noundef 4) #[[ATTR10]] -// CHECK-NEXT: store ptr [[CALL1]], ptr @sink, align 8 -// CHECK-NEXT: ret void -// +// CHECK: call noalias noundef nonnull ptr @_Znwm(i64 noundef 4) +// CHECK: call noalias noundef nonnull ptr @_Znwm(i64 noundef 4) void test_operator_new() { sink = __builtin_operator_new(sizeof(int)); sink = ::operator new(sizeof(int)); } // CHECK-LABEL: define dso_local void @_Z25test_operator_new_nothrowv( -// CHECK-SAME: ) #[[ATTR0:[0-9]+]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[CALL:%.*]] = call noalias noundef ptr @_ZnwmRKSt9nothrow_t(i64 noundef 4, ptr noundef nonnull align 1 dereferenceable(1) @_ZSt7nothrow) #[[ATTR14:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL1:%.*]] = call noalias noundef ptr @_ZnwmRKSt9nothrow_t(i64 noundef 4, ptr noundef nonnull align 1 dereferenceable(1) @_ZSt7nothrow) #[[ATTR15:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL1]], ptr @sink, align 8 -// CHECK-NEXT: ret void -// +// CHECK: call noalias noundef ptr @_ZnwmRKSt9nothrow_t(i64 noundef 4, ptr noundef nonnull align 1 dereferenceable(1) @_ZSt7nothrow) +// CHECK: call noalias noundef ptr @_ZnwmRKSt9nothrow_t(i64 noundef 4, ptr noundef nonnull align 1 dereferenceable(1) @_ZSt7nothrow) void test_operator_new_nothrow() { sink = __builtin_operator_new(sizeof(int), std::nothrow); sink = ::operator new(sizeof(int), std::nothrow); } // CHECK-LABEL: define dso_local noundef ptr @_Z8test_newv( -// CHECK-SAME: ) #[[ATTR1]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znwm(i64 noundef 4) #[[ATTR13]], !alloc_token [[META2:![0-9]+]] -// CHECK-NEXT: ret ptr [[CALL]] -// +// CHECK: call noalias noundef nonnull ptr @_Znwm(i64 noundef 4){{.*}} !alloc_token [[META_INT:![0-9]+]] int *test_new() { return new int; } // CHECK-LABEL: define dso_local noundef ptr @_Z14test_new_arrayv( -// CHECK-SAME: ) #[[ATTR1]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 40) #[[ATTR13]], !alloc_token [[META2]] -// CHECK-NEXT: ret ptr [[CALL]] -// +// CHECK: call noalias noundef nonnull ptr @_Znam(i64 noundef 40){{.*}} !alloc_token [[META_INT]] int *test_new_array() { return new int[10]; } // CHECK-LABEL: define dso_local noundef ptr @_Z16test_new_nothrowv( -// CHECK-SAME: ) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[CALL:%.*]] = call noalias noundef ptr @_ZnwmRKSt9nothrow_t(i64 noundef 4, ptr noundef nonnull align 1 dereferenceable(1) @_ZSt7nothrow) #[[ATTR14]], !alloc_token [[META2]] -// CHECK-NEXT: ret ptr [[CALL]] -// +// CHECK: call noalias noundef ptr @_ZnwmRKSt9nothrow_t(i64 noundef 4, ptr noundef nonnull align 1 dereferenceable(1) @_ZSt7nothrow){{.*}} !alloc_token [[META_INT]] int *test_new_nothrow() { return new (std::nothrow) int; } // CHECK-LABEL: define dso_local noundef ptr @_Z22test_new_array_nothrowv( -// CHECK-SAME: ) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[CALL:%.*]] = call noalias noundef ptr @_ZnamRKSt9nothrow_t(i64 noundef 40, ptr noundef nonnull align 1 dereferenceable(1) @_ZSt7nothrow) #[[ATTR14]], !alloc_token [[META2]] -// CHECK-NEXT: ret ptr [[CALL]] -// +// CHECK: call noalias noundef ptr @_ZnamRKSt9nothrow_t(i64 noundef 40, ptr noundef nonnull align 1 dereferenceable(1) @_ZSt7nothrow){{.*}} !alloc_token [[META_INT]] int *test_new_array_nothrow() { return new (std::nothrow) int[10]; } // CHECK-LABEL: define dso_local void @_Z23test_size_returning_newv( -// CHECK-SAME: ) #[[ATTR1]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[REF_TMP:%.*]] = alloca [[STRUCT___SIZED_PTR_T:%.*]], align 8 -// CHECK-NEXT: [[REF_TMP1:%.*]] = alloca [[STRUCT___SIZED_PTR_T]], align 8 -// CHECK-NEXT: [[REF_TMP4:%.*]] = alloca [[STRUCT___SIZED_PTR_T]], align 8 -// CHECK-NEXT: [[REF_TMP7:%.*]] = alloca [[STRUCT___SIZED_PTR_T]], align 8 -// CHECK-NEXT: [[CALL:%.*]] = call { ptr, i64 } @__size_returning_new(i64 noundef 8) -// CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw { ptr, i64 }, ptr [[REF_TMP]], i32 0, i32 0 -// CHECK-NEXT: [[TMP1:%.*]] = extractvalue { ptr, i64 } [[CALL]], 0 -// CHECK-NEXT: store ptr [[TMP1]], ptr [[TMP0]], align 8 -// CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw { ptr, i64 }, ptr [[REF_TMP]], i32 0, i32 1 -// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i64 } [[CALL]], 1 -// CHECK-NEXT: store i64 [[TMP3]], ptr [[TMP2]], align 8 -// CHECK-NEXT: [[P:%.*]] = getelementptr inbounds nuw [[STRUCT___SIZED_PTR_T]], ptr [[REF_TMP]], i32 0, i32 0 -// CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[P]], align 8 -// CHECK-NEXT: store ptr [[TMP4]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL2:%.*]] = call { ptr, i64 } @__size_returning_new_hot_cold(i64 noundef 8, i8 noundef zeroext 1) -// CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds nuw { ptr, i64 }, ptr [[REF_TMP1]], i32 0, i32 0 -// CHECK-NEXT: [[TMP6:%.*]] = extractvalue { ptr, i64 } [[CALL2]], 0 -// CHECK-NEXT: store ptr [[TMP6]], ptr [[TMP5]], align 8 -// CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw { ptr, i64 }, ptr [[REF_TMP1]], i32 0, i32 1 -// CHECK-NEXT: [[TMP8:%.*]] = extractvalue { ptr, i64 } [[CALL2]], 1 -// CHECK-NEXT: store i64 [[TMP8]], ptr [[TMP7]], align 8 -// CHECK-NEXT: [[P3:%.*]] = getelementptr inbounds nuw [[STRUCT___SIZED_PTR_T]], ptr [[REF_TMP1]], i32 0, i32 0 -// CHECK-NEXT: [[TMP9:%.*]] = load ptr, ptr [[P3]], align 8 -// CHECK-NEXT: store ptr [[TMP9]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL5:%.*]] = call { ptr, i64 } @__size_returning_new_aligned(i64 noundef 8, i64 noundef 32) -// CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw { ptr, i64 }, ptr [[REF_TMP4]], i32 0, i32 0 -// CHECK-NEXT: [[TMP11:%.*]] = extractvalue { ptr, i64 } [[CALL5]], 0 -// CHECK-NEXT: store ptr [[TMP11]], ptr [[TMP10]], align 8 -// CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds nuw { ptr, i64 }, ptr [[REF_TMP4]], i32 0, i32 1 -// CHECK-NEXT: [[TMP13:%.*]] = extractvalue { ptr, i64 } [[CALL5]], 1 -// CHECK-NEXT: store i64 [[TMP13]], ptr [[TMP12]], align 8 -// CHECK-NEXT: [[P6:%.*]] = getelementptr inbounds nuw [[STRUCT___SIZED_PTR_T]], ptr [[REF_TMP4]], i32 0, i32 0 -// CHECK-NEXT: [[TMP14:%.*]] = load ptr, ptr [[P6]], align 8 -// CHECK-NEXT: store ptr [[TMP14]], ptr @sink, align 8 -// CHECK-NEXT: [[CALL8:%.*]] = call { ptr, i64 } @__size_returning_new_aligned_hot_cold(i64 noundef 8, i64 noundef 32, i8 noundef zeroext 1) -// CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds nuw { ptr, i64 }, ptr [[REF_TMP7]], i32 0, i32 0 -// CHECK-NEXT: [[TMP16:%.*]] = extractvalue { ptr, i64 } [[CALL8]], 0 -// CHECK-NEXT: store ptr [[TMP16]], ptr [[TMP15]], align 8 -// CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds nuw { ptr, i64 }, ptr [[REF_TMP7]], i32 0, i32 1 -// CHECK-NEXT: [[TMP18:%.*]] = extractvalue { ptr, i64 } [[CALL8]], 1 -// CHECK-NEXT: store i64 [[TMP18]], ptr [[TMP17]], align 8 -// CHECK-NEXT: [[P9:%.*]] = getelementptr inbounds nuw [[STRUCT___SIZED_PTR_T]], ptr [[REF_TMP7]], i32 0, i32 0 -// CHECK-NEXT: [[TMP19:%.*]] = load ptr, ptr [[P9]], align 8 -// CHECK-NEXT: store ptr [[TMP19]], ptr @sink, align 8 -// CHECK-NEXT: ret void -// +// CHECK: call { ptr, i64 } @__size_returning_new(i64 noundef 8) +// CHECK: call { ptr, i64 } @__size_returning_new_hot_cold(i64 noundef 8, i8 noundef zeroext 1) +// CHECK: call { ptr, i64 } @__size_returning_new_aligned(i64 noundef 8, i64 noundef 32) +// CHECK: call { ptr, i64 } @__size_returning_new_aligned_hot_cold(i64 noundef 8, i64 noundef 32, i8 noundef zeroext 1) void test_size_returning_new() { sink = __size_returning_new(sizeof(long)).p; sink = __size_returning_new_hot_cold(sizeof(long), __hot_cold_t{1}).p; @@ -196,45 +109,8 @@ class TestClass { void may_throw(); // CHECK-LABEL: define dso_local noundef ptr @_Z27test_exception_handling_newv( -// CHECK-SAME: ) #[[ATTR1]] personality ptr @__gxx_personality_v0 { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[RETVAL:%.*]] = alloca ptr, align 8 -// CHECK-NEXT: [[OBJ:%.*]] = alloca ptr, align 8 -// CHECK-NEXT: [[EXN_SLOT:%.*]] = alloca ptr, align 8 -// CHECK-NEXT: [[EHSELECTOR_SLOT:%.*]] = alloca i32, align 4 -// CHECK-NEXT: [[CALL:%.*]] = invoke noalias noundef nonnull ptr @_Znwm(i64 noundef 72) #[[ATTR13]] -// CHECK-NEXT: to label %[[INVOKE_CONT:.*]] unwind label %[[LPAD:.*]], !alloc_token [[META3:![0-9]+]] -// CHECK: [[INVOKE_CONT]]: -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 16 [[CALL]], i8 0, i64 72, i1 false) -// CHECK-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 8 dereferenceable(72) [[CALL]]) #[[ATTR16:[0-9]+]] -// CHECK-NEXT: store ptr [[CALL]], ptr [[OBJ]], align 8 -// CHECK-NEXT: invoke void @_Z9may_throwv() -// CHECK-NEXT: to label %[[INVOKE_CONT1:.*]] unwind label %[[LPAD]] -// CHECK: [[INVOKE_CONT1]]: -// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[OBJ]], align 8 -// CHECK-NEXT: store ptr [[TMP0]], ptr [[RETVAL]], align 8 -// CHECK-NEXT: br label %[[RETURN:.*]] -// CHECK: [[LPAD]]: -// CHECK-NEXT: [[TMP1:%.*]] = landingpad { ptr, i32 } -// CHECK-NEXT: catch ptr null -// CHECK-NEXT: [[TMP2:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 0 -// CHECK-NEXT: store ptr [[TMP2]], ptr [[EXN_SLOT]], align 8 -// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { ptr, i32 } [[TMP1]], 1 -// CHECK-NEXT: store i32 [[TMP3]], ptr [[EHSELECTOR_SLOT]], align 4 -// CHECK-NEXT: br label %[[CATCH:.*]] -// CHECK: [[CATCH]]: -// CHECK-NEXT: [[EXN:%.*]] = load ptr, ptr [[EXN_SLOT]], align 8 -// CHECK-NEXT: [[TMP4:%.*]] = call ptr @__cxa_begin_catch(ptr [[EXN]]) #[[ATTR16]] -// CHECK-NEXT: store ptr null, ptr [[RETVAL]], align 8 -// CHECK-NEXT: call void @__cxa_end_catch() -// CHECK-NEXT: br label %[[RETURN]] -// CHECK: [[TRY_CONT:.*:]] -// CHECK-NEXT: call void @llvm.trap() -// CHECK-NEXT: unreachable -// CHECK: [[RETURN]]: -// CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr [[RETVAL]], align 8 -// CHECK-NEXT: ret ptr [[TMP5]] -// +// CHECK: invoke noalias noundef nonnull ptr @_Znwm(i64 noundef 72) +// CHECK-NEXT: !alloc_token [[META_TESTCLASS:![0-9]+]] TestClass *test_exception_handling_new() { try { TestClass *obj = new TestClass(); @@ -246,20 +122,7 @@ TestClass *test_exception_handling_new() { } // CHECK-LABEL: define dso_local noundef ptr @_Z14test_new_classv( -// CHECK-SAME: ) #[[ATTR1]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[OBJ:%.*]] = alloca ptr, align 8 -// CHECK-NEXT: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znwm(i64 noundef 72) #[[ATTR13]], !alloc_token [[META3]] -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 16 [[CALL]], i8 0, i64 72, i1 false) -// CHECK-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 8 dereferenceable(72) [[CALL]]) #[[ATTR16]] -// CHECK-NEXT: store ptr [[CALL]], ptr [[OBJ]], align 8 -// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[OBJ]], align 8 -// CHECK-NEXT: [[DATA:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS:%.*]], ptr [[TMP0]], i32 0, i32 1 -// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [16 x i32], ptr [[DATA]], i64 0, i64 0 -// CHECK-NEXT: store i32 42, ptr [[ARRAYIDX]], align 8 -// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[OBJ]], align 8 -// CHECK-NEXT: ret ptr [[TMP1]] -// +// CHECK: call noalias noundef nonnull ptr @_Znwm(i64 noundef 72){{.*}} !alloc_token [[META_TESTCLASS]] TestClass *test_new_class() { TestClass *obj = new TestClass(); obj->data[0] = 42; @@ -267,36 +130,12 @@ TestClass *test_new_class() { } // CHECK-LABEL: define dso_local noundef ptr @_Z20test_new_class_arrayv( -// CHECK-SAME: ) #[[ATTR1]] { -// CHECK-NEXT: [[ENTRY:.*]]: -// CHECK-NEXT: [[ARR:%.*]] = alloca ptr, align 8 -// CHECK-NEXT: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znam(i64 noundef 728) #[[ATTR13]], !alloc_token [[META3]] -// CHECK-NEXT: store i64 10, ptr [[CALL]], align 16 -// CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[CALL]], i64 8 -// CHECK-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS:%.*]], ptr [[TMP0]], i64 10 -// CHECK-NEXT: br label %[[ARRAYCTOR_LOOP:.*]] -// CHECK: [[ARRAYCTOR_LOOP]]: -// CHECK-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi ptr [ [[TMP0]], %[[ENTRY]] ], [ [[ARRAYCTOR_NEXT:%.*]], %[[ARRAYCTOR_LOOP]] ] -// CHECK-NEXT: call void @_ZN9TestClassC1Ev(ptr noundef nonnull align 8 dereferenceable(72) [[ARRAYCTOR_CUR]]) #[[ATTR16]] -// CHECK-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[ARRAYCTOR_CUR]], i64 1 -// CHECK-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq ptr [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]] -// CHECK-NEXT: br i1 [[ARRAYCTOR_DONE]], label %[[ARRAYCTOR_CONT:.*]], label %[[ARRAYCTOR_LOOP]] -// CHECK: [[ARRAYCTOR_CONT]]: -// CHECK-NEXT: store ptr [[TMP0]], ptr [[ARR]], align 8 -// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[ARR]], align 8 -// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [[CLASS_TESTCLASS]], ptr [[TMP1]], i64 0 -// CHECK-NEXT: [[DATA:%.*]] = getelementptr inbounds nuw [[CLASS_TESTCLASS]], ptr [[ARRAYIDX]], i32 0, i32 1 -// CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [16 x i32], ptr [[DATA]], i64 0, i64 0 -// CHECK-NEXT: store i32 123, ptr [[ARRAYIDX1]], align 8 -// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARR]], align 8 -// CHECK-NEXT: ret ptr [[TMP2]] -// +// CHECK: call noalias noundef nonnull ptr @_Znam(i64 noundef 728){{.*}} !alloc_token [[META_TESTCLASS]] TestClass *test_new_class_array() { TestClass* arr = new TestClass[10]; arr[0].data[0] = 123; return arr; } -//. -// CHECK: [[META2]] = !{!"int"} -// CHECK: [[META3]] = !{!"TestClass"} -//. + +// CHECK: [[META_INT]] = !{!"int"} +// CHECK: [[META_TESTCLASS]] = !{!"TestClass"} _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
