Skip to content

Commit ad652ef

Browse files
[AArch64][PAC][clang][ELF] Support PAuth ABI core info (#85235)
Depends on #87545 Emit PAuth ABI compatibility tag values as llvm module flags: - `aarch64-elf-pauthabi-platform` - `aarch64-elf-pauthabi-version` For platform 0x10000002 (llvm_linux), the version value bits correspond to the following LangOptions defined in #85232: - bit 0: `PointerAuthIntrinsics`; - bit 1: `PointerAuthCalls`; - bit 2: `PointerAuthReturns`; - bit 3: `PointerAuthAuthTraps`; - bit 4: `PointerAuthVTPtrAddressDiscrimination`; - bit 5: `PointerAuthVTPtrTypeDiscrimination`; - bit 6: `PointerAuthInitFini`. --------- Co-authored-by: Ahmed Bougacha <ahmed@bougacha.org>
1 parent c2a87d7 commit ad652ef

File tree

9 files changed

+274
-6
lines changed

9 files changed

+274
-6
lines changed

clang/include/clang/Basic/Features.def

+6
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread))
103103
FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow))
104104
FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo))
105105
FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics)
106+
FEATURE(ptrauth_calls, LangOpts.PointerAuthCalls)
107+
FEATURE(ptrauth_returns, LangOpts.PointerAuthReturns)
108+
FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtrAddressDiscrimination)
109+
FEATURE(ptrauth_vtable_pointer_type_discrimination, LangOpts.PointerAuthVTPtrTypeDiscrimination)
110+
FEATURE(ptrauth_member_function_pointer_type_discrimination, LangOpts.PointerAuthCalls)
111+
FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini)
106112
EXTENSION(swiftcc,
107113
PP.getTargetInfo().checkCallingConvention(CC_Swift) ==
108114
clang::TargetInfo::CCCR_OK)

clang/include/clang/Basic/LangOptions.def

+6
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,12 @@ LANGOPT(RelaxedTemplateTemplateArgs, 1, 1, "C++17 relaxed matching of template t
162162
LANGOPT(ExperimentalLibrary, 1, 0, "enable unstable and experimental library features")
163163

164164
LANGOPT(PointerAuthIntrinsics, 1, 0, "pointer authentication intrinsics")
165+
LANGOPT(PointerAuthCalls , 1, 0, "function pointer authentication")
166+
LANGOPT(PointerAuthReturns, 1, 0, "return pointer authentication")
167+
LANGOPT(PointerAuthAuthTraps, 1, 0, "pointer authentication failure traps")
168+
LANGOPT(PointerAuthVTPtrAddressDiscrimination, 1, 0, "incorporate address discrimination in authenticated vtable pointers")
169+
LANGOPT(PointerAuthVTPtrTypeDiscrimination, 1, 0, "incorporate type discrimination in authenticated vtable pointers")
170+
LANGOPT(PointerAuthInitFini, 1, 0, "sign function pointers in init/fini arrays")
165171

166172
LANGOPT(DoubleSquareBracketAttributes, 1, 0, "'[[]]' attributes extension for all language standard modes")
167173
LANGOPT(ExperimentalLateParseAttributes, 1, 0, "experimental late parsing of attributes")

clang/include/clang/Driver/Options.td

+8
Original file line numberDiff line numberDiff line change
@@ -4180,6 +4180,14 @@ defm strict_return : BoolFOption<"strict-return",
41804180

41814181
let Flags = [TargetSpecific] in {
41824182
defm ptrauth_intrinsics : OptInCC1FFlag<"ptrauth-intrinsics", "Enable pointer authentication intrinsics">;
4183+
defm ptrauth_calls : OptInCC1FFlag<"ptrauth-calls", "Enable signing and authentication of all indirect calls">;
4184+
defm ptrauth_returns : OptInCC1FFlag<"ptrauth-returns", "Enable signing and authentication of return addresses">;
4185+
defm ptrauth_auth_traps : OptInCC1FFlag<"ptrauth-auth-traps", "Enable traps on authentication failures">;
4186+
defm ptrauth_vtable_pointer_address_discrimination :
4187+
OptInCC1FFlag<"ptrauth-vtable-pointer-address-discrimination", "Enable address discrimination of vtable pointers">;
4188+
defm ptrauth_vtable_pointer_type_discrimination :
4189+
OptInCC1FFlag<"ptrauth-vtable-pointer-type-discrimination", "Enable type discrimination of vtable pointers">;
4190+
defm ptrauth_init_fini : OptInCC1FFlag<"ptrauth-init-fini", "Enable signing of function pointers in init/fini arrays">;
41834191
}
41844192

41854193
def fenable_matrix : Flag<["-"], "fenable-matrix">, Group<f_Group>,

clang/lib/CodeGen/CodeGenModule.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
#include "llvm/ADT/StringExtras.h"
5454
#include "llvm/ADT/StringSwitch.h"
5555
#include "llvm/Analysis/TargetLibraryInfo.h"
56+
#include "llvm/BinaryFormat/ELF.h"
5657
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
5758
#include "llvm/IR/AttributeMask.h"
5859
#include "llvm/IR/CallingConv.h"
@@ -1190,6 +1191,37 @@ void CodeGenModule::Release() {
11901191
if (!LangOpts.isSignReturnAddressWithAKey())
11911192
getModule().addModuleFlag(llvm::Module::Min,
11921193
"sign-return-address-with-bkey", 1);
1194+
1195+
if (getTriple().isOSLinux()) {
1196+
assert(getTriple().isOSBinFormatELF());
1197+
using namespace llvm::ELF;
1198+
uint64_t PAuthABIVersion =
1199+
(LangOpts.PointerAuthIntrinsics
1200+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) |
1201+
(LangOpts.PointerAuthCalls
1202+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) |
1203+
(LangOpts.PointerAuthReturns
1204+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) |
1205+
(LangOpts.PointerAuthAuthTraps
1206+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) |
1207+
(LangOpts.PointerAuthVTPtrAddressDiscrimination
1208+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) |
1209+
(LangOpts.PointerAuthVTPtrTypeDiscrimination
1210+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
1211+
(LangOpts.PointerAuthInitFini
1212+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI);
1213+
static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI ==
1214+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1215+
"Update when new enum items are defined");
1216+
if (PAuthABIVersion != 0) {
1217+
getModule().addModuleFlag(llvm::Module::Error,
1218+
"aarch64-elf-pauthabi-platform",
1219+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
1220+
getModule().addModuleFlag(llvm::Module::Error,
1221+
"aarch64-elf-pauthabi-version",
1222+
PAuthABIVersion);
1223+
}
1224+
}
11931225
}
11941226

11951227
if (CodeGenOpts.StackClashProtector)

clang/lib/Driver/ToolChains/Clang.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -1756,6 +1756,20 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
17561756

17571757
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_intrinsics,
17581758
options::OPT_fno_ptrauth_intrinsics);
1759+
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_calls,
1760+
options::OPT_fno_ptrauth_calls);
1761+
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_returns,
1762+
options::OPT_fno_ptrauth_returns);
1763+
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_auth_traps,
1764+
options::OPT_fno_ptrauth_auth_traps);
1765+
Args.addOptInFlag(
1766+
CmdArgs, options::OPT_fptrauth_vtable_pointer_address_discrimination,
1767+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
1768+
Args.addOptInFlag(
1769+
CmdArgs, options::OPT_fptrauth_vtable_pointer_type_discrimination,
1770+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
1771+
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini,
1772+
options::OPT_fno_ptrauth_init_fini);
17591773
}
17601774

17611775
void Clang::AddLoongArchTargetArgs(const ArgList &Args,

clang/lib/Frontend/CompilerInvocation.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -3346,11 +3346,31 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts,
33463346
ArgumentConsumer Consumer) {
33473347
if (Opts.PointerAuthIntrinsics)
33483348
GenerateArg(Consumer, OPT_fptrauth_intrinsics);
3349+
if (Opts.PointerAuthCalls)
3350+
GenerateArg(Consumer, OPT_fptrauth_calls);
3351+
if (Opts.PointerAuthReturns)
3352+
GenerateArg(Consumer, OPT_fptrauth_returns);
3353+
if (Opts.PointerAuthAuthTraps)
3354+
GenerateArg(Consumer, OPT_fptrauth_auth_traps);
3355+
if (Opts.PointerAuthVTPtrAddressDiscrimination)
3356+
GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination);
3357+
if (Opts.PointerAuthVTPtrTypeDiscrimination)
3358+
GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
3359+
if (Opts.PointerAuthInitFini)
3360+
GenerateArg(Consumer, OPT_fptrauth_init_fini);
33493361
}
33503362

33513363
static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
33523364
DiagnosticsEngine &Diags) {
33533365
Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics);
3366+
Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls);
3367+
Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns);
3368+
Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps);
3369+
Opts.PointerAuthVTPtrAddressDiscrimination =
3370+
Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination);
3371+
Opts.PointerAuthVTPtrTypeDiscrimination =
3372+
Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
3373+
Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
33543374
}
33553375

33563376
/// Check if input file kind and language standard are compatible.
+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
2+
// RUN: -fptrauth-intrinsics \
3+
// RUN: -fptrauth-calls \
4+
// RUN: -fptrauth-returns \
5+
// RUN: -fptrauth-auth-traps \
6+
// RUN: -fptrauth-vtable-pointer-address-discrimination \
7+
// RUN: -fptrauth-vtable-pointer-type-discrimination \
8+
// RUN: -fptrauth-init-fini %s | \
9+
// RUN: FileCheck %s --check-prefix=ALL
10+
11+
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
12+
// RUN: -fptrauth-intrinsics %s | FileCheck %s --check-prefix=INTRIN
13+
14+
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
15+
// RUN: -fptrauth-calls %s | FileCheck %s --check-prefix=CALL
16+
17+
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
18+
// RUN: -fptrauth-returns %s | FileCheck %s --check-prefix=RET
19+
20+
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
21+
// RUN: -fptrauth-auth-traps %s | FileCheck %s --check-prefix=TRAP
22+
23+
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
24+
// RUN: -fptrauth-calls -fptrauth-vtable-pointer-address-discrimination %s | \
25+
// RUN: FileCheck %s --check-prefix=VPTRADDR
26+
27+
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
28+
// RUN: -fptrauth-calls -fptrauth-vtable-pointer-type-discrimination %s | \
29+
// RUN: FileCheck %s --check-prefix=VPTRTYPE
30+
31+
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
32+
// RUN: -fptrauth-calls -fptrauth-init-fini %s | \
33+
// RUN: FileCheck %s --check-prefix=INITFINI
34+
35+
// ALL: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
36+
// ALL: !{i32 1, !"aarch64-elf-pauthabi-version", i32 127}
37+
38+
// INTRIN: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
39+
// INTRIN: !{i32 1, !"aarch64-elf-pauthabi-version", i32 1}
40+
41+
// CALL: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
42+
// CALL: !{i32 1, !"aarch64-elf-pauthabi-version", i32 2}
43+
44+
// RET: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
45+
// RET: !{i32 1, !"aarch64-elf-pauthabi-version", i32 4}
46+
47+
// TRAP: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
48+
// TRAP: !{i32 1, !"aarch64-elf-pauthabi-version", i32 8}
49+
50+
// VPTRADDR: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
51+
// VPTRADDR: !{i32 1, !"aarch64-elf-pauthabi-version", i32 18}
52+
53+
// VPTRTYPE: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
54+
// VPTRTYPE: !{i32 1, !"aarch64-elf-pauthabi-version", i32 34}
55+
56+
// INITFINI: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
57+
// INITFINI: !{i32 1, !"aarch64-elf-pauthabi-version", i32 66}
58+
59+
void foo() {}

clang/test/Driver/aarch64-ptrauth.c

+24-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
1-
// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-intrinsics -fptrauth-intrinsics %s 2>&1 | FileCheck %s --check-prefix=INTRIN
2-
// INTRIN: "-cc1"{{.*}} "-fptrauth-intrinsics"
1+
// RUN: %clang -### -c --target=aarch64 %s 2>&1 | FileCheck %s --check-prefix NONE
2+
// NONE: "-cc1"
3+
// NONE-NOT: "-fptrauth-
34

4-
// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics %s 2>&1 | FileCheck %s --check-prefix=ERR
5-
// ERR: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}'
5+
// RUN: %clang -### -c --target=aarch64 \
6+
// RUN: -fno-ptrauth-intrinsics -fptrauth-intrinsics \
7+
// RUN: -fno-ptrauth-calls -fptrauth-calls \
8+
// RUN: -fno-ptrauth-returns -fptrauth-returns \
9+
// RUN: -fno-ptrauth-auth-traps -fptrauth-auth-traps \
10+
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-address-discrimination \
11+
// RUN: -fno-ptrauth-vtable-pointer-type-discrimination -fptrauth-vtable-pointer-type-discrimination \
12+
// RUN: -fno-ptrauth-init-fini -fptrauth-init-fini \
13+
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL
14+
// ALL: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-init-fini"
15+
16+
// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
17+
// RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \
18+
// RUN: -fptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=ERR
19+
// ERR: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}'
20+
// ERR-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}'
21+
// ERR-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}'
22+
// ERR-NEXT: error: unsupported option '-fptrauth-auth-traps' for target '{{.*}}'
23+
// ERR-NEXT: error: unsupported option '-fptrauth-vtable-pointer-address-discrimination' for target '{{.*}}'
24+
// ERR-NEXT: error: unsupported option '-fptrauth-vtable-pointer-type-discrimination' for target '{{.*}}'
25+
// ERR-NEXT: error: unsupported option '-fptrauth-init-fini' for target '{{.*}}'
+105-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,59 @@
1-
// RUN: %clang_cc1 %s -E -triple=arm64-- | FileCheck %s --check-prefixes=NOINTRIN
2-
// RUN: %clang_cc1 %s -E -triple=arm64-- -fptrauth-intrinsics | FileCheck %s --check-prefixes=INTRIN
1+
// RUN: %clang_cc1 -E %s -triple=aarch64 \
2+
// RUN: -fptrauth-intrinsics \
3+
// RUN: -fptrauth-calls \
4+
// RUN: -fptrauth-returns \
5+
// RUN: -fptrauth-vtable-pointer-address-discrimination \
6+
// RUN: -fptrauth-vtable-pointer-type-discrimination \
7+
// RUN: -fptrauth-init-fini | \
8+
// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,RETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI
9+
10+
// RUN: %clang_cc1 -E %s -triple=aarch64 \
11+
// RUN: -fptrauth-calls \
12+
// RUN: -fptrauth-returns \
13+
// RUN: -fptrauth-vtable-pointer-address-discrimination \
14+
// RUN: -fptrauth-vtable-pointer-type-discrimination \
15+
// RUN: -fptrauth-init-fini | \
16+
// RUN: FileCheck %s --check-prefixes=NOINTRIN,CALLS,RETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI
17+
18+
// RUN: %clang_cc1 -E %s -triple=aarch64 \
19+
// RUN: -fptrauth-intrinsics \
20+
// RUN: -fptrauth-returns \
21+
// RUN: -fptrauth-vtable-pointer-address-discrimination \
22+
// RUN: -fptrauth-vtable-pointer-type-discrimination \
23+
// RUN: -fptrauth-init-fini | \
24+
// RUN: FileCheck %s --check-prefixes=INTRIN,NOCALLS,RETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI
25+
26+
// RUN: %clang_cc1 -E %s -triple=aarch64 \
27+
// RUN: -fptrauth-intrinsics \
28+
// RUN: -fptrauth-calls \
29+
// RUN: -fptrauth-vtable-pointer-address-discrimination \
30+
// RUN: -fptrauth-vtable-pointer-type-discrimination \
31+
// RUN: -fptrauth-init-fini | \
32+
// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,NORETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI
33+
34+
// RUN: %clang_cc1 -E %s -triple=aarch64 \
35+
// RUN: -fptrauth-intrinsics \
36+
// RUN: -fptrauth-calls \
37+
// RUN: -fptrauth-returns \
38+
// RUN: -fptrauth-vtable-pointer-type-discrimination \
39+
// RUN: -fptrauth-init-fini | \
40+
// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,RETS,NOVPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI
41+
42+
// RUN: %clang_cc1 -E %s -triple=aarch64 \
43+
// RUN: -fptrauth-intrinsics \
44+
// RUN: -fptrauth-calls \
45+
// RUN: -fptrauth-returns \
46+
// RUN: -fptrauth-vtable-pointer-address-discrimination \
47+
// RUN: -fptrauth-init-fini | \
48+
// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,RETS,VPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,INITFINI
49+
50+
// RUN: %clang_cc1 -E %s -triple=aarch64 \
51+
// RUN: -fptrauth-intrinsics \
52+
// RUN: -fptrauth-calls \
53+
// RUN: -fptrauth-returns \
54+
// RUN: -fptrauth-vtable-pointer-address-discrimination \
55+
// RUN: -fptrauth-vtable-pointer-type-discrimination | \
56+
// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,RETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,NOINITFINI
357

458
#if __has_feature(ptrauth_intrinsics)
559
// INTRIN: has_ptrauth_intrinsics
@@ -8,3 +62,52 @@ void has_ptrauth_intrinsics() {}
862
// NOINTRIN: no_ptrauth_intrinsics
963
void no_ptrauth_intrinsics() {}
1064
#endif
65+
66+
#if __has_feature(ptrauth_calls)
67+
// CALLS: has_ptrauth_calls
68+
void has_ptrauth_calls() {}
69+
#else
70+
// NOCALLS: no_ptrauth_calls
71+
void no_ptrauth_calls() {}
72+
#endif
73+
74+
// This is always enabled when ptrauth_calls is enabled
75+
#if __has_feature(ptrauth_member_function_pointer_type_discrimination)
76+
// CALLS: has_ptrauth_member_function_pointer_type_discrimination
77+
void has_ptrauth_member_function_pointer_type_discrimination() {}
78+
#else
79+
// NOCALLS: no_ptrauth_member_function_pointer_type_discrimination
80+
void no_ptrauth_member_function_pointer_type_discrimination() {}
81+
#endif
82+
83+
#if __has_feature(ptrauth_returns)
84+
// RETS: has_ptrauth_returns
85+
void has_ptrauth_returns() {}
86+
#else
87+
// NORETS: no_ptrauth_returns
88+
void no_ptrauth_returns() {}
89+
#endif
90+
91+
#if __has_feature(ptrauth_vtable_pointer_address_discrimination)
92+
// VPTR_ADDR_DISCR: has_ptrauth_vtable_pointer_address_discrimination
93+
void has_ptrauth_vtable_pointer_address_discrimination() {}
94+
#else
95+
// NOVPTR_ADDR_DISCR: no_ptrauth_vtable_pointer_address_discrimination
96+
void no_ptrauth_vtable_pointer_address_discrimination() {}
97+
#endif
98+
99+
#if __has_feature(ptrauth_vtable_pointer_type_discrimination)
100+
// VPTR_TYPE_DISCR: has_ptrauth_vtable_pointer_type_discrimination
101+
void has_ptrauth_vtable_pointer_type_discrimination() {}
102+
#else
103+
// NOVPTR_TYPE_DISCR: no_ptrauth_vtable_pointer_type_discrimination
104+
void no_ptrauth_vtable_pointer_type_discrimination() {}
105+
#endif
106+
107+
#if __has_feature(ptrauth_init_fini)
108+
// INITFINI: has_ptrauth_init_fini
109+
void has_ptrauth_init_fini() {}
110+
#else
111+
// NOINITFINI: no_ptrauth_init_fini
112+
void no_ptrauth_init_fini() {}
113+
#endif

0 commit comments

Comments
 (0)