@@ -1524,6 +1524,66 @@ static void setPGOUseInstrumentor(CodeGenOptions &Opts,
15241524void CompilerInvocation::setDefaultPointerAuthOptions (
15251525 PointerAuthOptions &Opts, const LangOptions &LangOpts,
15261526 const llvm::Triple &Triple) {
1527+
1528+ if (LangOpts.SoftPointerAuth ) {
1529+ if (LangOpts.PointerAuthCalls ) {
1530+ using Key = PointerAuthSchema::SoftKey;
1531+ using Discrimination = PointerAuthSchema::Discrimination;
1532+ Opts.FunctionPointers =
1533+ PointerAuthSchema (Key::FunctionPointers, false ,
1534+ LangOpts.PointerAuthFunctionTypeDiscrimination
1535+ ? Discrimination::Type
1536+ : Discrimination::None);
1537+
1538+ Opts.CXXVTablePointers = PointerAuthSchema (
1539+ Key::CXXVTablePointers,
1540+ LangOpts.PointerAuthVTPtrAddressDiscrimination ,
1541+ LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type
1542+ : Discrimination::None);
1543+ Opts.CXXTypeInfoVTablePointer = PointerAuthSchema (
1544+ Key::CXXVTablePointers, false , Discrimination::None);
1545+ Opts.CXXVTTVTablePointers = PointerAuthSchema (
1546+ Key::CXXVTablePointers, false , Discrimination::None);
1547+ Opts.CXXVirtualFunctionPointers =
1548+ Opts.CXXVirtualVariadicFunctionPointers = PointerAuthSchema (
1549+ Key::CXXVirtualFunctionPointers, true , Discrimination::Decl);
1550+ Opts.CXXMemberFunctionPointers = PointerAuthSchema (
1551+ Key::CXXMemberFunctionPointers, false , Discrimination::Type);
1552+
1553+ Opts.BlockInvocationFunctionPointers = PointerAuthSchema (
1554+ Key::BlockInvocationFunctionPointers, true , Discrimination::None);
1555+ Opts.BlockHelperFunctionPointers = PointerAuthSchema (
1556+ Key::BlockHelperFunctionPointers, true , Discrimination::None);
1557+ Opts.BlockByrefHelperFunctionPointers = PointerAuthSchema (
1558+ Key::BlockHelperFunctionPointers, true , Discrimination::None);
1559+ if (LangOpts.PointerAuthBlockDescriptorPointers )
1560+ Opts.BlockDescriptorPointers = PointerAuthSchema (
1561+ Key::BlockDescriptorPointers, true , Discrimination::Constant,
1562+ BlockDescriptorConstantDiscriminator);
1563+
1564+ Opts.ObjCMethodListFunctionPointers = PointerAuthSchema (
1565+ Key::ObjCMethodListFunctionPointers, true , Discrimination::None);
1566+ Opts.ObjCMethodListPointer = PointerAuthSchema (
1567+ Key::ObjCMethodListPointer, true , Discrimination::Constant,
1568+ MethodListPointerConstantDiscriminator);
1569+
1570+ auto IsaAuthenticationMode =
1571+ LangOpts.getPointerAuthObjcIsaAuthentication ();
1572+ if (IsaAuthenticationMode != PointerAuthenticationMode::None) {
1573+ Opts.ObjCIsaPointers = PointerAuthSchema (
1574+ Key::ObjCIsaPointer, true , IsaAuthenticationMode,
1575+ Discrimination::Constant, IsaPointerConstantDiscriminator, true );
1576+ Opts.ObjCSuperPointers = PointerAuthSchema (
1577+ Key::ObjCIsaPointer, true , IsaAuthenticationMode,
1578+ Discrimination::Constant, SuperPointerConstantDiscriminator);
1579+ }
1580+ }
1581+ Opts.ReturnAddresses = LangOpts.PointerAuthReturns ;
1582+ Opts.IndirectGotos = LangOpts.PointerAuthIndirectGotos ;
1583+ Opts.AuthTraps = LangOpts.PointerAuthAuthTraps ;
1584+ return ;
1585+ }
1586+
15271587 assert (Triple.getArch () == llvm::Triple::aarch64);
15281588 if (LangOpts.PointerAuthCalls ) {
15291589 using Key = PointerAuthSchema::ARM8_3Key;
@@ -3558,6 +3618,8 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts,
35583618 GenerateArg (Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination);
35593619 if (Opts.PointerAuthFunctionTypeDiscrimination )
35603620 GenerateArg (Consumer, OPT_fptrauth_function_pointer_type_discrimination);
3621+ if (Opts.SoftPointerAuth )
3622+ GenerateArg (Consumer, OPT_fptrauth_soft);
35613623 if (Opts.PointerAuthBlockDescriptorPointers )
35623624 GenerateArg (Consumer, OPT_fptrauth_block_descriptor_pointers);
35633625
@@ -3650,6 +3712,8 @@ static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
36503712 Opts.PointerAuthABIVersion =
36513713 getLastArgIntValue (Args, OPT_fptrauth_abi_version_EQ, 0 , Diags);
36523714 Opts.PointerAuthKernelABIVersion = Args.hasArg (OPT_fptrauth_kernel_abi_version);
3715+
3716+ Opts.SoftPointerAuth = Args.hasArg (OPT_fptrauth_soft);
36533717}
36543718
36553719// / Check if input file kind and language standard are compatible.
0 commit comments