Why is this valid? Shouldn't the assembler reject it (it doesn't)? How
can a global variable be defined as opaque? What's it size?
Does this just indicate that %x is some "unknown undefined" global which
will be resolved when linking?
If so, the CBE will choke (abort) on it, as does my XPLBE. Should I fix
this? How? Just declare it as a "char" or something? Won't that confuse
the linker?
Why is this valid? Shouldn't the assembler reject it (it doesn't)? How
can a global variable be defined as opaque? What's it size?
It has no size yet.
Does this just indicate that %x is some "unknown undefined" global which
will be resolved when linking?
undefined == external, so no.
If so, the CBE will choke (abort) on it, as does my XPLBE. Should I fix
this? How? Just declare it as a "char" or something? Won't that confuse
the linker?
The LLVM type system is more general than the C type system in a couple of ways. For example, it also allows definitions like "{ opaque, int }". This is fine as long as the type is resolved before codegen (e.g. at link-time), because code generators obviously like to have known offsets to elements in the struct.
Like you said, this sort of thing isn't supported by any of the other code generators, so I don't know why yours would be any different in this way.