For that, I think it might be interesting to arrange for non-empty TBs to
exit prior to recognizing a breakpoint. So that a breakpoint TB is always
just the one operation. Except for the fact that "generate an exception" has
traditionally been a target-specific helper, we could almost make the entire
breakpoint generation be done in common code.
I'd think something like a generic "must we end the TB now" predicate would
be the proper hook. It would contain all of the usual stuff: tcg_op_buf_full
and checks for singlestep, but then add "is there a breakpoint at the next pc".