Nicholas Clifton 0ae73d
diff -rcp ../binutils-2.20.51.0.2.original/bfd/ChangeLog ./bfd/ChangeLog
Nicholas Clifton 0ae73d
*** ../binutils-2.20.51.0.2.original/bfd/ChangeLog	2010-04-08 12:35:44.000000000 +0100
Nicholas Clifton 0ae73d
--- ./bfd/ChangeLog	2010-04-08 12:35:59.000000000 +0100
Nicholas Clifton 0ae73d
***************
Nicholas Clifton 0ae73d
*** 1,3 ****
Nicholas Clifton 0ae73d
--- 1,31 ----
Nicholas Clifton 0ae73d
+ 2010-04-08  Nick Clifton  <nickc@redhat.com>
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	Import these patches from the mainline:
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	2010-04-05  Jakub Jelinek  <jakub@redhat.com>
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	* elf-eh-frame.c (_bfd_elf_parse_eh_frame): Handle CIE version 4
Nicholas Clifton 0ae73d
+ 	provided that it has the expected address size and zero segment
Nicholas Clifton 0ae73d
+ 	length.
Nicholas Clifton 0ae73d
+ 	* dwarf2.c (struct line_head): Add maximum_ops_per_insn field.
Nicholas Clifton 0ae73d
+ 	(struct line_info): Add op_index field, change end_sequence type to
Nicholas Clifton 0ae73d
+ 	unsigned char.
Nicholas Clifton 0ae73d
+ 	(new_line_sorts_after): For the same address compare op_index.
Nicholas Clifton 0ae73d
+ 	(add_line_info): Add op_index argument, store it into the structure.
Nicholas Clifton 0ae73d
+ 	(decode_line_info): Complain about unknown versions of .debug_line.
Nicholas Clifton 0ae73d
+ 	Initialize maximum_ops_per_insn.  Add op_index state register and
Nicholas Clifton 0ae73d
+ 	track it.
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	2010-04-01  Jakub Jelinek  <jakub@redhat.com>
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	* dwarf2.c (read_attribute_value): Handle CU version 4
Nicholas Clifton 0ae73d
+ 	for DW_FORM_ref_addr, handle DW_FORM_sec_offset, DW_FORM_exprloc
Nicholas Clifton 0ae73d
+ 	and DW_FORM_flag_present.  For unknown form value return NULL.
Nicholas Clifton 0ae73d
+ 	(scan_unit_for_symbols): For DW_AT_location handle DW_FORM_exprloc
Nicholas Clifton 0ae73d
+ 	like DW_FORM_block.
Nicholas Clifton 0ae73d
+ 	(parse_comp_unit): Allow CU version 4.
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
  2010-04-07  Nick Clifton  <nickc@redhat.com>
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	Import this patch from the mainline:
Nicholas Clifton 0ae73d
diff -rcp ../binutils-2.20.51.0.2.original/bfd/dwarf2.c ./bfd/dwarf2.c
Nicholas Clifton 0ae73d
*** ../binutils-2.20.51.0.2.original/bfd/dwarf2.c	2010-04-08 12:35:44.000000000 +0100
Nicholas Clifton 0ae73d
--- ./bfd/dwarf2.c	2010-04-08 12:35:59.000000000 +0100
Nicholas Clifton 0ae73d
*************** struct line_head
Nicholas Clifton 0ae73d
*** 45,50 ****
Nicholas Clifton 0ae73d
--- 45,51 ----
Nicholas Clifton 0ae73d
    unsigned short version;
Nicholas Clifton 0ae73d
    bfd_vma prologue_length;
Nicholas Clifton 0ae73d
    unsigned char minimum_instruction_length;
Nicholas Clifton 0ae73d
+   unsigned char maximum_ops_per_insn;
Nicholas Clifton 0ae73d
    unsigned char default_is_stmt;
Nicholas Clifton 0ae73d
    int line_base;
Nicholas Clifton 0ae73d
    unsigned char line_range;
Nicholas Clifton 0ae73d
*************** read_attribute_value (struct attribute *
Nicholas Clifton 0ae73d
*** 753,759 ****
Nicholas Clifton 0ae73d
      case DW_FORM_ref_addr:
Nicholas Clifton 0ae73d
        /* DW_FORM_ref_addr is an address in DWARF2, and an offset in
Nicholas Clifton 0ae73d
  	 DWARF3.  */
Nicholas Clifton 0ae73d
!       if (unit->version == 3)
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
  	  if (unit->offset_size == 4)
Nicholas Clifton 0ae73d
  	    attr->u.val = read_4_bytes (unit->abfd, info_ptr);
Nicholas Clifton 0ae73d
--- 754,760 ----
Nicholas Clifton 0ae73d
      case DW_FORM_ref_addr:
Nicholas Clifton 0ae73d
        /* DW_FORM_ref_addr is an address in DWARF2, and an offset in
Nicholas Clifton 0ae73d
  	 DWARF3.  */
Nicholas Clifton 0ae73d
!       if (unit->version == 3 || unit->version == 4)
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
  	  if (unit->offset_size == 4)
Nicholas Clifton 0ae73d
  	    attr->u.val = read_4_bytes (unit->abfd, info_ptr);
Nicholas Clifton 0ae73d
*************** read_attribute_value (struct attribute *
Nicholas Clifton 0ae73d
*** 767,772 ****
Nicholas Clifton 0ae73d
--- 768,780 ----
Nicholas Clifton 0ae73d
        attr->u.val = read_address (unit, info_ptr);
Nicholas Clifton 0ae73d
        info_ptr += unit->addr_size;
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
+     case DW_FORM_sec_offset:
Nicholas Clifton 0ae73d
+       if (unit->offset_size == 4)
Nicholas Clifton 0ae73d
+ 	attr->u.val = read_4_bytes (unit->abfd, info_ptr);
Nicholas Clifton 0ae73d
+       else
Nicholas Clifton 0ae73d
+ 	attr->u.val = read_8_bytes (unit->abfd, info_ptr);
Nicholas Clifton 0ae73d
+       info_ptr += unit->offset_size;
Nicholas Clifton 0ae73d
+       break;
Nicholas Clifton 0ae73d
      case DW_FORM_block2:
Nicholas Clifton 0ae73d
        amt = sizeof (struct dwarf_block);
Nicholas Clifton 0ae73d
        blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
Nicholas Clifton 0ae73d
*************** read_attribute_value (struct attribute *
Nicholas Clifton 0ae73d
*** 805,810 ****
Nicholas Clifton 0ae73d
--- 813,819 ----
Nicholas Clifton 0ae73d
        attr->u.str = read_indirect_string (unit, info_ptr, &bytes_read);
Nicholas Clifton 0ae73d
        info_ptr += bytes_read;
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
+     case DW_FORM_exprloc:
Nicholas Clifton 0ae73d
      case DW_FORM_block:
Nicholas Clifton 0ae73d
        amt = sizeof (struct dwarf_block);
Nicholas Clifton 0ae73d
        blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
Nicholas Clifton 0ae73d
*************** read_attribute_value (struct attribute *
Nicholas Clifton 0ae73d
*** 831,836 ****
Nicholas Clifton 0ae73d
--- 840,848 ----
Nicholas Clifton 0ae73d
        attr->u.val = read_1_byte (abfd, info_ptr);
Nicholas Clifton 0ae73d
        info_ptr += 1;
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
+     case DW_FORM_flag_present:
Nicholas Clifton 0ae73d
+       attr->u.val = 1;
Nicholas Clifton 0ae73d
+       break;
Nicholas Clifton 0ae73d
      case DW_FORM_sdata:
Nicholas Clifton 0ae73d
        attr->u.sval = read_signed_leb128 (abfd, info_ptr, &bytes_read);
Nicholas Clifton 0ae73d
        info_ptr += bytes_read;
Nicholas Clifton 0ae73d
*************** read_attribute_value (struct attribute *
Nicholas Clifton 0ae73d
*** 868,873 ****
Nicholas Clifton 0ae73d
--- 880,886 ----
Nicholas Clifton 0ae73d
        (*_bfd_error_handler) (_("Dwarf Error: Invalid or unhandled FORM value: %u."),
Nicholas Clifton 0ae73d
  			     form);
Nicholas Clifton 0ae73d
        bfd_set_error (bfd_error_bad_value);
Nicholas Clifton 0ae73d
+       return NULL;
Nicholas Clifton 0ae73d
      }
Nicholas Clifton 0ae73d
    return info_ptr;
Nicholas Clifton 0ae73d
  }
Nicholas Clifton 0ae73d
*************** struct line_info
Nicholas Clifton 0ae73d
*** 897,903 ****
Nicholas Clifton 0ae73d
    char *filename;
Nicholas Clifton 0ae73d
    unsigned int line;
Nicholas Clifton 0ae73d
    unsigned int column;
Nicholas Clifton 0ae73d
!   int end_sequence;		/* End of (sequential) code sequence.  */
Nicholas Clifton 0ae73d
  };
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  struct fileinfo
Nicholas Clifton 0ae73d
--- 910,917 ----
Nicholas Clifton 0ae73d
    char *filename;
Nicholas Clifton 0ae73d
    unsigned int line;
Nicholas Clifton 0ae73d
    unsigned int column;
Nicholas Clifton 0ae73d
!   unsigned char op_index;
Nicholas Clifton 0ae73d
!   unsigned char end_sequence;		/* End of (sequential) code sequence.  */
Nicholas Clifton 0ae73d
  };
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  struct fileinfo
Nicholas Clifton 0ae73d
*************** new_line_sorts_after (struct line_info *
Nicholas Clifton 0ae73d
*** 963,969 ****
Nicholas Clifton 0ae73d
  {
Nicholas Clifton 0ae73d
    return (new_line->address > line->address
Nicholas Clifton 0ae73d
  	  || (new_line->address == line->address
Nicholas Clifton 0ae73d
! 	      && new_line->end_sequence < line->end_sequence));
Nicholas Clifton 0ae73d
  }
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
--- 977,985 ----
Nicholas Clifton 0ae73d
  {
Nicholas Clifton 0ae73d
    return (new_line->address > line->address
Nicholas Clifton 0ae73d
  	  || (new_line->address == line->address
Nicholas Clifton 0ae73d
! 	      && (new_line->op_index > line->op_index
Nicholas Clifton 0ae73d
! 		  || (new_line->op_index == line->op_index
Nicholas Clifton 0ae73d
! 		      && new_line->end_sequence < line->end_sequence))));
Nicholas Clifton 0ae73d
  }
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
*************** new_line_sorts_after (struct line_info *
Nicholas Clifton 0ae73d
*** 975,980 ****
Nicholas Clifton 0ae73d
--- 991,997 ----
Nicholas Clifton 0ae73d
  static void
Nicholas Clifton 0ae73d
  add_line_info (struct line_info_table *table,
Nicholas Clifton 0ae73d
  	       bfd_vma address,
Nicholas Clifton 0ae73d
+ 	       unsigned char op_index,
Nicholas Clifton 0ae73d
  	       char *filename,
Nicholas Clifton 0ae73d
  	       unsigned int line,
Nicholas Clifton 0ae73d
  	       unsigned int column,
Nicholas Clifton 0ae73d
*************** add_line_info (struct line_info_table *t
Nicholas Clifton 0ae73d
*** 985,990 ****
Nicholas Clifton 0ae73d
--- 1002,1008 ----
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
    /* Set member data of 'info'.  */
Nicholas Clifton 0ae73d
    info->address = address;
Nicholas Clifton 0ae73d
+   info->op_index = op_index;
Nicholas Clifton 0ae73d
    info->line = line;
Nicholas Clifton 0ae73d
    info->column = column;
Nicholas Clifton 0ae73d
    info->end_sequence = end_sequence;
Nicholas Clifton 0ae73d
*************** add_line_info (struct line_info_table *t
Nicholas Clifton 0ae73d
*** 1015,1020 ****
Nicholas Clifton 0ae73d
--- 1033,1039 ----
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
    if (table->last_line
Nicholas Clifton 0ae73d
        && table->last_line->address == address
Nicholas Clifton 0ae73d
+       && table->last_line->op_index == op_index
Nicholas Clifton 0ae73d
        && table->last_line->end_sequence == end_sequence)
Nicholas Clifton 0ae73d
      {
Nicholas Clifton 0ae73d
        /* We only keep the last entry with the same address and end
Nicholas Clifton 0ae73d
*************** decode_line_info (struct comp_unit *unit
Nicholas Clifton 0ae73d
*** 1225,1230 ****
Nicholas Clifton 0ae73d
--- 1244,1256 ----
Nicholas Clifton 0ae73d
      }
Nicholas Clifton 0ae73d
    line_end = line_ptr + lh.total_length;
Nicholas Clifton 0ae73d
    lh.version = read_2_bytes (abfd, line_ptr);
Nicholas Clifton 0ae73d
+   if (lh.version < 2 || lh.version > 4)
Nicholas Clifton 0ae73d
+     {
Nicholas Clifton 0ae73d
+       (*_bfd_error_handler)
Nicholas Clifton 0ae73d
+ 	(_("Dwarf Error: Unhandled .debug_line version %d."), lh.version);
Nicholas Clifton 0ae73d
+       bfd_set_error (bfd_error_bad_value);
Nicholas Clifton 0ae73d
+       return NULL;
Nicholas Clifton 0ae73d
+     }
Nicholas Clifton 0ae73d
    line_ptr += 2;
Nicholas Clifton 0ae73d
    if (offset_size == 4)
Nicholas Clifton 0ae73d
      lh.prologue_length = read_4_bytes (abfd, line_ptr);
Nicholas Clifton 0ae73d
*************** decode_line_info (struct comp_unit *unit
Nicholas Clifton 0ae73d
*** 1233,1238 ****
Nicholas Clifton 0ae73d
--- 1259,1278 ----
Nicholas Clifton 0ae73d
    line_ptr += offset_size;
Nicholas Clifton 0ae73d
    lh.minimum_instruction_length = read_1_byte (abfd, line_ptr);
Nicholas Clifton 0ae73d
    line_ptr += 1;
Nicholas Clifton 0ae73d
+   if (lh.version >= 4)
Nicholas Clifton 0ae73d
+     {
Nicholas Clifton 0ae73d
+       lh.maximum_ops_per_insn = read_1_byte (abfd, line_ptr);
Nicholas Clifton 0ae73d
+       line_ptr += 1;
Nicholas Clifton 0ae73d
+     }
Nicholas Clifton 0ae73d
+   else
Nicholas Clifton 0ae73d
+     lh.maximum_ops_per_insn = 1;
Nicholas Clifton 0ae73d
+   if (lh.maximum_ops_per_insn == 0)
Nicholas Clifton 0ae73d
+     {
Nicholas Clifton 0ae73d
+       (*_bfd_error_handler)
Nicholas Clifton 0ae73d
+ 	(_("Dwarf Error: Invalid maximum operations per instruction."));
Nicholas Clifton 0ae73d
+       bfd_set_error (bfd_error_bad_value);
Nicholas Clifton 0ae73d
+       return NULL;
Nicholas Clifton 0ae73d
+     }
Nicholas Clifton 0ae73d
    lh.default_is_stmt = read_1_byte (abfd, line_ptr);
Nicholas Clifton 0ae73d
    line_ptr += 1;
Nicholas Clifton 0ae73d
    lh.line_base = read_1_signed_byte (abfd, line_ptr);
Nicholas Clifton 0ae73d
*************** decode_line_info (struct comp_unit *unit
Nicholas Clifton 0ae73d
*** 1320,1325 ****
Nicholas Clifton 0ae73d
--- 1360,1366 ----
Nicholas Clifton 0ae73d
      {
Nicholas Clifton 0ae73d
        /* State machine registers.  */
Nicholas Clifton 0ae73d
        bfd_vma address = 0;
Nicholas Clifton 0ae73d
+       unsigned char op_index = 0;
Nicholas Clifton 0ae73d
        char * filename = table->num_files ? concat_filename (table, 1) : NULL;
Nicholas Clifton 0ae73d
        unsigned int line = 1;
Nicholas Clifton 0ae73d
        unsigned int column = 0;
Nicholas Clifton 0ae73d
*************** decode_line_info (struct comp_unit *unit
Nicholas Clifton 0ae73d
*** 1343,1353 ****
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      /* Special operand.  */
Nicholas Clifton 0ae73d
  	      adj_opcode = op_code - lh.opcode_base;
Nicholas Clifton 0ae73d
! 	      address += (adj_opcode / lh.line_range)
Nicholas Clifton 0ae73d
! 		* lh.minimum_instruction_length;
Nicholas Clifton 0ae73d
  	      line += lh.line_base + (adj_opcode % lh.line_range);
Nicholas Clifton 0ae73d
  	      /* Append row to matrix using current values.  */
Nicholas Clifton 0ae73d
! 	      add_line_info (table, address, filename, line, column, 0);
Nicholas Clifton 0ae73d
  	      if (address < low_pc)
Nicholas Clifton 0ae73d
  		low_pc = address;
Nicholas Clifton 0ae73d
  	      if (address > high_pc)
Nicholas Clifton 0ae73d
--- 1384,1404 ----
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      /* Special operand.  */
Nicholas Clifton 0ae73d
  	      adj_opcode = op_code - lh.opcode_base;
Nicholas Clifton 0ae73d
! 	      if (lh.maximum_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		address += (adj_opcode / lh.line_range)
Nicholas Clifton 0ae73d
! 			   * lh.minimum_instruction_length;
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  address += ((op_index + (adj_opcode / lh.line_range))
Nicholas Clifton 0ae73d
! 			      / lh.maximum_ops_per_insn)
Nicholas Clifton 0ae73d
! 			     * lh.minimum_instruction_length;
Nicholas Clifton 0ae73d
! 		  op_index = (op_index + (adj_opcode / lh.line_range))
Nicholas Clifton 0ae73d
! 			     % lh.maximum_ops_per_insn;
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
  	      line += lh.line_base + (adj_opcode % lh.line_range);
Nicholas Clifton 0ae73d
  	      /* Append row to matrix using current values.  */
Nicholas Clifton 0ae73d
! 	      add_line_info (table, address, op_index, filename,
Nicholas Clifton 0ae73d
! 			     line, column, 0);
Nicholas Clifton 0ae73d
  	      if (address < low_pc)
Nicholas Clifton 0ae73d
  		low_pc = address;
Nicholas Clifton 0ae73d
  	      if (address > high_pc)
Nicholas Clifton 0ae73d
*************** decode_line_info (struct comp_unit *unit
Nicholas Clifton 0ae73d
*** 1365,1372 ****
Nicholas Clifton 0ae73d
  		{
Nicholas Clifton 0ae73d
  		case DW_LNE_end_sequence:
Nicholas Clifton 0ae73d
  		  end_sequence = 1;
Nicholas Clifton 0ae73d
! 		  add_line_info (table, address, filename, line, column,
Nicholas Clifton 0ae73d
! 				 end_sequence);
Nicholas Clifton 0ae73d
  		  if (address < low_pc)
Nicholas Clifton 0ae73d
  		    low_pc = address;
Nicholas Clifton 0ae73d
  		  if (address > high_pc)
Nicholas Clifton 0ae73d
--- 1416,1423 ----
Nicholas Clifton 0ae73d
  		{
Nicholas Clifton 0ae73d
  		case DW_LNE_end_sequence:
Nicholas Clifton 0ae73d
  		  end_sequence = 1;
Nicholas Clifton 0ae73d
! 		  add_line_info (table, address, op_index, filename,
Nicholas Clifton 0ae73d
! 				 line, column, end_sequence);
Nicholas Clifton 0ae73d
  		  if (address < low_pc)
Nicholas Clifton 0ae73d
  		    low_pc = address;
Nicholas Clifton 0ae73d
  		  if (address > high_pc)
Nicholas Clifton 0ae73d
*************** decode_line_info (struct comp_unit *unit
Nicholas Clifton 0ae73d
*** 1375,1380 ****
Nicholas Clifton 0ae73d
--- 1426,1432 ----
Nicholas Clifton 0ae73d
  		  break;
Nicholas Clifton 0ae73d
  		case DW_LNE_set_address:
Nicholas Clifton 0ae73d
  		  address = read_address (unit, line_ptr);
Nicholas Clifton 0ae73d
+ 		  op_index = 0;
Nicholas Clifton 0ae73d
  		  line_ptr += unit->addr_size;
Nicholas Clifton 0ae73d
  		  break;
Nicholas Clifton 0ae73d
  		case DW_LNE_define_file:
Nicholas Clifton 0ae73d
*************** decode_line_info (struct comp_unit *unit
Nicholas Clifton 0ae73d
*** 1422,1436 ****
Nicholas Clifton 0ae73d
  		}
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_copy:
Nicholas Clifton 0ae73d
! 	      add_line_info (table, address, filename, line, column, 0);
Nicholas Clifton 0ae73d
  	      if (address < low_pc)
Nicholas Clifton 0ae73d
  		low_pc = address;
Nicholas Clifton 0ae73d
  	      if (address > high_pc)
Nicholas Clifton 0ae73d
  		high_pc = address;
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_advance_pc:
Nicholas Clifton 0ae73d
! 	      address += lh.minimum_instruction_length
Nicholas Clifton 0ae73d
! 		* read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
Nicholas Clifton 0ae73d
  	      line_ptr += bytes_read;
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_advance_line:
Nicholas Clifton 0ae73d
--- 1474,1499 ----
Nicholas Clifton 0ae73d
  		}
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_copy:
Nicholas Clifton 0ae73d
! 	      add_line_info (table, address, op_index,
Nicholas Clifton 0ae73d
! 			     filename, line, column, 0);
Nicholas Clifton 0ae73d
  	      if (address < low_pc)
Nicholas Clifton 0ae73d
  		low_pc = address;
Nicholas Clifton 0ae73d
  	      if (address > high_pc)
Nicholas Clifton 0ae73d
  		high_pc = address;
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_advance_pc:
Nicholas Clifton 0ae73d
! 	      if (lh.maximum_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		address += lh.minimum_instruction_length
Nicholas Clifton 0ae73d
! 			   * read_unsigned_leb128 (abfd, line_ptr,
Nicholas Clifton 0ae73d
! 						   &bytes_read);
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  bfd_vma adjust = read_unsigned_leb128 (abfd, line_ptr,
Nicholas Clifton 0ae73d
! 							 &bytes_read);
Nicholas Clifton 0ae73d
! 		  address = ((op_index + adjust) / lh.maximum_ops_per_insn)
Nicholas Clifton 0ae73d
! 			    * lh.minimum_instruction_length;
Nicholas Clifton 0ae73d
! 		  op_index = (op_index + adjust) % lh.maximum_ops_per_insn;
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
  	      line_ptr += bytes_read;
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_advance_line:
Nicholas Clifton 0ae73d
*************** decode_line_info (struct comp_unit *unit
Nicholas Clifton 0ae73d
*** 1460,1470 ****
Nicholas Clifton 0ae73d
  	    case DW_LNS_set_basic_block:
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_const_add_pc:
Nicholas Clifton 0ae73d
! 	      address += lh.minimum_instruction_length
Nicholas Clifton 0ae73d
! 		      * ((255 - lh.opcode_base) / lh.line_range);
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_fixed_advance_pc:
Nicholas Clifton 0ae73d
  	      address += read_2_bytes (abfd, line_ptr);
Nicholas Clifton 0ae73d
  	      line_ptr += 2;
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    default:
Nicholas Clifton 0ae73d
--- 1523,1542 ----
Nicholas Clifton 0ae73d
  	    case DW_LNS_set_basic_block:
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_const_add_pc:
Nicholas Clifton 0ae73d
! 	      if (lh.maximum_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		address += lh.minimum_instruction_length
Nicholas Clifton 0ae73d
! 			   * ((255 - lh.opcode_base) / lh.line_range);
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  bfd_vma adjust = ((255 - lh.opcode_base) / lh.line_range);
Nicholas Clifton 0ae73d
! 		  address += lh.minimum_instruction_length
Nicholas Clifton 0ae73d
! 			     * ((op_index + adjust) / lh.maximum_ops_per_insn);
Nicholas Clifton 0ae73d
! 		  op_index = (op_index + adjust) % lh.maximum_ops_per_insn;
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    case DW_LNS_fixed_advance_pc:
Nicholas Clifton 0ae73d
  	      address += read_2_bytes (abfd, line_ptr);
Nicholas Clifton 0ae73d
+ 	      op_index = 0;
Nicholas Clifton 0ae73d
  	      line_ptr += 2;
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  	    default:
Nicholas Clifton 0ae73d
*************** scan_unit_for_symbols (struct comp_unit 
Nicholas Clifton 0ae73d
*** 1930,1935 ****
Nicholas Clifton 0ae73d
--- 2002,2008 ----
Nicholas Clifton 0ae73d
  		    case DW_FORM_block1:
Nicholas Clifton 0ae73d
  		    case DW_FORM_block2:
Nicholas Clifton 0ae73d
  		    case DW_FORM_block4:
Nicholas Clifton 0ae73d
+ 		    case DW_FORM_exprloc:
Nicholas Clifton 0ae73d
  		      if (*attr.u.blk->data == DW_OP_addr)
Nicholas Clifton 0ae73d
  			{
Nicholas Clifton 0ae73d
  			  var->stack = 0;
Nicholas Clifton 0ae73d
*************** parse_comp_unit (struct dwarf2_debug *st
Nicholas Clifton 0ae73d
*** 2031,2039 ****
Nicholas Clifton 0ae73d
    addr_size = read_1_byte (abfd, info_ptr);
Nicholas Clifton 0ae73d
    info_ptr += 1;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
!   if (version != 2 && version != 3)
Nicholas Clifton 0ae73d
      {
Nicholas Clifton 0ae73d
!       (*_bfd_error_handler) (_("Dwarf Error: found dwarf version '%u', this reader only handles version 2 and 3 information."), version);
Nicholas Clifton 0ae73d
        bfd_set_error (bfd_error_bad_value);
Nicholas Clifton 0ae73d
        return 0;
Nicholas Clifton 0ae73d
      }
Nicholas Clifton 0ae73d
--- 2104,2112 ----
Nicholas Clifton 0ae73d
    addr_size = read_1_byte (abfd, info_ptr);
Nicholas Clifton 0ae73d
    info_ptr += 1;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
!   if (version != 2 && version != 3 && version != 4)
Nicholas Clifton 0ae73d
      {
Nicholas Clifton 0ae73d
!       (*_bfd_error_handler) (_("Dwarf Error: found dwarf version '%u', this reader only handles version 2, 3 and 4 information."), version);
Nicholas Clifton 0ae73d
        bfd_set_error (bfd_error_bad_value);
Nicholas Clifton 0ae73d
        return 0;
Nicholas Clifton 0ae73d
      }
Nicholas Clifton 0ae73d
diff -rcp ../binutils-2.20.51.0.2.original/bfd/elf-eh-frame.c ./bfd/elf-eh-frame.c
Nicholas Clifton 0ae73d
*** ../binutils-2.20.51.0.2.original/bfd/elf-eh-frame.c	2010-04-08 12:35:43.000000000 +0100
Nicholas Clifton 0ae73d
--- ./bfd/elf-eh-frame.c	2010-04-08 12:35:59.000000000 +0100
Nicholas Clifton 0ae73d
*************** _bfd_elf_parse_eh_frame (bfd *abfd, stru
Nicholas Clifton 0ae73d
*** 636,642 ****
Nicholas Clifton 0ae73d
  	  REQUIRE (read_byte (&buf, end, &cie->version));
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	  /* Cannot handle unknown versions.  */
Nicholas Clifton 0ae73d
! 	  REQUIRE (cie->version == 1 || cie->version == 3);
Nicholas Clifton 0ae73d
  	  REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	  strcpy (cie->augmentation, (char *) buf);
Nicholas Clifton 0ae73d
--- 636,644 ----
Nicholas Clifton 0ae73d
  	  REQUIRE (read_byte (&buf, end, &cie->version));
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	  /* Cannot handle unknown versions.  */
Nicholas Clifton 0ae73d
! 	  REQUIRE (cie->version == 1
Nicholas Clifton 0ae73d
! 		   || cie->version == 3
Nicholas Clifton 0ae73d
! 		   || cie->version == 4);
Nicholas Clifton 0ae73d
  	  REQUIRE (strlen ((char *) buf) < sizeof (cie->augmentation));
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	  strcpy (cie->augmentation, (char *) buf);
Nicholas Clifton 0ae73d
*************** _bfd_elf_parse_eh_frame (bfd *abfd, stru
Nicholas Clifton 0ae73d
*** 651,656 ****
Nicholas Clifton 0ae73d
--- 653,665 ----
Nicholas Clifton 0ae73d
  	      REQUIRE (skip_bytes (&buf, end, ptr_size));
Nicholas Clifton 0ae73d
  	      SKIP_RELOCS (buf);
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
+ 	  if (cie->version >= 4)
Nicholas Clifton 0ae73d
+ 	    {
Nicholas Clifton 0ae73d
+ 	      REQUIRE (buf + 1 < end);
Nicholas Clifton 0ae73d
+ 	      REQUIRE (buf[0] == ptr_size);
Nicholas Clifton 0ae73d
+ 	      REQUIRE (buf[1] == 0);
Nicholas Clifton 0ae73d
+ 	      buf += 2;
Nicholas Clifton 0ae73d
+ 	    }
Nicholas Clifton 0ae73d
  	  REQUIRE (read_uleb128 (&buf, end, &cie->code_align));
Nicholas Clifton 0ae73d
  	  REQUIRE (read_sleb128 (&buf, end, &cie->data_align));
Nicholas Clifton 0ae73d
  	  if (cie->version == 1)
Nicholas Clifton 0ae73d
diff -rcp ../binutils-2.20.51.0.2.original/binutils/ChangeLog ./binutils/ChangeLog
Nicholas Clifton 0ae73d
*** ../binutils-2.20.51.0.2.original/binutils/ChangeLog	2010-04-08 12:35:39.000000000 +0100
Nicholas Clifton 0ae73d
--- ./binutils/ChangeLog	2010-04-08 12:37:44.000000000 +0100
Nicholas Clifton 0ae73d
***************
Nicholas Clifton 0ae73d
*** 1,3 ****
Nicholas Clifton 0ae73d
--- 1,31 ----
Nicholas Clifton 0ae73d
+ 2010-04-08  Nick Clifton  <nickc@redhat.com>
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	Import these patches from the mainline:
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	2010-04-05  Jakub Jelinek  <jakub@redhat.com>
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	* dwarf.c (struct Frame_Chunk): Add ptr_size and segment_size
Nicholas Clifton 0ae73d
+ 	fields.
Nicholas Clifton 0ae73d
+ 	(display_debug_frames): Handle CIE version 4.
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	* dwarf.c (struct State_Machine_Registers): Add op_index field,
Nicholas Clifton 0ae73d
+ 	change end_sequence type to unsigned char.
Nicholas Clifton 0ae73d
+ 	(reset_state_machine): Clear op_index.
Nicholas Clifton 0ae73d
+ 	(process_extended_line_op): For DW_LNE_set_address clear op_index.
Nicholas Clifton 0ae73d
+ 	(display_debug_lines_raw): Initialize li_max_ops_per_insn.
Nicholas Clifton 0ae73d
+ 	Track op_index state machine register and print it if
Nicholas Clifton 0ae73d
+ 	li_max_ops_per_insn is != 1.
Nicholas Clifton 0ae73d
+ 	(display_debug_lines_decoded): Likewise.
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	2010-04-01  Jakub Jelinek  <jakub@redhat.com>
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	* dwarf.c (read_and_display_attr_value): Don't reject
Nicholas Clifton 0ae73d
+ 	dwarf_version == 4.  Handle DW_FORM_sec_offset, DW_FORM_flag_present
Nicholas Clifton 0ae73d
+ 	and DW_FORM_exprloc.
Nicholas Clifton 0ae73d
+ 	(process_debug_info): Handle cu_version == 4.
Nicholas Clifton 0ae73d
+ 	(display_debug_lines_raw, display_debug_lines_decoded): Handle
Nicholas Clifton 0ae73d
+ 	li_version == 4.
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
  2009-10-01  Alan Modra  <amodra@bigpond.net.au>
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	* addr2line.c (slurp_symtab): Don't use bfd_read_minisymbols.
Nicholas Clifton 0ae73d
diff -rcp ../binutils-2.20.51.0.2.original/binutils/dwarf.c ./binutils/dwarf.c
Nicholas Clifton 0ae73d
*** ../binutils-2.20.51.0.2.original/binutils/dwarf.c	2010-04-08 12:35:39.000000000 +0100
Nicholas Clifton 0ae73d
--- ./binutils/dwarf.c	2010-04-08 12:35:59.000000000 +0100
Nicholas Clifton 0ae73d
*************** typedef struct State_Machine_Registers
Nicholas Clifton 0ae73d
*** 263,269 ****
Nicholas Clifton 0ae73d
    unsigned int column;
Nicholas Clifton 0ae73d
    int is_stmt;
Nicholas Clifton 0ae73d
    int basic_block;
Nicholas Clifton 0ae73d
!   int end_sequence;
Nicholas Clifton 0ae73d
  /* This variable hold the number of the last entry seen
Nicholas Clifton 0ae73d
     in the File Table.  */
Nicholas Clifton 0ae73d
    unsigned int last_file_entry;
Nicholas Clifton 0ae73d
--- 263,270 ----
Nicholas Clifton 0ae73d
    unsigned int column;
Nicholas Clifton 0ae73d
    int is_stmt;
Nicholas Clifton 0ae73d
    int basic_block;
Nicholas Clifton 0ae73d
!   unsigned char op_index;
Nicholas Clifton 0ae73d
!   unsigned char end_sequence;
Nicholas Clifton 0ae73d
  /* This variable hold the number of the last entry seen
Nicholas Clifton 0ae73d
     in the File Table.  */
Nicholas Clifton 0ae73d
    unsigned int last_file_entry;
Nicholas Clifton 0ae73d
*************** static void
Nicholas Clifton 0ae73d
*** 275,280 ****
Nicholas Clifton 0ae73d
--- 276,282 ----
Nicholas Clifton 0ae73d
  reset_state_machine (int is_stmt)
Nicholas Clifton 0ae73d
  {
Nicholas Clifton 0ae73d
    state_machine_regs.address = 0;
Nicholas Clifton 0ae73d
+   state_machine_regs.op_index = 0;
Nicholas Clifton 0ae73d
    state_machine_regs.file = 1;
Nicholas Clifton 0ae73d
    state_machine_regs.line = 1;
Nicholas Clifton 0ae73d
    state_machine_regs.column = 0;
Nicholas Clifton 0ae73d
*************** process_extended_line_op (unsigned char 
Nicholas Clifton 0ae73d
*** 321,326 ****
Nicholas Clifton 0ae73d
--- 323,329 ----
Nicholas Clifton 0ae73d
        adr = byte_get (data, len - bytes_read - 1);
Nicholas Clifton 0ae73d
        printf (_("set Address to 0x%lx\n"), adr);
Nicholas Clifton 0ae73d
        state_machine_regs.address = adr;
Nicholas Clifton 0ae73d
+       state_machine_regs.op_index = 0;
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
      case DW_LNE_define_file:
Nicholas Clifton 0ae73d
*************** read_and_display_attr_value (unsigned lo
Nicholas Clifton 0ae73d
*** 1153,1166 ****
Nicholas Clifton 0ae73d
  	  uvalue = byte_get (data, pointer_size);
Nicholas Clifton 0ae73d
  	  data += pointer_size;
Nicholas Clifton 0ae73d
  	}
Nicholas Clifton 0ae73d
!       else if (dwarf_version == 3)
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
  	  uvalue = byte_get (data, offset_size);
Nicholas Clifton 0ae73d
  	  data += offset_size;
Nicholas Clifton 0ae73d
  	}
Nicholas Clifton 0ae73d
        else
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
! 	  error (_("Internal error: DWARF version is not 2 or 3.\n"));
Nicholas Clifton 0ae73d
  	}
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
--- 1156,1169 ----
Nicholas Clifton 0ae73d
  	  uvalue = byte_get (data, pointer_size);
Nicholas Clifton 0ae73d
  	  data += pointer_size;
Nicholas Clifton 0ae73d
  	}
Nicholas Clifton 0ae73d
!       else if (dwarf_version == 3 || dwarf_version == 4)
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
  	  uvalue = byte_get (data, offset_size);
Nicholas Clifton 0ae73d
  	  data += offset_size;
Nicholas Clifton 0ae73d
  	}
Nicholas Clifton 0ae73d
        else
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
! 	  error (_("Internal error: DWARF version is not 2, 3 or 4.\n"));
Nicholas Clifton 0ae73d
  	}
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
*************** read_and_display_attr_value (unsigned lo
Nicholas Clifton 0ae73d
*** 1170,1179 ****
Nicholas Clifton 0ae73d
--- 1173,1187 ----
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
      case DW_FORM_strp:
Nicholas Clifton 0ae73d
+     case DW_FORM_sec_offset:
Nicholas Clifton 0ae73d
        uvalue = byte_get (data, offset_size);
Nicholas Clifton 0ae73d
        data += offset_size;
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
+     case DW_FORM_flag_present:
Nicholas Clifton 0ae73d
+       uvalue = 1;
Nicholas Clifton 0ae73d
+       break;
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
      case DW_FORM_ref1:
Nicholas Clifton 0ae73d
      case DW_FORM_flag:
Nicholas Clifton 0ae73d
      case DW_FORM_data1:
Nicholas Clifton 0ae73d
*************** read_and_display_attr_value (unsigned lo
Nicholas Clifton 0ae73d
*** 1232,1241 ****
Nicholas Clifton 0ae73d
--- 1240,1251 ----
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
      case DW_FORM_data4:
Nicholas Clifton 0ae73d
      case DW_FORM_addr:
Nicholas Clifton 0ae73d
+     case DW_FORM_sec_offset:
Nicholas Clifton 0ae73d
        if (!do_loc)
Nicholas Clifton 0ae73d
  	printf (" 0x%lx", uvalue);
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
+     case DW_FORM_flag_present:
Nicholas Clifton 0ae73d
      case DW_FORM_flag:
Nicholas Clifton 0ae73d
      case DW_FORM_data1:
Nicholas Clifton 0ae73d
      case DW_FORM_data2:
Nicholas Clifton 0ae73d
*************** read_and_display_attr_value (unsigned lo
Nicholas Clifton 0ae73d
*** 1271,1276 ****
Nicholas Clifton 0ae73d
--- 1281,1287 ----
Nicholas Clifton 0ae73d
        break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
      case DW_FORM_block:
Nicholas Clifton 0ae73d
+     case DW_FORM_exprloc:
Nicholas Clifton 0ae73d
        uvalue = read_leb128 (data, & bytes_read, 0);
Nicholas Clifton 0ae73d
        block_start = data + bytes_read;
Nicholas Clifton 0ae73d
        if (do_loc)
Nicholas Clifton 0ae73d
*************** read_and_display_attr_value (unsigned lo
Nicholas Clifton 0ae73d
*** 1351,1357 ****
Nicholas Clifton 0ae73d
  	case DW_AT_segment:
Nicholas Clifton 0ae73d
  	case DW_AT_static_link:
Nicholas Clifton 0ae73d
  	case DW_AT_use_location:
Nicholas Clifton 0ae73d
!     	  if (form == DW_FORM_data4 || form == DW_FORM_data8)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      /* Process location list.  */
Nicholas Clifton 0ae73d
  	      unsigned int max = debug_info_p->max_loc_offsets;
Nicholas Clifton 0ae73d
--- 1362,1370 ----
Nicholas Clifton 0ae73d
  	case DW_AT_segment:
Nicholas Clifton 0ae73d
  	case DW_AT_static_link:
Nicholas Clifton 0ae73d
  	case DW_AT_use_location:
Nicholas Clifton 0ae73d
!     	  if (form == DW_FORM_data4
Nicholas Clifton 0ae73d
! 	      || form == DW_FORM_data8
Nicholas Clifton 0ae73d
! 	      || form == DW_FORM_sec_offset)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      /* Process location list.  */
Nicholas Clifton 0ae73d
  	      unsigned int max = debug_info_p->max_loc_offsets;
Nicholas Clifton 0ae73d
*************** read_and_display_attr_value (unsigned lo
Nicholas Clifton 0ae73d
*** 1380,1386 ****
Nicholas Clifton 0ae73d
  	  break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	case DW_AT_ranges:
Nicholas Clifton 0ae73d
! 	  if (form == DW_FORM_data4 || form == DW_FORM_data8)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      /* Process range list.  */
Nicholas Clifton 0ae73d
  	      unsigned int max = debug_info_p->max_range_lists;
Nicholas Clifton 0ae73d
--- 1393,1401 ----
Nicholas Clifton 0ae73d
  	  break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	case DW_AT_ranges:
Nicholas Clifton 0ae73d
! 	  if (form == DW_FORM_data4
Nicholas Clifton 0ae73d
! 	      || form == DW_FORM_data8
Nicholas Clifton 0ae73d
! 	      || form == DW_FORM_sec_offset)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      /* Process range list.  */
Nicholas Clifton 0ae73d
  	      unsigned int max = debug_info_p->max_range_lists;
Nicholas Clifton 0ae73d
*************** read_and_display_attr_value (unsigned lo
Nicholas Clifton 0ae73d
*** 1590,1596 ****
Nicholas Clifton 0ae73d
      case DW_AT_segment:
Nicholas Clifton 0ae73d
      case DW_AT_static_link:
Nicholas Clifton 0ae73d
      case DW_AT_use_location:
Nicholas Clifton 0ae73d
!       if (form == DW_FORM_data4 || form == DW_FORM_data8)
Nicholas Clifton 0ae73d
  	printf (_("(location list)"));
Nicholas Clifton 0ae73d
        /* Fall through.  */
Nicholas Clifton 0ae73d
      case DW_AT_allocated:
Nicholas Clifton 0ae73d
--- 1605,1613 ----
Nicholas Clifton 0ae73d
      case DW_AT_segment:
Nicholas Clifton 0ae73d
      case DW_AT_static_link:
Nicholas Clifton 0ae73d
      case DW_AT_use_location:
Nicholas Clifton 0ae73d
!       if (form == DW_FORM_data4
Nicholas Clifton 0ae73d
! 	  || form == DW_FORM_data8
Nicholas Clifton 0ae73d
! 	  || form == DW_FORM_sec_offset)
Nicholas Clifton 0ae73d
  	printf (_("(location list)"));
Nicholas Clifton 0ae73d
        /* Fall through.  */
Nicholas Clifton 0ae73d
      case DW_AT_allocated:
Nicholas Clifton 0ae73d
*************** process_debug_info (struct dwarf_section
Nicholas Clifton 0ae73d
*** 2035,2041 ****
Nicholas Clifton 0ae73d
        tags = hdrptr;
Nicholas Clifton 0ae73d
        start += compunit.cu_length + initial_length_size;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
!       if (compunit.cu_version != 2 && compunit.cu_version != 3)
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
  	  warn (_("CU at offset %lx contains corrupt or unsupported version number: %d.\n"),
Nicholas Clifton 0ae73d
  		cu_offset, compunit.cu_version);
Nicholas Clifton 0ae73d
--- 2052,2060 ----
Nicholas Clifton 0ae73d
        tags = hdrptr;
Nicholas Clifton 0ae73d
        start += compunit.cu_length + initial_length_size;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
!       if (compunit.cu_version != 2
Nicholas Clifton 0ae73d
! 	  && compunit.cu_version != 3
Nicholas Clifton 0ae73d
! 	  && compunit.cu_version != 4)
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
  	  warn (_("CU at offset %lx contains corrupt or unsupported version number: %d.\n"),
Nicholas Clifton 0ae73d
  		cu_offset, compunit.cu_version);
Nicholas Clifton 0ae73d
*************** display_debug_lines_raw (struct dwarf_se
Nicholas Clifton 0ae73d
*** 2266,2274 ****
Nicholas Clifton 0ae73d
        /* Check its version number.  */
Nicholas Clifton 0ae73d
        info.li_version = byte_get (hdrptr, 2);
Nicholas Clifton 0ae73d
        hdrptr += 2;
Nicholas Clifton 0ae73d
!       if (info.li_version != 2 && info.li_version != 3)
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
! 	  warn (_("Only DWARF version 2 and 3 line info is currently supported.\n"));
Nicholas Clifton 0ae73d
  	  return 0;
Nicholas Clifton 0ae73d
  	}
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
--- 2285,2295 ----
Nicholas Clifton 0ae73d
        /* Check its version number.  */
Nicholas Clifton 0ae73d
        info.li_version = byte_get (hdrptr, 2);
Nicholas Clifton 0ae73d
        hdrptr += 2;
Nicholas Clifton 0ae73d
!       if (info.li_version != 2
Nicholas Clifton 0ae73d
! 	  && info.li_version != 3
Nicholas Clifton 0ae73d
! 	  && info.li_version != 4)
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
! 	  warn (_("Only DWARF version 2, 3 and 4 line info is currently supported.\n"));
Nicholas Clifton 0ae73d
  	  return 0;
Nicholas Clifton 0ae73d
  	}
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
*************** display_debug_lines_raw (struct dwarf_se
Nicholas Clifton 0ae73d
*** 2276,2281 ****
Nicholas Clifton 0ae73d
--- 2297,2314 ----
Nicholas Clifton 0ae73d
        hdrptr += offset_size;
Nicholas Clifton 0ae73d
        info.li_min_insn_length = byte_get (hdrptr, 1);
Nicholas Clifton 0ae73d
        hdrptr++;
Nicholas Clifton 0ae73d
+       if (info.li_version >= 4)
Nicholas Clifton 0ae73d
+ 	{
Nicholas Clifton 0ae73d
+ 	  info.li_max_ops_per_insn = byte_get (hdrptr, 1);
Nicholas Clifton 0ae73d
+ 	  hdrptr++;
Nicholas Clifton 0ae73d
+ 	  if (info.li_max_ops_per_insn == 0)
Nicholas Clifton 0ae73d
+ 	    {
Nicholas Clifton 0ae73d
+ 	      warn (_("Invalid maximum operations per insn.\n"));
Nicholas Clifton 0ae73d
+ 	      return 0;
Nicholas Clifton 0ae73d
+ 	    }
Nicholas Clifton 0ae73d
+ 	}
Nicholas Clifton 0ae73d
+       else
Nicholas Clifton 0ae73d
+ 	info.li_max_ops_per_insn = 1;
Nicholas Clifton 0ae73d
        info.li_default_is_stmt = byte_get (hdrptr, 1);
Nicholas Clifton 0ae73d
        hdrptr++;
Nicholas Clifton 0ae73d
        info.li_line_base = byte_get (hdrptr, 1);
Nicholas Clifton 0ae73d
*************** display_debug_lines_raw (struct dwarf_se
Nicholas Clifton 0ae73d
*** 2294,2299 ****
Nicholas Clifton 0ae73d
--- 2327,2334 ----
Nicholas Clifton 0ae73d
        printf (_("  DWARF Version:               %d\n"), info.li_version);
Nicholas Clifton 0ae73d
        printf (_("  Prologue Length:             %d\n"), info.li_prologue_length);
Nicholas Clifton 0ae73d
        printf (_("  Minimum Instruction Length:  %d\n"), info.li_min_insn_length);
Nicholas Clifton 0ae73d
+       if (info.li_version >= 4)
Nicholas Clifton 0ae73d
+ 	printf (_("  Maximum Ops per Instruction: %d\n"), info.li_max_ops_per_insn);
Nicholas Clifton 0ae73d
        printf (_("  Initial value of 'is_stmt':  %d\n"), info.li_default_is_stmt);
Nicholas Clifton 0ae73d
        printf (_("  Line Base:                   %d\n"), info.li_line_base);
Nicholas Clifton 0ae73d
        printf (_("  Line Range:                  %d\n"), info.li_line_range);
Nicholas Clifton 0ae73d
*************** display_debug_lines_raw (struct dwarf_se
Nicholas Clifton 0ae73d
*** 2377,2386 ****
Nicholas Clifton 0ae73d
  	  if (op_code >= info.li_opcode_base)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      op_code -= info.li_opcode_base;
Nicholas Clifton 0ae73d
! 	      uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 	      state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
! 	      printf (_("  Special opcode %d: advance Address by %lu to 0x%lx"),
Nicholas Clifton 0ae73d
! 		      op_code, uladv, state_machine_regs.address);
Nicholas Clifton 0ae73d
  	      adv = (op_code % info.li_line_range) + info.li_line_base;
Nicholas Clifton 0ae73d
  	      state_machine_regs.line += adv;
Nicholas Clifton 0ae73d
  	      printf (_(" and Line by %d to %d\n"),
Nicholas Clifton 0ae73d
--- 2412,2438 ----
Nicholas Clifton 0ae73d
  	  if (op_code >= info.li_opcode_base)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      op_code -= info.li_opcode_base;
Nicholas Clifton 0ae73d
! 	      uladv = (op_code / info.li_line_range);
Nicholas Clifton 0ae73d
! 	      if (info.li_max_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  uladv *= info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
! 		  printf (_("  Special opcode %d: advance Address by %lu to 0x%lx"),
Nicholas Clifton 0ae73d
! 			  op_code, uladv, state_machine_regs.address);
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address
Nicholas Clifton 0ae73d
! 		    += ((state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 			/ info.li_max_ops_per_insn)
Nicholas Clifton 0ae73d
! 		       * info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.op_index
Nicholas Clifton 0ae73d
! 		    = (state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 		      % info.li_max_ops_per_insn;
Nicholas Clifton 0ae73d
! 		  printf (_("  Special opcode %d: advance Address by %lu to 0x%lx[%d]"),
Nicholas Clifton 0ae73d
! 			  op_code, uladv, state_machine_regs.address,
Nicholas Clifton 0ae73d
! 			  state_machine_regs.op_index);
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
  	      adv = (op_code % info.li_line_range) + info.li_line_base;
Nicholas Clifton 0ae73d
  	      state_machine_regs.line += adv;
Nicholas Clifton 0ae73d
  	      printf (_(" and Line by %d to %d\n"),
Nicholas Clifton 0ae73d
*************** display_debug_lines_raw (struct dwarf_se
Nicholas Clifton 0ae73d
*** 2398,2408 ****
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	    case DW_LNS_advance_pc:
Nicholas Clifton 0ae73d
  	      uladv = read_leb128 (data, & bytes_read, 0);
Nicholas Clifton 0ae73d
- 	      uladv *= info.li_min_insn_length;
Nicholas Clifton 0ae73d
  	      data += bytes_read;
Nicholas Clifton 0ae73d
! 	      state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
! 	      printf (_("  Advance PC by %lu to 0x%lx\n"), uladv,
Nicholas Clifton 0ae73d
! 		      state_machine_regs.address);
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	    case DW_LNS_advance_line:
Nicholas Clifton 0ae73d
--- 2450,2476 ----
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	    case DW_LNS_advance_pc:
Nicholas Clifton 0ae73d
  	      uladv = read_leb128 (data, & bytes_read, 0);
Nicholas Clifton 0ae73d
  	      data += bytes_read;
Nicholas Clifton 0ae73d
! 	      if (info.li_max_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  uladv *= info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
! 		  printf (_("  Advance PC by %lu to 0x%lx\n"), uladv,
Nicholas Clifton 0ae73d
! 			  state_machine_regs.address);
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address
Nicholas Clifton 0ae73d
! 		    += ((state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 			/ info.li_max_ops_per_insn)
Nicholas Clifton 0ae73d
! 		       * info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.op_index
Nicholas Clifton 0ae73d
! 		    = (state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 		      % info.li_max_ops_per_insn;
Nicholas Clifton 0ae73d
! 		  printf (_("  Advance PC by %lu to 0x%lx[%d]\n"), uladv,
Nicholas Clifton 0ae73d
! 			  state_machine_regs.address,
Nicholas Clifton 0ae73d
! 			  state_machine_regs.op_index);
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	    case DW_LNS_advance_line:
Nicholas Clifton 0ae73d
*************** display_debug_lines_raw (struct dwarf_se
Nicholas Clifton 0ae73d
*** 2441,2457 ****
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	    case DW_LNS_const_add_pc:
Nicholas Clifton 0ae73d
! 	      uladv = (((255 - info.li_opcode_base) / info.li_line_range)
Nicholas Clifton 0ae73d
! 		      * info.li_min_insn_length);
Nicholas Clifton 0ae73d
! 	      state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
! 	      printf (_("  Advance PC by constant %lu to 0x%lx\n"), uladv,
Nicholas Clifton 0ae73d
! 		      state_machine_regs.address);
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	    case DW_LNS_fixed_advance_pc:
Nicholas Clifton 0ae73d
  	      uladv = byte_get (data, 2);
Nicholas Clifton 0ae73d
  	      data += 2;
Nicholas Clifton 0ae73d
  	      state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
  	      printf (_("  Advance PC by fixed size amount %lu to 0x%lx\n"),
Nicholas Clifton 0ae73d
  		      uladv, state_machine_regs.address);
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
--- 2509,2542 ----
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	    case DW_LNS_const_add_pc:
Nicholas Clifton 0ae73d
! 	      uladv = ((255 - info.li_opcode_base) / info.li_line_range);
Nicholas Clifton 0ae73d
! 	      if (info.li_max_ops_per_insn)
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  uladv *= info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
! 		  printf (_("  Advance PC by constant %lu to 0x%lx\n"), uladv,
Nicholas Clifton 0ae73d
! 			  state_machine_regs.address);
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address
Nicholas Clifton 0ae73d
! 		    += ((state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 			/ info.li_max_ops_per_insn)
Nicholas Clifton 0ae73d
! 		       * info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.op_index
Nicholas Clifton 0ae73d
! 		    = (state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 		      % info.li_max_ops_per_insn;
Nicholas Clifton 0ae73d
! 		  printf (_("  Advance PC by constant %lu to 0x%lx[%d]\n"),
Nicholas Clifton 0ae73d
! 			  uladv, state_machine_regs.address,
Nicholas Clifton 0ae73d
! 			  state_machine_regs.op_index);
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	    case DW_LNS_fixed_advance_pc:
Nicholas Clifton 0ae73d
  	      uladv = byte_get (data, 2);
Nicholas Clifton 0ae73d
  	      data += 2;
Nicholas Clifton 0ae73d
  	      state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
+ 	      state_machine_regs.op_index = 0;
Nicholas Clifton 0ae73d
  	      printf (_("  Advance PC by fixed size amount %lu to 0x%lx\n"),
Nicholas Clifton 0ae73d
  		      uladv, state_machine_regs.address);
Nicholas Clifton 0ae73d
  	      break;
Nicholas Clifton 0ae73d
*************** display_debug_lines_decoded (struct dwar
Nicholas Clifton 0ae73d
*** 2554,2562 ****
Nicholas Clifton 0ae73d
        /* Get this CU's Line Number Block version number.  */
Nicholas Clifton 0ae73d
        info.li_version = byte_get (hdrptr, 2);
Nicholas Clifton 0ae73d
        hdrptr += 2;
Nicholas Clifton 0ae73d
!       if (info.li_version != 2 && info.li_version != 3)
Nicholas Clifton 0ae73d
          {
Nicholas Clifton 0ae73d
!           warn (_("Only DWARF version 2 and 3 line info is currently "
Nicholas Clifton 0ae73d
                  "supported.\n"));
Nicholas Clifton 0ae73d
            return 0;
Nicholas Clifton 0ae73d
          }
Nicholas Clifton 0ae73d
--- 2639,2649 ----
Nicholas Clifton 0ae73d
        /* Get this CU's Line Number Block version number.  */
Nicholas Clifton 0ae73d
        info.li_version = byte_get (hdrptr, 2);
Nicholas Clifton 0ae73d
        hdrptr += 2;
Nicholas Clifton 0ae73d
!       if (info.li_version != 2
Nicholas Clifton 0ae73d
! 	  && info.li_version != 3
Nicholas Clifton 0ae73d
! 	  && info.li_version != 4)
Nicholas Clifton 0ae73d
          {
Nicholas Clifton 0ae73d
!           warn (_("Only DWARF version 2, 3 and 4 line info is currently "
Nicholas Clifton 0ae73d
                  "supported.\n"));
Nicholas Clifton 0ae73d
            return 0;
Nicholas Clifton 0ae73d
          }
Nicholas Clifton 0ae73d
*************** display_debug_lines_decoded (struct dwar
Nicholas Clifton 0ae73d
*** 2565,2570 ****
Nicholas Clifton 0ae73d
--- 2652,2669 ----
Nicholas Clifton 0ae73d
        hdrptr += offset_size;
Nicholas Clifton 0ae73d
        info.li_min_insn_length = byte_get (hdrptr, 1);
Nicholas Clifton 0ae73d
        hdrptr++;
Nicholas Clifton 0ae73d
+       if (info.li_version >= 4)
Nicholas Clifton 0ae73d
+ 	{
Nicholas Clifton 0ae73d
+ 	  info.li_max_ops_per_insn = byte_get (hdrptr, 1);
Nicholas Clifton 0ae73d
+ 	  hdrptr++;
Nicholas Clifton 0ae73d
+ 	  if (info.li_max_ops_per_insn == 0)
Nicholas Clifton 0ae73d
+ 	    {
Nicholas Clifton 0ae73d
+ 	      warn (_("Invalid maximum operations per insn.\n"));
Nicholas Clifton 0ae73d
+ 	      return 0;
Nicholas Clifton 0ae73d
+ 	    }
Nicholas Clifton 0ae73d
+ 	}
Nicholas Clifton 0ae73d
+       else
Nicholas Clifton 0ae73d
+ 	info.li_max_ops_per_insn = 1;
Nicholas Clifton 0ae73d
        info.li_default_is_stmt = byte_get (hdrptr, 1);
Nicholas Clifton 0ae73d
        hdrptr++;
Nicholas Clifton 0ae73d
        info.li_line_base = byte_get (hdrptr, 1);
Nicholas Clifton 0ae73d
*************** display_debug_lines_decoded (struct dwar
Nicholas Clifton 0ae73d
*** 2702,2709 ****
Nicholas Clifton 0ae73d
            if (op_code >= info.li_opcode_base)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      op_code -= info.li_opcode_base;
Nicholas Clifton 0ae73d
!               uladv = (op_code / info.li_line_range) * info.li_min_insn_length;
Nicholas Clifton 0ae73d
!               state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
                adv = (op_code % info.li_line_range) + info.li_line_base;
Nicholas Clifton 0ae73d
                state_machine_regs.line += adv;
Nicholas Clifton 0ae73d
--- 2801,2822 ----
Nicholas Clifton 0ae73d
            if (op_code >= info.li_opcode_base)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      op_code -= info.li_opcode_base;
Nicholas Clifton 0ae73d
! 	      uladv = (op_code / info.li_line_range);
Nicholas Clifton 0ae73d
! 	      if (info.li_max_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  uladv *= info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address
Nicholas Clifton 0ae73d
! 		    += ((state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 			/ info.li_max_ops_per_insn)
Nicholas Clifton 0ae73d
! 		       * info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.op_index
Nicholas Clifton 0ae73d
! 		    = (state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 		      % info.li_max_ops_per_insn;
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
                adv = (op_code % info.li_line_range) + info.li_line_base;
Nicholas Clifton 0ae73d
                state_machine_regs.line += adv;
Nicholas Clifton 0ae73d
*************** display_debug_lines_decoded (struct dwar
Nicholas Clifton 0ae73d
*** 2737,2742 ****
Nicholas Clifton 0ae73d
--- 2850,2856 ----
Nicholas Clifton 0ae73d
                    case DW_LNE_set_address:
Nicholas Clifton 0ae73d
                      state_machine_regs.address =
Nicholas Clifton 0ae73d
                      byte_get (op_code_data, ext_op_code_len - bytes_read - 1);
Nicholas Clifton 0ae73d
+ 		    state_machine_regs.op_index = 0;
Nicholas Clifton 0ae73d
                      break;
Nicholas Clifton 0ae73d
                    case DW_LNE_define_file:
Nicholas Clifton 0ae73d
                      {
Nicholas Clifton 0ae73d
*************** display_debug_lines_decoded (struct dwar
Nicholas Clifton 0ae73d
*** 2765,2773 ****
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_advance_pc:
Nicholas Clifton 0ae73d
                uladv = read_leb128 (data, & bytes_read, 0);
Nicholas Clifton 0ae73d
-               uladv *= info.li_min_insn_length;
Nicholas Clifton 0ae73d
                data += bytes_read;
Nicholas Clifton 0ae73d
!               state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
                break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_advance_line:
Nicholas Clifton 0ae73d
--- 2879,2900 ----
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_advance_pc:
Nicholas Clifton 0ae73d
                uladv = read_leb128 (data, & bytes_read, 0);
Nicholas Clifton 0ae73d
                data += bytes_read;
Nicholas Clifton 0ae73d
! 	      if (info.li_max_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  uladv *= info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address
Nicholas Clifton 0ae73d
! 		    += ((state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 			/ info.li_max_ops_per_insn)
Nicholas Clifton 0ae73d
! 		       * info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.op_index
Nicholas Clifton 0ae73d
! 		    = (state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 		      % info.li_max_ops_per_insn;
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
                break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_advance_line:
Nicholas Clifton 0ae73d
*************** display_debug_lines_decoded (struct dwar
Nicholas Clifton 0ae73d
*** 2812,2826 ****
Nicholas Clifton 0ae73d
                break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_const_add_pc:
Nicholas Clifton 0ae73d
!               uladv = (((255 - info.li_opcode_base) / info.li_line_range)
Nicholas Clifton 0ae73d
!                        * info.li_min_insn_length);
Nicholas Clifton 0ae73d
!               state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
                break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_fixed_advance_pc:
Nicholas Clifton 0ae73d
                uladv = byte_get (data, 2);
Nicholas Clifton 0ae73d
                data += 2;
Nicholas Clifton 0ae73d
                state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
                break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_set_prologue_end:
Nicholas Clifton 0ae73d
--- 2939,2967 ----
Nicholas Clifton 0ae73d
                break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_const_add_pc:
Nicholas Clifton 0ae73d
! 	      uladv = ((255 - info.li_opcode_base) / info.li_line_range);
Nicholas Clifton 0ae73d
! 	      if (info.li_max_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  uladv *= info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  state_machine_regs.address
Nicholas Clifton 0ae73d
! 		    += ((state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 			/ info.li_max_ops_per_insn)
Nicholas Clifton 0ae73d
! 		       * info.li_min_insn_length;
Nicholas Clifton 0ae73d
! 		  state_machine_regs.op_index
Nicholas Clifton 0ae73d
! 		    = (state_machine_regs.op_index + uladv)
Nicholas Clifton 0ae73d
! 		      % info.li_max_ops_per_insn;
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
                break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_fixed_advance_pc:
Nicholas Clifton 0ae73d
                uladv = byte_get (data, 2);
Nicholas Clifton 0ae73d
                data += 2;
Nicholas Clifton 0ae73d
                state_machine_regs.address += uladv;
Nicholas Clifton 0ae73d
+ 	      state_machine_regs.op_index = 0;
Nicholas Clifton 0ae73d
                break;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
              case DW_LNS_set_prologue_end:
Nicholas Clifton 0ae73d
*************** display_debug_lines_decoded (struct dwar
Nicholas Clifton 0ae73d
*** 2874,2886 ****
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
                if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
Nicholas Clifton 0ae73d
                  {
Nicholas Clifton 0ae73d
!                   printf (_("%-35s  %11d  %#18lx\n"), newFileName,
Nicholas Clifton 0ae73d
!                           state_machine_regs.line, state_machine_regs.address);
Nicholas Clifton 0ae73d
                  }
Nicholas Clifton 0ae73d
                else
Nicholas Clifton 0ae73d
                  {
Nicholas Clifton 0ae73d
!                   printf (_("%s  %11d  %#18lx\n"), newFileName,
Nicholas Clifton 0ae73d
!                           state_machine_regs.line, state_machine_regs.address);
Nicholas Clifton 0ae73d
                  }
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
                if (op_code == DW_LNE_end_sequence)
Nicholas Clifton 0ae73d
--- 3015,3041 ----
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
                if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
Nicholas Clifton 0ae73d
                  {
Nicholas Clifton 0ae73d
! 		  if (info.li_max_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		    printf (_("%-35s  %11d  %#18lx\n"), newFileName,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.line,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.address);
Nicholas Clifton 0ae73d
! 		  else
Nicholas Clifton 0ae73d
! 		    printf (_("%-35s  %11d  %#18lx[%d]\n"), newFileName,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.line,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.address,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.op_index);
Nicholas Clifton 0ae73d
                  }
Nicholas Clifton 0ae73d
                else
Nicholas Clifton 0ae73d
                  {
Nicholas Clifton 0ae73d
! 		  if (info.li_max_ops_per_insn == 1)
Nicholas Clifton 0ae73d
! 		    printf (_("%s  %11d  %#18lx\n"), newFileName,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.line,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.address);
Nicholas Clifton 0ae73d
! 		  else
Nicholas Clifton 0ae73d
! 		    printf (_("%s  %11d  %#18lx[%d]\n"), newFileName,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.line,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.address,
Nicholas Clifton 0ae73d
! 			    state_machine_regs.op_index);
Nicholas Clifton 0ae73d
                  }
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
                if (op_code == DW_LNE_end_sequence)
Nicholas Clifton 0ae73d
*************** typedef struct Frame_Chunk
Nicholas Clifton 0ae73d
*** 3751,3756 ****
Nicholas Clifton 0ae73d
--- 3906,3913 ----
Nicholas Clifton 0ae73d
    int ra;
Nicholas Clifton 0ae73d
    unsigned char fde_encoding;
Nicholas Clifton 0ae73d
    unsigned char cfa_exp;
Nicholas Clifton 0ae73d
+   unsigned char ptr_size;
Nicholas Clifton 0ae73d
+   unsigned char segment_size;
Nicholas Clifton 0ae73d
  }
Nicholas Clifton 0ae73d
  Frame_Chunk;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 3959,3964 ****
Nicholas Clifton 0ae73d
--- 4116,4122 ----
Nicholas Clifton 0ae73d
    unsigned int length_return;
Nicholas Clifton 0ae73d
    int max_regs = 0;
Nicholas Clifton 0ae73d
    const char *bad_reg = _("bad register: ");
Nicholas Clifton 0ae73d
+   int saved_eh_addr_size = eh_addr_size;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
    printf (_("Contents of the %s section:\n"), section->name);
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 3973,3979 ****
Nicholas Clifton 0ae73d
        int need_col_headers = 1;
Nicholas Clifton 0ae73d
        unsigned char *augmentation_data = NULL;
Nicholas Clifton 0ae73d
        unsigned long augmentation_data_len = 0;
Nicholas Clifton 0ae73d
!       int encoded_ptr_size = eh_addr_size;
Nicholas Clifton 0ae73d
        int offset_size;
Nicholas Clifton 0ae73d
        int initial_length_size;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
--- 4131,4137 ----
Nicholas Clifton 0ae73d
        int need_col_headers = 1;
Nicholas Clifton 0ae73d
        unsigned char *augmentation_data = NULL;
Nicholas Clifton 0ae73d
        unsigned long augmentation_data_len = 0;
Nicholas Clifton 0ae73d
!       int encoded_ptr_size = saved_eh_addr_size;
Nicholas Clifton 0ae73d
        int offset_size;
Nicholas Clifton 0ae73d
        int initial_length_size;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 4029,4076 ****
Nicholas Clifton 0ae73d
  	  fc->augmentation = (char *) start;
Nicholas Clifton 0ae73d
  	  start = (unsigned char *) strchr ((char *) start, '\0') + 1;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
! 	  if (fc->augmentation[0] == 'z')
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
! 	      fc->code_factor = LEB ();
Nicholas Clifton 0ae73d
! 	      fc->data_factor = SLEB ();
Nicholas Clifton 0ae73d
! 	      if (version == 1)
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  fc->ra = GET (1);
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  fc->ra = LEB ();
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      augmentation_data_len = LEB ();
Nicholas Clifton 0ae73d
! 	      augmentation_data = start;
Nicholas Clifton 0ae73d
! 	      start += augmentation_data_len;
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
! 	  else if (strcmp (fc->augmentation, "eh") == 0)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
! 	      start += eh_addr_size;
Nicholas Clifton 0ae73d
! 	      fc->code_factor = LEB ();
Nicholas Clifton 0ae73d
! 	      fc->data_factor = SLEB ();
Nicholas Clifton 0ae73d
! 	      if (version == 1)
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  fc->ra = GET (1);
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  fc->ra = LEB ();
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
  	  else
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
! 	      fc->code_factor = LEB ();
Nicholas Clifton 0ae73d
! 	      fc->data_factor = SLEB ();
Nicholas Clifton 0ae73d
! 	      if (version == 1)
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  fc->ra = GET (1);
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
! 	      else
Nicholas Clifton 0ae73d
! 		{
Nicholas Clifton 0ae73d
! 		  fc->ra = LEB ();
Nicholas Clifton 0ae73d
! 		}
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
  	  cie = fc;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
--- 4187,4222 ----
Nicholas Clifton 0ae73d
  	  fc->augmentation = (char *) start;
Nicholas Clifton 0ae73d
  	  start = (unsigned char *) strchr ((char *) start, '\0') + 1;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
! 	  if (strcmp (fc->augmentation, "eh") == 0)
Nicholas Clifton 0ae73d
! 	    start += eh_addr_size;
Nicholas Clifton 0ae73d
! 
Nicholas Clifton 0ae73d
! 	  if (version >= 4)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
! 	      fc->ptr_size = GET (1);
Nicholas Clifton 0ae73d
! 	      fc->segment_size = GET (1);
Nicholas Clifton 0ae73d
! 	      eh_addr_size = fc->ptr_size;
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
! 	  else
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
! 	      fc->ptr_size = eh_addr_size;
Nicholas Clifton 0ae73d
! 	      fc->segment_size = 0;
Nicholas Clifton 0ae73d
! 	    }
Nicholas Clifton 0ae73d
! 	  fc->code_factor = LEB ();
Nicholas Clifton 0ae73d
! 	  fc->data_factor = SLEB ();
Nicholas Clifton 0ae73d
! 	  if (version == 1)
Nicholas Clifton 0ae73d
! 	    {
Nicholas Clifton 0ae73d
! 	      fc->ra = GET (1);
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
  	  else
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
! 	      fc->ra = LEB ();
Nicholas Clifton 0ae73d
! 	    }
Nicholas Clifton 0ae73d
! 
Nicholas Clifton 0ae73d
! 	  if (fc->augmentation[0] == 'z')
Nicholas Clifton 0ae73d
! 	    {
Nicholas Clifton 0ae73d
! 	      augmentation_data_len = LEB ();
Nicholas Clifton 0ae73d
! 	      augmentation_data = start;
Nicholas Clifton 0ae73d
! 	      start += augmentation_data_len;
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
  	  cie = fc;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 4085,4090 ****
Nicholas Clifton 0ae73d
--- 4231,4241 ----
Nicholas Clifton 0ae73d
  		      (unsigned long)(saved_start - section_start), length, cie_id);
Nicholas Clifton 0ae73d
  	      printf ("  Version:               %d\n", version);
Nicholas Clifton 0ae73d
  	      printf ("  Augmentation:          \"%s\"\n", fc->augmentation);
Nicholas Clifton 0ae73d
+ 	      if (version >= 4)
Nicholas Clifton 0ae73d
+ 		{
Nicholas Clifton 0ae73d
+ 		  printf ("  Pointer Size:          %u\n", fc->ptr_size);
Nicholas Clifton 0ae73d
+ 		  printf ("  Segment Size:          %u\n", fc->segment_size);
Nicholas Clifton 0ae73d
+ 		}
Nicholas Clifton 0ae73d
  	      printf ("  Code alignment factor: %u\n", fc->code_factor);
Nicholas Clifton 0ae73d
  	      printf ("  Data alignment factor: %d\n", fc->data_factor);
Nicholas Clifton 0ae73d
  	      printf ("  Return address column: %d\n", fc->ra);
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 4129,4134 ****
Nicholas Clifton 0ae73d
--- 4280,4286 ----
Nicholas Clifton 0ae73d
  	{
Nicholas Clifton 0ae73d
  	  unsigned char *look_for;
Nicholas Clifton 0ae73d
  	  static Frame_Chunk fde_fc;
Nicholas Clifton 0ae73d
+ 	  unsigned long segment_selector;
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	  fc = & fde_fc;
Nicholas Clifton 0ae73d
  	  memset (fc, 0, sizeof (Frame_Chunk));
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 4150,4155 ****
Nicholas Clifton 0ae73d
--- 4302,4309 ----
Nicholas Clifton 0ae73d
  	      cie = fc;
Nicholas Clifton 0ae73d
  	      fc->augmentation = "";
Nicholas Clifton 0ae73d
  	      fc->fde_encoding = 0;
Nicholas Clifton 0ae73d
+ 	      fc->ptr_size = eh_addr_size;
Nicholas Clifton 0ae73d
+ 	      fc->segment_size = 0;
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
  	  else
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 4159,4164 ****
Nicholas Clifton 0ae73d
--- 4313,4321 ----
Nicholas Clifton 0ae73d
  	      memcpy (fc->col_type, cie->col_type, fc->ncols * sizeof (short int));
Nicholas Clifton 0ae73d
  	      memcpy (fc->col_offset, cie->col_offset, fc->ncols * sizeof (int));
Nicholas Clifton 0ae73d
  	      fc->augmentation = cie->augmentation;
Nicholas Clifton 0ae73d
+ 	      fc->ptr_size = cie->ptr_size;
Nicholas Clifton 0ae73d
+ 	      eh_addr_size = cie->ptr_size;
Nicholas Clifton 0ae73d
+ 	      fc->segment_size = cie->segment_size;
Nicholas Clifton 0ae73d
  	      fc->code_factor = cie->code_factor;
Nicholas Clifton 0ae73d
  	      fc->data_factor = cie->data_factor;
Nicholas Clifton 0ae73d
  	      fc->cfa_reg = cie->cfa_reg;
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 4171,4176 ****
Nicholas Clifton 0ae73d
--- 4328,4339 ----
Nicholas Clifton 0ae73d
  	  if (fc->fde_encoding)
Nicholas Clifton 0ae73d
  	    encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
+ 	  segment_selector = 0;
Nicholas Clifton 0ae73d
+ 	  if (fc->segment_size)
Nicholas Clifton 0ae73d
+ 	    {
Nicholas Clifton 0ae73d
+ 	      segment_selector = byte_get (start, fc->segment_size);
Nicholas Clifton 0ae73d
+ 	      start += fc->segment_size;
Nicholas Clifton 0ae73d
+ 	    }
Nicholas Clifton 0ae73d
  	  fc->pc_begin = get_encoded_value (start, fc->fde_encoding);
Nicholas Clifton 0ae73d
  	  if ((fc->fde_encoding & 0x70) == DW_EH_PE_pcrel)
Nicholas Clifton 0ae73d
  	    fc->pc_begin += section->address + (start - section_start);
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 4185,4194 ****
Nicholas Clifton 0ae73d
  	      start += augmentation_data_len;
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
! 	  printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n",
Nicholas Clifton 0ae73d
  		  (unsigned long)(saved_start - section_start), length, cie_id,
Nicholas Clifton 0ae73d
! 		  (unsigned long)(cie->chunk_start - section_start),
Nicholas Clifton 0ae73d
! 		  fc->pc_begin, fc->pc_begin + fc->pc_range);
Nicholas Clifton 0ae73d
  	  if (! do_debug_frames_interp && augmentation_data_len)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      unsigned long i;
Nicholas Clifton 0ae73d
--- 4348,4359 ----
Nicholas Clifton 0ae73d
  	      start += augmentation_data_len;
Nicholas Clifton 0ae73d
  	    }
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
! 	  printf ("\n%08lx %08lx %08lx FDE cie=%08lx pc=",
Nicholas Clifton 0ae73d
  		  (unsigned long)(saved_start - section_start), length, cie_id,
Nicholas Clifton 0ae73d
! 		  (unsigned long)(cie->chunk_start - section_start));
Nicholas Clifton 0ae73d
! 	  if (fc->segment_size)
Nicholas Clifton 0ae73d
! 	    printf ("%04lx:", segment_selector);
Nicholas Clifton 0ae73d
! 	  printf ("%08lx..%08lx\n", fc->pc_begin, fc->pc_begin + fc->pc_range);
Nicholas Clifton 0ae73d
  	  if (! do_debug_frames_interp && augmentation_data_len)
Nicholas Clifton 0ae73d
  	    {
Nicholas Clifton 0ae73d
  	      unsigned long i;
Nicholas Clifton 0ae73d
*************** display_debug_frames (struct dwarf_secti
Nicholas Clifton 0ae73d
*** 4736,4741 ****
Nicholas Clifton 0ae73d
--- 4901,4907 ----
Nicholas Clifton 0ae73d
  	frame_display_row (fc, &need_col_headers, &max_regs);
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
        start = block_end;
Nicholas Clifton 0ae73d
+       eh_addr_size = saved_eh_addr_size;
Nicholas Clifton 0ae73d
      }
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
    printf ("\n");
Nicholas Clifton 0ae73d
diff -rcp ../binutils-2.20.51.0.2.original/include/ChangeLog ./include/ChangeLog
Nicholas Clifton 0ae73d
*** ../binutils-2.20.51.0.2.original/include/ChangeLog	2010-04-08 12:35:39.000000000 +0100
Nicholas Clifton 0ae73d
--- ./include/ChangeLog	2010-04-08 12:37:27.000000000 +0100
Nicholas Clifton 0ae73d
***************
Nicholas Clifton 0ae73d
*** 1,3 ****
Nicholas Clifton 0ae73d
--- 1,12 ----
Nicholas Clifton 0ae73d
+ 2010-04-08  Nick Clifton  <nickc@redhat.com>
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	Import these patches from the mainline:
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	2010-04-05  Jakub Jelinek  <jakub@redhat.com>
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
+ 	* dwarf2.h (DWARF2_Internal_LineInfo): Add li_max_ops_per_insn
Nicholas Clifton 0ae73d
+ 	field.
Nicholas Clifton 0ae73d
+ 
Nicholas Clifton 0ae73d
  2008-10-03  Rafael Espindola  <espindola@google.com>
Nicholas Clifton 0ae73d
  
Nicholas Clifton 0ae73d
  	* plugin-api.h: New.
Nicholas Clifton 0ae73d
diff -rcp ../binutils-2.20.51.0.2.original/include/dwarf2.h ./include/dwarf2.h
Nicholas Clifton 0ae73d
*** ../binutils-2.20.51.0.2.original/include/dwarf2.h	2010-04-08 12:35:38.000000000 +0100
Nicholas Clifton 0ae73d
--- ./include/dwarf2.h	2010-04-08 12:35:59.000000000 +0100
Nicholas Clifton 0ae73d
*************** typedef struct
Nicholas Clifton 0ae73d
*** 66,71 ****
Nicholas Clifton 0ae73d
--- 66,72 ----
Nicholas Clifton 0ae73d
    unsigned short li_version;
Nicholas Clifton 0ae73d
    unsigned int   li_prologue_length;
Nicholas Clifton 0ae73d
    unsigned char  li_min_insn_length;
Nicholas Clifton 0ae73d
+   unsigned char  li_max_ops_per_insn;
Nicholas Clifton 0ae73d
    unsigned char  li_default_is_stmt;
Nicholas Clifton 0ae73d
    int            li_line_base;
Nicholas Clifton 0ae73d
    unsigned char  li_line_range;