Hi Zack,
> So, the plan: Step 1 introduces - one at a time - target hooks
> corresponding to each of the above macros. All callers are changed to
> use the hooks. The default definitions of the hooks invoke the
> existing macros. The hardest part of this is working out exactly what
> their sole callers expect of LEGITIMIZE_ADDRESS and
> LEGITIMIZE_RELOAD_ADDRESS. The manual, unfortunately, is not very
> clear. I think that in both cases it amounts to "either replace X
> with a new value and jump to WIN, or leave X unmodified and drop
> through", which can be translated to "return a new value for X, or
> NULL", but I'm not sure, particularly about LEGITIMIZE_RELOAD_ADDRESS
> and its interaction with push_reload.
>
> Step 2 is to convert each architecture, one at a time, to make
> target-hook definitions. I think it makes most sense to do each
> architecture in one go, because the definitions of these macros tend
> to be intertwined. In particular, REG_OK_FOR_BASE_P etc are often
> used in the definition of GO_IF_LEGITIMATE_ADDRESS. It will require
> some care to be sure that the hooks retain the same semantics wrt
> REG_OK_STRICT. Some of the macros have sensible defaults; for
> instance, it is allowed to define a LEGITIMIZE_ADDRESS that does
> nothing. In this stage we should identify what those defaults are,
> and add appropriate functions to hooks.c; but we cannot change the
> default settings in target-def.h until all architectures are
> converted.
I would swap these two steps.
Last time I looked at this stuff, I was surprised by how many things
depended on REG_OK_STRICT. Even if macro A does not mention
REG_OK_STRICT, macro B used in A might use REG_OK_STRICT, so it's
difficult to tell in advance which macro depends on REG_OK_STRICT
either directly or indirectly. So I would change each macro to an
architecture-specific function in each architecture first. For
example, GO_IF_LEGITIMATE_ADDRESS should look like this (taken from
i386.h):
#ifdef REG_OK_STRICT
#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
do { \
if (legitimate_address_p ((MODE), (X), 1)) \
goto ADDR; \
} while (0)
#else
#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
do { \
if (legitimate_address_p ((MODE), (X), 0)) \
goto ADDR; \
} while (0)
#endif
Note that REG_OK_STRICT is essentially used as an argument to
legitimate_address_p and that the use of the function argument
decouples legitimate_address_p and REG_OK_STRICT.
Once REG_OK_STRICT appears in this way only, we are ready to introduce
new target hooks. The new target hooks would have a REG_OK_STRICT as
an argument. So in the above example, we would simply psas that
argument to the last argument of legitimate_address_p.
Kazu Hirata