Re: gcc optimises out test of value in register-only loop

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/13/2011 12:23 PM, MikeW wrote:
> sh4-linux-gcc (GCC) 4.2.4 [unfortunately the version is tied to the
>  kernel build. ]
> 
> In some kernel code where RAM is unavailable due to manipulation of the MMU,
> I wanted to place some 'got here' stops in the code so I could ^C break in gdb,
> reset a register value and allow execution to continue.
> 
> Accordingly I tried:
>   volatile register int stop_loop __asm("r5")__;
> ...
>   stop_loop = 0x1234;
>   (disable MMU)
>   while (stop_loop != 0);
> ...
> 
> which seemed to generate code that checks the value of r5 only once:
> 
> xxxx08: mov r5,r1
> xxxx0a: tst r1,r1
> xxxx0c: bf xxxx0c   ;r5 never tested again!!
> xxxx0e: (unrelated code)
> 
> I also tried
>   while ((volatile)stop_loop != 0);
> and
>   while ((volatile)(stop_loop != 0));
> 
> which both gave the original asm code as above.
> 
> So, in short, is there any way to persuade gcc to reload r5 - which could
> in other non-debug situations be a global register variable updated
> in an ISR, for example.

I don't think so.  If every there was a case for "use asm", it's surely
this.

Andrew.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux