diff options
author | Ian Lance Taylor <ian@airs.com> | 1996-07-03 20:15:38 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1996-07-03 20:15:38 +0000 |
commit | 5af96dce32e08b589d845b970ce612926ac3ae80 (patch) | |
tree | d61579861a31df402c2092bd0b30279833f6fcba /gas/config/tc-mips.c | |
parent | a31e14f44c7b05fc527d83abd6e4738481add056 (diff) | |
download | gdb-5af96dce32e08b589d845b970ce612926ac3ae80.zip gdb-5af96dce32e08b589d845b970ce612926ac3ae80.tar.gz gdb-5af96dce32e08b589d845b970ce612926ac3ae80.tar.bz2 |
Based on patches from Tom Quiggle <quiggle@sgi.com>:
* ecoff.c (last_lineno): New static variable.
(add_procedure): Set last_lineno.
(ecoff_directive_loc): Likewise.
(ecoff_generate_asm_lineno): Likewise.
(ecoff_fix_loc): New function.
* ecoff.h (ecoff_fix_loc): Declare.
* config/tc-mips.c (append_insn): When inserting nops, and using
ECOFF debugging, call ecoff_fix_loc.
Diffstat (limited to 'gas/config/tc-mips.c')
-rw-r--r-- | gas/config/tc-mips.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index be81790..dbb3a1c 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -1007,8 +1007,8 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi) /* The previous insn might require a delay slot, depending upon the contents of the current insn. */ if (mips_isa < 4 - && ((prev_pinfo & INSN_LOAD_COPROC_DELAY) - && ! cop_interlocks + && (((prev_pinfo & INSN_LOAD_COPROC_DELAY) + && ! cop_interlocks) || (mips_isa < 2 && (prev_pinfo & INSN_LOAD_MEMORY_DELAY)))) { @@ -1025,8 +1025,8 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi) ++nops; } else if (mips_isa < 4 - && ((prev_pinfo & INSN_COPROC_MOVE_DELAY) - && ! cop_interlocks + && (((prev_pinfo & INSN_COPROC_MOVE_DELAY) + && ! cop_interlocks) || (mips_isa < 2 && (prev_pinfo & INSN_COPROC_MEMORY_DELAY)))) { @@ -1147,10 +1147,16 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi) /* Now emit the right number of NOP instructions. */ if (nops > 0) { + fragS *old_frag; + unsigned long old_frag_offset; int i; + old_frag = frag_now; + old_frag_offset = frag_now_fix (); + for (i = 0; i < nops; i++) emit_nop (); + if (listing) { listing_prev_line (); @@ -1164,12 +1170,18 @@ append_insn (place, ip, address_expr, reloc_type, unmatched_hi) all needed nop instructions themselves. */ frag_grow (40); } + if (insn_label != NULL) { assert (S_GET_SEGMENT (insn_label) == now_seg); insn_label->sy_frag = frag_now; S_SET_VALUE (insn_label, (valueT) frag_now_fix ()); } + +#ifndef NO_ECOFF_DEBUGGING + if (ECOFF_DEBUGGING) + ecoff_fix_loc (old_frag, old_frag_offset); +#endif } } |