@@ -1201,13 +1201,48 @@ void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
12011201 }
12021202}
12031203
1204+ static bool useObjCIsaPtrauth (const Darwin &D) {
1205+ VersionTuple TargetVersion = D.getTripleTargetVersion ();
1206+ if (D.isTargetMacCatalyst () || D.TargetEnvironment == Darwin::Simulator)
1207+ return true ;
1208+ switch (D.TargetPlatform ) {
1209+ case Darwin::IPhoneOS:
1210+ case Darwin::TvOS:
1211+ return TargetVersion >= VersionTuple (14 , 5 , 0 );
1212+ case Darwin::WatchOS:
1213+ case Darwin::MacOS:
1214+ case Darwin::DriverKit:
1215+ return true ;
1216+ case Darwin::XROS:
1217+ return true ;
1218+ }
1219+ }
1220+
1221+ static bool useCXXVTablePtrTypeAddressDiscrimination (const Darwin& D) {
1222+ VersionTuple TargetVersion = D.getTripleTargetVersion ();
1223+ if (D.isTargetMacCatalyst ())
1224+ return true ;
1225+ switch (D.TargetPlatform ) {
1226+ case Darwin::IPhoneOS:
1227+ case Darwin::TvOS:
1228+ return TargetVersion >= VersionTuple (15 , 0 , 0 );
1229+ case Darwin::WatchOS:
1230+ case Darwin::MacOS:
1231+ case Darwin::DriverKit:
1232+ return true ;
1233+ case Darwin::XROS:
1234+ return true ;
1235+ }
1236+ }
1237+
12041238void DarwinClang::addClangTargetOptions (
12051239 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
12061240 Action::OffloadKind DeviceOffloadKind) const {
12071241
12081242 Darwin::addClangTargetOptions (DriverArgs, CC1Args, DeviceOffloadKind);
12091243
1210- // On arm64e, enable pointer authentication intrinsics.
1244+ // On arm64e, enable pointer authentication (for the return address and
1245+ // indirect calls), as well as usage of the intrinsics.
12111246 if (getTriple ().isArm64e ()) {
12121247 // The ptrauth ABI version is 0 by default, but can be overridden.
12131248 static const constexpr unsigned DefaultPtrauthABIVersion = 0 ;
@@ -1241,9 +1276,87 @@ void DarwinClang::addClangTargetOptions(
12411276 CC1Args.push_back (" -fptrauth-kernel-abi-version" );
12421277 }
12431278
1279+ if (!DriverArgs.hasArg (options::OPT_fptrauth_returns,
1280+ options::OPT_fno_ptrauth_returns))
1281+ CC1Args.push_back (" -fptrauth-returns" );
1282+
12441283 if (!DriverArgs.hasArg (options::OPT_fptrauth_intrinsics,
12451284 options::OPT_fno_ptrauth_intrinsics))
12461285 CC1Args.push_back (" -fptrauth-intrinsics" );
1286+
1287+ if (!DriverArgs.hasArg (options::OPT_fptrauth_calls,
1288+ options::OPT_fno_ptrauth_calls))
1289+ CC1Args.push_back (" -fptrauth-calls" );
1290+
1291+ if (!DriverArgs.hasArg (options::OPT_fptrauth_indirect_gotos,
1292+ options::OPT_fno_ptrauth_indirect_gotos))
1293+ CC1Args.push_back (" -fptrauth-indirect-gotos" );
1294+
1295+ if (!DriverArgs.hasArg (options::OPT_fptrauth_auth_traps,
1296+ options::OPT_fno_ptrauth_auth_traps))
1297+ CC1Args.push_back (" -fptrauth-auth-traps" );
1298+
1299+ if (!DriverArgs.hasArg (options::OPT_fassume_unique_vtables,
1300+ options::OPT_fno_assume_unique_vtables))
1301+ CC1Args.push_back (" -fno-assume-unique-vtables" );
1302+
1303+ if (useCXXVTablePtrTypeAddressDiscrimination (*this )) {
1304+ if (!DriverArgs.hasArg (
1305+ options::OPT_fptrauth_vtable_pointer_address_discrimination,
1306+ options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
1307+ CC1Args.push_back (" -fptrauth-vtable-pointer-address-discrimination" );
1308+
1309+ if (!DriverArgs.hasArg (
1310+ options::OPT_fptrauth_vtable_pointer_type_discrimination,
1311+ options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
1312+ CC1Args.push_back (" -fptrauth-vtable-pointer-type-discrimination" );
1313+ }
1314+
1315+ if (!DriverArgs.hasArg (options::OPT_fptrauth_objc_isa,
1316+ options::OPT_fno_ptrauth_objc_isa)) {
1317+ if (useObjCIsaPtrauth (*this ))
1318+ CC1Args.push_back (" -fptrauth-objc-isa-mode=sign-and-auth" );
1319+ else
1320+ CC1Args.push_back (" -fptrauth-objc-isa-mode=sign-and-strip" );
1321+ }
1322+
1323+ if (DriverArgs.hasArg (options::OPT_fapple_kext) ||
1324+ DriverArgs.hasArg (options::OPT_mkernel) || isTargetDriverKit ()) {
1325+ if (!DriverArgs.hasArg (
1326+ options::OPT_fptrauth_block_descriptor_pointers,
1327+ options::OPT_fno_ptrauth_block_descriptor_pointers))
1328+ CC1Args.push_back (" -fptrauth-block-descriptor-pointers" );
1329+
1330+ if (!DriverArgs.hasArg (
1331+ options::OPT_fptrauth_vtable_pointer_address_discrimination,
1332+ options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
1333+ CC1Args.push_back (" -fptrauth-vtable-pointer-address-discrimination" );
1334+
1335+ if (!DriverArgs.hasArg (
1336+ options::OPT_fptrauth_vtable_pointer_type_discrimination,
1337+ options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
1338+ CC1Args.push_back (" -fptrauth-vtable-pointer-type-discrimination" );
1339+
1340+ if (!DriverArgs.hasArg (
1341+ options::OPT_fptrauth_function_pointer_type_discrimination,
1342+ options::OPT_fno_ptrauth_function_pointer_type_discrimination))
1343+ CC1Args.push_back (" -fptrauth-function-pointer-type-discrimination" );
1344+ }
1345+
1346+ if (DriverArgs.hasArg (options::OPT_fapple_kext) ||
1347+ DriverArgs.hasArg (options::OPT_mkernel)) {
1348+ // -fbranch-target-identification is a driver flag and isn't honored
1349+ // by -cc1. For arm64e, -mbranch-target-enforce is the -cc1 spelling,
1350+ // derived from non-arm64e -mbranch-protection=.
1351+ // Catch all 3 here anyway.
1352+ if (!DriverArgs.hasArg (options::OPT_fbranch_target_identification,
1353+ options::OPT_fno_branch_target_identification) &&
1354+ !DriverArgs.hasArg (options::OPT_mbranch_target_enforce) &&
1355+ !DriverArgs.hasArg (options::OPT_mbranch_protection_EQ)) {
1356+ CC1Args.push_back (" -mbranch-target-enforce" );
1357+ }
1358+ }
1359+
12471360 }
12481361}
12491362
0 commit comments