diff options
author | Alan Modra <amodra@bigpond.net.au> | 2001-03-17 03:02:06 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2001-03-17 03:02:06 +0000 |
commit | ed65d27d3fbfcd801c6ced2e407a11964cca1bb2 (patch) | |
tree | d181599a7ed4ef9975f4a16ecff3cedaa1120108 /gas/cgen.c | |
parent | edae0d5fbe308710d3263e541386c3f827602b04 (diff) | |
download | binutils-redhat-ed65d27d3fbfcd801c6ced2e407a11964cca1bb2.tar.gz |
Teach .org to handle complex expressions
Diffstat (limited to 'gas/cgen.c')
-rw-r--r-- | gas/cgen.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/gas/cgen.c b/gas/cgen.c index d2eb7eccd5..3baee8fe94 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 |