2001-07-06 John Healy <jhealy@redhat.com>
* cgen.c (gas_cgen_save_fixups): Modified to allow more than one set of fixups to be stored. (gas_cgen_restore_fixups): Modified to allow the fixup chain to be restored to be chosen from any that are saved. (gas_cgen_swap_fixups): Modified to allow the current set of fixups to be swapped with any other set that has been saved. (gas_cgen_initialize_saved_fixups_array): New routine. * cgen.h: Modifed prototypes for gas_cgen_save_fixups, gas_cgen_restore_fixups, and gas_cgen_swap_fixups. Added definitions or MAX_SAVED_FIXUP_CHAINS. * config/tc-m32r.c (assemble_two_insns): Changed calls to fixup store, swap and restore fuctions to reflect the new interface.
This commit is contained in:
parent
b1aeb4c5a3
commit
002de68b31
|
@ -1,3 +1,18 @@
|
||||||
|
2001-07-06 John Healy <jhealy@redhat.com>
|
||||||
|
|
||||||
|
* cgen.c (gas_cgen_save_fixups): Modified to allow more than one
|
||||||
|
set of fixups to be stored.
|
||||||
|
(gas_cgen_restore_fixups): Modified to allow the fixup chain to be
|
||||||
|
restored to be chosen from any that are saved.
|
||||||
|
(gas_cgen_swap_fixups): Modified to allow the current set of
|
||||||
|
fixups to be swapped with any other set that has been saved.
|
||||||
|
(gas_cgen_initialize_saved_fixups_array): New routine.
|
||||||
|
* cgen.h: Modifed prototypes for gas_cgen_save_fixups,
|
||||||
|
gas_cgen_restore_fixups, and gas_cgen_swap_fixups. Added definitions
|
||||||
|
or MAX_SAVED_FIXUP_CHAINS.
|
||||||
|
* config/tc-m32r.c (assemble_two_insns): Changed calls to fixup
|
||||||
|
store, swap and restore fuctions to reflect the new interface.
|
||||||
|
|
||||||
2001-07-06 Nick Clifton <nickc@cambridge.redhat.com>
|
2001-07-06 Nick Clifton <nickc@cambridge.redhat.com>
|
||||||
|
|
||||||
* config/tc-m68k.c (md_estimate_size_before_relax): Catch and
|
* config/tc-m68k.c (md_estimate_size_before_relax): Catch and
|
||||||
|
|
143
gas/cgen.c
143
gas/cgen.c
|
@ -94,62 +94,115 @@ queue_fixup (opindex, opinfo, expP)
|
||||||
++ num_fixups;
|
++ num_fixups;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The following three functions allow a backup of the fixup chain to be made,
|
/* The following functions allow fixup chains to be stored, retrieved,
|
||||||
and to have this backup be swapped with the current chain. This allows
|
and swapped. They are a generalization of a pre-existing scheme
|
||||||
certain ports, eg the m32r, to swap two instructions and swap their fixups
|
for storing, restoring and swapping fixup chains that was used by
|
||||||
at the same time. */
|
the m32r port. The functionality is essentially the same, only
|
||||||
/* ??? I think with cgen_asm_finish_insn (or something else) there is no
|
instead of only being able to store a single fixup chain, an entire
|
||||||
more need for this. */
|
array of fixup chains can be stored. It is the user's responsibility
|
||||||
|
to keep track of how many fixup chains have been stored and which
|
||||||
|
elements of the array they are in.
|
||||||
|
|
||||||
static struct fixup saved_fixups[GAS_CGEN_MAX_FIXUPS];
|
The algorithms used are the same as in the old scheme. Other than the
|
||||||
static int saved_num_fixups;
|
"array-ness" of the whole thing, the functionality is identical to the
|
||||||
|
old scheme.
|
||||||
|
|
||||||
void
|
gas_cgen_initialize_saved_fixups_array():
|
||||||
gas_cgen_save_fixups ()
|
Sets num_fixups_in_chain to 0 for each element. Call this from
|
||||||
|
md_begin() if you plan to use these functions and you want the
|
||||||
|
fixup count in each element to be set to 0 intially. This is
|
||||||
|
not necessary, but it's included just in case. It performs
|
||||||
|
the same function for each element in the array of fixup chains
|
||||||
|
that gas_init_parse() performs for the current fixups.
|
||||||
|
|
||||||
|
gas_cgen_save_fixups (element):
|
||||||
|
element - element number of the array you wish to store the fixups
|
||||||
|
to. No mechanism is built in for tracking what element
|
||||||
|
was last stored to.
|
||||||
|
|
||||||
|
gas_cgen_restore_fixups (element):
|
||||||
|
element - element number of the array you wish to restore the fixups
|
||||||
|
from.
|
||||||
|
|
||||||
|
gas_cgen_swap_fixups(int element):
|
||||||
|
element - swap the current fixups with those in this element number.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct saved_fixups {
|
||||||
|
struct fixup fixup_chain[GAS_CGEN_MAX_FIXUPS];
|
||||||
|
int num_fixups_in_chain;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct saved_fixups stored_fixups[MAX_SAVED_FIXUP_CHAINS];
|
||||||
|
|
||||||
|
void
|
||||||
|
gas_cgen_initialize_saved_fixups_array ()
|
||||||
{
|
{
|
||||||
saved_num_fixups = num_fixups;
|
int i = 0;
|
||||||
|
while (i < MAX_SAVED_FIXUP_CHAINS)
|
||||||
memcpy (saved_fixups, fixups, sizeof (fixups[0]) * num_fixups);
|
stored_fixups[i++].num_fixups_in_chain = 0;
|
||||||
|
|
||||||
num_fixups = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gas_cgen_restore_fixups ()
|
gas_cgen_save_fixups (int i)
|
||||||
{
|
{
|
||||||
num_fixups = saved_num_fixups;
|
if (i < 0 || i >= MAX_SAVED_FIXUP_CHAINS)
|
||||||
|
{
|
||||||
memcpy (fixups, saved_fixups, sizeof (fixups[0]) * num_fixups);
|
as_fatal("Index into stored_fixups[] out of bounds.");
|
||||||
|
return;
|
||||||
saved_num_fixups = 0;
|
}
|
||||||
|
stored_fixups[i].num_fixups_in_chain = num_fixups;
|
||||||
|
memcpy(stored_fixups[i].fixup_chain, fixups,
|
||||||
|
sizeof (fixups[0])*num_fixups);
|
||||||
|
num_fixups = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gas_cgen_swap_fixups ()
|
gas_cgen_restore_fixups (int i)
|
||||||
{
|
{
|
||||||
int tmp;
|
if (i < 0 || i >= MAX_SAVED_FIXUP_CHAINS)
|
||||||
struct fixup tmp_fixup;
|
{
|
||||||
|
as_fatal("Index into stored_fixups[] out of bounds.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
num_fixups = stored_fixups[i].num_fixups_in_chain;
|
||||||
|
memcpy(fixups,stored_fixups[i].fixup_chain,
|
||||||
|
(sizeof (stored_fixups[i].fixup_chain[0]))*num_fixups);
|
||||||
|
stored_fixups[i].num_fixups_in_chain = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (num_fixups == 0)
|
void
|
||||||
{
|
gas_cgen_swap_fixups (int i)
|
||||||
gas_cgen_restore_fixups ();
|
{
|
||||||
}
|
int tmp;
|
||||||
else if (saved_num_fixups == 0)
|
struct fixup tmp_fixup;
|
||||||
{
|
|
||||||
gas_cgen_save_fixups ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tmp = saved_num_fixups;
|
|
||||||
saved_num_fixups = num_fixups;
|
|
||||||
num_fixups = tmp;
|
|
||||||
|
|
||||||
for (tmp = GAS_CGEN_MAX_FIXUPS; tmp--;)
|
if (i < 0 || i >= MAX_SAVED_FIXUP_CHAINS)
|
||||||
{
|
{
|
||||||
tmp_fixup = saved_fixups [tmp];
|
as_fatal("Index into stored_fixups[] out of bounds.");
|
||||||
saved_fixups [tmp] = fixups [tmp];
|
return;
|
||||||
fixups [tmp] = tmp_fixup;
|
}
|
||||||
}
|
|
||||||
|
if (num_fixups == 0)
|
||||||
|
{
|
||||||
|
gas_cgen_restore_fixups (i);
|
||||||
|
}
|
||||||
|
else if (stored_fixups[i].num_fixups_in_chain == 0)
|
||||||
|
{
|
||||||
|
gas_cgen_save_fixups (i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmp = stored_fixups[i].num_fixups_in_chain;
|
||||||
|
stored_fixups[i].num_fixups_in_chain = num_fixups;
|
||||||
|
num_fixups = tmp;
|
||||||
|
|
||||||
|
for (tmp = GAS_CGEN_MAX_FIXUPS; tmp--;)
|
||||||
|
{
|
||||||
|
tmp_fixup = stored_fixups[i].fixup_chain [tmp];
|
||||||
|
stored_fixups[i].fixup_chain[tmp] = fixups [tmp];
|
||||||
|
fixups [tmp] = tmp_fixup;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,9 +53,12 @@ extern const char * gas_cgen_parse_operand
|
||||||
/* Call this from md_assemble to initialize the assembler callback. */
|
/* Call this from md_assemble to initialize the assembler callback. */
|
||||||
extern void gas_cgen_init_parse PARAMS ((void));
|
extern void gas_cgen_init_parse PARAMS ((void));
|
||||||
|
|
||||||
extern void gas_cgen_save_fixups PARAMS ((void));
|
/* Routines and macros for saving fixup chains. */
|
||||||
extern void gas_cgen_restore_fixups PARAMS ((void));
|
extern void gas_cgen_save_fixups PARAMS ((int));
|
||||||
extern void gas_cgen_swap_fixups PARAMS ((void));
|
extern void gas_cgen_restore_fixups PARAMS ((int));
|
||||||
|
extern void gas_cgen_swap_fixups PARAMS ((int));
|
||||||
|
extern void gas_cgen_initialize_saved_fixups_array PARAMS ((void));
|
||||||
|
#define MAX_SAVED_FIXUP_CHAINS 50
|
||||||
|
|
||||||
/* Add a register to the assembler's hash table.
|
/* Add a register to the assembler's hash table.
|
||||||
This makes lets GAS parse registers for us.
|
This makes lets GAS parse registers for us.
|
||||||
|
|
|
@ -554,6 +554,8 @@ md_begin ()
|
||||||
scom_symbol.section = &scom_section;
|
scom_symbol.section = &scom_section;
|
||||||
|
|
||||||
allow_m32rx (enable_m32rx);
|
allow_m32rx (enable_m32rx);
|
||||||
|
|
||||||
|
gas_cgen_initialize_saved_fixups_array();
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OPERAND_IS_COND_BIT(operand, indices, index) \
|
#define OPERAND_IS_COND_BIT(operand, indices, index) \
|
||||||
|
@ -832,7 +834,7 @@ assemble_two_insns (str, str2, parallel_p)
|
||||||
|
|
||||||
/* Preserve any fixups that have been generated and reset the list
|
/* Preserve any fixups that have been generated and reset the list
|
||||||
to empty. */
|
to empty. */
|
||||||
gas_cgen_save_fixups ();
|
gas_cgen_save_fixups (0);
|
||||||
|
|
||||||
/* Get the indices of the operands of the instruction. */
|
/* Get the indices of the operands of the instruction. */
|
||||||
/* FIXME: CGEN_FIELDS is already recorded, but relying on that fact
|
/* FIXME: CGEN_FIELDS is already recorded, but relying on that fact
|
||||||
|
@ -941,7 +943,7 @@ assemble_two_insns (str, str2, parallel_p)
|
||||||
|| (errmsg = (char *) can_make_parallel (&first, &second)) == NULL)
|
|| (errmsg = (char *) can_make_parallel (&first, &second)) == NULL)
|
||||||
{
|
{
|
||||||
/* Get the fixups for the first instruction. */
|
/* Get the fixups for the first instruction. */
|
||||||
gas_cgen_swap_fixups ();
|
gas_cgen_swap_fixups (0);
|
||||||
|
|
||||||
/* Write it out. */
|
/* Write it out. */
|
||||||
expand_debug_syms (first.debug_sym_link, 1);
|
expand_debug_syms (first.debug_sym_link, 1);
|
||||||
|
@ -953,7 +955,7 @@ assemble_two_insns (str, str2, parallel_p)
|
||||||
make_parallel (second.buffer);
|
make_parallel (second.buffer);
|
||||||
|
|
||||||
/* Get its fixups. */
|
/* Get its fixups. */
|
||||||
gas_cgen_restore_fixups ();
|
gas_cgen_restore_fixups (0);
|
||||||
|
|
||||||
/* Write it out. */
|
/* Write it out. */
|
||||||
expand_debug_syms (second.debug_sym_link, 1);
|
expand_debug_syms (second.debug_sym_link, 1);
|
||||||
|
@ -972,7 +974,7 @@ assemble_two_insns (str, str2, parallel_p)
|
||||||
make_parallel (first.buffer);
|
make_parallel (first.buffer);
|
||||||
|
|
||||||
/* Get the fixups for the first instruction. */
|
/* Get the fixups for the first instruction. */
|
||||||
gas_cgen_restore_fixups ();
|
gas_cgen_restore_fixups (0);
|
||||||
|
|
||||||
/* Write out the first instruction. */
|
/* Write out the first instruction. */
|
||||||
expand_debug_syms (first.debug_sym_link, 1);
|
expand_debug_syms (first.debug_sym_link, 1);
|
||||||
|
|
Loading…
Reference in New Issue