This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [llvmlinux] Builtin: stack pointer
- From: Behan Webster <behanw at converseincode dot com>
- To: pinskia at gmail dot com
- Cc: Renato Golin <renato dot golin at linaro dot org>, schwab at suse dot de, Compiling the Linux Kernel with Clang/LLVM <llvmlinux at lists dot linuxfoundation dot org>, gcc <gcc at gcc dot gnu dot org>
- Date: Thu, 27 Mar 2014 07:44:35 -0700
- Subject: Re: [llvmlinux] Builtin: stack pointer
- Authentication-results: sourceware.org; auth=none
- References: <CAMSE1kc3FJOq+mh=AD-FQhrGW+aVpVkWFdhfHCM+c=ZgN6Kpug at mail dot gmail dot com> <mvm61n0j6h6 dot fsf at hawking dot suse dot de> <CAMSE1kdyg5VaVTiNJ0t=+5Epstb=vPf48f_YBzM5KrQtan8MYQ at mail dot gmail dot com> <CA+=Sn1kSVpsNvng-=y6ovm85g311xzVtgpvgAiEHuw-RnrZr3g at mail dot gmail dot com>
On 03/27/14 03:44, Andrew Pinski wrote:
On Thu, Mar 27, 2014 at 3:25 AM, Renato Golin <renato.golin@linaro.org> wrote:
On 27 March 2014 10:12, Andreas Schwab <schwab@suse.de> wrote:
Can't you use __builtin_frame_address (0) instead?
That would give me the frame pointer, not the stack pointer, and the
user would have to calculate manually the offset to get the actual
stack pointer, which would be target-specific, possibly making it even
worse. Is that what you meant?
So if we audit what the kernel uses this method. There is stack
tracing code which is highly target dependent.
Yup.
And then there is current_thread_info which is also highly target
dependent code (though it can use __builtin_frame_address(0) there
since it is doing an alignment of a huge value at that point).
Already tried that. Patches doing exactly this in the ARM code in these
cases were rejected as generates less efficient code in the situation
where the kernel is compiled without a frame-pointer. So no, that is not
acceptable to upstream kernel maintainers.
That is what led to this proposal.
I don't see why there needs to be an builtin function for this case,
adding one extra instruction inside an inline-asm for the moving from
the stack point to a normal register should be good enough.
Because one extra instruction was not acceptable upstream. Patch also
rejected.
Take arch/arm64/include/asm/thread_info.h for an example,
__builtin_frame_address(0) should be good enough since the sp and fp
should be on the same page (that is what THREAD_SIZE is about).
Less efficient if compiled without a frame-pointer. Patch was rejected.
(so you need to split by arch with ifdefs),
Except it is already in the kernel anyways; not even by ifdefs but by
different files so the reasoning adding a new builtin is not useful.
For the existing cases this is true. However such a builtin would allow
it to be used in common code (as a theoretical example).
Behan
--
Behan Webster
behanw@converseincode.com