>Now to actually absorb them, given that if I were to read your
>comments literally, I'd assume that the intermediate code would be
>machine independent.

not if you're reading my comments literally. i'd already observed
that "they contain target-dependent code but not precise machine instructions",
before saying "only the loader knows or needs to know the bit patterns
and peculiar properties of the actual machine".  given that it's 
target-dependent
it certainly isn't machine independent.  it's target-dependent because
register allocation has been done with regard to the target register set, and 
because
the compiler has generated code that refers to instructions (including
virtual instructions) available on that target (eg, AMULHW or AMULHWCC
on the powerpc, but not on the x86).

the set of instructions used by the compiler for a given
target is represented by a set of enumeration values in 5.out.h, q.out.h, etc.
the compiler and assembler cannot use anything outside that set. the 
instructions are represented
in the .[8kvq5...] files by those enumeration values; that includes virtual
instructions and pseudo-ops such as ANAME, ASIGNAME, ATEXT, and AGLOBL.
the enum values are written as one or two-byte value, followed by operand 
descriptors.
the operands to instructions resemble those on the target, so that they can use
double-indexing if the machine supports that, or shift/rotate (cf. ARM).
they are virtual to the extent that some irregularities of the actual processor
are glossed over, and also because external references are by name, not by 
address.
the representation is therefore an abstraction of the real machine,
but it isn't machine independent. different machines have different types and 
numbers
of operands, and different representations in detail for them.

libmach has modules 5obj.c kobj.c etc. that interpret the formats for the 
benefit
of nm and ar amongst others.

Reply via email to