Index: clang/lib/Driver/ToolChains/Arch/AArch64.h =================================================================== --- clang/lib/Driver/ToolChains/Arch/AArch64.h +++ clang/lib/Driver/ToolChains/Arch/AArch64.h @@ -22,6 +22,7 @@ void getAArch64TargetFeatures(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs, std::vector &Features); std::string getAArch64TargetCPU(const llvm::opt::ArgList &Args, Index: clang/lib/Driver/ToolChains/Arch/AArch64.cpp =================================================================== --- clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -185,6 +185,7 @@ void aarch64::getAArch64TargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, + llvm::opt::ArgStringList &CmdArgs, std::vector &Features) { Arg *A; bool success = true; @@ -235,11 +236,17 @@ StringRef Scope = A->getValue(); bool EnableRetBr = false; bool EnableBlr = false; - if (Scope != "none" && Scope != "all") { + bool DisableComdat = false; + if (Scope != "none") { SmallVector Opts; Scope.split(Opts, ","); for (auto Opt : Opts) { Opt = Opt.trim(); + if (Opt == "all") { + EnableBlr = true; + EnableRetBr = true; + continue; + } if (Opt == "retbr") { EnableRetBr = true; continue; @@ -248,19 +255,28 @@ EnableBlr = true; continue; } + if (Opt == "comdat") { + DisableComdat = false; + continue; + } + if (Opt == "nocomdat") { + DisableComdat = true; + continue; + } D.Diag(diag::err_invalid_sls_hardening) << Scope << A->getAsString(Args); break; } - } else if (Scope == "all") { - EnableRetBr = true; - EnableBlr = true; } if (EnableRetBr) Features.push_back("+harden-sls-retbr"); if (EnableBlr) Features.push_back("+harden-sls-blr"); + if ((EnableRetBr || EnableBlr) && DisableComdat) { + CmdArgs.push_back("-mllvm"); + CmdArgs.push_back("-aarch64-sls-hardening-comdat=false"); + } } // En/disable crc Index: clang/lib/Driver/ToolChains/Arch/ARM.cpp =================================================================== --- clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -792,11 +792,17 @@ StringRef Scope = A->getValue(); bool EnableRetBr = false; bool EnableBlr = false; - if (Scope != "none" && Scope != "all") { + bool DisableComdat = false; + if (Scope != "none") { SmallVector Opts; Scope.split(Opts, ","); for (auto Opt : Opts) { Opt = Opt.trim(); + if (Opt == "all") { + EnableBlr = true; + EnableRetBr = true; + continue; + } if (Opt == "retbr") { EnableRetBr = true; continue; @@ -805,13 +811,18 @@ EnableBlr = true; continue; } + if (Opt == "comdat") { + DisableComdat = false; + continue; + } + if (Opt == "nocomdat") { + DisableComdat = true; + continue; + } D.Diag(diag::err_invalid_sls_hardening) << Scope << A->getAsString(Args); break; } - } else if (Scope == "all") { - EnableRetBr = true; - EnableBlr = true; } if (EnableRetBr || EnableBlr) @@ -823,6 +834,10 @@ Features.push_back("+harden-sls-retbr"); if (EnableBlr) Features.push_back("+harden-sls-blr"); + if ((EnableRetBr || EnableBlr) && DisableComdat) { + CmdArgs.push_back("-mllvm"); + CmdArgs.push_back("-arm-sls-hardening-comdat=false"); + } } } Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -344,7 +344,7 @@ case llvm::Triple::aarch64: case llvm::Triple::aarch64_32: case llvm::Triple::aarch64_be: - aarch64::getAArch64TargetFeatures(D, Triple, Args, Features); + aarch64::getAArch64TargetFeatures(D, Triple, Args, CmdArgs, Features); break; case llvm::Triple::x86: case llvm::Triple::x86_64: Index: clang/test/Driver/sls-hardening-options.c =================================================================== --- clang/test/Driver/sls-hardening-options.c +++ clang/test/Driver/sls-hardening-options.c @@ -1,49 +1,49 @@ // Check the -mharden-sls= option, which has a required argument to select // scope. // RUN: %clang -target aarch64--none-eabi -c %s -### 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target armv7a--none-eabi -c %s -### 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=none 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=none 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=retbr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=blr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-ON +// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-ON --check-prefix=NOCOMDAT-OFF // RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=blr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-ON +// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-ON --check-prefix=NOCOMDAT-OFF // RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=blr -mharden-sls=none 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=blr -mharden-sls=none 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=blr -mharden-sls=retbr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=blr -mharden-sls=retbr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF --check-prefix=NOCOMDAT-OFF // RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr,blr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-OFF // RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=retbr,blr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-OFF // RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=all 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-OFF // RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=all 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-OFF // RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr,blr,retbr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-OFF // RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=retbr,blr,retbr 2>&1 | \ -// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-OFF // RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr,blr,r 2>&1 | \ // RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC @@ -60,6 +60,40 @@ // RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=all,-blr 2>&1 | \ // RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC +// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr,blr,nocomdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-AARCH64 +// RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=retbr,blr,nocomdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-ARM + +// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=all,nocomdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-AARCH64 +// RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=all,nocomdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-ARM + +// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr,blr,retbr,nocomdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-AARCH64 +// RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=retbr,blr,retbr,nocomdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON --check-prefix=NOCOMDAT-ARM + +// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr,comdat,r 2>&1 | \ +// RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC +// RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=retbr,comdat,r 2>&1 | \ +// RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC + +// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=none,comdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC +// RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=none,comdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC + +// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=all,-comdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC +// RUN: %clang -target armv7a--none-eabi -c %s -### -mharden-sls=all,-comdat 2>&1 | \ +// RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC + +// NOCOMDAT-OFF-NOT: "sls-hardening-comdat" +// NOCOMDAT-AARCH64: "-aarch64-sls-hardening-comdat=false" +// NOCOMDAT-ARM: "-arm-sls-hardening-comdat=false" + // RETBR-OFF-NOT: "harden-sls-retbr" // RETBR-ON: "+harden-sls-retbr" Index: llvm/include/llvm/CodeGen/IndirectThunks.h =================================================================== --- llvm/include/llvm/CodeGen/IndirectThunks.h +++ llvm/include/llvm/CodeGen/IndirectThunks.h @@ -27,7 +27,8 @@ 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 @@ template void ThunkInserter::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(*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. Index: llvm/lib/Target/AArch64/AArch64SLSHardening.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64SLSHardening.cpp +++ llvm/lib/Target/AArch64/AArch64SLSHardening.cpp @@ -38,6 +38,10 @@ #define AARCH64_SLS_HARDENING_NAME "AArch64 sls hardening pass" +static cl::opt + ComdatThunks("aarch64-sls-hardening-comdat", + cl::desc("Output SLS hardening thunks in comdats"), + cl::init(true), cl::Hidden); namespace { class AArch64SLSHardening : public MachineFunctionPass { @@ -200,7 +204,7 @@ // 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) { Index: llvm/lib/Target/ARM/ARMSLSHardening.cpp =================================================================== --- llvm/lib/Target/ARM/ARMSLSHardening.cpp +++ llvm/lib/Target/ARM/ARMSLSHardening.cpp @@ -30,6 +30,11 @@ #define ARM_SLS_HARDENING_NAME "ARM sls hardening pass" +static cl::opt + ComdatThunks("arm-sls-hardening-comdat", + cl::desc("Output SLS hardening thunks in comdats"), + cl::init(true), cl::Hidden); + namespace { class ARMSLSHardening : public MachineFunctionPass { @@ -179,7 +184,7 @@ // 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) { Index: llvm/test/CodeGen/AArch64/speculation-hardening-sls.ll =================================================================== --- llvm/test/CodeGen/AArch64/speculation-hardening-sls.ll +++ llvm/test/CodeGen/AArch64/speculation-hardening-sls.ll @@ -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 -aarch64-sls-hardening-comdat=false -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 -aarch64-sls-hardening-comdat=false -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,12 @@ ; 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-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-label: __llvm_slsblr_thunk_x19: ; HARDEN: mov x16, x19 ; HARDEN: br x16 Index: llvm/test/CodeGen/ARM/speculation-hardening-sls.ll =================================================================== --- llvm/test/CodeGen/ARM/speculation-hardening-sls.ll +++ llvm/test/CodeGen/ARM/speculation-hardening-sls.ll @@ -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 -arm-sls-hardening-comdat=false -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 -arm-sls-hardening-comdat=false -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 -arm-sls-hardening-comdat=false -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 -arm-sls-hardening-comdat=false -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 -arm-sls-hardening-comdat=false -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 -arm-sls-hardening-comdat=false -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 -arm-sls-hardening-comdat=false -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 -arm-sls-hardening-comdat=false -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,12 @@ ; 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-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-label: {{__llvm_slsblr_thunk_(arm|thumb)_r5}}: ; HARDEN: bx r5 ; ISBDSB-NEXT: dsb sy