Teach .org to handle complex expressions

This commit is contained in:
Alan Modra 2001-03-17 03:02:06 +00:00
parent 4a5c6a1dd9
commit 2289f85d24
3 changed files with 30 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2001-03-17 Alan Modra <alan@linuxcare.com.au>
* read.c (do_org): Handle complex expressions.
* cgen.c (gas_cgen_finish_insn): Likewise.
2001-03-15 David Mosberger <davidm@hpl.hp.com>
* config/tc-ia64.c (md): New member keep_pending_output.

View File

@ -398,6 +398,9 @@ gas_cgen_finish_insn (insn, buf, length, relax_p, result)
{
int max_len;
fragS *old_frag;
expressionS *exp;
symbolS *sym;
offsetT off;
#ifdef TC_CGEN_MAX_RELAX
max_len = TC_CGEN_MAX_RELAX (insn, byte_len);
@ -414,14 +417,24 @@ gas_cgen_finish_insn (insn, buf, length, relax_p, result)
/* Create a relaxable fragment for this instruction. */
old_frag = frag_now;
exp = &fixups[relax_operand].exp;
sym = exp->X_add_symbol;
off = exp->X_add_number;
if (exp->X_op != O_constant && exp->X_op != O_symbol)
{
/* Handle complex expressions. */
sym = make_expr_symbol (exp);
off = 0;
}
frag_var (rs_machine_dependent,
max_len - byte_len /* max chars */,
0 /* variable part already allocated */,
/* FIXME: When we machine generate the relax table,
machine generate a macro to compute subtype. */
1 /* subtype */,
fixups[relax_operand].exp.X_add_symbol,
fixups[relax_operand].exp.X_add_number,
sym,
off,
f);
/* Record the operand number with the fragment so md_convert_frag

View File

@ -2379,9 +2379,17 @@ do_org (segment, exp, fill)
else
{
char *p;
symbolS *sym = exp->X_add_symbol;
offsetT off = exp->X_add_number * OCTETS_PER_BYTE;
p = frag_var (rs_org, 1, 1, (relax_substateT) 0, exp->X_add_symbol,
exp->X_add_number * OCTETS_PER_BYTE, (char *) NULL);
if (exp->X_op != O_constant && exp->X_op != O_symbol)
{
/* Handle complex expressions. */
sym = make_expr_symbol (exp);
off = 0;
}
p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0);
*p = fill;
}
}