[PATCH v3] gcc/config/tilegx/tilegx.c (tilegx_function_profiler): Save r10 to stack before call mcount

Jeff Law law@redhat.com
Mon Oct 24 15:28:00 GMT 2016


On 10/23/2016 12:11 PM, Bernd Edlinger wrote:
> Hi,
>
> I don't know much about tilegx, but
> I think the patch should work as is.
>
> This is because the
> Save r10 code is a bundle
>
>   {
>   addi sp, sp, -8
>   st sp, r10
>   }
>
> which stores r10 at [sp] and subtracts 8 from sp.
>
> The restore r10 code is actually two bundles:
Thanks for pointing that out!  I totally missed the restore was two bundles.


>
>   addi sp, sp, 8
>   ld r10, sp
>
> This just adds 8 to sp, and loads r10 from there.
Right.  And with the restore as two bundles the semantics of the 
save/restore seem consistent/correct.

>
> I don't know how __mcount is implemented, it must
> be some asm code, almost all functions save the
> lr at [sp] when invoked, but I don't know if __mcount
> does that at all, if it doesn't do that, then the
> adjusting of sp might be unnecessary.
>
> The only thing that might be a problem is that
> the stack is always adjusted in multiples of 16
> on the tilegx platform, see tilegx.h:
>
> #define STACK_BOUNDARY 128
>
> That is counted in bits, and means 16 bytes.
> But your patch adjusts the stack only by 8.
Missed that.  Without knowing the tile ports, I can't say with any 
degree of confidence that it's safe to only adjust by 8 bytes. 
Adjusting by 16 seems safer.

>
> Furthermore, I don't see how the stack unwinding will work
> with this stack adjustment when no .cfi directives
> are emitted, but that is probably not a big problem.
I wouldn't be surprised if the tilegx isn't the only port with this 
problem.   I don't think we've ever been good about making sure the 
unwinders are correct for targets where we profile before the prologue 
and which emit the profiling bits directly rather than representing them 
as RTL.

jeff



More information about the Gcc-patches mailing list