Hi!

PR82920 is about CET fails on Darwin.

Initially, this was expected to be just a testsuite issue, however it turns out 
that the indirection thunks code has inconsistent handling of the output of 
labels.  Thus some of the output is missing the leading “_” on Darwin, which 
breaks ABI and won’t link.

Since most of the tests are scan-asms that check for what’s expected, they 
currently pass on Darwin but will begin failing when the codegen is fixed.  
Thus there is  larger, but mechanical, testsuite change needed to deal with 
this.   I will post that if anyone’s interested, but otherwise will just apply 
it once the codgen fix is agreed.

The patch factors out some common code that writes out the jumps and uses the 
regular output scheme that accounts for __USER_LABEL_PREFIX__.

I will note in passing that there’s very little PIC test coverage for the 
indirection thunks code, although Darwin is PIC-only for m64 - Linux has only a 
few tests.

OK for trunk?
Backports?
Iain

gcc/

        * config/i386/i386.c (ix86_output_jmp_thunk_or_indirect): New.
        (ix86_output_indirect_branch_via_reg): Use output mechanism accounting 
for
        __USR_LABEL_PREFIX.
        (ix86_output_indirect_branch_via_push): Likewise.
        (ix86_output_function_return): Likewise.
        (ix86_output_indirect_function_return): Likewise.

From 4da5837cd7bbe61b6d2687e552e3afb5bfdb2765 Mon Sep 17 00:00:00 2001
From: Iain Sandoe <i...@sandoe.co.uk>
Date: Tue, 7 May 2019 07:27:19 -0400
Subject: [PATCH] [Darwin] Fix PR82920 - code changes.

Emit labels using machinery that includes the __USER_LABEL_PREFIX__
---
 gcc/config/i386/i386.c | 48 ++++++++++++++++++++++++------------------
 1 file changed, 27 insertions(+), 21 deletions(-)

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index c51d775b89..08aa9d9475 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -15130,6 +15130,20 @@ ix86_nopic_noplt_attribute_p (rtx call_op)
   return false;
 }
 
+/* Helper to output the jmp/call.  */
+static void
+ix86_output_jmp_thunk_or_indirect (const char *thunk_name, const int regno)
+{
+  if (thunk_name != NULL)
+    {
+      fprintf (asm_out_file, "\tjmp\t");
+      assemble_name (asm_out_file, thunk_name);
+      putc ('\n', asm_out_file);
+    }
+  else
+    output_indirect_thunk (regno);
+}
+
 /* Output indirect branch via a call and return thunk.  CALL_OP is a
    register which contains the branch target.  XASM is the assembly
    template for CALL_OP.  Branch is a tail call if SIBCALL_P is true.
@@ -15168,17 +15182,14 @@ ix86_output_indirect_branch_via_reg (rtx call_op, 
bool sibcall_p)
     thunk_name = NULL;
 
   if (sibcall_p)
-    {
-      if (thunk_name != NULL)
-       fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
-      else
-       output_indirect_thunk (regno);
-    }
+     ix86_output_jmp_thunk_or_indirect (thunk_name, regno);
   else
     {
       if (thunk_name != NULL)
        {
-         fprintf (asm_out_file, "\tcall\t%s\n", thunk_name);
+         fprintf (asm_out_file, "\tcall\t");
+         assemble_name (asm_out_file, thunk_name);
+         putc ('\n', asm_out_file);
          return;
        }
 
@@ -15199,10 +15210,7 @@ ix86_output_indirect_branch_via_reg (rtx call_op, bool 
sibcall_p)
 
       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel1);
 
-      if (thunk_name != NULL)
-       fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
-      else
-       output_indirect_thunk (regno);
+     ix86_output_jmp_thunk_or_indirect (thunk_name, regno);
 
       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);
 
@@ -15259,10 +15267,7 @@ ix86_output_indirect_branch_via_push (rtx call_op, 
const char *xasm,
   if (sibcall_p)
     {
       output_asm_insn (push_buf, &call_op);
-      if (thunk_name != NULL)
-       fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
-      else
-       output_indirect_thunk (regno);
+      ix86_output_jmp_thunk_or_indirect (thunk_name, regno);
     }
   else
     {
@@ -15318,10 +15323,7 @@ ix86_output_indirect_branch_via_push (rtx call_op, 
const char *xasm,
 
       output_asm_insn (push_buf, &call_op);
 
-      if (thunk_name != NULL)
-       fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
-      else
-       output_indirect_thunk (regno);
+      ix86_output_jmp_thunk_or_indirect (thunk_name, regno);
 
       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, indirectlabel2);
 
@@ -15420,7 +15422,9 @@ ix86_output_function_return (bool long_p)
          indirect_thunk_name (thunk_name, INVALID_REGNUM, need_prefix,
                               true);
          indirect_return_needed |= need_thunk;
-         fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
+         fprintf (asm_out_file, "\tjmp\t");
+         assemble_name (asm_out_file, thunk_name);
+         putc ('\n', asm_out_file);
        }
       else
        output_indirect_thunk (INVALID_REGNUM);
@@ -15460,7 +15464,9 @@ ix86_output_indirect_function_return (rtx ret_op)
              indirect_return_via_cx = true;
              indirect_thunks_used |= 1 << CX_REG;
            }
-         fprintf (asm_out_file, "\tjmp\t%s\n", thunk_name);
+         fprintf (asm_out_file, "\tjmp\t");
+         assemble_name (asm_out_file, thunk_name);
+         putc ('\n', asm_out_file);
        }
       else
        output_indirect_thunk (regno);
-- 
2.17.1


Reply via email to