[gcc(refs/users/wschmidt/heads/dd2)] rs6000: Emit ROP instructions in prolog/epilog

William Schmidt wschmidt@gcc.gnu.org
Wed Mar 17 21:41:20 GMT 2021


https://gcc.gnu.org/g:42e9301a4a852349cde1228750cb085efb0bcc71

commit 42e9301a4a852349cde1228750cb085efb0bcc71
Author: Bill Schmidt <wschmidt@linux.ibm.com>
Date:   Wed Mar 17 16:41:02 2021 -0500

    rs6000: Emit ROP instructions in prolog/epilog
    
    2021-03-17  Bill Schmidt  <wschmidt@linux.ibm.com>
    
    gcc/
            * config/rs6000/rs6000-logue.c (rs6000_emit_prologue): Emit
            hashst.
            (rs6000_emit_epilogue): Emit hashchk.

Diff:
---
 gcc/config/rs6000/rs6000-logue.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/gcc/config/rs6000/rs6000-logue.c b/gcc/config/rs6000/rs6000-logue.c
index 4b06e2a65b2..de99f708803 100644
--- a/gcc/config/rs6000/rs6000-logue.c
+++ b/gcc/config/rs6000/rs6000-logue.c
@@ -3065,6 +3065,17 @@ rs6000_emit_prologue (void)
 	cfun->machine->r2_setup_needed = true;
     }
 
+  /* The ROP hash store must occur before a stack frame is created.  */
+  if (rs6000_rop_protect)
+    {
+      gcc_assert (DEFAULT_ABI == ABI_ELFv2);
+      rtx stack_ptr = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
+      rtx addr = gen_rtx_PLUS (Pmode, stack_ptr,
+			       GEN_INT (info->rop_check_save_offset));
+      rtx mem = gen_rtx_MEM (Pmode, addr);
+      rtx insn = emit_insn (gen_hashst (mem, stack_ptr));
+      RTX_FRAME_RELATED_P (insn) = 1;
+    }
 
   if (flag_stack_usage_info)
     current_function_static_stack_size = info->total_size;
@@ -3126,7 +3137,8 @@ rs6000_emit_prologue (void)
 		  && (!crtl->calls_eh_return
 		      || info->ehrd_offset == -432)
 		  && info->vrsave_save_offset == -224
-		  && info->altivec_save_offset == -416);
+		  && info->altivec_save_offset == -416
+		  && !rs6000_rop_protect);
 
       treg = gen_rtx_REG (SImode, 11);
       emit_move_insn (treg, GEN_INT (-info->total_size));
@@ -5001,6 +5013,18 @@ rs6000_emit_epilogue (enum epilogue_type epilogue_type)
       emit_insn (gen_add3_insn (sp_reg_rtx, sp_reg_rtx, sa));
     }
 
+  /* The ROP hash check must occur after the stack pointer is restored.  */
+  if (rs6000_rop_protect)
+    {
+      gcc_assert (DEFAULT_ABI == ABI_ELFv2);
+      rtx stack_ptr = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
+      rtx addr = gen_rtx_PLUS (Pmode, stack_ptr,
+			       GEN_INT (info->rop_check_save_offset));
+      rtx mem = gen_rtx_MEM (Pmode, addr);
+      rtx insn = emit_insn (gen_hashchk (stack_ptr, mem));
+      RTX_FRAME_RELATED_P (insn) = 1;
+    }
+
   if (epilogue_type != EPILOGUE_TYPE_SIBCALL && restoring_FPRs_inline)
     {
       if (cfa_restores)


More information about the Gcc-cvs mailing list