Skip to content

Commit 49c53ab

Browse files
committed
[Clang][Driver] Add arm64e support for Swift’s "-none-macho" target triples in Clang Driver
This change moves arm64e pointer authentication flag computation the the DarwinClang toolchain to the base MachO toolchain. This makes the logic apply to all Mach-O target triples, not just Darwin ones.
1 parent 8bd44a7 commit 49c53ab

File tree

2 files changed

+71
-57
lines changed

2 files changed

+71
-57
lines changed

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 67 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,65 +1292,9 @@ void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
12921292

12931293
void DarwinClang::addClangTargetOptions(
12941294
const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1295-
Action::OffloadKind DeviceOffloadKind) const{
1295+
Action::OffloadKind DeviceOffloadKind) const {
12961296

12971297
Darwin::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
1298-
1299-
// On arm64e, enable pointer authentication (for the return address and
1300-
// indirect calls), as well as usage of the intrinsics.
1301-
if (getArchName() == "arm64e") {
1302-
// The ptrauth ABI version is 0 by default, but can be overridden.
1303-
static const constexpr unsigned DefaultPtrauthABIVersion = 0;
1304-
1305-
unsigned PtrAuthABIVersion = DefaultPtrauthABIVersion;
1306-
const Arg *A = DriverArgs.getLastArg(options::OPT_fptrauth_abi_version_EQ,
1307-
options::OPT_fno_ptrauth_abi_version);
1308-
bool HasVersionArg =
1309-
A && A->getOption().matches(options::OPT_fptrauth_abi_version_EQ);
1310-
if (HasVersionArg) {
1311-
unsigned PtrAuthABIVersionArg;
1312-
if (StringRef(A->getValue()).getAsInteger(10, PtrAuthABIVersionArg))
1313-
getDriver().Diag(diag::err_drv_invalid_value)
1314-
<< A->getAsString(DriverArgs) << A->getValue();
1315-
else
1316-
PtrAuthABIVersion = PtrAuthABIVersionArg;
1317-
}
1318-
1319-
// Pass the ABI version to -cc1, regardless of its value, if the user asked
1320-
// for it or if the user didn't explicitly disable it.
1321-
if (HasVersionArg ||
1322-
!DriverArgs.hasArg(options::OPT_fno_ptrauth_abi_version)) {
1323-
CC1Args.push_back(DriverArgs.MakeArgString(
1324-
"-fptrauth-abi-version=" + llvm::utostr(PtrAuthABIVersion)));
1325-
1326-
// -f(no-)ptrauth-kernel-abi-version can override -mkernel and
1327-
// -fapple-kext
1328-
if (DriverArgs.hasArg(options::OPT_fptrauth_kernel_abi_version,
1329-
options::OPT_mkernel, options::OPT_fapple_kext) &&
1330-
!DriverArgs.hasArg(options::OPT_fno_ptrauth_kernel_abi_version))
1331-
CC1Args.push_back("-fptrauth-kernel-abi-version");
1332-
}
1333-
1334-
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
1335-
options::OPT_fno_ptrauth_returns))
1336-
CC1Args.push_back("-fptrauth-returns");
1337-
1338-
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
1339-
options::OPT_fno_ptrauth_intrinsics))
1340-
CC1Args.push_back("-fptrauth-intrinsics");
1341-
1342-
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
1343-
options::OPT_fno_ptrauth_calls))
1344-
CC1Args.push_back("-fptrauth-calls");
1345-
1346-
if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
1347-
options::OPT_fno_ptrauth_indirect_gotos))
1348-
CC1Args.push_back("-fptrauth-indirect-gotos");
1349-
1350-
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
1351-
options::OPT_fno_ptrauth_auth_traps))
1352-
CC1Args.push_back("-fptrauth-auth-traps");
1353-
}
13541298
}
13551299

13561300
/// Take a path that speculatively points into Xcode and return the
@@ -3216,9 +3160,75 @@ bool Darwin::isSizedDeallocationUnavailable() const {
32163160
return TargetVersion < sizedDeallocMinVersion(OS);
32173161
}
32183162

3163+
void MachO::addClangTargetOptions(
3164+
const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3165+
Action::OffloadKind DeviceOffloadKind) const {
3166+
3167+
ToolChain::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
3168+
3169+
// On arm64e, enable pointer authentication (for the return address and
3170+
// indirect calls), as well as usage of the intrinsics.
3171+
if (getArchName() == "arm64e") {
3172+
// The ptrauth ABI version is 0 by default, but can be overridden.
3173+
static const constexpr unsigned DefaultPtrauthABIVersion = 0;
3174+
3175+
unsigned PtrAuthABIVersion = DefaultPtrauthABIVersion;
3176+
const Arg *A = DriverArgs.getLastArg(options::OPT_fptrauth_abi_version_EQ,
3177+
options::OPT_fno_ptrauth_abi_version);
3178+
bool HasVersionArg =
3179+
A && A->getOption().matches(options::OPT_fptrauth_abi_version_EQ);
3180+
if (HasVersionArg) {
3181+
unsigned PtrAuthABIVersionArg;
3182+
if (StringRef(A->getValue()).getAsInteger(10, PtrAuthABIVersionArg))
3183+
getDriver().Diag(diag::err_drv_invalid_value)
3184+
<< A->getAsString(DriverArgs) << A->getValue();
3185+
else
3186+
PtrAuthABIVersion = PtrAuthABIVersionArg;
3187+
}
3188+
3189+
// Pass the ABI version to -cc1, regardless of its value, if the user asked
3190+
// for it or if the user didn't explicitly disable it.
3191+
if (HasVersionArg ||
3192+
!DriverArgs.hasArg(options::OPT_fno_ptrauth_abi_version)) {
3193+
CC1Args.push_back(DriverArgs.MakeArgString(
3194+
"-fptrauth-abi-version=" + llvm::utostr(PtrAuthABIVersion)));
3195+
3196+
// -f(no-)ptrauth-kernel-abi-version can override -mkernel and
3197+
// -fapple-kext
3198+
if (DriverArgs.hasArg(options::OPT_fptrauth_kernel_abi_version,
3199+
options::OPT_mkernel, options::OPT_fapple_kext) &&
3200+
!DriverArgs.hasArg(options::OPT_fno_ptrauth_kernel_abi_version))
3201+
CC1Args.push_back("-fptrauth-kernel-abi-version");
3202+
}
3203+
3204+
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3205+
options::OPT_fno_ptrauth_returns))
3206+
CC1Args.push_back("-fptrauth-returns");
3207+
3208+
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3209+
options::OPT_fno_ptrauth_intrinsics))
3210+
CC1Args.push_back("-fptrauth-intrinsics");
3211+
3212+
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3213+
options::OPT_fno_ptrauth_calls))
3214+
CC1Args.push_back("-fptrauth-calls");
3215+
3216+
if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3217+
options::OPT_fno_ptrauth_indirect_gotos))
3218+
CC1Args.push_back("-fptrauth-indirect-gotos");
3219+
3220+
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3221+
options::OPT_fno_ptrauth_auth_traps))
3222+
CC1Args.push_back("-fptrauth-auth-traps");
3223+
}
3224+
}
3225+
32193226
void Darwin::addClangTargetOptions(
32203227
const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
32213228
Action::OffloadKind DeviceOffloadKind) const {
3229+
3230+
MachO::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
3231+
32223232
// Pass "-faligned-alloc-unavailable" only when the user hasn't manually
32233233
// enabled or disabled aligned allocations.
32243234
if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,

clang/lib/Driver/ToolChains/Darwin.h

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

147+
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
148+
llvm::opt::ArgStringList &CC1Args,
149+
Action::OffloadKind DeviceOffloadKind) const override;
150+
147151
private:
148152
mutable std::unique_ptr<tools::darwin::Lipo> Lipo;
149153
mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil;

0 commit comments

Comments
 (0)