Skip to content

Commit c4bc1b1

Browse files
authored
[clang] Update Mach-O ptrauth driver defaults (#132834)
Xcode clang default-enables a bunch of ptrauth flags when targeting arm64e. Let's match that.
1 parent 4cdcf3b commit c4bc1b1

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,13 @@ void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
12011201
}
12021202
}
12031203

1204+
void DarwinClang::addClangTargetOptions(
1205+
const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1206+
Action::OffloadKind DeviceOffloadKind) const {
1207+
1208+
Darwin::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
1209+
}
1210+
12041211
/// Take a path that speculatively points into Xcode and return the
12051212
/// `XCODE/Contents/Developer` path if it is an Xcode path, or an empty path
12061213
/// otherwise.
@@ -3056,9 +3063,43 @@ bool Darwin::isSizedDeallocationUnavailable() const {
30563063
return TargetVersion < sizedDeallocMinVersion(OS);
30573064
}
30583065

3066+
void MachO::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3067+
llvm::opt::ArgStringList &CC1Args,
3068+
Action::OffloadKind DeviceOffloadKind) const {
3069+
3070+
ToolChain::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
3071+
3072+
// On arm64e, enable pointer authentication (for the return address and
3073+
// indirect calls), as well as usage of the intrinsics.
3074+
if (getArchName() == "arm64e") {
3075+
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3076+
options::OPT_fno_ptrauth_returns))
3077+
CC1Args.push_back("-fptrauth-returns");
3078+
3079+
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3080+
options::OPT_fno_ptrauth_intrinsics))
3081+
CC1Args.push_back("-fptrauth-intrinsics");
3082+
3083+
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3084+
options::OPT_fno_ptrauth_calls))
3085+
CC1Args.push_back("-fptrauth-calls");
3086+
3087+
if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3088+
options::OPT_fno_ptrauth_indirect_gotos))
3089+
CC1Args.push_back("-fptrauth-indirect-gotos");
3090+
3091+
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3092+
options::OPT_fno_ptrauth_auth_traps))
3093+
CC1Args.push_back("-fptrauth-auth-traps");
3094+
}
3095+
}
3096+
30593097
void Darwin::addClangTargetOptions(
30603098
const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
30613099
Action::OffloadKind DeviceOffloadKind) const {
3100+
3101+
MachO::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
3102+
30623103
// Pass "-faligned-alloc-unavailable" only when the user hasn't manually
30633104
// enabled or disabled aligned allocations.
30643105
if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,

clang/lib/Driver/ToolChains/Darwin.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ class LLVM_LIBRARY_VISIBILITY MachO : public ToolChain {
145145
Tool *buildStaticLibTool() const override;
146146
Tool *getTool(Action::ActionClass AC) const override;
147147

148+
void
149+
addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
150+
llvm::opt::ArgStringList &CC1Args,
151+
Action::OffloadKind DeviceOffloadKind) const override;
152+
148153
private:
149154
mutable std::unique_ptr<tools::darwin::Lipo> Lipo;
150155
mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil;
@@ -653,6 +658,11 @@ class LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin {
653658

654659
void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;
655660

661+
void
662+
addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
663+
llvm::opt::ArgStringList &CC1Args,
664+
Action::OffloadKind DeviceOffloadKind) const override;
665+
656666
void AddLinkARCArgs(const llvm::opt::ArgList &Args,
657667
llvm::opt::ArgStringList &CmdArgs) const override;
658668

clang/test/Driver/arch-arm64e.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// Check that we can manually enable specific ptrauth features.
2+
3+
// RUN: %clang -target arm64-apple-darwin -c %s -### 2>&1 | FileCheck %s --check-prefix NONE
4+
// NONE: "-cc1"
5+
// NONE-NOT: "-fptrauth-intrinsics"
6+
// NONE-NOT: "-fptrauth-calls"
7+
// NONE-NOT: "-fptrauth-returns"
8+
// NONE-NOT: "-fptrauth-indirect-gotos"
9+
// NONE-NOT: "-fptrauth-auth-traps"
10+
11+
// RUN: %clang -target arm64-apple-darwin -fptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix CALL
12+
// CALL: "-cc1"{{.*}} {{.*}} "-fptrauth-calls"
13+
14+
// RUN: %clang -target arm64-apple-darwin -fptrauth-intrinsics -c %s -### 2>&1 | FileCheck %s --check-prefix INTRIN
15+
// INTRIN: "-cc1"{{.*}} {{.*}} "-fptrauth-intrinsics"
16+
17+
// RUN: %clang -target arm64-apple-darwin -fptrauth-returns -c %s -### 2>&1 | FileCheck %s --check-prefix RETURN
18+
// RETURN: "-cc1"{{.*}} {{.*}} "-fptrauth-returns"
19+
20+
// RUN: %clang -target arm64-apple-darwin -fptrauth-indirect-gotos -c %s -### 2>&1 | FileCheck %s --check-prefix INDGOTO
21+
// INDGOTO: "-cc1"{{.*}} {{.*}} "-fptrauth-indirect-gotos"
22+
23+
// RUN: %clang -target arm64-apple-darwin -fptrauth-auth-traps -c %s -### 2>&1 | FileCheck %s --check-prefix TRAPS
24+
// TRAPS: "-cc1"{{.*}} {{.*}} "-fptrauth-auth-traps"
25+
26+
27+
// Check the arm64e defaults.
28+
29+
// RUN: %clang -target arm64e-apple-ios -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT
30+
// RUN: %clang -mkernel -target arm64e-apple-ios -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT
31+
// RUN: %clang -fapple-kext -target arm64e-apple-ios -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT
32+
// DEFAULT: "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"{{.*}}
33+
34+
// RUN: %clang -target arm64e-apple-none-macho -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT-MACHO
35+
// DEFAULT-MACHO: "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"{{.*}}
36+
37+
38+
// RUN: %clang -target arm64e-apple-ios -fno-ptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT-NOCALL
39+
// RUN: %clang -mkernel -target arm64e-apple-ios -fno-ptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT-NOCALL
40+
// RUN: %clang -fapple-kext -target arm64e-apple-ios -fno-ptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT-NOCALL
41+
// DEFAULT-NOCALL-NOT: "-fptrauth-calls"
42+
// DEFAULT-NOCALL: "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"
43+
44+
45+
// RUN: %clang -target arm64e-apple-ios -fno-ptrauth-returns -c %s -### 2>&1 | FileCheck %s --check-prefix NORET
46+
47+
// NORET-NOT: "-fptrauth-returns"
48+
// NORET: "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"
49+
50+
// RUN: %clang -target arm64e-apple-ios -fno-ptrauth-intrinsics -c %s -### 2>&1 | FileCheck %s --check-prefix NOINTRIN
51+
52+
// NOINTRIN: "-fptrauth-returns"
53+
// NOINTRIN-NOT: "-fptrauth-intrinsics"
54+
// NOINTRIN: "-fptrauth-calls" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"{{.*}}
55+
56+
57+
// RUN: %clang -target arm64e-apple-ios -fno-ptrauth-auth-traps -c %s -### 2>&1 | FileCheck %s --check-prefix NOTRAP
58+
// NOTRAP: "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-indirect-gotos" {{.*}}"-target-cpu" "apple-a12"
59+
60+
61+
// Check the CPU defaults and overrides.
62+
63+
// RUN: %clang -target arm64e-apple-ios -c %s -### 2>&1 | FileCheck %s --check-prefix APPLE-A12
64+
// RUN: %clang -target arm64e-apple-ios -mcpu=apple-a13 -c %s -### 2>&1 | FileCheck %s --check-prefix APPLE-A13
65+
// APPLE-A12: "-cc1"{{.*}} "-target-cpu" "apple-a12"
66+
// APPLE-A13: "-cc1"{{.*}} "-target-cpu" "apple-a13"

0 commit comments

Comments
 (0)