diff options
| author | Daniil Kovalev <dkovalev@accesssoftek.com> | 2024-06-27 10:02:17 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-27 10:02:17 +0300 |
| commit | b5cc19e572855136eb4080208a9bd5ecef785aa3 (patch) | |
| tree | bb04edc1d95595ae791cf6c572494025b3e2c9ec /llvm/lib/CodeGen/MachineModuleInfoImpls.cpp | |
| parent | ab58b6d58edf6a7c8881044fc716ca435d7a0156 (diff) | |
[PAC][AArch64] Lower ptrauth constants in code (#94241)
Depends on #94240.
Define the following pseudos for lowering ptrauth constants in code:
- non-`extern_weak`:
- no GOT load needed: `MOVaddrPAC` - similar to `MOVaddr`, with added
PAC;
- GOT load needed: `LOADgotPAC` - similar to `LOADgot`, with added PAC;
- `extern_weak`: `LOADauthptrstatic` - similar to `LOADgot`, but use a
special stub slot named `sym$auth_ptr$key$disc` filled by dynamic linker
during relocation resolving instead of a GOT slot.
---------
Co-authored-by: Ahmed Bougacha <ahmed@bougacha.org>
Diffstat (limited to 'llvm/lib/CodeGen/MachineModuleInfoImpls.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/MachineModuleInfoImpls.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineModuleInfoImpls.cpp b/llvm/lib/CodeGen/MachineModuleInfoImpls.cpp index 9c3b31935f6d..f114f1ecc0ba 100644 --- a/llvm/lib/CodeGen/MachineModuleInfoImpls.cpp +++ b/llvm/lib/CodeGen/MachineModuleInfoImpls.cpp @@ -13,6 +13,7 @@ #include "llvm/CodeGen/MachineModuleInfoImpls.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/MC/MCSymbol.h" using namespace llvm; @@ -41,3 +42,25 @@ MachineModuleInfoImpl::SymbolListTy MachineModuleInfoImpl::getSortedStubs( Map.clear(); return List; } + +template <typename MachineModuleInfoTarget> +static typename MachineModuleInfoTarget::AuthStubListTy getAuthGVStubListHelper( + DenseMap<MCSymbol *, typename MachineModuleInfoTarget::AuthStubInfo> + &AuthPtrStubs) { + typename MachineModuleInfoTarget::AuthStubListTy List(AuthPtrStubs.begin(), + AuthPtrStubs.end()); + + if (!List.empty()) + llvm::sort(List.begin(), List.end(), + [](const typename MachineModuleInfoTarget::AuthStubPairTy &LHS, + const typename MachineModuleInfoTarget::AuthStubPairTy &RHS) { + return LHS.first->getName() < RHS.first->getName(); + }); + + AuthPtrStubs.clear(); + return List; +} + +MachineModuleInfoELF::AuthStubListTy MachineModuleInfoELF::getAuthGVStubList() { + return getAuthGVStubListHelper<MachineModuleInfoELF>(AuthPtrStubs); +} |
