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
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) {
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!");
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.
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;
}
-; 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.
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" }
+