Skip to content

Commit d511d02

Browse files
committed
Make type discrimination of 128-bit types optional
1 parent 21d2b2d commit d511d02

File tree

7 files changed

+43
-16
lines changed

7 files changed

+43
-16
lines changed

clang/include/clang/Basic/Features.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ FEATURE(ptrauth_indirect_gotos, LangOpts.PointerAuthIndirectGotos)
119119
FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini)
120120
FEATURE(ptrauth_init_fini_address_discrimination, LangOpts.PointerAuthInitFiniAddressDiscrimination)
121121
FEATURE(ptrauth_elf_got, LangOpts.PointerAuthELFGOT)
122+
FEATURE(ptrauth_function_pointer_type_discrimination_128, LangOpts.PointerAuthFunctionTypeDiscrimination128)
122123
EXTENSION(swiftcc,
123124
PP.getTargetInfo().checkCallingConvention(CC_Swift) ==
124125
clang::TargetInfo::CCCR_OK)

clang/include/clang/Basic/LangOptions.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ LANGOPT(PointerAuthVTPtrTypeDiscrimination, 1, 0, "incorporate type discriminati
172172
LANGOPT(PointerAuthTypeInfoVTPtrDiscrimination, 1, 0, "incorporate type and address discrimination in authenticated vtable pointers for std::type_info")
173173
BENIGN_LANGOPT(PointerAuthFunctionTypeDiscrimination, 1, 0,
174174
"Use type discrimination when signing function pointers")
175+
LANGOPT(PointerAuthFunctionTypeDiscrimination128, 1, 1,
176+
"Use different discriminators for __int128_t / __uint128_t / _BitInt(n) compared to other integer types when computing function pointer type discriminator")
175177
LANGOPT(PointerAuthInitFini, 1, 0, "sign function pointers in init/fini arrays")
176178
LANGOPT(PointerAuthInitFiniAddressDiscrimination, 1, 0,
177179
"incorporate address discrimination in authenticated function pointers in init/fini arrays")

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4451,6 +4451,8 @@ defm ptrauth_init_fini_address_discrimination : OptInCC1FFlag<"ptrauth-init-fini
44514451
"Enable address discrimination of function pointers in init/fini arrays">;
44524452
defm ptrauth_elf_got : OptInCC1FFlag<"ptrauth-elf-got", "Enable authentication of pointers from GOT (ELF only)">;
44534453
defm aarch64_jump_table_hardening: OptInCC1FFlag<"aarch64-jump-table-hardening", "Use hardened lowering for jump-table dispatch">;
4454+
defm ptrauth_disable_128bit_type_discrimination : OptInCC1FFlag<"ptrauth-disable-128bit-type-discrimination",
4455+
"Do not use different discriminators for __int128_t / __uint128_t / _BitInt(n) compared to other integer types when computing function pointer type discriminator">;
44544456
}
44554457

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

clang/lib/AST/ASTContext.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3399,23 +3399,32 @@ static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx,
33993399
OS << "?";
34003400
return;
34013401

3402-
case Type::BitInt: {
3403-
const auto *BtTy = T->castAs<BitIntType>();
3404-
OS << "D" << (BtTy->isUnsigned() ? "U" : "B") << BtTy->getNumBits() << "_";
3402+
case Type::BitInt:
3403+
if (Ctx.getLangOpts().PointerAuthFunctionTypeDiscrimination128) {
3404+
const auto *BtTy = T->castAs<BitIntType>();
3405+
OS << "D" << (BtTy->isUnsigned() ? "U" : "B") << BtTy->getNumBits()
3406+
<< "_";
3407+
} else
3408+
OS << "?";
34053409
return;
3406-
}
34073410

34083411
case Type::Builtin: {
34093412
const auto *BTy = T->castAs<BuiltinType>();
34103413
const auto Kind = BTy->getKind();
34113414
switch (Kind) {
34123415
#define SIGNED_TYPE(Id, SingletonId) \
34133416
case BuiltinType::Id: \
3414-
OS << (Kind == BuiltinType::Int128 ? "n" : "i"); \
3417+
OS << (Kind == BuiltinType::Int128 && \
3418+
Ctx.getLangOpts().PointerAuthFunctionTypeDiscrimination128 \
3419+
? "n" \
3420+
: "i"); \
34153421
return;
34163422
#define UNSIGNED_TYPE(Id, SingletonId) \
34173423
case BuiltinType::Id: \
3418-
OS << (Kind == BuiltinType::UInt128 ? "o" : "i"); \
3424+
OS << (Kind == BuiltinType::UInt128 && \
3425+
Ctx.getLangOpts().PointerAuthFunctionTypeDiscrimination128 \
3426+
? "o" \
3427+
: "i"); \
34193428
return;
34203429
#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
34213430
#define BUILTIN_TYPE(Id, SingletonId)

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1883,6 +1883,9 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
18831883
Args.addOptInFlag(
18841884
CmdArgs, options::OPT_fptrauth_function_pointer_type_discrimination,
18851885
options::OPT_fno_ptrauth_function_pointer_type_discrimination);
1886+
Args.addOptInFlag(
1887+
CmdArgs, options::OPT_fptrauth_disable_128bit_type_discrimination,
1888+
options::OPT_fno_ptrauth_disable_128bit_type_discrimination);
18861889

18871890
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_indirect_gotos,
18881891
options::OPT_fno_ptrauth_indirect_gotos);

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3544,6 +3544,8 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts,
35443544
GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
35453545
if (Opts.PointerAuthFunctionTypeDiscrimination)
35463546
GenerateArg(Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3547+
if (!Opts.PointerAuthFunctionTypeDiscrimination128)
3548+
GenerateArg(Consumer, OPT_fptrauth_disable_128bit_type_discrimination);
35473549
if (Opts.PointerAuthInitFini)
35483550
GenerateArg(Consumer, OPT_fptrauth_init_fini);
35493551
if (Opts.PointerAuthInitFiniAddressDiscrimination)
@@ -3569,6 +3571,8 @@ static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
35693571
Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
35703572
Opts.PointerAuthFunctionTypeDiscrimination =
35713573
Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
3574+
Opts.PointerAuthFunctionTypeDiscrimination128 =
3575+
!Args.hasArg(OPT_fptrauth_disable_128bit_type_discrimination);
35723576
Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
35733577
Opts.PointerAuthInitFiniAddressDiscrimination =
35743578
Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);

clang/test/CodeGen/ptrauth-function-type-discriminator.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
// RUN: %clang_cc1 -fptrauth-function-pointer-type-discrimination -triple arm64e-apple-ios13 -fptrauth-calls -fptrauth-intrinsics \
2-
// RUN: -disable-llvm-passes -emit-llvm %s -o- | FileCheck --check-prefixes=CHECK,CHECKC %s
2+
// RUN: -disable-llvm-passes -emit-llvm %s -o- | FileCheck --check-prefixes=CHECK,CHECKC,CHECK128 %s
33
// RUN: %clang_cc1 -fptrauth-function-pointer-type-discrimination -triple arm64e-apple-ios13 -fptrauth-calls -fptrauth-intrinsics \
4-
// RUN: -disable-llvm-passes -emit-llvm -xc++ %s -o- | FileCheck --check-prefix=CHECK %s
4+
// RUN: -disable-llvm-passes -emit-llvm -xc++ %s -o- | FileCheck --check-prefixes=CHECK,CHECK128 %s
55
// RUN: %clang_cc1 -fptrauth-function-pointer-type-discrimination -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics -emit-pch %s -o %t.ast
66
// RUN: %clang_cc1 -fptrauth-function-pointer-type-discrimination -triple arm64-apple-ios -fptrauth-calls -fptrauth-intrinsics \
7-
// RUN: -emit-llvm -x ast -o - %t.ast | FileCheck --check-prefixes=CHECK,CHECKC %s
7+
// RUN: -emit-llvm -x ast -o - %t.ast | FileCheck --check-prefixes=CHECK,CHECKC,CHECK128 %s
8+
// RUN: %clang_cc1 -fptrauth-function-pointer-type-discrimination -triple arm64e-apple-ios13 -fptrauth-calls -fptrauth-intrinsics \
9+
// RUN: -fptrauth-disable-128bit-type-discrimination -disable-llvm-passes -emit-llvm %s -o- | FileCheck --check-prefixes=CHECK,CHECKC,CHECKNO128 %s
810

911
// RUN: %clang_cc1 -fptrauth-function-pointer-type-discrimination -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics \
10-
// RUN: -disable-llvm-passes -emit-llvm %s -o- | FileCheck --check-prefixes=CHECK,CHECKC %s
12+
// RUN: -disable-llvm-passes -emit-llvm %s -o- | FileCheck --check-prefixes=CHECK,CHECKC,CHECK128 %s
1113
// RUN: %clang_cc1 -fptrauth-function-pointer-type-discrimination -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics \
12-
// RUN: -disable-llvm-passes -emit-llvm -xc++ %s -o- | FileCheck --check-prefix=CHECK %s
14+
// RUN: -disable-llvm-passes -emit-llvm -xc++ %s -o- | FileCheck --check-prefixes=CHECK,CHECK128 %s
1315
// RUN: %clang_cc1 -fptrauth-function-pointer-type-discrimination -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics -emit-pch %s -o %t.ast
1416
// RUN: %clang_cc1 -fptrauth-function-pointer-type-discrimination -triple aarch64-linux-gnu -fptrauth-calls -fptrauth-intrinsics \
15-
// RUN: -emit-llvm -x ast -o - %t.ast | FileCheck --check-prefixes=CHECK,CHECKC %s
17+
// RUN: -emit-llvm -x ast -o - %t.ast | FileCheck --check-prefixes=CHECK,CHECKC,CHECK128 %s
1618

1719
#ifdef __cplusplus
1820
extern "C" {
@@ -87,10 +89,14 @@ extern void external_function_b8(_BitInt(8));
8789
void (*fptr5)(int) = external_function_int;
8890
void (*fptr6)(char) = external_function_char;
8991

90-
// CHECK: @fptr7 = global ptr ptrauth (ptr @external_function_i128, i32 0, i64 23141)
91-
// CHECK: @fptr8 = global ptr ptrauth (ptr @external_function_u128, i32 0, i64 45743)
92-
// CHECK: @fptr9 = global ptr ptrauth (ptr @external_function_b128, i32 0, i64 17854)
93-
// CHECK: @fptr10 = global ptr ptrauth (ptr @external_function_b8, i32 0, i64 26383)
92+
// CHECK128: @fptr7 = global ptr ptrauth (ptr @external_function_i128, i32 0, i64 23141)
93+
// CHECK128: @fptr8 = global ptr ptrauth (ptr @external_function_u128, i32 0, i64 45743)
94+
// CHECK128: @fptr9 = global ptr ptrauth (ptr @external_function_b128, i32 0, i64 17854)
95+
// CHECK128: @fptr10 = global ptr ptrauth (ptr @external_function_b8, i32 0, i64 26383)
96+
// CHECKNO128: @fptr7 = global ptr ptrauth (ptr @external_function_i128, i32 0, i64 2712)
97+
// CHECKNO128: @fptr8 = global ptr ptrauth (ptr @external_function_u128, i32 0, i64 2712)
98+
// CHECKNO128: @fptr9 = global ptr ptrauth (ptr @external_function_b128, i32 0, i64 41228)
99+
// CHECKNO128: @fptr10 = global ptr ptrauth (ptr @external_function_b8, i32 0, i64 41228)
94100
void (*fptr7)(__int128_t) = external_function_i128;
95101
void (*fptr8)(__uint128_t) = external_function_u128;
96102
void (*fptr9)(_BitInt(128)) = external_function_b128;

0 commit comments

Comments
 (0)