diff options
author | Ahmed Bougacha <ahmed@bougacha.org> | 2024-07-22 16:41:22 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-22 16:41:22 -0700 |
commit | b6dbda67d8f687350de66e68a7fd61433fac7107 (patch) | |
tree | 495ef5c6f6ac2de06258f24ceb61deccc3ffb8d6 /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | d4da96d6b1d5d8128fc57c8148785144c7b96705 (diff) | |
download | llvm-b6dbda67d8f687350de66e68a7fd61433fac7107.zip llvm-b6dbda67d8f687350de66e68a7fd61433fac7107.tar.gz llvm-b6dbda67d8f687350de66e68a7fd61433fac7107.tar.bz2 |
[clang] Implement type/address discrimination of type_info vtable. (#99726)
We want to be able to support full type and address discrimination of
type_info on targets that don't have existing ABI compatibility
constraints.
This patch does not enable such behavior on any platform, it just adds
the necessary machinery.
In clang we add a new commandline argument to control the type_info
vtable ABI:
-fptrauth-type-info-vtable-pointer-discrimination
and a feature flag to allow source level detection of the ABI:
__has_feature(ptrauth_type_info_vtable_pointer_discrimination)
Co-authored-by: Oliver Hunt <oliver@apple.com>
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index bf57add..424fe53 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1488,8 +1488,15 @@ void CompilerInvocation::setDefaultPointerAuthOptions( Key::ASDA, LangOpts.PointerAuthVTPtrAddressDiscrimination, LangOpts.PointerAuthVTPtrTypeDiscrimination ? Discrimination::Type : Discrimination::None); - Opts.CXXTypeInfoVTablePointer = - PointerAuthSchema(Key::ASDA, false, Discrimination::None); + + if (LangOpts.PointerAuthTypeInfoVTPtrDiscrimination) + Opts.CXXTypeInfoVTablePointer = + PointerAuthSchema(Key::ASDA, true, Discrimination::Constant, + StdTypeInfoVTablePointerConstantDiscrimination); + else + Opts.CXXTypeInfoVTablePointer = + PointerAuthSchema(Key::ASDA, false, Discrimination::None); + Opts.CXXVTTVTablePointers = PointerAuthSchema(Key::ASDA, false, Discrimination::None); Opts.CXXVirtualFunctionPointers = Opts.CXXVirtualVariadicFunctionPointers = @@ -3411,6 +3418,9 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts, GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination); if (Opts.PointerAuthVTPtrTypeDiscrimination) GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination); + if (Opts.PointerAuthTypeInfoVTPtrDiscrimination) + GenerateArg(Consumer, OPT_fptrauth_type_info_vtable_pointer_discrimination); + if (Opts.PointerAuthInitFini) GenerateArg(Consumer, OPT_fptrauth_init_fini); if (Opts.PointerAuthFunctionTypeDiscrimination) @@ -3427,6 +3437,9 @@ static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args, Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination); Opts.PointerAuthVTPtrTypeDiscrimination = Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination); + Opts.PointerAuthTypeInfoVTPtrDiscrimination = + Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination); + Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini); Opts.PointerAuthFunctionTypeDiscrimination = Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination); |