diff options
author | Daniil Kovalev <dkovalev@accesssoftek.com> | 2024-08-06 08:02:13 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-06 08:02:13 +0300 |
commit | 6e45fa95be9db5318ac7037c673c9b18a48ac5b1 (patch) | |
tree | ccd9345d2ec3e0bc661084df846522f7118ee5c2 /llvm/lib/CodeGen/MachineFunction.cpp | |
parent | 1745c8e08dde9f32d0f0b701d3a6a271697458eb (diff) | |
download | llvm-6e45fa95be9db5318ac7037c673c9b18a48ac5b1.zip llvm-6e45fa95be9db5318ac7037c673c9b18a48ac5b1.tar.gz llvm-6e45fa95be9db5318ac7037c673c9b18a48ac5b1.tar.bz2 |
[PAC][AArch64] Support init/fini array signing (#96478)
If both `-fptrauth-init-fini` and `-fptrauth-calls` are passed, sign
function pointers in `llvm.global_ctors` and `llvm.global_dtors` with
constant discriminator 0xD9D4
(`ptrauth_string_discriminator("init_fini")`). Additionally, if
`-fptrauth-init-fini-address-discrimination` is passed, address
discrimination is used for signing (otherwise, just constant
discriminator is used).
For address discrimination, we use it's special form since uses of
`llvm.global_{c|d}tors` are disallowed (see
`Verifier::visitGlobalVariable`) and we can't emit `getelementptr`
expressions referencing these special arrays. A signed ctor/dtor pointer
with special address discrimination applied looks like the following:
```
ptr ptrauth (ptr @foo, i32 0, i64 55764, ptr inttoptr (i64 1 to ptr))
```
Diffstat (limited to 'llvm/lib/CodeGen/MachineFunction.cpp')
0 files changed, 0 insertions, 0 deletions