| Index: gdb/dwarf2-frame.c | 
| diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c | 
| index 88aa338919e3da03c2b1908e1d3c234e00c93f98..986aaea2335e59f3fded32c487e337495c4cc014 100644 | 
| --- a/gdb/dwarf2-frame.c | 
| +++ b/gdb/dwarf2-frame.c | 
| @@ -68,8 +68,8 @@ struct dwarf2_cie | 
| ULONGEST return_address_register; | 
|  | 
| /* Instruction sequence to initialize a register set.  */ | 
| -  gdb_byte *initial_instructions; | 
| -  gdb_byte *end; | 
| +  const gdb_byte *initial_instructions; | 
| +  const gdb_byte *end; | 
|  | 
| /* Saved augmentation, in case it's needed later.  */ | 
| char *augmentation; | 
| @@ -116,8 +116,8 @@ struct dwarf2_fde | 
| CORE_ADDR address_range; | 
|  | 
| /* Instruction sequence.  */ | 
| -  gdb_byte *instructions; | 
| -  gdb_byte *end; | 
| +  const gdb_byte *instructions; | 
| +  const gdb_byte *end; | 
|  | 
| /* True if this FDE is read from a .eh_frame instead of a .debug_frame | 
| section.  */ | 
| @@ -354,7 +354,8 @@ static const struct dwarf_expr_context_funcs dwarf2_frame_ctx_funcs = | 
| ctx_no_get_tls_address, | 
| ctx_no_dwarf_call, | 
| ctx_no_get_base_type, | 
| -  ctx_no_push_dwarf_reg_entry_value | 
| +  ctx_no_push_dwarf_reg_entry_value, | 
| +  ctx_no_get_addr_index | 
| }; | 
|  | 
| static CORE_ADDR | 
| @@ -415,8 +416,8 @@ execute_cfa_program (struct dwarf2_fde *fde, const gdb_byte *insn_ptr, | 
| while (insn_ptr < insn_end && fs->pc <= pc) | 
| { | 
| gdb_byte insn = *insn_ptr++; | 
| -      ULONGEST utmp, reg; | 
| -      LONGEST offset; | 
| +      uint64_t utmp, reg; | 
| +      int64_t offset; | 
|  | 
| if ((insn & 0xc0) == DW_CFA_advance_loc) | 
| fs->pc += (insn & 0x3f) * fs->code_align; | 
| @@ -424,7 +425,7 @@ execute_cfa_program (struct dwarf2_fde *fde, const gdb_byte *insn_ptr, | 
| { | 
| reg = insn & 0x3f; | 
| reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p); | 
| -	  insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	  insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
| offset = utmp * fs->data_align; | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET; | 
| @@ -466,9 +467,9 @@ execute_cfa_program (struct dwarf2_fde *fde, const gdb_byte *insn_ptr, | 
| break; | 
|  | 
| case DW_CFA_offset_extended: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p); | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
| offset = utmp * fs->data_align; | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET; | 
| @@ -476,28 +477,28 @@ execute_cfa_program (struct dwarf2_fde *fde, const gdb_byte *insn_ptr, | 
| break; | 
|  | 
| case DW_CFA_restore_extended: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| dwarf2_restore_rule (gdbarch, reg, fs, eh_frame_p); | 
| break; | 
|  | 
| case DW_CFA_undefined: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p); | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_UNDEFINED; | 
| break; | 
|  | 
| case DW_CFA_same_value: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p); | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAME_VALUE; | 
| break; | 
|  | 
| case DW_CFA_register: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p); | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
| utmp = dwarf2_frame_adjust_regnum (gdbarch, utmp, eh_frame_p); | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_REG; | 
| @@ -535,8 +536,9 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"), | 
| break; | 
|  | 
| case DW_CFA_def_cfa: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->regs.cfa_reg); | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      fs->regs.cfa_reg = reg; | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
|  | 
| if (fs->armcc_cfa_offsets_sf) | 
| utmp *= fs->data_align; | 
| @@ -546,15 +548,14 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"), | 
| break; | 
|  | 
| case DW_CFA_def_cfa_register: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->regs.cfa_reg); | 
| -	      fs->regs.cfa_reg = dwarf2_frame_adjust_regnum (gdbarch, | 
| -                                                             fs->regs.cfa_reg, | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      fs->regs.cfa_reg = dwarf2_frame_adjust_regnum (gdbarch, reg, | 
| eh_frame_p); | 
| fs->regs.cfa_how = CFA_REG_OFFSET; | 
| break; | 
|  | 
| case DW_CFA_def_cfa_offset: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
|  | 
| if (fs->armcc_cfa_offsets_sf) | 
| utmp *= fs->data_align; | 
| @@ -567,18 +568,18 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"), | 
| break; | 
|  | 
| case DW_CFA_def_cfa_expression: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, | 
| -                                       &fs->regs.cfa_exp_len); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	      fs->regs.cfa_exp_len = utmp; | 
| fs->regs.cfa_exp = insn_ptr; | 
| fs->regs.cfa_how = CFA_EXP; | 
| insn_ptr += fs->regs.cfa_exp_len; | 
| break; | 
|  | 
| case DW_CFA_expression: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p); | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
| fs->regs.reg[reg].loc.exp = insn_ptr; | 
| fs->regs.reg[reg].exp_len = utmp; | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_EXP; | 
| @@ -586,9 +587,9 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"), | 
| break; | 
|  | 
| case DW_CFA_offset_extended_sf: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p); | 
| -	      insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset); | 
| +	      insn_ptr = safe_read_sleb128 (insn_ptr, insn_end, &offset); | 
| offset *= fs->data_align; | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET; | 
| @@ -596,27 +597,27 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"), | 
| break; | 
|  | 
| case DW_CFA_val_offset: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
| offset = utmp * fs->data_align; | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_VAL_OFFSET; | 
| fs->regs.reg[reg].loc.offset = offset; | 
| break; | 
|  | 
| case DW_CFA_val_offset_sf: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| -	      insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset); | 
| +	      insn_ptr = safe_read_sleb128 (insn_ptr, insn_end, &offset); | 
| offset *= fs->data_align; | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_VAL_OFFSET; | 
| fs->regs.reg[reg].loc.offset = offset; | 
| break; | 
|  | 
| case DW_CFA_val_expression: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
| fs->regs.reg[reg].loc.exp = insn_ptr; | 
| fs->regs.reg[reg].exp_len = utmp; | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_VAL_EXP; | 
| @@ -624,17 +625,16 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"), | 
| break; | 
|  | 
| case DW_CFA_def_cfa_sf: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->regs.cfa_reg); | 
| -	      fs->regs.cfa_reg = dwarf2_frame_adjust_regnum (gdbarch, | 
| -                                                             fs->regs.cfa_reg, | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      fs->regs.cfa_reg = dwarf2_frame_adjust_regnum (gdbarch, reg, | 
| eh_frame_p); | 
| -	      insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset); | 
| +	      insn_ptr = safe_read_sleb128 (insn_ptr, insn_end, &offset); | 
| fs->regs.cfa_offset = offset * fs->data_align; | 
| fs->regs.cfa_how = CFA_REG_OFFSET; | 
| break; | 
|  | 
| case DW_CFA_def_cfa_offset_sf: | 
| -	      insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset); | 
| +	      insn_ptr = safe_read_sleb128 (insn_ptr, insn_end, &offset); | 
| fs->regs.cfa_offset = offset * fs->data_align; | 
| /* cfa_how deliberately not set.  */ | 
| break; | 
| @@ -666,13 +666,13 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"), | 
|  | 
| case DW_CFA_GNU_args_size: | 
| /* Ignored.  */ | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); | 
| break; | 
|  | 
| case DW_CFA_GNU_negative_offset_extended: | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, ®); | 
| reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p); | 
| -	      insn_ptr = read_uleb128 (insn_ptr, insn_end, &offset); | 
| +	      insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &offset); | 
| offset *= fs->data_align; | 
| dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); | 
| fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET; | 
| @@ -891,7 +891,7 @@ dwarf2_compile_cfa_to_ax (struct agent_expr *expr, struct axs_value *loc, | 
| const int num_regs = gdbarch_num_regs (gdbarch) | 
| + gdbarch_num_pseudo_regs (gdbarch); | 
| struct dwarf2_fde *fde; | 
| -  CORE_ADDR text_offset, cfa; | 
| +  CORE_ADDR text_offset; | 
| struct dwarf2_frame_state fs; | 
| int addr_size; | 
|  | 
| @@ -994,10 +994,20 @@ struct dwarf2_frame_cache | 
| void *tailcall_cache; | 
| }; | 
|  | 
| +/* A cleanup that sets a pointer to NULL.  */ | 
| + | 
| +static void | 
| +clear_pointer_cleanup (void *arg) | 
| +{ | 
| +  void **ptr = arg; | 
| + | 
| +  *ptr = NULL; | 
| +} | 
| + | 
| static struct dwarf2_frame_cache * | 
| dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) | 
| { | 
| -  struct cleanup *old_chain; | 
| +  struct cleanup *reset_cache_cleanup, *old_chain; | 
| struct gdbarch *gdbarch = get_frame_arch (this_frame); | 
| const int num_regs = gdbarch_num_regs (gdbarch) | 
| + gdbarch_num_pseudo_regs (gdbarch); | 
| @@ -1017,6 +1027,7 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) | 
| cache = FRAME_OBSTACK_ZALLOC (struct dwarf2_frame_cache); | 
| cache->reg = FRAME_OBSTACK_CALLOC (num_regs, struct dwarf2_frame_state_reg); | 
| *this_cache = cache; | 
| +  reset_cache_cleanup = make_cleanup (clear_pointer_cleanup, this_cache); | 
|  | 
| /* Allocate and initialize the frame state.  */ | 
| fs = XZALLOC (struct dwarf2_frame_state); | 
| @@ -1110,6 +1121,8 @@ dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache) | 
| if (ex.error == NOT_AVAILABLE_ERROR) | 
| { | 
| cache->unavailable_retaddr = 1; | 
| +	  do_cleanups (old_chain); | 
| +	  discard_cleanups (reset_cache_cleanup); | 
| return cache; | 
| } | 
|  | 
| @@ -1225,6 +1238,7 @@ incomplete CFI data; unspecified registers (e.g., %s) at %s"), | 
| (entry_cfa_sp_offset_p | 
| ? &entry_cfa_sp_offset : NULL)); | 
|  | 
| +  discard_cleanups (reset_cache_cleanup); | 
| return cache; | 
| } | 
|  | 
| @@ -1490,88 +1504,36 @@ dwarf2_frame_cfa (struct frame_info *this_frame) | 
| if (!frame_unwinder_is (this_frame, &dwarf2_frame_unwind) | 
| && !frame_unwinder_is (this_frame, &dwarf2_tailcall_frame_unwind)) | 
| error (_("can't compute CFA for this frame")); | 
| +  if (get_frame_unwind_stop_reason (this_frame) == UNWIND_UNAVAILABLE) | 
| +    throw_error (NOT_AVAILABLE_ERROR, | 
| +		 _("can't compute CFA for this frame: " | 
| +		   "required registers or memory are unavailable")); | 
| return get_frame_base (this_frame); | 
| } | 
|  | 
| const struct objfile_data *dwarf2_frame_objfile_data; | 
|  | 
| static unsigned int | 
| -read_1_byte (bfd *abfd, gdb_byte *buf) | 
| +read_1_byte (bfd *abfd, const gdb_byte *buf) | 
| { | 
| return bfd_get_8 (abfd, buf); | 
| } | 
|  | 
| static unsigned int | 
| -read_4_bytes (bfd *abfd, gdb_byte *buf) | 
| +read_4_bytes (bfd *abfd, const gdb_byte *buf) | 
| { | 
| return bfd_get_32 (abfd, buf); | 
| } | 
|  | 
| static ULONGEST | 
| -read_8_bytes (bfd *abfd, gdb_byte *buf) | 
| +read_8_bytes (bfd *abfd, const gdb_byte *buf) | 
| { | 
| return bfd_get_64 (abfd, buf); | 
| } | 
|  | 
| static ULONGEST | 
| -read_unsigned_leb128 (bfd *abfd, gdb_byte *buf, unsigned int *bytes_read_ptr) | 
| -{ | 
| -  ULONGEST result; | 
| -  unsigned int num_read; | 
| -  int shift; | 
| -  gdb_byte byte; | 
| - | 
| -  result = 0; | 
| -  shift = 0; | 
| -  num_read = 0; | 
| - | 
| -  do | 
| -    { | 
| -      byte = bfd_get_8 (abfd, (bfd_byte *) buf); | 
| -      buf++; | 
| -      num_read++; | 
| -      result |= ((byte & 0x7f) << shift); | 
| -      shift += 7; | 
| -    } | 
| -  while (byte & 0x80); | 
| - | 
| -  *bytes_read_ptr = num_read; | 
| - | 
| -  return result; | 
| -} | 
| - | 
| -static LONGEST | 
| -read_signed_leb128 (bfd *abfd, gdb_byte *buf, unsigned int *bytes_read_ptr) | 
| -{ | 
| -  LONGEST result; | 
| -  int shift; | 
| -  unsigned int num_read; | 
| -  gdb_byte byte; | 
| - | 
| -  result = 0; | 
| -  shift = 0; | 
| -  num_read = 0; | 
| - | 
| -  do | 
| -    { | 
| -      byte = bfd_get_8 (abfd, (bfd_byte *) buf); | 
| -      buf++; | 
| -      num_read++; | 
| -      result |= ((byte & 0x7f) << shift); | 
| -      shift += 7; | 
| -    } | 
| -  while (byte & 0x80); | 
| - | 
| -  if (shift < 8 * sizeof (result) && (byte & 0x40)) | 
| -    result |= -(((LONGEST)1) << shift); | 
| - | 
| -  *bytes_read_ptr = num_read; | 
| - | 
| -  return result; | 
| -} | 
| - | 
| -static ULONGEST | 
| -read_initial_length (bfd *abfd, gdb_byte *buf, unsigned int *bytes_read_ptr) | 
| +read_initial_length (bfd *abfd, const gdb_byte *buf, | 
| +		     unsigned int *bytes_read_ptr) | 
| { | 
| LONGEST result; | 
|  | 
| @@ -1680,10 +1642,10 @@ read_encoded_value (struct comp_unit *unit, gdb_byte encoding, | 
| { | 
| case DW_EH_PE_uleb128: | 
| { | 
| -	ULONGEST value; | 
| +	uint64_t value; | 
| const gdb_byte *end_buf = buf + (sizeof (value) + 1) * 8 / 7; | 
|  | 
| -	*bytes_read_ptr += read_uleb128 (buf, end_buf, &value) - buf; | 
| +	*bytes_read_ptr += safe_read_uleb128 (buf, end_buf, &value) - buf; | 
| return base + value; | 
| } | 
| case DW_EH_PE_udata2: | 
| @@ -1697,10 +1659,10 @@ read_encoded_value (struct comp_unit *unit, gdb_byte encoding, | 
| return (base + bfd_get_64 (unit->abfd, (bfd_byte *) buf)); | 
| case DW_EH_PE_sleb128: | 
| { | 
| -	LONGEST value; | 
| +	int64_t value; | 
| const gdb_byte *end_buf = buf + (sizeof (value) + 1) * 8 / 7; | 
|  | 
| -	*bytes_read_ptr += read_sleb128 (buf, end_buf, &value) - buf; | 
| +	*bytes_read_ptr += safe_read_sleb128 (buf, end_buf, &value) - buf; | 
| return base + value; | 
| } | 
| case DW_EH_PE_sdata2: | 
| @@ -1858,28 +1820,32 @@ enum eh_frame_type | 
| EH_CIE_OR_FDE_TYPE_ID = EH_CIE_TYPE_ID | EH_FDE_TYPE_ID | 
| }; | 
|  | 
| -static gdb_byte *decode_frame_entry (struct comp_unit *unit, gdb_byte *start, | 
| -				     int eh_frame_p, | 
| -                                     struct dwarf2_cie_table *cie_table, | 
| -                                     struct dwarf2_fde_table *fde_table, | 
| -                                     enum eh_frame_type entry_type); | 
| +static const gdb_byte *decode_frame_entry (struct comp_unit *unit, | 
| +					   const gdb_byte *start, | 
| +					   int eh_frame_p, | 
| +					   struct dwarf2_cie_table *cie_table, | 
| +					   struct dwarf2_fde_table *fde_table, | 
| +					   enum eh_frame_type entry_type); | 
|  | 
| /* Decode the next CIE or FDE, entry_type specifies the expected type. | 
| Return NULL if invalid input, otherwise the next byte to be processed.  */ | 
|  | 
| -static gdb_byte * | 
| -decode_frame_entry_1 (struct comp_unit *unit, gdb_byte *start, int eh_frame_p, | 
| +static const gdb_byte * | 
| +decode_frame_entry_1 (struct comp_unit *unit, const gdb_byte *start, | 
| +		      int eh_frame_p, | 
| struct dwarf2_cie_table *cie_table, | 
| struct dwarf2_fde_table *fde_table, | 
| enum eh_frame_type entry_type) | 
| { | 
| struct gdbarch *gdbarch = get_objfile_arch (unit->objfile); | 
| -  gdb_byte *buf, *end; | 
| +  const gdb_byte *buf, *end; | 
| LONGEST length; | 
| unsigned int bytes_read; | 
| int dwarf64_p; | 
| ULONGEST cie_id; | 
| ULONGEST cie_pointer; | 
| +  int64_t sleb128; | 
| +  uint64_t uleb128; | 
|  | 
| buf = start; | 
| length = read_initial_length (unit->abfd, buf, &bytes_read); | 
| @@ -1995,37 +1961,41 @@ decode_frame_entry_1 (struct comp_unit *unit, gdb_byte *start, int eh_frame_p, | 
| else | 
| cie->ptr_size = cie->addr_size; | 
|  | 
| -      cie->code_alignment_factor = | 
| -	read_unsigned_leb128 (unit->abfd, buf, &bytes_read); | 
| -      buf += bytes_read; | 
| +      buf = gdb_read_uleb128 (buf, end, &uleb128); | 
| +      if (buf == NULL) | 
| +	return NULL; | 
| +      cie->code_alignment_factor = uleb128; | 
|  | 
| -      cie->data_alignment_factor = | 
| -	read_signed_leb128 (unit->abfd, buf, &bytes_read); | 
| -      buf += bytes_read; | 
| +      buf = gdb_read_sleb128 (buf, end, &sleb128); | 
| +      if (buf == NULL) | 
| +	return NULL; | 
| +      cie->data_alignment_factor = sleb128; | 
|  | 
| if (cie_version == 1) | 
| { | 
| cie->return_address_register = read_1_byte (unit->abfd, buf); | 
| -	  bytes_read = 1; | 
| +	  ++buf; | 
| } | 
| else | 
| -	cie->return_address_register = read_unsigned_leb128 (unit->abfd, buf, | 
| -							     &bytes_read); | 
| +	{ | 
| +	  buf = gdb_read_uleb128 (buf, end, &uleb128); | 
| +	  if (buf == NULL) | 
| +	    return NULL; | 
| +	  cie->return_address_register = uleb128; | 
| +	} | 
| + | 
| cie->return_address_register | 
| = dwarf2_frame_adjust_regnum (gdbarch, | 
| cie->return_address_register, | 
| eh_frame_p); | 
|  | 
| -      buf += bytes_read; | 
| - | 
| cie->saw_z_augmentation = (*augmentation == 'z'); | 
| if (cie->saw_z_augmentation) | 
| { | 
| -	  ULONGEST length; | 
| +	  uint64_t length; | 
|  | 
| -	  length = read_unsigned_leb128 (unit->abfd, buf, &bytes_read); | 
| -	  buf += bytes_read; | 
| -	  if (buf > end) | 
| +	  buf = gdb_read_uleb128 (buf, end, &length); | 
| +	  if (buf == NULL) | 
| return NULL; | 
| cie->initial_instructions = buf + length; | 
| augmentation++; | 
| @@ -2139,10 +2109,12 @@ decode_frame_entry_1 (struct comp_unit *unit, gdb_byte *start, int eh_frame_p, | 
| can skip the whole thing.  */ | 
| if (fde->cie->saw_z_augmentation) | 
| { | 
| -	  ULONGEST length; | 
| +	  uint64_t length; | 
|  | 
| -	  length = read_unsigned_leb128 (unit->abfd, buf, &bytes_read); | 
| -	  buf += bytes_read + length; | 
| +	  buf = gdb_read_uleb128 (buf, end, &length); | 
| +	  if (buf == NULL) | 
| +	    return NULL; | 
| +	  buf += length; | 
| if (buf > end) | 
| return NULL; | 
| } | 
| @@ -2161,14 +2133,15 @@ decode_frame_entry_1 (struct comp_unit *unit, gdb_byte *start, int eh_frame_p, | 
| /* Read a CIE or FDE in BUF and decode it. Entry_type specifies whether we | 
| expect an FDE or a CIE.  */ | 
|  | 
| -static gdb_byte * | 
| -decode_frame_entry (struct comp_unit *unit, gdb_byte *start, int eh_frame_p, | 
| +static const gdb_byte * | 
| +decode_frame_entry (struct comp_unit *unit, const gdb_byte *start, | 
| +		    int eh_frame_p, | 
| struct dwarf2_cie_table *cie_table, | 
| struct dwarf2_fde_table *fde_table, | 
| enum eh_frame_type entry_type) | 
| { | 
| enum { NONE, ALIGN4, ALIGN8, FAIL } workaround = NONE; | 
| -  gdb_byte *ret; | 
| +  const gdb_byte *ret; | 
| ptrdiff_t start_offset; | 
|  | 
| while (1) | 
| @@ -2280,7 +2253,7 @@ void | 
| dwarf2_build_frame_info (struct objfile *objfile) | 
| { | 
| struct comp_unit *unit; | 
| -  gdb_byte *frame_ptr; | 
| +  const gdb_byte *frame_ptr; | 
| struct dwarf2_cie_table cie_table; | 
| struct dwarf2_fde_table fde_table; | 
| struct dwarf2_fde_table *fde_table2; | 
|  |