Skip to content

Commit 6e45fa9

Browse files
authored
[PAC][AArch64] Support init/fini array signing (#96478)
If both `-fptrauth-init-fini` and `-fptrauth-calls` are passed, sign function pointers in `llvm.global_ctors` and `llvm.global_dtors` with constant discriminator 0xD9D4 (`ptrauth_string_discriminator("init_fini")`). Additionally, if `-fptrauth-init-fini-address-discrimination` is passed, address discrimination is used for signing (otherwise, just constant discriminator is used). For address discrimination, we use it's special form since uses of `llvm.global_{c|d}tors` are disallowed (see `Verifier::visitGlobalVariable`) and we can't emit `getelementptr` expressions referencing these special arrays. A signed ctor/dtor pointer with special address discrimination applied looks like the following: ``` ptr ptrauth (ptr @foo, i32 0, i64 55764, ptr inttoptr (i64 1 to ptr)) ```
1 parent 1745c8e commit 6e45fa9

File tree

21 files changed

+352
-61
lines changed

21 files changed

+352
-61
lines changed

clang/include/clang/Basic/Features.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,10 @@ FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtr
110110
FEATURE(ptrauth_vtable_pointer_type_discrimination, LangOpts.PointerAuthVTPtrTypeDiscrimination)
111111
FEATURE(ptrauth_type_info_vtable_pointer_discrimination, LangOpts.PointerAuthTypeInfoVTPtrDiscrimination)
112112
FEATURE(ptrauth_member_function_pointer_type_discrimination, LangOpts.PointerAuthCalls)
113-
FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini)
114113
FEATURE(ptrauth_function_pointer_type_discrimination, LangOpts.PointerAuthFunctionTypeDiscrimination)
115114
FEATURE(ptrauth_indirect_gotos, LangOpts.PointerAuthIndirectGotos)
115+
FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini)
116+
FEATURE(ptrauth_init_fini_address_discrimination, LangOpts.PointerAuthInitFiniAddressDiscrimination)
116117
EXTENSION(swiftcc,
117118
PP.getTargetInfo().checkCallingConvention(CC_Swift) ==
118119
clang::TargetInfo::CCCR_OK)

clang/include/clang/Basic/LangOptions.def

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,11 @@ LANGOPT(PointerAuthAuthTraps, 1, 0, "pointer authentication failure traps")
170170
LANGOPT(PointerAuthVTPtrAddressDiscrimination, 1, 0, "incorporate address discrimination in authenticated vtable pointers")
171171
LANGOPT(PointerAuthVTPtrTypeDiscrimination, 1, 0, "incorporate type discrimination in authenticated vtable pointers")
172172
LANGOPT(PointerAuthTypeInfoVTPtrDiscrimination, 1, 0, "incorporate type and address discrimination in authenticated vtable pointers for std::type_info")
173-
LANGOPT(PointerAuthInitFini, 1, 0, "sign function pointers in init/fini arrays")
174173
BENIGN_LANGOPT(PointerAuthFunctionTypeDiscrimination, 1, 0,
175174
"Use type discrimination when signing function pointers")
175+
LANGOPT(PointerAuthInitFini, 1, 0, "sign function pointers in init/fini arrays")
176+
LANGOPT(PointerAuthInitFiniAddressDiscrimination, 1, 0,
177+
"incorporate address discrimination in authenticated function pointers in init/fini arrays")
176178

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

clang/include/clang/Basic/PointerAuthOptions.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323

2424
namespace clang {
2525

26+
/// Constant discriminator to be used with function pointers in .init_array and
27+
/// .fini_array. The value is ptrauth_string_discriminator("init_fini")
28+
constexpr uint16_t InitFiniPointerConstantDiscriminator = 0xD9D4;
29+
2630
constexpr unsigned PointerAuthKeyNone = -1;
2731

2832
/// Constant discriminator for std::type_info vtable pointers: 0xB1EA/45546
@@ -186,6 +190,9 @@ struct PointerAuthOptions {
186190

187191
/// The ABI for C++ member function pointers.
188192
PointerAuthSchema CXXMemberFunctionPointers;
193+
194+
/// The ABI for function addresses in .init_array and .fini_array
195+
PointerAuthSchema InitFiniPointers;
189196
};
190197

191198
} // end namespace clang

clang/include/clang/Driver/Options.td

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4254,11 +4254,13 @@ defm ptrauth_vtable_pointer_type_discrimination :
42544254
OptInCC1FFlag<"ptrauth-vtable-pointer-type-discrimination", "Enable type discrimination of vtable pointers">;
42554255
defm ptrauth_type_info_vtable_pointer_discrimination :
42564256
OptInCC1FFlag<"ptrauth-type-info-vtable-pointer-discrimination", "Enable type and address discrimination of vtable pointer of std::type_info">;
4257-
defm ptrauth_init_fini : OptInCC1FFlag<"ptrauth-init-fini", "Enable signing of function pointers in init/fini arrays">;
42584257
defm ptrauth_function_pointer_type_discrimination : OptInCC1FFlag<"ptrauth-function-pointer-type-discrimination",
42594258
"Enable type discrimination on C function pointers">;
42604259
defm ptrauth_indirect_gotos : OptInCC1FFlag<"ptrauth-indirect-gotos",
42614260
"Enable signing and authentication of indirect goto targets">;
4261+
defm ptrauth_init_fini : OptInCC1FFlag<"ptrauth-init-fini", "Enable signing of function pointers in init/fini arrays">;
4262+
defm ptrauth_init_fini_address_discrimination : OptInCC1FFlag<"ptrauth-init-fini-address-discrimination",
4263+
"Enable address discrimination of function pointers in init/fini arrays">;
42624264
}
42634265

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

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,10 +1218,13 @@ void CodeGenModule::Release() {
12181218
(LangOpts.PointerAuthVTPtrTypeDiscrimination
12191219
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) |
12201220
(LangOpts.PointerAuthInitFini
1221-
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI);
1222-
static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI ==
1223-
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1224-
"Update when new enum items are defined");
1221+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
1222+
(LangOpts.PointerAuthInitFiniAddressDiscrimination
1223+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC);
1224+
static_assert(
1225+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC ==
1226+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1227+
"Update when new enum items are defined");
12251228
if (PAuthABIVersion != 0) {
12261229
getModule().addModuleFlag(llvm::Module::Error,
12271230
"aarch64-elf-pauthabi-platform",
@@ -2082,37 +2085,53 @@ void CodeGenModule::AddGlobalDtor(llvm::Function *Dtor, int Priority,
20822085
void CodeGenModule::EmitCtorList(CtorList &Fns, const char *GlobalName) {
20832086
if (Fns.empty()) return;
20842087

2085-
// Ctor function type is void()*.
2086-
llvm::FunctionType* CtorFTy = llvm::FunctionType::get(VoidTy, false);
2087-
llvm::Type *CtorPFTy = llvm::PointerType::get(CtorFTy,
2088-
TheModule.getDataLayout().getProgramAddressSpace());
2088+
const PointerAuthSchema &InitFiniAuthSchema =
2089+
getCodeGenOpts().PointerAuth.InitFiniPointers;
20892090

2090-
// Get the type of a ctor entry, { i32, void ()*, i8* }.
2091-
llvm::StructType *CtorStructTy = llvm::StructType::get(
2092-
Int32Ty, CtorPFTy, VoidPtrTy);
2091+
// Ctor function type is ptr.
2092+
llvm::PointerType *PtrTy = llvm::PointerType::get(
2093+
getLLVMContext(), TheModule.getDataLayout().getProgramAddressSpace());
2094+
2095+
// Get the type of a ctor entry, { i32, ptr, ptr }.
2096+
llvm::StructType *CtorStructTy = llvm::StructType::get(Int32Ty, PtrTy, PtrTy);
20932097

20942098
// Construct the constructor and destructor arrays.
2095-
ConstantInitBuilder builder(*this);
2096-
auto ctors = builder.beginArray(CtorStructTy);
2099+
ConstantInitBuilder Builder(*this);
2100+
auto Ctors = Builder.beginArray(CtorStructTy);
20972101
for (const auto &I : Fns) {
2098-
auto ctor = ctors.beginStruct(CtorStructTy);
2099-
ctor.addInt(Int32Ty, I.Priority);
2100-
ctor.add(I.Initializer);
2102+
auto Ctor = Ctors.beginStruct(CtorStructTy);
2103+
Ctor.addInt(Int32Ty, I.Priority);
2104+
if (InitFiniAuthSchema) {
2105+
llvm::Constant *StorageAddress =
2106+
(InitFiniAuthSchema.isAddressDiscriminated()
2107+
? llvm::ConstantExpr::getIntToPtr(
2108+
llvm::ConstantInt::get(
2109+
IntPtrTy,
2110+
llvm::ConstantPtrAuth::AddrDiscriminator_CtorsDtors),
2111+
PtrTy)
2112+
: nullptr);
2113+
llvm::Constant *SignedCtorPtr = getConstantSignedPointer(
2114+
I.Initializer, InitFiniAuthSchema.getKey(), StorageAddress,
2115+
llvm::ConstantInt::get(
2116+
SizeTy, InitFiniAuthSchema.getConstantDiscrimination()));
2117+
Ctor.add(SignedCtorPtr);
2118+
} else {
2119+
Ctor.add(I.Initializer);
2120+
}
21012121
if (I.AssociatedData)
2102-
ctor.add(I.AssociatedData);
2122+
Ctor.add(I.AssociatedData);
21032123
else
2104-
ctor.addNullPointer(VoidPtrTy);
2105-
ctor.finishAndAddTo(ctors);
2124+
Ctor.addNullPointer(PtrTy);
2125+
Ctor.finishAndAddTo(Ctors);
21062126
}
21072127

2108-
auto list =
2109-
ctors.finishAndCreateGlobal(GlobalName, getPointerAlign(),
2110-
/*constant*/ false,
2111-
llvm::GlobalValue::AppendingLinkage);
2128+
auto List = Ctors.finishAndCreateGlobal(GlobalName, getPointerAlign(),
2129+
/*constant*/ false,
2130+
llvm::GlobalValue::AppendingLinkage);
21122131

21132132
// The LTO linker doesn't seem to like it when we set an alignment
21142133
// on appending variables. Take it off as a workaround.
2115-
list->setAlignment(std::nullopt);
2134+
List->setAlignment(std::nullopt);
21162135

21172136
Fns.clear();
21182137
}

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,14 +1847,17 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
18471847
Args.addOptInFlag(
18481848
CmdArgs, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
18491849
options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
1850-
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini,
1851-
options::OPT_fno_ptrauth_init_fini);
18521850
Args.addOptInFlag(
18531851
CmdArgs, options::OPT_fptrauth_function_pointer_type_discrimination,
18541852
options::OPT_fno_ptrauth_function_pointer_type_discrimination);
18551853

18561854
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_indirect_gotos,
18571855
options::OPT_fno_ptrauth_indirect_gotos);
1856+
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini,
1857+
options::OPT_fno_ptrauth_init_fini);
1858+
Args.addOptInFlag(CmdArgs,
1859+
options::OPT_fptrauth_init_fini_address_discrimination,
1860+
options::OPT_fno_ptrauth_init_fini_address_discrimination);
18581861
}
18591862

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

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,6 +1503,12 @@ void CompilerInvocation::setDefaultPointerAuthOptions(
15031503
PointerAuthSchema(Key::ASIA, true, Discrimination::Decl);
15041504
Opts.CXXMemberFunctionPointers =
15051505
PointerAuthSchema(Key::ASIA, false, Discrimination::Type);
1506+
1507+
if (LangOpts.PointerAuthInitFini) {
1508+
Opts.InitFiniPointers = PointerAuthSchema(
1509+
Key::ASIA, LangOpts.PointerAuthInitFiniAddressDiscrimination,
1510+
Discrimination::Constant, InitFiniPointerConstantDiscriminator);
1511+
}
15061512
}
15071513
Opts.IndirectGotos = LangOpts.PointerAuthIndirectGotos;
15081514
}
@@ -3425,11 +3431,12 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts,
34253431
GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
34263432
if (Opts.PointerAuthTypeInfoVTPtrDiscrimination)
34273433
GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
3428-
3429-
if (Opts.PointerAuthInitFini)
3430-
GenerateArg(Consumer, OPT_fptrauth_init_fini);
34313434
if (Opts.PointerAuthFunctionTypeDiscrimination)
34323435
GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3436+
if (Opts.PointerAuthInitFini)
3437+
GenerateArg(Consumer, OPT_fptrauth_init_fini);
3438+
if (Opts.PointerAuthInitFiniAddressDiscrimination)
3439+
GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
34333440
}
34343441

34353442
static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
@@ -3445,10 +3452,11 @@ static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
34453452
Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination);
34463453
Opts.PointerAuthTypeInfoVTPtrDiscrimination =
34473454
Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
3448-
3449-
Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
34503455
Opts.PointerAuthFunctionTypeDiscrimination =
34513456
Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3457+
Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
3458+
Opts.PointerAuthInitFiniAddressDiscrimination =
3459+
Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
34523460
}
34533461

34543462
/// Check if input file kind and language standard are compatible.

clang/lib/Headers/ptrauth.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ typedef enum {
3636
The extra data is always 0. */
3737
ptrauth_key_cxx_vtable_pointer = ptrauth_key_process_independent_data,
3838

39+
/* The key used to sign pointers in ELF .init_array/.fini_array. */
40+
ptrauth_key_init_fini_pointer = ptrauth_key_process_independent_code,
41+
3942
/* Other pointers signed under the ABI use private ABI rules. */
4043

4144
} ptrauth_key;
@@ -247,6 +250,9 @@ typedef __UINTPTR_TYPE__ ptrauth_generic_signature_t;
247250
[[clang::ptrauth_vtable_pointer(key, address_discrimination, \
248251
extra_discrimination)]]
249252

253+
/* The value is ptrauth_string_discriminator("init_fini") */
254+
#define __ptrauth_init_fini_discriminator 0xd9d4
255+
250256
#else
251257

252258
#define ptrauth_strip(__value, __key) \

clang/test/CodeGen/aarch64-elf-pauthabi.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
// RUN: -fptrauth-auth-traps \
66
// RUN: -fptrauth-vtable-pointer-address-discrimination \
77
// RUN: -fptrauth-vtable-pointer-type-discrimination \
8-
// RUN: -fptrauth-init-fini %s | \
8+
// RUN: -fptrauth-init-fini %s \
9+
// RUN: -fptrauth-init-fini-address-discrimination %s | \
910
// RUN: FileCheck %s --check-prefix=ALL
1011

1112
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
@@ -32,8 +33,12 @@
3233
// RUN: -fptrauth-calls -fptrauth-init-fini %s | \
3334
// RUN: FileCheck %s --check-prefix=INITFINI
3435

36+
// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \
37+
// RUN: -fptrauth-calls -fptrauth-init-fini -fptrauth-init-fini-address-discrimination %s | \
38+
// RUN: FileCheck %s --check-prefix=INITFINIADDR
39+
3540
// ALL: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
36-
// ALL: !{i32 1, !"aarch64-elf-pauthabi-version", i32 127}
41+
// ALL: !{i32 1, !"aarch64-elf-pauthabi-version", i32 255}
3742

3843
// INTRIN: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
3944
// INTRIN: !{i32 1, !"aarch64-elf-pauthabi-version", i32 1}
@@ -56,4 +61,7 @@
5661
// INITFINI: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
5762
// INITFINI: !{i32 1, !"aarch64-elf-pauthabi-version", i32 66}
5863

64+
// INITFINIADDR: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
65+
// INITFINIADDR: !{i32 1, !"aarch64-elf-pauthabi-version", i32 194}
66+
5967
void foo() {}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// REQUIRES: aarch64-registered-target
2+
3+
// RUN: %clang -target aarch64-elf -march=armv8.3-a+pauth -fptrauth-calls -fptrauth-init-fini \
4+
// RUN: -S -emit-llvm %s -o - | FileCheck --check-prefix=SIGNED %s
5+
6+
// RUN: %clang -target aarch64-elf -march=armv8.3-a+pauth -fptrauth-calls -fptrauth-init-fini \
7+
// RUN: -fptrauth-init-fini-address-discrimination -S -emit-llvm %s -o - | FileCheck --check-prefix=ADDRDISC %s
8+
9+
// RUN: %clang -target aarch64-elf -march=armv8.3-a+pauth -fptrauth-calls -fno-ptrauth-init-fini \
10+
// RUN: -S -emit-llvm %s -o - | FileCheck --check-prefix=UNSIGNED %s
11+
12+
// RUN: %clang -target aarch64-elf -march=armv8.3-a+pauth -fptrauth-calls -fptrauth-init-fini-address-discrimination \
13+
// RUN: -S -emit-llvm %s -o - | FileCheck --check-prefix=UNSIGNED %s
14+
15+
// RUN: %clang -target aarch64-elf -march=armv8.3-a+pauth -fptrauth-init-fini \
16+
// RUN: -S -emit-llvm %s -o - | FileCheck --check-prefix=UNSIGNED %s
17+
18+
// SIGNED: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @foo, i32 0, i64 55764), ptr null }]
19+
// SIGNED: @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @bar, i32 0, i64 55764), ptr null }]
20+
21+
// ADDRDISC: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @foo, i32 0, i64 55764, ptr inttoptr (i64 1 to ptr)), ptr null }]
22+
// ADDRDISC: @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr ptrauth (ptr @bar, i32 0, i64 55764, ptr inttoptr (i64 1 to ptr)), ptr null }]
23+
24+
// UNSIGNED: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @foo, ptr null }]
25+
// UNSIGNED: @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @bar, ptr null }]
26+
27+
volatile int x = 0;
28+
29+
__attribute__((constructor)) void foo(void) {
30+
x = 42;
31+
}
32+
33+
__attribute__((destructor)) void bar(void) {
34+
x = 24;
35+
}
36+
37+
int main() {
38+
return x;
39+
}

clang/test/Driver/aarch64-ptrauth.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-address-discrimination \
1313
// RUN: -fno-ptrauth-vtable-pointer-type-discrimination -fptrauth-vtable-pointer-type-discrimination \
1414
// RUN: -fno-ptrauth-type-info-vtable-pointer-discrimination -fptrauth-type-info-vtable-pointer-discrimination \
15-
// RUN: -fno-ptrauth-init-fini -fptrauth-init-fini \
1615
// RUN: -fno-ptrauth-indirect-gotos -fptrauth-indirect-gotos \
16+
// RUN: -fno-ptrauth-init-fini -fptrauth-init-fini \
17+
// RUN: -fno-ptrauth-init-fini-address-discrimination -fptrauth-init-fini-address-discrimination \
1718
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL
18-
// ALL: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-init-fini" "-fptrauth-indirect-gotos"
19+
// ALL: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" "-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination"
1920

2021
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
2122
// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
@@ -36,8 +37,8 @@
3637

3738
// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
3839
// RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \
39-
// RUN: -fptrauth-type-info-vtable-pointer-discrimination -fptrauth-indirect-gotos -fptrauth-init-fini %s 2>&1 | \
40-
// RUN: FileCheck %s --check-prefix=ERR1
40+
// RUN: -fptrauth-type-info-vtable-pointer-discrimination -fptrauth-indirect-gotos -fptrauth-init-fini \
41+
// RUN: -fptrauth-init-fini-address-discrimination %s 2>&1 | FileCheck %s --check-prefix=ERR1
4142
// ERR1: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}'
4243
// ERR1-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}'
4344
// ERR1-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}'
@@ -47,6 +48,7 @@
4748
// ERR1-NEXT: error: unsupported option '-fptrauth-type-info-vtable-pointer-discrimination' for target '{{.*}}'
4849
// ERR1-NEXT: error: unsupported option '-fptrauth-indirect-gotos' for target '{{.*}}'
4950
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini' for target '{{.*}}'
51+
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini-address-discrimination' for target '{{.*}}'
5052

5153
//// Only support PAuth ABI for Linux as for now.
5254
// RUN: not %clang -o /dev/null -c --target=aarch64-unknown -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR2

0 commit comments

Comments
 (0)