mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
[ARM][AArch64] SLSHardening: make non-comdat thunks possible
Linker scripts might not handle COMDAT sections. SLSHardeing adds new section for each __llvm_slsblr_thunk_xN. This new option allows the generation of the thunks into the normal text section to handle these exceptional cases. ,comdat or ,noncomdat can be added to harden-sls to control the codegen. -mharden-sls=[all|retbr|blr],nocomdat. Reviewed By: kristof.beyls Differential Revision: https://reviews.llvm.org/D100546
This commit is contained in:
parent
b69d892627
commit
00169a8661
@ -27,7 +27,8 @@ template <typename Derived> class ThunkInserter {
|
||||
protected:
|
||||
bool InsertedThunks;
|
||||
void doInitialization(Module &M) {}
|
||||
void createThunkFunction(MachineModuleInfo &MMI, StringRef Name);
|
||||
void createThunkFunction(MachineModuleInfo &MMI, StringRef Name,
|
||||
bool Comdat = true);
|
||||
|
||||
public:
|
||||
void init(Module &M) {
|
||||
@ -40,17 +41,21 @@ public:
|
||||
|
||||
template <typename Derived>
|
||||
void ThunkInserter<Derived>::createThunkFunction(MachineModuleInfo &MMI,
|
||||
StringRef Name) {
|
||||
StringRef Name, bool Comdat) {
|
||||
assert(Name.startswith(getDerived().getThunkPrefix()) &&
|
||||
"Created a thunk with an unexpected prefix!");
|
||||
|
||||
Module &M = const_cast<Module &>(*MMI.getModule());
|
||||
LLVMContext &Ctx = M.getContext();
|
||||
auto Type = FunctionType::get(Type::getVoidTy(Ctx), false);
|
||||
Function *F =
|
||||
Function::Create(Type, GlobalValue::LinkOnceODRLinkage, Name, &M);
|
||||
F->setVisibility(GlobalValue::HiddenVisibility);
|
||||
F->setComdat(M.getOrInsertComdat(Name));
|
||||
Function *F = Function::Create(Type,
|
||||
Comdat ? GlobalValue::LinkOnceODRLinkage
|
||||
: GlobalValue::InternalLinkage,
|
||||
Name, &M);
|
||||
if (Comdat) {
|
||||
F->setVisibility(GlobalValue::HiddenVisibility);
|
||||
F->setComdat(M.getOrInsertComdat(Name));
|
||||
}
|
||||
|
||||
// Add Attributes so that we don't create a frame, unwind information, or
|
||||
// inline.
|
||||
|
@ -523,6 +523,9 @@ def FeatureHardenSlsRetBr : SubtargetFeature<"harden-sls-retbr",
|
||||
def FeatureHardenSlsBlr : SubtargetFeature<"harden-sls-blr",
|
||||
"HardenSlsBlr", "true",
|
||||
"Harden against straight line speculation across BLR instructions">;
|
||||
def FeatureHardenSlsNoComdat : SubtargetFeature<"harden-sls-nocomdat",
|
||||
"HardenSlsNoComdat", "true",
|
||||
"Generate thunk code for SLS mitigation in the normal text section">;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// AArch64 Processors supported.
|
||||
|
@ -186,12 +186,16 @@ namespace {
|
||||
struct SLSBLRThunkInserter : ThunkInserter<SLSBLRThunkInserter> {
|
||||
const char *getThunkPrefix() { return SLSBLRNamePrefix; }
|
||||
bool mayUseThunk(const MachineFunction &MF) {
|
||||
ComdatThunks &= !MF.getSubtarget<AArch64Subtarget>().hardenSlsNoComdat();
|
||||
// FIXME: This could also check if there are any BLRs in the function
|
||||
// to more accurately reflect if a thunk will be needed.
|
||||
return MF.getSubtarget<AArch64Subtarget>().hardenSlsBlr();
|
||||
}
|
||||
void insertThunks(MachineModuleInfo &MMI);
|
||||
void populateThunk(MachineFunction &MF);
|
||||
|
||||
private:
|
||||
bool ComdatThunks = true;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
@ -200,7 +204,7 @@ void SLSBLRThunkInserter::insertThunks(MachineModuleInfo &MMI) {
|
||||
// based on which registers are actually used in BLR instructions in this
|
||||
// function. But would that be a worthwhile optimization?
|
||||
for (auto T : SLSBLRThunks)
|
||||
createThunkFunction(MMI, T.Name);
|
||||
createThunkFunction(MMI, T.Name, ComdatThunks);
|
||||
}
|
||||
|
||||
void SLSBLRThunkInserter::populateThunk(MachineFunction &MF) {
|
||||
|
@ -241,6 +241,7 @@ protected:
|
||||
bool AllowTaggedGlobals = false;
|
||||
bool HardenSlsRetBr = false;
|
||||
bool HardenSlsBlr = false;
|
||||
bool HardenSlsNoComdat = false;
|
||||
uint8_t MaxInterleaveFactor = 2;
|
||||
uint8_t VectorInsertExtractBaseCost = 3;
|
||||
uint16_t CacheLineSize = 0;
|
||||
@ -399,6 +400,7 @@ public:
|
||||
|
||||
bool hardenSlsRetBr() const { return HardenSlsRetBr; }
|
||||
bool hardenSlsBlr() const { return HardenSlsBlr; }
|
||||
bool hardenSlsNoComdat() const { return HardenSlsNoComdat; }
|
||||
|
||||
bool useEL1ForTP() const { return UseEL1ForTP; }
|
||||
bool useEL2ForTP() const { return UseEL2ForTP; }
|
||||
|
@ -573,8 +573,9 @@ def FeatureHardenSlsRetBr : SubtargetFeature<"harden-sls-retbr",
|
||||
def FeatureHardenSlsBlr : SubtargetFeature<"harden-sls-blr",
|
||||
"HardenSlsBlr", "true",
|
||||
"Harden against straight line speculation across indirect calls">;
|
||||
|
||||
|
||||
def FeatureHardenSlsNoComdat : SubtargetFeature<"harden-sls-nocomdat",
|
||||
"HardenSlsNoComdat", "true",
|
||||
"Generate thunk code for SLS mitigation in the normal text section">;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// ARM Processor subtarget features.
|
||||
|
@ -165,12 +165,16 @@ namespace {
|
||||
struct SLSBLRThunkInserter : ThunkInserter<SLSBLRThunkInserter> {
|
||||
const char *getThunkPrefix() { return SLSBLRNamePrefix; }
|
||||
bool mayUseThunk(const MachineFunction &MF) {
|
||||
ComdatThunks &= !MF.getSubtarget<ARMSubtarget>().hardenSlsNoComdat();
|
||||
// FIXME: This could also check if there are any indirect calls in the
|
||||
// function to more accurately reflect if a thunk will be needed.
|
||||
return MF.getSubtarget<ARMSubtarget>().hardenSlsBlr();
|
||||
}
|
||||
void insertThunks(MachineModuleInfo &MMI);
|
||||
void populateThunk(MachineFunction &MF);
|
||||
|
||||
private:
|
||||
bool ComdatThunks = true;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
@ -179,7 +183,7 @@ void SLSBLRThunkInserter::insertThunks(MachineModuleInfo &MMI) {
|
||||
// based on which registers are actually used in indirect calls in this
|
||||
// function. But would that be a worthwhile optimization?
|
||||
for (auto T : SLSBLRThunks)
|
||||
createThunkFunction(MMI, T.Name);
|
||||
createThunkFunction(MMI, T.Name, ComdatThunks);
|
||||
}
|
||||
|
||||
void SLSBLRThunkInserter::populateThunk(MachineFunction &MF) {
|
||||
|
@ -475,6 +475,9 @@ protected:
|
||||
/// Harden against Straight Line Speculation for indirect calls.
|
||||
bool HardenSlsBlr = false;
|
||||
|
||||
/// Generate thunk code for SLS mitigation in the normal text section.
|
||||
bool HardenSlsNoComdat = false;
|
||||
|
||||
/// stackAlignment - The minimum alignment known to hold of the stack frame on
|
||||
/// entry to the function and which must be maintained by every function.
|
||||
Align stackAlignment = Align(4);
|
||||
@ -931,6 +934,7 @@ public:
|
||||
|
||||
bool hardenSlsRetBr() const { return HardenSlsRetBr; }
|
||||
bool hardenSlsBlr() const { return HardenSlsBlr; }
|
||||
bool hardenSlsNoComdat() const { return HardenSlsNoComdat; }
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -1,7 +1,9 @@
|
||||
; RUN: llc -mattr=harden-sls-retbr,harden-sls-blr -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,HARDEN,ISBDSB,ISBDSBDAGISEL
|
||||
; RUN: llc -mattr=harden-sls-retbr,harden-sls-blr -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,HARDEN,HARDEN-COMDAT,ISBDSB,ISBDSBDAGISEL
|
||||
; RUN: llc -mattr=harden-sls-retbr,harden-sls-blr,harden-sls-nocomdat -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,HARDEN,HARDEN-COMDAT-OFF,ISBDSB,ISBDSBDAGISEL
|
||||
; RUN: llc -mattr=harden-sls-retbr,harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,HARDEN,SB,SBDAGISEL
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr,harden-sls-blr -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,HARDEN,HARDEN-COMDAT,ISBDSB
|
||||
; RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,NOHARDEN
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr,harden-sls-blr -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,HARDEN,ISBDSB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr,harden-sls-blr,harden-sls-nocomdat -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,HARDEN,HARDEN-COMDAT-OFF,ISBDSB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr,harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=aarch64-none-linux-gnu < %s | FileCheck %s --check-prefixes=CHECK,HARDEN,SB
|
||||
|
||||
; Function Attrs: norecurse nounwind readnone
|
||||
@ -210,6 +212,14 @@ entry:
|
||||
; SB-NEXT: dsb sy
|
||||
; SB-NEXT: isb
|
||||
; HARDEN-NEXT: .Lfunc_end
|
||||
; HARDEN-COMDAT: .section .text.__llvm_slsblr_thunk_x19
|
||||
; HARDEN-COMDAT: .hidden __llvm_slsblr_thunk_x19
|
||||
; HARDEN-COMDAT: .weak __llvm_slsblr_thunk_x19
|
||||
; HARDEN-COMDAT: .type __llvm_slsblr_thunk_x19,@function
|
||||
; HARDEN-COMDAT-OFF-NOT: .section .text.__llvm_slsblr_thunk_x19
|
||||
; HARDEN-COMDAT-OFF-NOT: .hidden __llvm_slsblr_thunk_x19
|
||||
; HARDEN-COMDAT-OFF-NOT: .weak __llvm_slsblr_thunk_x19
|
||||
; HARDEN-COMDAT-OFF: .type __llvm_slsblr_thunk_x19,@function
|
||||
; HARDEN-label: __llvm_slsblr_thunk_x19:
|
||||
; HARDEN: mov x16, x19
|
||||
; HARDEN: br x16
|
||||
|
@ -1,15 +1,23 @@
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,ISBDSB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,ISBDSB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,SB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,SB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,HARDEN-COMDAT,ISBDSB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,HARDEN-COMDAT,ISBDSB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,HARDEN-COMDAT,SB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,HARDEN-COMDAT,SB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=harden-sls-nocomdat -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,HARDEN-COMDAT-OFF,ISBDSB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=harden-sls-nocomdat -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,HARDEN-COMDAT-OFF,ISBDSB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=harden-sls-nocomdat -mattr=+sb -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,HARDEN-COMDAT-OFF,SB -dump-input-context=100
|
||||
; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=harden-sls-nocomdat -mattr=+sb -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,HARDEN-COMDAT-OFF,SB -dump-input-context=100
|
||||
; RUN: llc -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,NOHARDENARM -dump-input-context=100
|
||||
; RUN: llc -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,NOHARDENTHUMB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,ISBDSB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,ISBDSB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,HARDEN-COMDAT,ISBDSB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,HARDEN-COMDAT,ISBDSB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr -mattr=harden-sls-nocomdat -mattr=harden-sls-blr -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,HARDEN-COMDAT-OFF,ISBDSB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr -mattr=harden-sls-nocomdat -mattr=harden-sls-blr -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,HARDEN-COMDAT-OFF,ISBDSB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,SB
|
||||
; RUN: llc -global-isel -global-isel-abort=0 -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,SB
|
||||
; RUN: llc -fast-isel -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,ISBDSB
|
||||
; RUN: llc -fast-isel -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,ISBDSB
|
||||
; RUN: llc -fast-isel -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,HARDEN-COMDAT,ISBDSB
|
||||
; RUN: llc -fast-isel -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,HARDEN-COMDAT,ISBDSB
|
||||
; RUN: llc -fast-isel -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=harden-sls-nocomdat -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,HARDEN-COMDAT-OFF,ISBDSB
|
||||
; RUN: llc -fast-isel -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=harden-sls-nocomdat -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,HARDEN-COMDAT-OFF,ISBDSB
|
||||
; RUN: llc -fast-isel -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,ARM,HARDEN,SB
|
||||
; RUN: llc -fast-isel -mattr=harden-sls-retbr -mattr=harden-sls-blr -mattr=+sb -verify-machineinstrs -mtriple=thumbv8-linux-gnueabi < %s | FileCheck %s --check-prefixes=CHECK,THUMB,HARDENTHUMB,HARDEN,SB
|
||||
|
||||
@ -235,6 +243,14 @@ entry:
|
||||
; CHECK: .Lfunc_end
|
||||
}
|
||||
|
||||
; HARDEN-COMDAT: .section {{.text.__llvm_slsblr_thunk_(arm|thumb)_r5}}
|
||||
; HARDEN-COMDAT: .hidden {{__llvm_slsblr_thunk_(arm|thumb)_r5}}
|
||||
; HARDEN-COMDAT: .weak {{__llvm_slsblr_thunk_(arm|thumb)_r5}}
|
||||
; HARDEN-COMDAT: .type {{__llvm_slsblr_thunk_(arm|thumb)_r5}},%function
|
||||
; HARDEN-COMDAT-OFF-NOT: .section {{.text.__llvm_slsblr_thunk_(arm|thumb)_r5}}
|
||||
; HARDEN-COMDAT-OFF-NOT: .hidden {{__llvm_slsblr_thunk_(arm|thumb)_r5}}
|
||||
; HARDEN-COMDAT-OFF-NOT: .weak {{__llvm_slsblr_thunk_(arm|thumb)_r5}}
|
||||
; HARDEN-COMDAT-OFF: .type {{__llvm_slsblr_thunk_(arm|thumb)_r5}},%function
|
||||
; HARDEN-label: {{__llvm_slsblr_thunk_(arm|thumb)_r5}}:
|
||||
; HARDEN: bx r5
|
||||
; ISBDSB-NEXT: dsb sy
|
||||
|
Loading…
Reference in New Issue
Block a user