PROC_LOW_ADDR (proc_desc) = startaddr;
PROC_LOW_ADDR (proc_desc) = pdr_pc;
non_heuristic_proc_desc (CORE_ADDR pc, CORE_ADDR *addrptr){  CORE_ADDR startaddr;  mips_extra_func_info_t proc_desc;  struct block *b = block_for_pc (pc);  struct symbol *sym;  struct obj_section *sec;  struct mips_objfile_private *priv;  if (DEPRECATED_PC_IN_CALL_DUMMY (pc, 0, 0))    return NULL;  find_pc_partial_function (pc, NULL, &startaddr, NULL);  if (addrptr)    *addrptr = startaddr;  priv = NULL;  sec = find_pc_section (pc);  if (sec != NULL)    {      priv = (struct mips_objfile_private *) objfile_data (sec->objfile, mips_pdr_data);      /* Search the ".pdr" section generated by GAS.  This includes most of         the information normally found in ECOFF PDRs.  */      the_bfd = sec->objfile->obfd;      if (priv == NULL	  && (the_bfd->format == bfd_object	      && bfd_get_flavour (the_bfd) == bfd_target_elf_flavour	      && elf_elfheader (the_bfd)->e_ident[EI_CLASS] == ELFCLASS64))	{	  /* Right now GAS only outputs the address as a four-byte sequence.	     This means that we should not bother with this method on 64-bit	     targets (until that is fixed).  */	  priv = obstack_alloc (&sec->objfile->objfile_obstack,				sizeof (struct mips_objfile_private));	  priv->size = 0;	  set_objfile_data (sec->objfile, mips_pdr_data, priv);	}      else if (priv == NULL)	{	  asection *bfdsec;	  priv = obstack_alloc (&sec->objfile->objfile_obstack,				sizeof (struct mips_objfile_private));	  bfdsec = bfd_get_section_by_name (sec->objfile->obfd, ".pdr");	  if (bfdsec != NULL)	    {	      priv->size = bfd_section_size (sec->objfile->obfd, bfdsec);	      priv->contents = obstack_alloc (&sec->objfile->objfile_obstack,					      priv->size);	      bfd_get_section_contents (sec->objfile->obfd, bfdsec,					priv->contents, 0, priv->size);	      /* In general, the .pdr section is sorted.  However, in the	         presence of multiple code sections (and other corner cases)	         it can become unsorted.  Sort it so that we can use a faster	         binary search.  */	      qsort (priv->contents, priv->size / 32, 32,		     compare_pdr_entries);	    }	  else	    priv->size = 0;	  set_objfile_data (sec->objfile, mips_pdr_data, priv);	}      the_bfd = NULL;      if (priv->size != 0)	{	  int low, mid, high;	  char *ptr;	  low = 0;	  high = priv->size / 32;	  do	    {	      CORE_ADDR pdr_pc;	      mid = (low + high) / 2;	      ptr = priv->contents + mid * 32;	      pdr_pc = bfd_get_signed_32 (sec->objfile->obfd, ptr);	      pdr_pc += ANOFFSET (sec->objfile->section_offsets,				  SECT_OFF_TEXT (sec->objfile));	      if (pdr_pc == startaddr)		break;	      if (pdr_pc > startaddr)		high = mid;	      else		low = mid + 1;	    }	  while (low != high);	  if (low != high)	    {	      struct symbol *sym = find_pc_function (pc);	      /* Fill in what we need of the proc_desc.  */	      proc_desc = (mips_extra_func_info_t)		obstack_alloc (&sec->objfile->objfile_obstack,			       sizeof (struct mips_extra_func_info));	      PROC_LOW_ADDR (proc_desc) = startaddr;	      /* Only used for dummy frames.  */	      PROC_HIGH_ADDR (proc_desc) = 0;	      PROC_FRAME_OFFSET (proc_desc)		= bfd_get_32 (sec->objfile->obfd, ptr + 20);	      PROC_FRAME_REG (proc_desc) = bfd_get_32 (sec->objfile->obfd,						       ptr + 24);	      PROC_FRAME_ADJUST (proc_desc) = 0;	      PROC_REG_MASK (proc_desc) = bfd_get_32 (sec->objfile->obfd,						      ptr + 4);	      PROC_FREG_MASK (proc_desc) = bfd_get_32 (sec->objfile->obfd,						       ptr + 12);	      PROC_REG_OFFSET (proc_desc) = bfd_get_32 (sec->objfile->obfd,							ptr + 8);	      PROC_FREG_OFFSET (proc_desc)		= bfd_get_32 (sec->objfile->obfd, ptr + 16);	      PROC_PC_REG (proc_desc) = bfd_get_32 (sec->objfile->obfd,						    ptr + 28);	      proc_desc->pdr.isym = (long) sym;	      return proc_desc;	    }	}    }  if (b == NULL)    return NULL;  if (startaddr > BLOCK_START (b))    {      /* This is the "pathological" case referred to in a comment in         print_frame_info.  It might be better to move this check into         symbol reading.  */      return NULL;    }  sym = lookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_DOMAIN, 0, NULL);  /* If we never found a PDR for this function in symbol reading, then     examine prologues to find the information.  */  if (sym)    {      proc_desc = (mips_extra_func_info_t) SYMBOL_VALUE (sym);      if (PROC_FRAME_REG (proc_desc) == -1)	return NULL;      else	return proc_desc;    }  else    return NULL;}