Skip to content

Commit 41cde46

Browse files
authoredDec 5, 2024
[PAC][Driver] Add -faarch64-jump-table-hardening flag (#113149)
The flag is placed together with pointer authentication flags since they serve the same security purpose of protecting against attacks on control flow. The flag is not ABI-affecting and might be enabled separately if needed, but it's also intended to be enabled as part of pauth-enabled environments (e.g. pauthtest). See also codegen implementation #97666.
1 parent fd3907c commit 41cde46

File tree

8 files changed

+25
-3
lines changed

8 files changed

+25
-3
lines changed
 

‎clang/include/clang/Basic/LangOptions.def

+1
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ LANGOPT(PointerAuthInitFini, 1, 0, "sign function pointers in init/fini arrays")
178178
LANGOPT(PointerAuthInitFiniAddressDiscrimination, 1, 0,
179179
"incorporate address discrimination in authenticated function pointers in init/fini arrays")
180180
LANGOPT(PointerAuthELFGOT, 1, 0, "authenticate pointers from GOT")
181+
LANGOPT(AArch64JumpTableHardening, 1, 0, "use hardened lowering for jump-table dispatch")
181182

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

‎clang/include/clang/Basic/PointerAuthOptions.h

+3
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ struct PointerAuthOptions {
172172
/// Do indirect goto label addresses need to be authenticated?
173173
bool IndirectGotos = false;
174174

175+
/// Use hardened lowering for jump-table dispatch?
176+
bool AArch64JumpTableHardening = false;
177+
175178
/// The ABI for C function pointers.
176179
PointerAuthSchema FunctionPointers;
177180

‎clang/include/clang/Driver/Options.td

+1
Original file line numberDiff line numberDiff line change
@@ -4353,6 +4353,7 @@ defm ptrauth_init_fini : OptInCC1FFlag<"ptrauth-init-fini", "Enable signing of f
43534353
defm ptrauth_init_fini_address_discrimination : OptInCC1FFlag<"ptrauth-init-fini-address-discrimination",
43544354
"Enable address discrimination of function pointers in init/fini arrays">;
43554355
defm ptrauth_elf_got : OptInCC1FFlag<"ptrauth-elf-got", "Enable authentication of pointers from GOT (ELF only)">;
4356+
defm aarch64_jump_table_hardening: OptInCC1FFlag<"aarch64-jump-table-hardening", "Use hardened lowering for jump-table dispatch">;
43564357
}
43574358

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

‎clang/lib/CodeGen/CodeGenFunction.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,8 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
899899
Fn->addFnAttr("ptrauth-auth-traps");
900900
if (CodeGenOpts.PointerAuth.IndirectGotos)
901901
Fn->addFnAttr("ptrauth-indirect-gotos");
902+
if (CodeGenOpts.PointerAuth.AArch64JumpTableHardening)
903+
Fn->addFnAttr("aarch64-jump-table-hardening");
902904

903905
// Apply xray attributes to the function (as a string, for now)
904906
bool AlwaysXRayAttr = false;

‎clang/lib/Driver/ToolChains/Clang.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1876,6 +1876,8 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
18761876
Args.addOptInFlag(CmdArgs,
18771877
options::OPT_fptrauth_init_fini_address_discrimination,
18781878
options::OPT_fno_ptrauth_init_fini_address_discrimination);
1879+
Args.addOptInFlag(CmdArgs, options::OPT_faarch64_jump_table_hardening,
1880+
options::OPT_fno_aarch64_jump_table_hardening);
18791881
}
18801882

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

‎clang/lib/Frontend/CompilerInvocation.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -1511,14 +1511,16 @@ void CompilerInvocation::setDefaultPointerAuthOptions(
15111511
Opts.ReturnAddresses = LangOpts.PointerAuthReturns;
15121512
Opts.AuthTraps = LangOpts.PointerAuthAuthTraps;
15131513
Opts.IndirectGotos = LangOpts.PointerAuthIndirectGotos;
1514+
Opts.AArch64JumpTableHardening = LangOpts.AArch64JumpTableHardening;
15141515
}
15151516

15161517
static void parsePointerAuthOptions(PointerAuthOptions &Opts,
15171518
const LangOptions &LangOpts,
15181519
const llvm::Triple &Triple,
15191520
DiagnosticsEngine &Diags) {
15201521
if (!LangOpts.PointerAuthCalls && !LangOpts.PointerAuthReturns &&
1521-
!LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos)
1522+
!LangOpts.PointerAuthAuthTraps && !LangOpts.PointerAuthIndirectGotos &&
1523+
!LangOpts.AArch64JumpTableHardening)
15221524
return;
15231525

15241526
CompilerInvocation::setDefaultPointerAuthOptions(Opts, LangOpts, Triple);
@@ -3454,6 +3456,8 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts,
34543456
GenerateArg(Consumer, OPT_fptrauth_init_fini_address_discrimination);
34553457
if (Opts.PointerAuthELFGOT)
34563458
GenerateArg(Consumer, OPT_fptrauth_elf_got);
3459+
if (Opts.AArch64JumpTableHardening)
3460+
GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
34573461
}
34583462

34593463
static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
@@ -3475,6 +3479,8 @@ static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
34753479
Opts.PointerAuthInitFiniAddressDiscrimination =
34763480
Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
34773481
Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
3482+
Opts.AArch64JumpTableHardening =
3483+
Args.hasArg(OPT_faarch64_jump_table_hardening);
34783484
}
34793485

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

‎clang/test/CodeGen/ptrauth-function-attributes.c

+5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
// RUN: %clang_cc1 -triple arm64-apple-ios -fptrauth-indirect-gotos -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,GOTOS
1515
// RUN: %clang_cc1 -triple aarch64-linux-gnu -fptrauth-indirect-gotos -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,GOTOS
1616

17+
// RUN: %clang_cc1 -triple arm64e-apple-ios -faarch64-jump-table-hardening -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,JMPTBL
18+
// RUN: %clang_cc1 -triple aarch64-linux-gnu -faarch64-jump-table-hardening -emit-llvm %s -o - | FileCheck %s --check-prefixes=ALL,JMPTBL
19+
1720
// ALL: define {{(dso_local )?}}void @test() #0
1821
void test() {
1922
}
@@ -26,4 +29,6 @@ void test() {
2629

2730
// GOTOS: attributes #0 = {{{.*}} "ptrauth-indirect-gotos" {{.*}}}
2831

32+
// JMPTBL: attributes #0 = {{{.*}} "aarch64-jump-table-hardening" {{.*}}}
33+
2934
// OFF-NOT: attributes {{.*}} "ptrauth-

‎clang/test/Driver/aarch64-ptrauth.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
// RUN: -fno-ptrauth-indirect-gotos -fptrauth-indirect-gotos \
1616
// RUN: -fno-ptrauth-init-fini -fptrauth-init-fini \
1717
// RUN: -fno-ptrauth-init-fini-address-discrimination -fptrauth-init-fini-address-discrimination \
18+
// RUN: -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
1819
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL
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"
20+
// 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" "-faarch64-jump-table-hardening"
2021

2122
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
2223
// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
@@ -38,7 +39,7 @@
3839
// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
3940
// RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \
4041
// 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
42+
// RUN: -fptrauth-init-fini-address-discrimination -faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=ERR1
4243
// ERR1: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}'
4344
// ERR1-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}'
4445
// ERR1-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}'
@@ -49,6 +50,7 @@
4950
// ERR1-NEXT: error: unsupported option '-fptrauth-indirect-gotos' for target '{{.*}}'
5051
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini' for target '{{.*}}'
5152
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini-address-discrimination' for target '{{.*}}'
53+
// ERR1-NEXT: error: unsupported option '-faarch64-jump-table-hardening' for target '{{.*}}'
5254

5355
//// Only support PAuth ABI for Linux as for now.
5456
// 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)