diff --git a/llvm/lib/Target/AArch64/AArch64SLSHardening.cpp b/llvm/lib/Target/AArch64/AArch64SLSHardening.cpp index 9d225fa89fa47634702febea7d36a25a790f9f15..0baf22a51c92b065b58a9fee101128fd667dba5d 100644 --- a/llvm/lib/Target/AArch64/AArch64SLSHardening.cpp +++ b/llvm/lib/Target/AArch64/AArch64SLSHardening.cpp @@ -223,7 +223,12 @@ void SLSBLRThunkInserter::populateThunk(MachineFunction &MF) { // BR xN // barrierInsts Entry->addLiveIn(ThunkReg); - BuildMI(Entry, DebugLoc(), TII->get(AArch64::BR)).addReg(ThunkReg); + // MOV X16, ThunkReg == ORR X16, XZR, ThunkReg, LSL #0 + BuildMI(Entry, DebugLoc(), TII->get(AArch64::ORRXrs), AArch64::X16) + .addReg(AArch64::XZR) + .addReg(ThunkReg) + .addImm(0); + BuildMI(Entry, DebugLoc(), TII->get(AArch64::BR)).addReg(AArch64::X16); // Make sure the thunks do not make use of the SB extension in case there is // a function somewhere that will call to it that for some reason disabled // the SB extension locally on that function, even though it's enabled for diff --git a/llvm/test/CodeGen/AArch64/speculation-hardening-sls.ll b/llvm/test/CodeGen/AArch64/speculation-hardening-sls.ll index b7ea875dc661a97c87ab5dd86f818d6c69c59685..90d27830134a4bc764df256ed49701813b94daab 100644 --- a/llvm/test/CodeGen/AArch64/speculation-hardening-sls.ll +++ b/llvm/test/CodeGen/AArch64/speculation-hardening-sls.ll @@ -203,14 +203,16 @@ entry: } ; HARDEN-label: __llvm_slsblr_thunk_x0: -; HARDEN: br x0 +; HARDEN: mov x16, x0 +; HARDEN: br x16 ; ISBDSB-NEXT: dsb sy ; ISBDSB-NEXT: isb ; SB-NEXT: dsb sy ; SB-NEXT: isb ; HARDEN-NEXT: .Lfunc_end ; HARDEN-label: __llvm_slsblr_thunk_x19: -; HARDEN: br x19 +; HARDEN: mov x16, x19 +; HARDEN: br x16 ; ISBDSB-NEXT: dsb sy ; ISBDSB-NEXT: isb ; SB-NEXT: dsb sy