This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: ARM setjmp and r12


Hi Konrad,

On the ARM, why does setjmp preserve r12 (ip)? I believe r12 is caller-preserved, not callee-preserved.

I *think* that this is because GCC uses it as the static chain register for nested functions (when operating in ARM mode).

Would that even be legal?

Yes...


Shouldn't the contents/layout of jmpbuf be
specified by the ABI?

The ARM EABI specifies the jmp_buf type as being an opaque type. ie one whose contents are not specified by the EABI. It does mandate that if the define _AEABI_PORTABILITY_LEVEL is 0 that the size of the jump buffer should be at least 8. (See section 5.11 of the ARM C-library EABI for more information).


Or how would different implementations interoperate?

By not sharing implementations of setjmp and longjmp. ie if you link with the setjmp() implementation from one particular library you must also link with the longjmp() implementation from the same library. This is usually not an issue, as you would have to try quite hard to link with different versions of these functions.


The only real issue is whether the code that invokes setjmp() and longjmp() have passed a sufficiently sized buffer in as one of the parameters. Providing that the setjmp.h header files for the two different C libraries that you are using(1) define a jmp_buf type that is sufficiently large, then there should not be problems.

Cheers
  Nick

(1) Why on earth would you want to use two different C libraries anyway? This is just asking for trouble.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]