aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorOliver Hunt <oliver@apple.com>2025-07-14 19:32:18 -0700
committerGitHub <noreply@github.com>2025-07-14 19:32:18 -0700
commit451a9ce9ffcf18db365f32a5a01dd025ab26c1d0 (patch)
tree79013dc921b35ef8be969689052648ec318c9b15 /clang/lib/Frontend/CompilerInvocation.cpp
parent90ef114a33805b67eea29564193ad6d4c6975a30 (diff)
downloadllvm-451a9ce9ffcf18db365f32a5a01dd025ab26c1d0.zip
llvm-451a9ce9ffcf18db365f32a5a01dd025ab26c1d0.tar.gz
llvm-451a9ce9ffcf18db365f32a5a01dd025ab26c1d0.tar.bz2
[clang][ObjC][PAC] Add ptrauth protections to objective-c (#147899)
This PR introduces the use of pointer authentication to objective-c[++]. This includes: * __ptrauth qualifier support for ivars * protection of isa and super fields * protection of SEL typed ivars * protection of class_ro_t data * protection of methodlist pointers and content
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index b9f7579..08cf0ae 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1541,6 +1541,25 @@ void CompilerInvocation::setDefaultPointerAuthOptions(
Key::ASIA, LangOpts.PointerAuthInitFiniAddressDiscrimination,
Discrimination::Constant, InitFiniPointerConstantDiscriminator);
}
+
+ Opts.ObjCMethodListFunctionPointers =
+ PointerAuthSchema(Key::ASIA, true, Discrimination::None);
+ Opts.ObjCMethodListPointer =
+ PointerAuthSchema(Key::ASDA, true, Discrimination::Constant,
+ MethodListPointerConstantDiscriminator);
+ if (LangOpts.PointerAuthObjcIsa) {
+ Opts.ObjCIsaPointers =
+ PointerAuthSchema(Key::ASDA, true, Discrimination::Constant,
+ IsaPointerConstantDiscriminator);
+ Opts.ObjCSuperPointers =
+ PointerAuthSchema(Key::ASDA, true, Discrimination::Constant,
+ SuperPointerConstantDiscriminator);
+ }
+
+ if (LangOpts.PointerAuthObjcClassROPointers)
+ Opts.ObjCClassROPointers =
+ PointerAuthSchema(Key::ASDA, true, Discrimination::Constant,
+ ClassROConstantDiscriminator);
}
Opts.ReturnAddresses = LangOpts.PointerAuthReturns;
Opts.AuthTraps = LangOpts.PointerAuthAuthTraps;
@@ -3573,6 +3592,12 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts,
GenerateArg(Consumer, OPT_fptrauth_elf_got);
if (Opts.AArch64JumpTableHardening)
GenerateArg(Consumer, OPT_faarch64_jump_table_hardening);
+ if (Opts.PointerAuthObjcIsa)
+ GenerateArg(Consumer, OPT_fptrauth_objc_isa);
+ if (Opts.PointerAuthObjcInterfaceSel)
+ GenerateArg(Consumer, OPT_fptrauth_objc_interface_sel);
+ if (Opts.PointerAuthObjcClassROPointers)
+ GenerateArg(Consumer, OPT_fptrauth_objc_class_ro);
}
static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
@@ -3596,6 +3621,15 @@ static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args,
Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
Opts.AArch64JumpTableHardening =
Args.hasArg(OPT_faarch64_jump_table_hardening);
+
+ Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
+ Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
+ Opts.PointerAuthObjcInterfaceSel =
+ Args.hasArg(OPT_fptrauth_objc_interface_sel);
+
+ if (Opts.PointerAuthObjcInterfaceSel)
+ Opts.PointerAuthObjcInterfaceSelKey =
+ static_cast<unsigned>(PointerAuthSchema::ARM8_3Key::ASDB);
}
/// Check if input file kind and language standard are compatible.