[ARM] Add Thumb Attributes for thumb thunks created in SLSHarding
authorDavid Green <david.green@arm.com>
Fri, 24 Mar 2023 18:11:54 +0000 (18:11 +0000)
committerDavid Green <david.green@arm.com>
Fri, 24 Mar 2023 18:11:54 +0000 (18:11 +0000)
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
llvm/lib/Target/ARM/ARMSLSHardening.cpp
llvm/test/CodeGen/ARM/speculation-hardening-sls-boththunks.ll

index 6da60fb658aec7962f616f0363565887203f4634..b0a8e3043be5cc4011c4252a4389635071802dcb 100644 (file)
@@ -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 <typename Derived, typename InsertedThunksTy>
 void ThunkInserter<Derived, InsertedThunksTy>::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<Derived, InsertedThunksTy>::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.
index 3dd9428c75891ae2101de4b466dca67c5153a9e8..09357ae2e3a3890d5d7ab02e416cc0fd04afe111 100644 (file)
@@ -202,7 +202,8 @@ ArmInsertedThunks SLSBLRThunkInserter::insertThunks(MachineModuleInfo &MMI,
   const ARMSubtarget *ST = &MF.getSubtarget<ARMSubtarget>();
   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;
 }
 
index dd258696090ecf140791a3fcae4f2a74f779dfde..9fbda66ca5085de0465cdde2d07c51e1ab2748e8 100644 (file)
@@ -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" }
+