On 21.09.17 10:19, Philipp Tomsich wrote:
The previous setjmp-implementation (as a static inline function that
contained an 'asm volatile' sequence) was extremely fragile: (some
versions of) GCC optimised the set of registers.  One critical example
was the removal of 'r9' from the clobber list, if -ffixed-reg9 was
supplied.

I wouldn't call that fragile, but "works as intended". Gcc only saves the registers it really needs to save - and if r9 is fixed it can safely assume that between setjmp/longjmp it did not change.

Did you encounter other cases where it did something wrong?

To increase robustness and ensure PCS-compliant behaviour, the setjmp
and longjmp implementation are now in assembly and closely match what
one would expect to find in a libc implementation.

I'm personally quite indifferent on which version we take, but I personally found the inline asm version more readable. At least it was half-way self-documenting and struct offset independent ;).

But again, I really don't have strong feelings. I only wrote the inline asm version because we didn't have any implementation at all. If you opt to maintain yours, be my guest :).


Alex
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to