[Bug 207325] projects/clang380-import for TARGET_ARCH=powerpc : c++ exceptions cause SEGV (9 line program)

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Sat Feb 27 23:17:52 UTC 2016


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=207325

--- Comment #6 from Mark Millard <markmi at dsl-only.net> ---
I've tracked this down to misbehavior of clang 3.8.0 for __builtin_dwarf_cfa ()
for TARGET_ARCH=powerpc in:

#define uw_init_context(CONTEXT)                                           \
  do                                                                       \
    {                                                                      \
      /* Do any necessary initialization to access arbitrary stack frames. \
         On the SPARC, this means flushing the register windows.  */       \
      __builtin_unwind_init ();                                            \
      uw_init_context_1 (CONTEXT, __builtin_dwarf_cfa (),                  \
                         __builtin_return_address (0));                    \
    }                                                                      \
  while (0)
. . .
85      _Unwind_Reason_Code
86      _Unwind_RaiseException(struct _Unwind_Exception *exc)
87      {
88        struct _Unwind_Context this_context, cur_context;
89        _Unwind_Reason_Code code;
90      
91        /* Set up this_context to describe the current stack frame.  */
92        uw_init_context (&this_context);

In the below r4 ends up with the __builtin_dwarf_cfa () value:

Dump of assembler code for function _Unwind_RaiseException:
   0x419a8fd8 <+0>:     mflr    r0
   0x419a8fdc <+4>:     stw     r31,-148(r1)
   0x419a8fe0 <+8>:     stw     r30,-152(r1)
   0x419a8fe4 <+12>:    stw     r0,4(r1)
   0x419a8fe8 <+16>:    stwu    r1,-2992(r1)
   0x419a8fec <+20>:    mr      r31,r1
. . .
   0x419a9094 <+188>:   mr      r4,r31
   0x419a9098 <+192>:   mflr    r30
   0x419a909c <+196>:   lwz     r5,2996(r31)
   0x419a90a0 <+200>:   mr      r3,r28
   0x419a90a4 <+204>:   bl      0x419a929c <uw_init_context_1>

That r4 ends up holding the stack pointer (r1) value for after it has been
decremented. It is not pointing at the boundary with the caller's frame.

The .eh_frame information and unwind code is set up for it pointing at the
boundary with the caller's frame. So the cfa relative addressing is messed up
for what it actually extracts.

Contrast this with gcc/g++ 5.3's TARGET_ARCH=powerpc64 code where r4 is  made
to be at the boundary with the caller's frame:

Dump of assembler code for function _Unwind_RaiseException:
   0x00000000501cb810 <+0>:     mflr    r0
   0x00000000501cb814 <+4>:     stdu    r1,-5648(r1)
. . .
   0x00000000501cb8d0 <+192>:   addi    r4,r1,5648
   0x00000000501cb8d4 <+196>:   stw     r12,5656(r1)
   0x00000000501cb8d8 <+200>:   mr      r28,r3
   0x00000000501cb8dc <+204>:   addi    r31,r1,2544
   0x00000000501cb8e0 <+208>:   mr      r3,r27
   0x00000000501cb8e4 <+212>:   addi    r29,r1,112
   0x00000000501cb8e8 <+216>:   bl      0x501cae60 <uw_init_context_1>


NOTE: This may in someway be associated with the clang 3.8.0 ABI violation in
how it handles the stack pointer for FreeBSD: TARGET_ARCH=powerpc is currently
using a "red zone", decrementing the stack pointer late, and incrementing the
stack pointer early compared to the ABI rules. (This is similar to the official
FreeBSD ABI for TARGET_ARCH=powerpc64.)

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-bugs mailing list