@@ -1442,6 +1442,51 @@ static void setPGOUseInstrumentor(CodeGenOptions &Opts,
14421442bool CompilerInvocation::setDefaultPointerAuthOptions (
14431443 PointerAuthOptions &Opts, const LangOptions &LangOpts,
14441444 const llvm::Triple &Triple) {
1445+ if (LangOpts.SoftPointerAuth ) {
1446+ if (LangOpts.PointerAuthCalls ) {
1447+ using Key = PointerAuthSchema::SoftKey;
1448+ using Discrimination = PointerAuthSchema::Discrimination;
1449+ Opts.FunctionPointers =
1450+ PointerAuthSchema (Key::FunctionPointers, false ,
1451+ LangOpts.FunctionPointerTypeDiscrimination
1452+ ? Discrimination::Type
1453+ : Discrimination::None);
1454+ Opts.BlockInvocationFunctionPointers = PointerAuthSchema (
1455+ Key::BlockInvocationFunctionPointers, true , Discrimination::None);
1456+ Opts.BlockHelperFunctionPointers = PointerAuthSchema (
1457+ Key::BlockHelperFunctionPointers, true , Discrimination::None);
1458+ Opts.BlockByrefHelperFunctionPointers = PointerAuthSchema (
1459+ Key::BlockHelperFunctionPointers, true , Discrimination::None);
1460+ if (LangOpts.PointerAuthBlockDescriptorPointers ) {
1461+ Opts.BlockDescriptorPointers = PointerAuthSchema (
1462+ Key::BlockDescriptorPointers, true , Discrimination::Constant,
1463+ BlockDescriptorConstantDiscriminator);
1464+ }
1465+ Opts.ObjCMethodListFunctionPointers = PointerAuthSchema (
1466+ Key::ObjCMethodListFunctionPointers, true , Discrimination::None);
1467+ Opts.ObjCMethodListPointer = PointerAuthSchema (
1468+ Key::ObjCMethodListPointer, true , Discrimination::Constant,
1469+ MethodListPointerConstantDiscriminator);
1470+ Opts.CXXVTablePointers = PointerAuthSchema (
1471+ Key::CXXVTablePointers,
1472+ LangOpts.PointerAuthVTPtrAddressDiscrimination ,
1473+ LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1474+ : Discrimination::None);
1475+ Opts.CXXTypeInfoVTablePointer = PointerAuthSchema (
1476+ Key::CXXVTablePointers, false , Discrimination::None);
1477+ Opts.CXXVTTVTablePointers = PointerAuthSchema (
1478+ Key::CXXVTablePointers, false , Discrimination::None);
1479+ Opts.CXXVirtualFunctionPointers =
1480+ Opts.CXXVirtualVariadicFunctionPointers = PointerAuthSchema (
1481+ Key::CXXVirtualFunctionPointers, true , Discrimination::Decl);
1482+ Opts.CXXMemberFunctionPointers = PointerAuthSchema (
1483+ Key::CXXMemberFunctionPointers, false , Discrimination::Type);
1484+ }
1485+ Opts.ReturnAddresses = LangOpts.PointerAuthReturns ;
1486+ Opts.AuthTraps = LangOpts.PointerAuthAuthTraps ;
1487+ return true ;
1488+ }
1489+
14451490 if (Triple.getArch () == llvm::Triple::aarch64) {
14461491 if (LangOpts.PointerAuthCalls ) {
14471492 using Key = PointerAuthSchema::ARM8_3Key;
@@ -3346,6 +3391,8 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts,
33463391 GenerateArg (Consumer, OPT_fptrauth_vtable_pointer_type_discrimination);
33473392 if (Opts.FunctionPointerTypeDiscrimination )
33483393 GenerateArg (Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3394+ if (Opts.SoftPointerAuth )
3395+ GenerateArg (Consumer, OPT_fptrauth_soft);
33493396 if (Opts.PointerAuthBlockDescriptorPointers )
33503397 GenerateArg (Consumer, OPT_fptrauth_block_descriptor_pointers);
33513398
@@ -3367,6 +3414,7 @@ static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
33673414 Args.hasArg (OPT_fptrauth_vtable_pointer_address_discrimination);
33683415 Opts.PointerAuthVTPtrTypeDiscrimination =
33693416 Args.hasArg (OPT_fptrauth_vtable_pointer_type_discrimination);
3417+ Opts.SoftPointerAuth = Args.hasArg (OPT_fptrauth_soft);
33703418 Opts.PointerAuthBlockDescriptorPointers =
33713419 Args.hasArg (OPT_fptrauth_block_descriptor_pointers);
33723420
0 commit comments