[AArch64][2/4] Generate dwarf information for -msign-return-address
authorJiong Wang <jiong.wang@arm.com>
Fri, 20 Jan 2017 00:05:30 +0000 (00:05 +0000)
committerJiong Wang <jiwang@gcc.gnu.org>
Fri, 20 Jan 2017 00:05:30 +0000 (00:05 +0000)
gcc/
* reg-notes.def (CFA_TOGGLE_RA_MANGLE): New reg-note.
* combine-stack-adj.c (no_unhandled_cfa): Handle
REG_CFA_TOGGLE_RA_MANGLE.
* dwarf2cfi.c (dwarf2out_frame_debug): Handle REG_CFA_TOGGLE_RA_MANGLE.
* config/aarch64/aarch64.c (aarch64_expand_prologue): Generates DWARF
info for return address signing.
(aarch64_expand_epilogue): Likewise.

From-SVN: r244667

gcc/ChangeLog
gcc/combine-stack-adj.c
gcc/config/aarch64/aarch64.c
gcc/dwarf2cfi.c
gcc/reg-notes.def

index 1f959bb8899f9fa9af46d6a879f917d1d6497284..2abfea0f03e91e371a6f4a1be1d6ebca0b613bc1 100644 (file)
@@ -1,3 +1,13 @@
+2017-01-19  Jiong Wang  <jiong.wang@arm.com>
+
+       * reg-notes.def (CFA_TOGGLE_RA_MANGLE): New reg-note.
+       * combine-stack-adj.c (no_unhandled_cfa): Handle
+       REG_CFA_TOGGLE_RA_MANGLE.
+       * dwarf2cfi.c (dwarf2out_frame_debug): Handle REG_CFA_TOGGLE_RA_MANGLE.
+       * config/aarch64/aarch64.c (aarch64_expand_prologue): Generates DWARF
+       info for return address signing.
+       (aarch64_expand_epilogue): Likewise.
+
 2017-01-19  Jiong Wang  <jiong.wang@arm.com>
 
        * config/aarch64/aarch64-opts.h (aarch64_function_type): New enum.
index 20cd59ad08329e9f4f834bfc01d6f9ccc4485283..9ec14a3e44363f35f6419c38233ce5eebddd3458 100644 (file)
@@ -208,6 +208,7 @@ no_unhandled_cfa (rtx_insn *insn)
       case REG_CFA_SET_VDRAP:
       case REG_CFA_WINDOW_SAVE:
       case REG_CFA_FLUSH_QUEUE:
+      case REG_CFA_TOGGLE_RA_MANGLE:
        return false;
       }
 
index 62baf5849949dcbc45313a360966f789a0d03b67..c3992d8aceb9d7b52082f5ac8856a37ec2bc91cc 100644 (file)
@@ -3559,7 +3559,11 @@ aarch64_expand_prologue (void)
 
   /* Sign return address for functions.  */
   if (aarch64_return_address_signing_enabled ())
-    emit_insn (gen_pacisp ());
+    {
+      insn = emit_insn (gen_pacisp ());
+      add_reg_note (insn, REG_CFA_TOGGLE_RA_MANGLE, const0_rtx);
+      RTX_FRAME_RELATED_P (insn) = 1;
+    }
 
   if (flag_stack_usage_info)
     current_function_static_stack_size = frame_size;
@@ -3714,7 +3718,11 @@ aarch64_expand_epilogue (bool for_sibcall)
     */
   if (aarch64_return_address_signing_enabled ()
       && (for_sibcall || !TARGET_ARMV8_3 || crtl->calls_eh_return))
-    emit_insn (gen_autisp ());
+    {
+      insn = emit_insn (gen_autisp ());
+      add_reg_note (insn, REG_CFA_TOGGLE_RA_MANGLE, const0_rtx);
+      RTX_FRAME_RELATED_P (insn) = 1;
+    }
 
   /* Stack adjustment for exception handler.  */
   if (crtl->calls_eh_return)
index 2748e2fa48e4794181496b26df9b51b7e51e7b84..2a527c9fecab091dccb417492e5dbb2ade244be2 100644 (file)
@@ -2098,7 +2098,9 @@ dwarf2out_frame_debug (rtx_insn *insn)
        handled_one = true;
        break;
 
+      case REG_CFA_TOGGLE_RA_MANGLE:
       case REG_CFA_WINDOW_SAVE:
+       /* We overload both of these operations onto the same DWARF opcode.  */
        dwarf2out_frame_debug_cfa_window_save ();
        handled_one = true;
        break;
index ead4a9f58e8621288ee765e029c673640fdf38f4..175da119b6a534b04bd154f2c69dd087afd474ea 100644 (file)
@@ -177,6 +177,11 @@ REG_NOTE (CFA_WINDOW_SAVE)
    the rest of the compiler as a CALL_INSN.  */
 REG_NOTE (CFA_FLUSH_QUEUE)
 
+/* Attached to insns that are RTX_FRAME_RELATED_P, toggling the mangling status
+   of return address.  Currently it's only used by AArch64.  The argument is
+   ignored.  */
+REG_NOTE (CFA_TOGGLE_RA_MANGLE)
+
 /* Indicates what exception region an INSN belongs in.  This is used
    to indicate what region to which a call may throw.  REGION 0
    indicates that a call cannot throw at all.  REGION -1 indicates