From: Alan Modra Date: Sat, 17 Mar 2001 03:02:06 +0000 (+0000) Subject: Teach .org to handle complex expressions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2289f85d2410fb736111f0c4adf99eba874f38be;p=binutils-gdb.git Teach .org to handle complex expressions --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 3d9e3577bd7..a2914001e3e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2001-03-17 Alan Modra + + * read.c (do_org): Handle complex expressions. + * cgen.c (gas_cgen_finish_insn): Likewise. + 2001-03-15 David Mosberger * config/tc-ia64.c (md): New member keep_pending_output. diff --git a/gas/cgen.c b/gas/cgen.c index d2eb7eccd59..3baee8fe94b 100644 --- a/gas/cgen.c +++ b/gas/cgen.c @@ -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 diff --git a/gas/read.c b/gas/read.c index e6462e6b365..29ab1553a5f 100644 --- a/gas/read.c +++ b/gas/read.c @@ -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; } }