[PATCH] Expansion of __builtin_frame_address
Mark Shinwell
shinwell@codesourcery.com
Wed Jun 7 13:57:00 GMT 2006
Ian Lance Taylor wrote:
> Mark Shinwell <shinwell@codesourcery.com> writes:
>
>>>> (i) always return the hard frame pointer, and disable FP elimination in
>>>> the current function; or
>>>>
>>>> (iii) ...the same as option (i), but allow targets to define another macro
>>>> that will cause the default code to use the soft frame pointer rather than
>>>> the hard frame pointer, and hence allow FP elimination. (If such a macro
>>>> were set by a particular target, am I right in thinking that it would be
>>>> safe to use the soft frame pointer even in the count >= 1 cases?)
>>>> I tend to think that option (iii) might be best, although perhaps it
>>>> is overkill and option (i) would do. But I'm not entirely sure;
>>>> still being a gcc novice I have to admit to not being quite thoroughly
>>>> clear on this myself at this stage. So any advice or comments would be
>>>> appreciated!
>>> I agree that option (iii) is best, as it provides the ability to
>>> optimize on platforms where that is feasible, and still provides a
>>> working default elsewhere. I will review and approve a suitable patch
>>> to implement (iii), assuming that there are no objections from Jim or
>>> others.
>> This having been discussed some more, and my understanding improved,
>> I now believe that option (i) is in fact the correct thing to do. The
>> attach patch implements this, which basically amounts to the same logic
>> that is currently in the compiler save for the removal of the special
>> case when count == 0.
>>
>> OK for mainline?
>>
>> Mark
>>
>> --
>>
>> 2006-06-01 Mark Shinwell <shinwell@codesourcery.com>
>>
>> * gcc/builtins.c (expand_builtin_return_addr): Always use
>> hard_frame_pointer_rtx and prevent frame pointer elimination
>> if INITIAL_FRAME_ADDRESS_RTX isn't set.
>
> I also believe this is the correct choice. This is OK if it passes
> bootstrap and testing.
I'm sorry to prolong this thread, but I think the patch below is
more satisfactory, since it doesn't force a frame pointer for
__builtin_return_address in the count == 0 case (in such cases we
don't need to force the FP since target-specific code does the
correct thing at a later stage).
This of course is still not entirely satisfactory from the point of
view of __builtin_frame_address, since we can't just stroll up the
frames on some targets. To try to tighten the behaviour here, it has
been suggested that the target-specific macro CAN_DEBUG_WITHOUT_FP
could be used. If this is defined, we might suspect that the stack
doesn't have a regular layout, and therefore make __builtin_frame_address
cause a static error for n > 0. This might be overkill, however, given
how much of a can of worms this general area is.
Mark
--
2006-06-07 Mark Shinwell <shinwell@codesourcery.com>
* gcc/builtins.c (expand_builtin_return_addr): Only use
frame_pointer_rtx when count == 0 and we are expanding
__builtin_return_address.
--
Index: builtins.c
===================================================================
--- builtins.c (revision 114325)
+++ builtins.c (working copy)
@@ -496,12 +496,16 @@ expand_builtin_return_addr (enum built_i
#else
rtx tem;
- /* For a zero count, we don't care what frame address we return, so frame
- pointer elimination is OK, and using the soft frame pointer is OK.
- For a non-zero count, we require a stable offset from the current frame
- pointer to the previous one, so we must use the hard frame pointer, and
+ /* For a zero count with __builtin_return_address, we don't care what
+ frame address we return, because target-specific definitions will
+ override us. Therefore frame pointer elimination is OK, and using
+ the soft frame pointer is OK.
+
+ For a non-zero count, or a zero count with __builtin_frame_address,
+ we require a stable offset from the current frame pointer to the
+ previous one, so we must use the hard frame pointer, and
we must disable frame pointer elimination. */
- if (count == 0)
+ if (count == 0 && fndecl_code == BUILT_IN_RETURN_ADDRESS)
tem = frame_pointer_rtx;
else
{
More information about the Gcc-patches
mailing list