[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
kovdan01 wrote: Ping: would be glad to see feedback on the changes from those who are interested. https://github.com/llvm/llvm-project/pull/96160 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
kovdan01 wrote: Ping: would be glad to see feedback on the changes from those who are interested. https://github.com/llvm/llvm-project/pull/96160 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
kovdan01 wrote: @MaskRay @ahmedbougacha @asl I suggest to move the discussion on comma-separated flags/current flags to an issue #97320. This PR is intended to introduce the signed GOT flag, and we already have a bunch of similar ptrauth flags, so, if we want to change the flags to a single comma-separated value, we need to do that as a separate refactoring PR but not here. As for this PR, I suggest to stick with old convention not to make this a blocker. @MaskRay please let me know if you have other issues with proposed changes except suggestion to use comma-separated flags. https://github.com/llvm/llvm-project/pull/96160 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
kovdan01 wrote: @ahmedbougacha > I should mention that in our world we generally don't expect these to be > common (other than in cc1 invocations), and they're generally used for > overriding default ABI behavior inferred from triples and deployment targets > and whatnot. We also don't expect usage of these options to be common - instead, we propose `-mbranch-protection=pauthabi` option which enables a pre-defined set of ptrauth flags, see #97237. I think that the main rationale for using comma-separated flags instead of a bunch of different flags is that it'll reduce unneeded `-fptrauth-` duplication - such duplication is probably undesirable even in cc1 invocations. > and it should be doable to support the long spellings on top of these. Regarding that: I'm not sure if it's a good idea to support both `-fptrauth-xxx -fptrauth-yyy` and `-fptrauth=xxx,yyy`. It'll result in additional logic for handling conflicts if the same flags are defined in different ways. It's probably not too complex, but it'll make things more messy, and I don't think it's what we are trying to achive. https://github.com/llvm/llvm-project/pull/96160 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
ahmedbougacha wrote: >> Do we want a lot of -fptrauth-xxx instead of -fptrauth-something=xxx,yyy,zzz? > > I would lean towards a single flag. Comma-separated flags generally seem less user-friendly (for, e.g., grepping, modifying, reading). To some extent we can mitigate that with the obvious cleverness (e.g., negatives, repetition), at the cost of a lot more driver logic, and even that would only go so far. Is there a compelling argument for them? > However, I do not know how this would affect Apple downstream and what are > preferences there. Yeah, we do already support the long spellings, but we can change these here if we have consensus, and it should be doable to support the long spellings on top of these. https://github.com/llvm/llvm-project/pull/96160 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
https://github.com/kovdan01 milestoned https://github.com/llvm/llvm-project/pull/96160 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
asl wrote: > Do we want a lot of `-fptrauth-xxx` instead of > `-fptrauth-something=xxx,yyy,zzz`? I would lean towards a single flag. However, I do not know how this would affect Apple downstream and what are preferences there. Tagging @ahmedbougacha @ahatanak @ojhunt https://github.com/llvm/llvm-project/pull/96160 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
MaskRay wrote: Do we want a lot of `-fptrauth-xxx` instead of `-fptrauth-something=xxx,yyy,zzz`? https://github.com/llvm/llvm-project/pull/96160 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
llvmbot wrote: @llvm/pr-subscribers-clang Author: Daniil Kovalev (kovdan01) Changes Depends on #96159 Add `-fptrauth-elf-got` clang driver flag and set `ptrauth_elf_got` preprocessor feature and `PointerAuthELFGOT` LangOption correspondingly. For non-ELF triples, the driver flag is ignored and a warning is emitted. --- Full diff: https://github.com/llvm/llvm-project/pull/96160.diff 8 Files Affected: - (modified) clang/include/clang/Basic/DiagnosticDriverKinds.td (+4) - (modified) clang/include/clang/Basic/Features.def (+1) - (modified) clang/include/clang/Driver/Options.td (+1) - (modified) clang/lib/Driver/ToolChains/Clang.cpp (+7) - (modified) clang/lib/Frontend/CompilerInvocation.cpp (+4) - (modified) clang/test/CodeGen/aarch64-elf-pauthabi.c (+9-2) - (modified) clang/test/Driver/aarch64-ptrauth.c (+8-1) - (modified) clang/test/Preprocessor/ptrauth_feature.c (+38-14) ``diff diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 1ca2cb85565a1..28667b1eb239e 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -742,6 +742,10 @@ def warn_drv_fjmc_for_elf_only : Warning< "-fjmc works only for ELF; option ignored">, InGroup; +def warn_drv_ptrauth_elf_got_for_elf_only : Warning< + "-fptrauth-elf-got works only for ELF; option ignored">, + InGroup; + def warn_target_override_arm64ec : Warning< "/arm64EC has been overridden by specified target: %0; option ignored">, InGroup; diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 53f410d3cb4bd..569f4e1715af5 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -110,6 +110,7 @@ FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtr FEATURE(ptrauth_vtable_pointer_type_discrimination, LangOpts.PointerAuthVTPtrTypeDiscrimination) FEATURE(ptrauth_member_function_pointer_type_discrimination, LangOpts.PointerAuthCalls) FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini) +FEATURE(ptrauth_elf_got, LangOpts.PointerAuthELFGOT) EXTENSION(swiftcc, PP.getTargetInfo().checkCallingConvention(CC_Swift) == clang::TargetInfo::CCCR_OK) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 112eb286eb075..e16c1a0d06a1b 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4222,6 +4222,7 @@ defm ptrauth_vtable_pointer_address_discrimination : defm ptrauth_vtable_pointer_type_discrimination : OptInCC1FFlag<"ptrauth-vtable-pointer-type-discrimination", "Enable type discrimination of vtable pointers">; defm ptrauth_init_fini : OptInCC1FFlag<"ptrauth-init-fini", "Enable signing of function pointers in init/fini arrays">; +defm ptrauth_elf_got : OptInCC1FFlag<"ptrauth-elf-got", "Enable authentication of pointers from GOT (ELF only)">; } def fenable_matrix : Flag<["-"], "fenable-matrix">, Group, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 331cf6e713d89..5f55e79ec206b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1788,6 +1788,13 @@ void Clang::AddAArch64TargetArgs(const ArgList , options::OPT_fno_ptrauth_vtable_pointer_type_discrimination); Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini, options::OPT_fno_ptrauth_init_fini); + + Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_elf_got, +options::OPT_fno_ptrauth_elf_got); + + if (Args.hasArg(options::OPT_fptrauth_elf_got)) +getToolChain().getDriver().Diag( +diag::warn_drv_ptrauth_elf_got_for_elf_only); } void Clang::AddLoongArchTargetArgs(const ArgList , diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 58694e5399d58..97a5408a4c1e0 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3361,6 +3361,8 @@ static void GeneratePointerAuthArgs(const LangOptions , GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination); if (Opts.PointerAuthInitFini) GenerateArg(Consumer, OPT_fptrauth_init_fini); + if (Opts.PointerAuthELFGOT) +GenerateArg(Consumer, OPT_fptrauth_elf_got); } static void ParsePointerAuthArgs(LangOptions , ArgList , @@ -3374,6 +3376,7 @@ static void ParsePointerAuthArgs(LangOptions , ArgList , Opts.PointerAuthVTPtrTypeDiscrimination = Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination); Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini); + Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got); } /// Check if input file kind and language standard are compatible. @@ -4728,6 +4731,7 @@ bool CompilerInvocation::CreateFromArgsImpl(
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
https://github.com/kovdan01 ready_for_review https://github.com/llvm/llvm-project/pull/96160 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang][Driver] Add signed GOT flag (PR #96160)
https://github.com/kovdan01 created https://github.com/llvm/llvm-project/pull/96160 Depends on #96159 Add `-fptrauth-elf-got` clang driver flag and set `ptrauth_elf_got` preprocessor feature and `PointerAuthELFGOT` LangOption correspondingly. For non-ELF triples, the driver flag is ignored and a warning is emitted. >From f891f791dfe882389d83d3c4c4fb57d67a845c04 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Tue, 18 Jun 2024 15:38:18 +0300 Subject: [PATCH] [PAC][clang][Driver] Add signed GOT flag Add `-fptrauth-elf-got` clang driver flag and set `ptrauth_elf_got` preprocessor feature and `PointerAuthELFGOT` LangOption correspondingly. For non-ELF triples, the driver flag is ignored and a warning is emitted. --- .../clang/Basic/DiagnosticDriverKinds.td | 4 ++ clang/include/clang/Basic/Features.def| 1 + clang/include/clang/Driver/Options.td | 1 + clang/lib/Driver/ToolChains/Clang.cpp | 7 +++ clang/lib/Frontend/CompilerInvocation.cpp | 4 ++ clang/test/CodeGen/aarch64-elf-pauthabi.c | 11 +++- clang/test/Driver/aarch64-ptrauth.c | 9 +++- clang/test/Preprocessor/ptrauth_feature.c | 52 ++- 8 files changed, 72 insertions(+), 17 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 1ca2cb85565a1..28667b1eb239e 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -742,6 +742,10 @@ def warn_drv_fjmc_for_elf_only : Warning< "-fjmc works only for ELF; option ignored">, InGroup; +def warn_drv_ptrauth_elf_got_for_elf_only : Warning< + "-fptrauth-elf-got works only for ELF; option ignored">, + InGroup; + def warn_target_override_arm64ec : Warning< "/arm64EC has been overridden by specified target: %0; option ignored">, InGroup; diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index 53f410d3cb4bd..569f4e1715af5 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -110,6 +110,7 @@ FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtr FEATURE(ptrauth_vtable_pointer_type_discrimination, LangOpts.PointerAuthVTPtrTypeDiscrimination) FEATURE(ptrauth_member_function_pointer_type_discrimination, LangOpts.PointerAuthCalls) FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini) +FEATURE(ptrauth_elf_got, LangOpts.PointerAuthELFGOT) EXTENSION(swiftcc, PP.getTargetInfo().checkCallingConvention(CC_Swift) == clang::TargetInfo::CCCR_OK) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 112eb286eb075..e16c1a0d06a1b 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4222,6 +4222,7 @@ defm ptrauth_vtable_pointer_address_discrimination : defm ptrauth_vtable_pointer_type_discrimination : OptInCC1FFlag<"ptrauth-vtable-pointer-type-discrimination", "Enable type discrimination of vtable pointers">; defm ptrauth_init_fini : OptInCC1FFlag<"ptrauth-init-fini", "Enable signing of function pointers in init/fini arrays">; +defm ptrauth_elf_got : OptInCC1FFlag<"ptrauth-elf-got", "Enable authentication of pointers from GOT (ELF only)">; } def fenable_matrix : Flag<["-"], "fenable-matrix">, Group, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 331cf6e713d89..5f55e79ec206b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1788,6 +1788,13 @@ void Clang::AddAArch64TargetArgs(const ArgList , options::OPT_fno_ptrauth_vtable_pointer_type_discrimination); Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini, options::OPT_fno_ptrauth_init_fini); + + Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_elf_got, +options::OPT_fno_ptrauth_elf_got); + + if (Args.hasArg(options::OPT_fptrauth_elf_got)) +getToolChain().getDriver().Diag( +diag::warn_drv_ptrauth_elf_got_for_elf_only); } void Clang::AddLoongArchTargetArgs(const ArgList , diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 58694e5399d58..97a5408a4c1e0 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3361,6 +3361,8 @@ static void GeneratePointerAuthArgs(const LangOptions , GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination); if (Opts.PointerAuthInitFini) GenerateArg(Consumer, OPT_fptrauth_init_fini); + if (Opts.PointerAuthELFGOT) +GenerateArg(Consumer, OPT_fptrauth_elf_got); } static void ParsePointerAuthArgs(LangOptions , ArgList , @@ -3374,6 +3376,7 @@ static void ParsePointerAuthArgs(LangOptions , ArgList , Opts.PointerAuthVTPtrTypeDiscrimination =