From 1d0a5266072b7973011012d354781368ee17a453 Mon Sep 17 00:00:00 2001 From: Oliver Hunt Date: Tue, 9 Sep 2025 15:51:32 -0700 Subject: [PATCH] stable/21.x: Fix pointer auth mismerges --- clang/include/clang/Basic/Features.def | 4 ---- .../ptrauth-explicit-vtable-pointer-control.cpp | 16 ++++++++-------- clang/test/CodeGenObjC/ptrauth-attr-exception.m | 3 +-- .../ptrauth-block-descriptor-pointer.m | 10 ++++++---- clang/test/CodeGenObjC/ptrauth-block-isa.m | 5 +++-- clang/test/CodeGenObjC/ptrauth-class-ro.m | 2 +- clang/test/CodeGenObjC/ptrauth-objc-isa-super.m | 2 +- .../ptrauth-objc-method-list-pointer.m | 2 +- 8 files changed, 21 insertions(+), 23 deletions(-) diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 66001df9e48cb..ed456becc7f3c 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -149,10 +149,6 @@ FEATURE(memory_sanitizer, FEATURE(type_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Type)) FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread)) FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow)) -FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics) -FEATURE(ptrauth_qualifier, LangOpts.PointerAuthIntrinsics) -FEATURE(ptrauth_calls, LangOpts.PointerAuthCalls) -FEATURE(ptrauth_returns, LangOpts.PointerAuthReturns) FEATURE(ptrauth_indirect_gotos, LangOpts.PointerAuthIndirectGotos) FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo)) FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics && diff --git a/clang/test/CodeGenCXX/ptrauth-explicit-vtable-pointer-control.cpp b/clang/test/CodeGenCXX/ptrauth-explicit-vtable-pointer-control.cpp index e33525c1ec0f9..32467cb0c74b5 100644 --- a/clang/test/CodeGenCXX/ptrauth-explicit-vtable-pointer-control.cpp +++ b/clang/test/CodeGenCXX/ptrauth-explicit-vtable-pointer-control.cpp @@ -1,34 +1,34 @@ // RUN: %clang_cc1 %s -x c++ -std=c++20 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics \ -// RUN: -emit-llvm -o - | FileCheck --check-prefixes=CHECK,NODISC %s +// RUN: -mllvm -ptrauth-emit-wrapper-globals=0 -emit-llvm -o - | FileCheck --check-prefixes=CHECK,NODISC %s // RUN: %clang_cc1 %s -x c++ -std=c++20 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics \ // RUN: -fptrauth-vtable-pointer-type-discrimination \ -// RUN: -emit-llvm -o - | FileCheck --check-prefixes=CHECK,TYPE %s +// RUN: -mllvm -ptrauth-emit-wrapper-globals=0 -emit-llvm -o - | FileCheck --check-prefixes=CHECK,TYPE %s // RUN: %clang_cc1 %s -x c++ -std=c++20 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics \ // RUN: -fptrauth-vtable-pointer-address-discrimination \ -// RUN: -emit-llvm -o - | FileCheck --check-prefixes=CHECK,ADDR %s +// RUN: -mllvm -ptrauth-emit-wrapper-globals=0 -emit-llvm -o - | FileCheck --check-prefixes=CHECK,ADDR %s // RUN: %clang_cc1 %s -x c++ -std=c++20 -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics \ // RUN: -fptrauth-vtable-pointer-type-discrimination \ // RUN: -fptrauth-vtable-pointer-address-discrimination \ -// RUN: -emit-llvm -o - | FileCheck --check-prefixes=CHECK,BOTH %s +// RUN: -mllvm -ptrauth-emit-wrapper-globals=0 -emit-llvm -o - | FileCheck --check-prefixes=CHECK,BOTH %s // RUN: %clang_cc1 %s -x c++ -std=c++20 -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics \ -// RUN: -emit-llvm -o - | FileCheck --check-prefixes=CHECK,NODISC %s +// RUN: -mllvm -ptrauth-emit-wrapper-globals=0 -emit-llvm -o - | FileCheck --check-prefixes=CHECK,NODISC %s // RUN: %clang_cc1 %s -x c++ -std=c++20 -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics \ // RUN: -fptrauth-vtable-pointer-type-discrimination \ -// RUN: -emit-llvm -o - | FileCheck --check-prefixes=CHECK,TYPE %s +// RUN: -mllvm -ptrauth-emit-wrapper-globals=0 -emit-llvm -o - | FileCheck --check-prefixes=CHECK,TYPE %s // RUN: %clang_cc1 %s -x c++ -std=c++20 -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics \ // RUN: -fptrauth-vtable-pointer-address-discrimination \ -// RUN: -emit-llvm -o - | FileCheck --check-prefixes=CHECK,ADDR %s +// RUN: -mllvm -ptrauth-emit-wrapper-globals=0 -emit-llvm -o - | FileCheck --check-prefixes=CHECK,ADDR %s // RUN: %clang_cc1 %s -x c++ -std=c++20 -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics \ // RUN: -fptrauth-vtable-pointer-type-discrimination \ // RUN: -fptrauth-vtable-pointer-address-discrimination \ -// RUN: -emit-llvm -o - | FileCheck --check-prefixes=CHECK,BOTH %s +// RUN: -mllvm -ptrauth-emit-wrapper-globals=0 -emit-llvm -o - | FileCheck --check-prefixes=CHECK,BOTH %s #include diff --git a/clang/test/CodeGenObjC/ptrauth-attr-exception.m b/clang/test/CodeGenObjC/ptrauth-attr-exception.m index 8c07a698ecc70..8d1c0aa95ca1c 100644 --- a/clang/test/CodeGenObjC/ptrauth-attr-exception.m +++ b/clang/test/CodeGenObjC/ptrauth-attr-exception.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple arm64e -fptrauth-calls -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination -emit-llvm -fexceptions -fobjc-exceptions -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple arm64e -fptrauth-calls -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination -emit-llvm -fexceptions -fobjc-exceptions -o - -mllvm -ptrauth-emit-wrapper-globals=0 %s | FileCheck %s __attribute__((objc_root_class)) @interface Root { @@ -14,4 +14,3 @@ @implementation A @end // CHECK: @"OBJC_EHTYPE_$_A" = global %struct._objc_typeinfo { ptr ptrauth (ptr getelementptr inbounds (ptr, ptr @objc_ehtype_vtable, i32 2), i32 2), ptr @OBJC_CLASS_NAME_, ptr @"OBJC_CLASS_$_A" } - //. @"OBJC_EHTYPE_$_A" = global %struct._objc_typeinfo { ptr getelementptr inbounds (ptr, ptr @objc_ehtype_vtable, i32 2), ptr @OBJC_CLASS_NAME_, ptr @"OBJC_CLASS_$_A" } diff --git a/clang/test/CodeGenObjC/ptrauth-block-descriptor-pointer.m b/clang/test/CodeGenObjC/ptrauth-block-descriptor-pointer.m index b51670fd6459a..0740637ddf07e 100644 --- a/clang/test/CodeGenObjC/ptrauth-block-descriptor-pointer.m +++ b/clang/test/CodeGenObjC/ptrauth-block-descriptor-pointer.m @@ -12,12 +12,14 @@ void a() { void (^blk)(void) = ^{}; } -// CHECK: [[BLOCK_DESCRIPTOR_NAME:@"__block_descriptor_.*"]] = linkonce_odr hidden unnamed_addr constant { i64, i64, ptr, ptr } { i64 0, i64 32, ptr @.str, ptr null } -// CHECK: @__block_literal_global = internal constant { ptr, i32, i32, ptr, ptr } { ptr @_NSConcreteGlobalBlock, i32 1342177280, i32 0, ptr ptrauth (ptr @__a_block_invoke, i32 0, i64 0, ptr getelementptr inbounds ({ ptr, i32, i32, ptr, ptr }, ptr @__block_literal_global, i32 0, i32 3)), ptr ptrauth (ptr [[BLOCK_DESCRIPTOR_NAME]], i32 2, i64 49339, ptr getelementptr inbounds ({ ptr, i32, i32, ptr, ptr }, ptr @__block_literal_global, i32 0, i32 4)) } +// CHECK: @__a_block_invoke.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @__a_block_invoke, i32 0, i64 ptrtoint (ptr getelementptr inbounds ({ ptr, i32, i32, ptr, ptr }, ptr @__block_literal_global, i32 0, i32 3) to i64), i64 0 } +// CHECK: @"[[BLOCK_DESCRIPTOR_NAME:__block_descriptor_.*]]" = linkonce_odr hidden unnamed_addr constant { i64, i64, ptr, ptr } { i64 0, i64 32, ptr @.str, ptr null } +// CHECK: @"[[BLOCK_DESCRIPTOR_NAME]].ptrauth" = private constant { ptr, i32, i64, i64 } { ptr @"[[BLOCK_DESCRIPTOR_NAME]]", i32 2, i64 ptrtoint (ptr getelementptr inbounds ({ ptr, i32, i32, ptr, ptr }, ptr @__block_literal_global, i32 0, i32 4) to i64), i64 49339 } +// CHECK: @__block_literal_global = internal constant { ptr, i32, i32, ptr, ptr } { ptr @_NSConcreteGlobalBlock, i32 1342177280, i32 0, ptr @__a_block_invoke.ptrauth, ptr @"[[BLOCK_DESCRIPTOR_NAME]].ptrauth" } +// NODESCRIPTORAUTH: @__a_block_invoke.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @__a_block_invoke, i32 0, i64 ptrtoint (ptr getelementptr inbounds ({ ptr, i32, i32, ptr, ptr }, ptr @__block_literal_global, i32 0, i32 3) to i64), i64 0 }, section "llvm.ptrauth" // NODESCRIPTORAUTH: [[BLOCK_DESCRIPTOR_NAME:@"__block_descriptor_.*"]] = linkonce_odr hidden unnamed_addr constant { i64, i64, ptr, ptr } { i64 0, i64 32, ptr @.str, ptr null } -// NODESCRIPTORAUTH: @__block_literal_global = internal constant { ptr, i32, i32, ptr, ptr } { ptr @_NSConcreteGlobalBlock, i32 1342177280, i32 0, ptr ptrauth (ptr @__a_block_invoke, i32 0, i64 0, ptr getelementptr inbounds ({ ptr, i32, i32, ptr, ptr }, ptr @__block_literal_global, i32 0, i32 3)), ptr [[BLOCK_DESCRIPTOR_NAME]] } - +// NODESCRIPTORAUTH: @__block_literal_global = internal constant { ptr, i32, i32, ptr, ptr } { ptr @_NSConcreteGlobalBlock, i32 1342177280, i32 0, ptr @__a_block_invoke.ptrauth, ptr [[BLOCK_DESCRIPTOR_NAME]] } void b(int p) { // CHECK-LABEL: define void @b diff --git a/clang/test/CodeGenObjC/ptrauth-block-isa.m b/clang/test/CodeGenObjC/ptrauth-block-isa.m index 248e57769ba1e..1d8c63569504c 100644 --- a/clang/test/CodeGenObjC/ptrauth-block-isa.m +++ b/clang/test/CodeGenObjC/ptrauth-block-isa.m @@ -1,8 +1,9 @@ // RUN: %clang_cc1 -fptrauth-calls -fptrauth-objc-isa -fobjc-arc -fblocks -triple arm64e -emit-llvm %s -o - | FileCheck %s void (^globalblock)(void) = ^{}; -// CHECK: [[BLOCK_DESCRIPTOR_NAME:@"__block_descriptor_.*"]] = linkonce_odr hidden unnamed_addr constant { i64, i64, ptr, ptr } { i64 0, i64 32, ptr @.str, ptr null }, comdat, align 8 -// CHECK: @__block_literal_global = internal constant { ptr, i32, i32, ptr, ptr } { ptr ptrauth (ptr @_NSConcreteGlobalBlock, i32 2, i64 27361, ptr @__block_literal_global), i32 1342177280, i32 0, ptr ptrauth (ptr @globalblock_block_invoke, i32 0, i64 0, ptr getelementptr inbounds ({ ptr, i32, i32, ptr, ptr }, ptr @__block_literal_global, i32 0, i32 3)), ptr [[BLOCK_DESCRIPTOR_NAME]] } +// CHECK: @_NSConcreteGlobalBlock.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @_NSConcreteGlobalBlock, i32 2, i64 ptrtoint (ptr [[GLOBAL_BLOCK_1:@.*]] to i64), i64 27361 }, section "llvm.ptrauth", align 8 +// CHECK: [[INVOCATION_1:@.*]] = private constant { ptr, i32, i64, i64 } { ptr {{@.*}}, i32 0, i64 ptrtoint (ptr getelementptr inbounds ({ ptr, i32, i32, ptr, ptr }, ptr [[GLOBAL_BLOCK_1]], i32 0, i32 3) to i64), i64 0 }, section "llvm.ptrauth" +// CHECK: [[GLOBAL_BLOCK_1]] = internal constant { ptr, i32, i32, ptr, ptr } { ptr @_NSConcreteGlobalBlock.ptrauth, i32 1342177280, i32 0, ptr [[INVOCATION_1]], @interface A - (int) count; diff --git a/clang/test/CodeGenObjC/ptrauth-class-ro.m b/clang/test/CodeGenObjC/ptrauth-class-ro.m index a80b3d34bf9f4..12296bc4aecd1 100644 --- a/clang/test/CodeGenObjC/ptrauth-class-ro.m +++ b/clang/test/CodeGenObjC/ptrauth-class-ro.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -Wno-objc-root-class -fptrauth-objc-class-ro -fobjc-arc -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-calls -Wno-objc-root-class -fptrauth-objc-class-ro -fobjc-arc -emit-llvm -o - %s -mllvm -ptrauth-emit-wrapper-globals=0 | FileCheck %s // CHECK: @"OBJC_CLASS_$_C" = global %struct._class_t { ptr @"OBJC_METACLASS_$_C", ptr null, ptr @_objc_empty_cache, ptr null, ptr ptrauth (ptr @"_OBJC_CLASS_RO_$_C", i32 2, i64 25080, ptr getelementptr inbounds (%struct._class_t, ptr @"OBJC_CLASS_$_C", i32 0, i32 4)) }, section "__DATA, __objc_data", align 8 // CHECK: @"OBJC_METACLASS_$_C" = global %struct._class_t { ptr @"OBJC_METACLASS_$_C", ptr @"OBJC_CLASS_$_C", ptr @_objc_empty_cache, ptr null, ptr ptrauth (ptr @"_OBJC_METACLASS_RO_$_C", i32 2, i64 25080, ptr getelementptr inbounds (%struct._class_t, ptr @"OBJC_METACLASS_$_C", i32 0, i32 4)) }, section "__DATA, __objc_data", align 8 diff --git a/clang/test/CodeGenObjC/ptrauth-objc-isa-super.m b/clang/test/CodeGenObjC/ptrauth-objc-isa-super.m index 69fd01f28067d..3197145cffeff 100644 --- a/clang/test/CodeGenObjC/ptrauth-objc-isa-super.m +++ b/clang/test/CodeGenObjC/ptrauth-objc-isa-super.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -I %S/Inputs -fptrauth-calls -fptrauth-objc-isa -triple arm64-apple-ios -emit-llvm -no-enable-noundef-analysis -fblocks -fobjc-arc -fobjc-runtime-has-weak -O2 -disable-llvm-passes -o - %s | FileCheck %s +// RUN: %clang_cc1 -I %S/Inputs -fptrauth-calls -fptrauth-objc-isa -triple arm64-apple-ios -emit-llvm -no-enable-noundef-analysis -fblocks -fobjc-arc -fobjc-runtime-has-weak -O2 -disable-llvm-passes -o - -mllvm -ptrauth-emit-wrapper-globals=0 %s | FileCheck %s #include "literal-support.h" diff --git a/clang/test/CodeGenObjC/ptrauth-objc-method-list-pointer.m b/clang/test/CodeGenObjC/ptrauth-objc-method-list-pointer.m index e7cb5642ee490..810fd1d710352 100644 --- a/clang/test/CodeGenObjC/ptrauth-objc-method-list-pointer.m +++ b/clang/test/CodeGenObjC/ptrauth-objc-method-list-pointer.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -Wno-objc-root-class -fptrauth-calls -triple arm64e -fptrauth-objc-class-ro %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -Wno-objc-root-class -fptrauth-calls -triple arm64e -fptrauth-objc-class-ro %s -emit-llvm -mllvm -ptrauth-emit-wrapper-globals=0 -o - | FileCheck %s @interface X @end