diff --git a/llvm/include/llvm/CodeGen/IndirectThunks.h b/llvm/include/llvm/CodeGen/IndirectThunks.h --- a/llvm/include/llvm/CodeGen/IndirectThunks.h +++ b/llvm/include/llvm/CodeGen/IndirectThunks.h @@ -33,7 +33,7 @@ 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 @@ 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 @@ 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 --- a/llvm/lib/Target/ARM/ARMSLSHardening.cpp +++ b/llvm/lib/Target/ARM/ARMSLSHardening.cpp @@ -202,7 +202,8 @@ 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 --- 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 @@ 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" } +