This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] gas/config/tc-msp430.c. undo last changes and add more sanity check.


Fellows,

Last changes to msp430 target lead to strange errors if an input sile size is 
big. The following patch fixes this problem.
Cheers,
Dmitry.

2005-09-09  Dmitry Diky  <diwil@spec.ru>

        * config/tc-msp430.c (msp430_operands): Undo last changes. Instead...
        (msp430_relax_frag): add a guard check to ensure that final fr_subtype
        has been reached.


Index: config/tc-msp430.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-msp430.c,v
retrieving revision 1.21
diff -c -3 -p -r1.21 tc-msp430.c
*** config/tc-msp430.c	1 Sep 2005 12:41:25 -0000	1.21
--- config/tc-msp430.c	9 Sep 2005 08:44:46 -0000
*************** msp430_operands (struct msp430_opcode_s 
*** 1778,1791 ****
  		 of the insn from the fix piece of instruction that was emitted.
  		 Since next fragments may have variable size we tie debug info
  	         to the beginning of the instruction. */
! 	      frag = frag_more (0);
  	      dwarf2_emit_insn (0);
! 	      frag = frag_var/*iant*/ (rs_machine_dependent, 8, 2,
  				   ENCODE_RELAX (rc.lpos, STATE_BITS10), /* Wild guess.  */
  				   exp.X_add_symbol,
  				   0,	/* Offset is zero if jump dist less than 1K.  */
  				   (char *) frag);
- 	      bfd_putl16 ((bfd_vma) rc.sop, frag);
  	      break;
  	    }
  	}
--- 1778,1791 ----
  		 of the insn from the fix piece of instruction that was emitted.
  		 Since next fragments may have variable size we tie debug info
  	         to the beginning of the instruction. */
! 	      frag = frag_more (8);
  	      dwarf2_emit_insn (0);
! 	      bfd_putl16 ((bfd_vma) rc.sop, frag);
! 	      frag = frag_variant (rs_machine_dependent, 8, 2,
  				   ENCODE_RELAX (rc.lpos, STATE_BITS10), /* Wild guess.  */
  				   exp.X_add_symbol,
  				   0,	/* Offset is zero if jump dist less than 1K.  */
  				   (char *) frag);
  	      break;
  	    }
  	}
*************** msp430_operands (struct msp430_opcode_s 
*** 1815,1829 ****
  	      /* Relaxation required.  */
  	      struct hcodes_s hc = msp430_hcodes[opcode->insn_opnumb];
  
! 	      frag = frag_more (0);
  	      dwarf2_emit_insn (0);
! 	      frag = frag_var/*iant*/ (rs_machine_dependent, 8, 2,
  				   ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_BITS10), /* Wild guess.  */
  				   exp.X_add_symbol,
  				   0,	/* Offset is zero if jump dist less than 1K.  */
  				   (char *) frag);
- 	      bfd_putl16 ((bfd_vma) hc.op0, frag);
- 	      bfd_putl16 ((bfd_vma) hc.op1, frag+2);
  	      break;
  	    }
  	}
--- 1815,1830 ----
  	      /* Relaxation required.  */
  	      struct hcodes_s hc = msp430_hcodes[opcode->insn_opnumb];
  
! 	      frag = frag_more (8);
  	      dwarf2_emit_insn (0);
! 	      bfd_putl16 ((bfd_vma) hc.op0, frag);
! 	      bfd_putl16 ((bfd_vma) hc.op1, frag+2);
! 
! 	      frag = frag_variant (rs_machine_dependent, 8, 2,
  				   ENCODE_RELAX (STATE_EMUL_BRANCH, STATE_BITS10), /* Wild guess.  */
  				   exp.X_add_symbol,
  				   0,	/* Offset is zero if jump dist less than 1K.  */
  				   (char *) frag);
  	      break;
  	    }
  	}
*************** msp430_relax_frag (segT seg ATTRIBUTE_UN
*** 2305,2311 ****
      {
        /* Look backwards.  */
        for (next_state = this_type->rlx_more; next_state;)
! 	if (aim >= this_type->rlx_backward)
  	  next_state = 0;
  	else
  	  {
--- 2306,2312 ----
      {
        /* Look backwards.  */
        for (next_state = this_type->rlx_more; next_state;)
! 	if (aim >= this_type->rlx_backward || !this_type->rlx_backward)
  	  next_state = 0;
  	else
  	  {
*************** msp430_relax_frag (segT seg ATTRIBUTE_UN
*** 2319,2325 ****
      {
        /* Look forwards.  */
        for (next_state = this_type->rlx_more; next_state;)
! 	if (aim <= this_type->rlx_forward)
  	  next_state = 0;
  	else
  	  {
--- 2320,2326 ----
      {
        /* Look forwards.  */
        for (next_state = this_type->rlx_more; next_state;)
! 	if (aim <= this_type->rlx_forward || !this_type->rlx_forward)
  	  next_state = 0;
  	else
  	  {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]