Index: llvm/include/llvm/CodeGen/IndirectThunks.h =================================================================== --- llvm/include/llvm/CodeGen/IndirectThunks.h +++ 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. Index: llvm/lib/Target/ARM/ARMSLSHardening.cpp =================================================================== --- llvm/lib/Target/ARM/ARMSLSHardening.cpp +++ 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; }