>>10register alloc
It has essentialy none. It's the price you pay for single pass-ness (this also reduces overall complexity as there is no internal IR either - everything is emitted on the go). Same for error reporting being severely restricted by a single pass. As I elaborated before, TCC embraces the "all or nothing" ethos of compilers. It does not bother optimizing things at a cost of compiler complexity, because that'd be suddenly GCC/llvm competition it can't win.
However in terms of (supported features)/(compiler complexity) weight, it has no rival (yet?).
As for opaque struct passing, I suspect it's related to ABI (because there is no stable ABI for that, it's compiler specific). Things will definitely explode if you pass structs with something gcc linked.
retarget
This makes sense only in case when the compiler is enormous and resource intensive to build - like llvm.
With tcc, just compile each target as libtcc DSO, and dlopen you need to emit code for.
TCC is not particularly ABI and ANSI compliant, it's merely designed for "compile linux kernel", which is a practical benchmark of general useability.