On 09/22/15 04:52, David Chisnall wrote: > On 22 Sep 2015, at 12:47, H.J. Lu <hjl.to...@gmail.com> wrote: >> >> since __builtin_exception_error () is the same as >> __builtin_return_address (0) and __builtin_interrupt_data () is >> address of __builtin_exception_error () + size of register. > > Except that they’re *not*. __builtin_return_address(0) is guaranteed to be > the same for the duration of the function. __builtin_exception_error() needs > to either: > > 1) Fetch the values early with interrupts disabled, store them in a > well-known location, and load them from this place when the intrinsic > is called, or > > 2) Force any function that calls the intrinsic (and wants a > meaningful result) to run with interrupts disabled, which is > something that the compiler can’t verify without knowing the full > chain of code from the interrupt handler to the current point (and > therefore prone to error). > > It is trivial to write a little bit of inline assembly that reads > these values from the CPU and expose that for C code. There is a > good reason why no one does this. >
This is why it makes no sense for the intrinsics to be callable from anywhere except inside the interrupt handler. It is really nothing other than a way to pass arguments -- whether or not it is simpler for the compilers to implement than supporting a different function signature is beyond my scope of expertise. -hpa