From 3ac5a123d95c4caa194b2f0b54ad963ce3034ca8 Mon Sep 17 00:00:00 2001 From: David Green Date: Fri, 24 Mar 2023 18:11:54 +0000 Subject: [PATCH] [ARM] Add Thumb Attributes for thumb thunks created in SLSHarding Without this the function will be use an Arm subtarget, meaning the instructions in it will be invalid for the current subtarget. Differential Revision: https://reviews.llvm.org/D144733 --- llvm/include/llvm/CodeGen/IndirectThunks.h | 7 +++++-- llvm/lib/Target/ARM/ARMSLSHardening.cpp | 3 ++- .../CodeGen/ARM/speculation-hardening-sls-boththunks.ll | 16 +++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/CodeGen/IndirectThunks.h b/llvm/include/llvm/CodeGen/IndirectThunks.h index 6da60fb..b0a8e30 100644 --- a/llvm/include/llvm/CodeGen/IndirectThunks.h +++ b/llvm/include/llvm/CodeGen/IndirectThunks.h @@ -33,7 +33,7 @@ protected: InsertedThunksTy InsertedThunks; void doInitialization(Module &M) {} void createThunkFunction(MachineModuleInfo &MMI, StringRef Name, - bool Comdat = true); + bool Comdat = true, StringRef TargetAttrs = ""); public: void init(Module &M) { @@ -46,7 +46,8 @@ public: template void ThunkInserter::createThunkFunction( - MachineModuleInfo &MMI, StringRef Name, bool Comdat) { + MachineModuleInfo &MMI, StringRef Name, bool Comdat, + StringRef TargetAttrs) { assert(Name.startswith(getDerived().getThunkPrefix()) && "Created a thunk with an unexpected prefix!"); @@ -67,6 +68,8 @@ void ThunkInserter::createThunkFunction( AttrBuilder B(Ctx); B.addAttribute(llvm::Attribute::NoUnwind); B.addAttribute(llvm::Attribute::Naked); + if (TargetAttrs != "") + B.addAttribute("target-features", TargetAttrs); F->addFnAttrs(B); // Populate our function a bit so that we can verify. diff --git a/llvm/lib/Target/ARM/ARMSLSHardening.cpp b/llvm/lib/Target/ARM/ARMSLSHardening.cpp index 3dd9428..09357ae 100644 --- a/llvm/lib/Target/ARM/ARMSLSHardening.cpp +++ b/llvm/lib/Target/ARM/ARMSLSHardening.cpp @@ -202,7 +202,8 @@ ArmInsertedThunks SLSBLRThunkInserter::insertThunks(MachineModuleInfo &MMI, const ARMSubtarget *ST = &MF.getSubtarget(); for (auto T : SLSBLRThunks) if (ST->isThumb() == T.isThumb) - createThunkFunction(MMI, T.Name, ComdatThunks); + createThunkFunction(MMI, T.Name, ComdatThunks, + T.isThumb ? "+thumb-mode" : ""); return ST->isThumb() ? ThumbThunk : ArmThunk; } diff --git a/llvm/test/CodeGen/ARM/speculation-hardening-sls-boththunks.ll b/llvm/test/CodeGen/ARM/speculation-hardening-sls-boththunks.ll index dd25869..9fbda66 100644 --- a/llvm/test/CodeGen/ARM/speculation-hardening-sls-boththunks.ll +++ b/llvm/test/CodeGen/ARM/speculation-hardening-sls-boththunks.ll @@ -1,4 +1,4 @@ -; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=armv8-linux-gnueabi < %s | FileCheck %s +; RUN: llc -mattr=harden-sls-retbr -mattr=harden-sls-blr -verify-machineinstrs -mtriple=armv8-linux-gnueabi -stop-after=arm-sls-hardening %s -o - | FileCheck %s ; Given both Arm and Thumb functions in the same compilation unit, we should ; get both arm and thumb thunks. @@ -11,7 +11,13 @@ define i32 @test2(i32 %a, i32 %b) "target-features"="+thumb-mode" { ret i32 %a } -; CHECK: test1 -; CHECK: test2 -; CHECK: __llvm_slsblr_thunk_arm_sp -; CHECK: __llvm_slsblr_thunk_thumb_sp \ No newline at end of file +; CHECK: define i32 @test1(i32 %a, i32 %b) #0 +; CHECK: define i32 @test2(i32 %a, i32 %b) #1 +; CHECK: define linkonce_odr hidden void @__llvm_slsblr_thunk_arm_sp() #2 comdat +; CHECK: define linkonce_odr hidden void @__llvm_slsblr_thunk_thumb_sp() #3 comdat + +; CHECK: attributes #0 = { "target-features"="+harden-sls-retbr,+harden-sls-blr" } +; CHECK: attributes #1 = { "target-features"="+thumb-mode,+harden-sls-retbr,+harden-sls-blr" } +; CHECK: attributes #2 = { naked nounwind } +; CHECK: attributes #3 = { naked nounwind "target-features"="+thumb-mode" } + -- 2.7.4