https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114664
--- Comment #11 from Peter Bergner <bergner at gcc dot gnu.org> --- (In reply to Richard Sandiford from comment #10) > Yeah, I agree it's an error. The PR says “ICE”, but is there an internal > error? The “cannot be used in ‘asm’ here” is a normal user-facing error, > albeit with bad error recovery, leading us to report the same thing multiple > times. My bad for calling it an ICE. Clearly it's not an ICE but a normal error as you say. > > but how are users supposed to know whether > > -fno-omit-frame-pointer is in effect or not? I've looked and there is no > > pre-defined macro a user could check. > That might be a useful thing to have, but if the programmer has no control > over the build flags (i.e. cannot require/force -fomit-frame-pointer) then I > think the asm has to take care to save and restore the frame pointer itself. > > Dropping "31" from the asm means that the asm must preserve the register. > Things will go badly if the asm doesn't do that. So r31 which we use as our frame-pointer reg is a non-volatile/callee saved register, so it must be saved, but I guess they (greenlet) cannot use the method of mentioning it in the asm clobber list to perform that.