[He also includes a note about ELFV2 ABI for powerpc64le.]

Quoting llvm 26856 Comment 6 (he put the text in the 26856 submittal but the 
content also covers 26519 and most of 26844):

> Ulrich Weigand 2016-03-09 11:53:17 CST
> 
> Yes, there's indeed a couple of problems here, which affect different areas.
> 
> 1) On 32-bit ppc, LLVM violates the ABI by storing below the stack pointer 
> even though the ABI does not provide a "red zone".  This affects every 
> function with a stack frame, and could in theory lead to spurious crashes 
> when an asynchronous signal overwrites this area.  This seems to be a known 
> issue; the source code contains FIXME lines:
>     // FIXME: On PPC32 SVR4, we must not spill before claiming the stackframe.
> 
> 2) In some scenarios, registers may be spilled/restored twice to the stack.  
> This happens because while most of the spilling happens in 
> PPCFrameLowering::spillCalleeSavedRegisters, a few selected registers are 
> also spilled in PPCFrameLowering::emitPrologue.  Those registers are the 
> frame pointer, base pointer, PIC base pointer, link register, and condition 
> code register.  For the latter two, code ensures that they can never be 
> spilled in both places (for CR, there is extra code in 
> spillCalleeSavedRegisters; for LR, the register is removed from SavedRegs in 
> determineCalleeSaves).
> 
> However, for FP, BP, and PBP, nothing ensures the registers are not spilled 
> twice.  It is probably *rare* for this to happen, because the register 
> allocator will not use those registers within the function if they're needed 
> for their special purpose, but it can happen in rare cases.  This includes 
> the case of a system unwinder routine that uses __builtin_unwind_init, but 
> could also include other routines that clobber one of those registers, e.g. 
> the following case:
> 
> void func (void);
> 
> void test (void)
> {
>   func ();
>   asm ("nop" : : : "31");
> }
> 
> When it happens that a register is spilled twice, the code as such still 
> works correctly, but the DWARF CFI unwind info associated with the routine 
> will be broken, which can mess up both C++ exception handling and debugging.
> 
> 3) For the specific case of system unwinder routines that use 
> __builtin_unwind_init and/or __builtin_eh_return, special things need to 
> happen in the prolog and epilog that are not required for any other routine.  
> This in particular includes setting up save areas and CFI records for the EH 
> data registers (r3 ... r6).  [See bug #26844. ]  For the ELFv2 ABI 
> (powerpc64le), it also include using three separate save areas for the three 
> caller-saved condition register fields, so that the EH logic can overwrite 
> their values independently.
> 
> None of this is currently implemented in LLVM, since on Linux generally GCC 
> is used to build the system unwind libraries, and no other code in the system 
> ever needs those special constructs.


===
Mark Millard
markmi at dsl-only.net

_______________________________________________
freebsd-toolchain@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
To unsubscribe, send any mail to "freebsd-toolchain-unsubscr...@freebsd.org"

Reply via email to