Uros,
Testing on Cygwin only turns out to be a nightmare, but I've finally gotten some test results that I'm calling "clean enough". I have only done 64-bit Cygwin thus far, (still need 32-bit Cygwin as well as 32/64 MinGW), but I've hit a snag. The first patch set ("Use aligned SSE movs for re-aligned MS ABI pro/epilogues" -- https://gcc.gnu.org/ml/gcc-patches/2016-12/msg01859.html) modifies how we select a base register and offset for accessing the stack. The test gcc.target/x86_64/abi/callabi/vaarg-5a.c uses a realigned stack pointer in a cross-abi case that triggers an internal compiler error at config/i386/winnt.c:1132 where i386_pe_seh_unwind_emit() doesn't like REG_CFA_EXPRESSION in the notes. This is the snippet:

  for (note = REG_NOTES (insn); note ; note = XEXP (note,  1))
      {
        switch (REG_NOTE_KIND (note))
          {
          case REG_FRAME_RELATED_EXPR:
            pat = XEXP (note, 0);
            goto found;
case REG_CFA_DEF_CFA:
          case REG_CFA_EXPRESSION:
            /* Only emitted with DRAP, which we disable.  */
            gcc_unreachable ();
            break;


This is the chunk that introduces this new behavior:

@@ -12824,6 +12878,13 @@ ix86_emit_save_reg_using_mov (machine_mode mode, 
unsigned int regno,
        }
     }
+ else if (base == stack_pointer_rtx && m->fs.sp_realigned
+          && cfa_offset >= m->fs.sp_realigned_offset)
+    {
+      gcc_checking_assert (stack_realign_fp);
+      add_reg_note (insn, REG_CFA_EXPRESSION, gen_rtx_SET (mem, reg));
+    }
+
   /* The memory may not be relative to the current CFA register,
      which means that we may need to generate a new pattern for
      use by the unwind info.  */

And this is a sample of pre- and post-patch in pro_and_epilogue:

RTL pre-patch:

(insn/f 41 40 42 2 (set (mem/c:V4SF (plus:DI (reg/f:DI 6 bp)
                (const_int -160 [0xffffffffffffff60])) [6  S16 A64])
        (reg:V4SF 27 xmm6)) 
"/c/Users/daniel/proj/sys/gcc/github/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5b.c":29
 -1
     (nil))


RTL post-patch:

(insn/f 41 40 42 2 (set (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
                (const_int 48 [0x30])) [6  S16 A128])
        (reg:V4SF 27 xmm6)) 
"/c/Users/daniel/proj/sys/gcc/github/gcc/testsuite/gcc.target/x86_64/abi/callabi/vaarg-5b.c":29
 -1
     (expr_list:REG_CFA_EXPRESSION (set (mem/c:V4SF (plus:DI (reg/f:DI 7 sp)
                    (const_int 48 [0x30])) [6  S16 A128])
            (reg:V4SF 27 xmm6))
        (nil)))


I haven't learned much of the dwarf code so I can't fully appreciate the function of all of these notes, but if we're using the SP should I just omit the note and let dwarf intuit the insn? The test in i386_pe_seh_unwind_emit() presumes that if we're using REG_CFA_EXPRESSION then we've used DRAP, but that isn't the case after this patch. Can you please advise on the correct solution? My current guess is to just remove the above chunk (or at least remove the note).

Also of note, I need to do more analysis on why my tests did not expose this flaw, since va args is something that it tests.

Thanks!
Daniel

Reply via email to