--- gas/config/tc-i386.c.jj 2002-07-18 11:35:39.000000000 +0200 +++ gas/config/tc-i386.c 2002-07-31 15:04:27.000000000 +0200 @@ -104,7 +104,8 @@ static void output_insn PARAMS ((void)); static void output_branch PARAMS ((void)); static void output_jump PARAMS ((void)); static void output_interseg_jump PARAMS ((void)); -static void output_imm PARAMS ((void)); +static void output_imm PARAMS ((fragS *insn_start_frag, + offsetT insn_start_off)); static void output_disp PARAMS ((void)); #ifndef I386COFF static void s_bss PARAMS ((int)); @@ -3101,14 +3102,21 @@ output_interseg_jump () md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2); } + static void output_insn () { + fragS *insn_start_frag; + offsetT insn_start_off; + /* Tie dwarf2 debug info to the address at the start of the insn. We can't do this after the insn has been output as the current frag may have been closed off. eg. by frag_var. */ dwarf2_emit_insn (0); + insn_start_frag = frag_now; + insn_start_off = frag_now_fix (); + /* Output jumps. */ if (i.tm.opcode_modifier & Jump) output_branch (); @@ -3182,7 +3190,7 @@ output_insn () output_disp (); if (i.imm_operands) - output_imm (); + output_imm (insn_start_frag, insn_start_off); } #ifdef DEBUG386 @@ -3275,7 +3283,9 @@ output_disp () } static void -output_imm () +output_imm (insn_start_frag, insn_start_off) + fragS *insn_start_frag; + offsetT insn_start_off; { char *p; unsigned int n; @@ -3337,11 +3347,26 @@ output_imm () (i.op[n].imms->X_op_symbol)->X_op) == O_subtract)))) { + offsetT add; + + if (insn_start_frag == frag_now) + add = (p - frag_now->fr_literal) - insn_start_off; + else + { + fragS *fr; + + add = insn_start_frag->fr_fix - insn_start_off; + for (fr = insn_start_frag->fr_next; + fr && fr != frag_now; fr = fr->fr_next) + add += fr->fr_fix; + add += p - frag_now->fr_literal; + } + /* We don't support dynamic linking on x86-64 yet. */ if (flag_code == CODE_64BIT) abort (); reloc_type = BFD_RELOC_386_GOTPC; - i.op[n].imms->X_add_number += 3; + i.op[n].imms->X_add_number += add + 1; } #endif fix_new_exp (frag_now, p - frag_now->fr_literal, size,