Comments

Hi,
The implementation of -m[no-]omit-leaf-frame-pointer and
-f[no-]omit-frame-pointer in the AArch64 target does not behave
correctly in the presence of __attribute__ optimize.
This patch adjusts the implementation to work in a similar fashion to
the same functionality in the i386 target.
The problem occurs because the current implementation uses a global
'faked_omit_frame_pointer' to retain the original value of
flag_omit_frame_pointer. The global does not form part of the
optimization save state.
This solution removes the global and instead tracks required behaviour
using only flag_omit_frame_pointer and flag_omit_leaf_frame_pointer.
These two form part of the optimziation save state and target save state
respectively.
The additional complication for AArch64 is that the PCS requires that
given -fno-omit-frame-pointer -momit-leave-frame-pointer, a leaf
function that kills LR must create a frame record. This is readily
handled in aarch64_frame_pointer_required(). I've dropped logic in
aarch64_can_eliminate() that attempts to detect this scenario since it
appears to me to be superflous.
I'll leave this on the list for 24h for folks to comment and to give the
RM's the chance to object before committing.
Cheers
/Marcus
2014-03-25 Marcus Shawcroft <marcus.shawcroft@arm.com>
PR target/60580
* config/aarch64/aarch64.c (faked_omit_frame_pointer): Remove.
(aarch64_frame_pointer_required): Adjust logic.
(aarch64_can_eliminate): Adjust logic.
(aarch64_override_options_after_change): Adjust logic.