As has been mentioned by Walter Banks, it is perfectly possible to write re-entrant functions on the PIC (and other such limited micros). It is not possible, in general, to write small and fast re-entrant functions - but small and fast code is not a requirement of the standards. Thus a good compiler for such micros can cope with re-entrant code when it has to, but will generate non-reentrant code when possible.
Similarly, there is no good reason why long longs should not be supported on the PIC. They are obviously inefficient to implement, but so what? You write your compiler to be as efficient as possible on the architecture in question, for code constructs that match the target. If someone really wants 64-bit integers on the PIC, then they probably have good reasons, and probably understand the cost - so you give them working code. About the only place I (were I a compiler writer) would break with the standards is for floating point - the standards require floating point calculations to be promoted to 64-bit doubles, which is not a good idea on a small micro. I'd be inclined, therefore, to either make doubles 32-bit normally (with a flag for 64-bit support), or to cheat and avoid promoting floats unless necessary (again, controlled by flags).
Of course, there is nothing that the compiler can do to implement the C standards' requirements regarding minimum sizes if the microcontroller's memory is too small.