ieee_error (info, atn_start, "illegal variable index");
if (atn_code == 9) return ieee_read_number (info, pp, &v);  ieee_error (info, atn_start, _("illegal variable index"));
parse_ieee_atn (info, pp)     struct ieee_info *info;     const bfd_byte **pp;{  const bfd_byte *atn_start, *atn_code_start;  bfd_vma varindx;  struct ieee_var *pvar;  debug_type type;  bfd_vma atn_code;  PTR dhandle;  bfd_vma v, v2, v3, v4, v5;  const char *name;  unsigned long namlen;  char *namcopy;  boolean present;  int blocktype;  atn_start = *pp;  if (! ieee_read_number (info, pp, &varindx)      || ! ieee_read_type_index (info, pp, &type))    return false;  atn_code_start = *pp;  if (! ieee_read_number (info, pp, &atn_code))    return false;  if (varindx == 0)    {      pvar = NULL;      name = "";      namlen = 0;    }  else if (varindx < 32)    {      ieee_error (info, atn_start, "illegal variable index");      return false;    }  else    {      varindx -= 32;      if (varindx >= info->vars.alloc	  || info->vars.vars[varindx].name == NULL)	{	  /* The MRI compiler or linker sometimes omits the NN record             for a pmisc record.  */	  if (atn_code == 62)	    {	      if (varindx >= info->vars.alloc)		{		  unsigned int alloc;		  alloc = info->vars.alloc;		  if (alloc == 0)		    alloc = 4;		  while (varindx >= alloc)		    alloc *= 2;		  info->vars.vars = ((struct ieee_var *)				     xrealloc (info->vars.vars,					       (alloc						* sizeof *info->vars.vars)));		  memset (info->vars.vars + info->vars.alloc, 0,			  ((alloc - info->vars.alloc)			   * sizeof *info->vars.vars));		  info->vars.alloc = alloc;		}	      pvar = info->vars.vars + varindx;	      pvar->name = "";	      pvar->namlen = 0;	    }	  else	    {	      ieee_error (info, atn_start, "undefined variable in ATN");	      return false;	    }	}      pvar = info->vars.vars + varindx;      pvar->type = type;      name = pvar->name;      namlen = pvar->namlen;    }  dhandle = info->dhandle;  /* If we are going to call debug_record_variable with a pointer     type, change the type to an indirect type so that we can later     change it to a reference type if we encounter a C++ pmisc 'R'     record.  */  if (pvar != NULL      && type != DEBUG_TYPE_NULL      && debug_get_type_kind (dhandle, type) == DEBUG_KIND_POINTER)    {      switch (atn_code)	{	case 1:	case 2:	case 3:	case 5:	case 8:	case 10:	  pvar->pslot = (debug_type *) xmalloc (sizeof *pvar->pslot);	  *pvar->pslot = type;	  type = debug_make_indirect_type (dhandle, pvar->pslot,					   (const char *) NULL);	  pvar->type = type;	  break;	}    }  switch (atn_code)    {    default:      ieee_error (info, atn_code_start, "unknown ATN type");      return false;    case 1:      /* Automatic variable.  */      if (! ieee_read_number (info, pp, &v))	return false;      namcopy = savestring (name, namlen);      if (type == NULL)	type = debug_make_void_type (dhandle);      if (pvar != NULL)	pvar->kind = IEEE_LOCAL;      return debug_record_variable (dhandle, namcopy, type, DEBUG_LOCAL, v);    case 2:      /* Register variable.  */      if (! ieee_read_number (info, pp, &v))	return false;      namcopy = savestring (name, namlen);      if (type == NULL)	type = debug_make_void_type (dhandle);      if (pvar != NULL)	pvar->kind = IEEE_LOCAL;      return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER,				    ieee_regno_to_genreg (info->abfd, v));    case 3:      /* Static variable.  */      if (! ieee_require_asn (info, pp, &v))	return false;      namcopy = savestring (name, namlen);      if (type == NULL)	type = debug_make_void_type (dhandle);      if (info->blockstack.bsp <= info->blockstack.stack)	blocktype = 0;      else	blocktype = info->blockstack.bsp[-1].kind;      if (pvar != NULL)	{	  if (blocktype == 4 || blocktype == 6)	    pvar->kind = IEEE_LOCAL;	  else	    pvar->kind = IEEE_STATIC;	}      return debug_record_variable (dhandle, namcopy, type,				    (blocktype == 4 || blocktype == 6				     ? DEBUG_LOCAL_STATIC				     : DEBUG_STATIC),				    v);    case 4:      /* External function.  We don't currently record these.  FIXME.  */      if (pvar != NULL)	pvar->kind = IEEE_EXTERNAL;      return true;    case 5:      /* External variable.  We don't currently record these.  FIXME.  */      if (pvar != NULL)	pvar->kind = IEEE_EXTERNAL;      return true;    case 7:      if (! ieee_read_number (info, pp, &v)	  || ! ieee_read_number (info, pp, &v2)	  || ! ieee_read_optional_number (info, pp, &v3, &present))	return false;      if (present)	{	  if (! ieee_read_optional_number (info, pp, &v4, &present))	    return false;	}      /* We just ignore the two optional fields in v3 and v4, since         they are not defined.  */      if (! ieee_require_asn (info, pp, &v3))	return false;      /* We have no way to record the column number.  FIXME.  */      return debug_record_line (dhandle, v, v3);    case 8:      /* Global variable.  */      if (! ieee_require_asn (info, pp, &v))	return false;      namcopy = savestring (name, namlen);      if (type == NULL)	type = debug_make_void_type (dhandle);      if (pvar != NULL)	pvar->kind = IEEE_GLOBAL;      return debug_record_variable (dhandle, namcopy, type, DEBUG_GLOBAL, v);    case 9:      /* Variable lifetime information.  */      if (! ieee_read_number (info, pp, &v))	return false;      /* We have no way to record this information.  FIXME.  */      return true;    case 10:      /* Locked register.  The spec says that there are two required         fields, but at least on occasion the MRI compiler only emits         one.  */      if (! ieee_read_number (info, pp, &v)	  || ! ieee_read_optional_number (info, pp, &v2, &present))	return false;      /* I think this means a variable that is both in a register and         a frame slot.  We ignore the frame slot.  FIXME.  */      namcopy = savestring (name, namlen);      if (type == NULL)	type = debug_make_void_type (dhandle);      if (pvar != NULL)	pvar->kind = IEEE_LOCAL;      return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, v);    case 11:      /* Reserved for FORTRAN common.  */      ieee_error (info, atn_code_start, "unsupported ATN11");      /* Return true to keep going.  */      return true;    case 12:      /* Based variable.  */      v3 = 0;      v4 = 0x80;      v5 = 0;      if (! ieee_read_number (info, pp, &v)	  || ! ieee_read_number (info, pp, &v2)	  || ! ieee_read_optional_number (info, pp, &v3, &present))	return false;      if (present)	{	  if (! ieee_read_optional_number (info, pp, &v4, &present))	    return false;	  if (present)	    {	      if (! ieee_read_optional_number (info, pp, &v5, &present))		return false;	    }	}      /* We have no way to record this information.  FIXME.  */      ieee_error (info, atn_code_start, "unsupported ATN12");      /* Return true to keep going.  */      return true;    case 16:      /* Constant.  The description of this that I have is ambiguous,         so I'm not going to try to implement it.  */      if (! ieee_read_number (info, pp, &v)	  || ! ieee_read_optional_number (info, pp, &v2, &present))	return false;      if (present)	{	  if (! ieee_read_optional_number (info, pp, &v2, &present))	    return false;	  if (present)	    {	      if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))		return false;	    }	}      if ((ieee_record_enum_type) **pp == ieee_e2_first_byte_enum)	{	  if (! ieee_require_asn (info, pp, &v3))	    return false;	}      return true;    case 19:      /* Static variable from assembler.  */      v2 = 0;      if (! ieee_read_number (info, pp, &v)	  || ! ieee_read_optional_number (info, pp, &v2, &present)	  || ! ieee_require_asn (info, pp, &v3))	return false;      namcopy = savestring (name, namlen);      /* We don't really handle this correctly.  FIXME.  */      return debug_record_variable (dhandle, namcopy,				    debug_make_void_type (dhandle),				    v2 != 0 ? DEBUG_GLOBAL : DEBUG_STATIC,				    v3);    case 62:      /* Procedure miscellaneous information.  */    case 63:      /* Variable miscellaneous information.  */    case 64:      /* Module miscellaneous information.  */      if (! ieee_read_number (info, pp, &v)	  || ! ieee_read_number (info, pp, &v2)	  || ! ieee_read_optional_id (info, pp, &name, &namlen, &present))	return false;      if (atn_code == 62 && v == 80)	{	  if (present)	    {	      ieee_error (info, atn_code_start,			  "unexpected string in C++ misc");	      return false;	    }	  return ieee_read_cxx_misc (info, pp, v2);	}      /* We just ignore all of this stuff.  FIXME.  */      for (; v2 > 0; --v2)	{	  switch ((ieee_record_enum_type) **pp)	    {	    default:	      ieee_error (info, *pp, "bad misc record");	      return false;	    case ieee_at_record_enum:	      if (! ieee_require_atn65 (info, pp, &name, &namlen))		return false;	      break;	    case ieee_e2_first_byte_enum:	      if (! ieee_require_asn (info, pp, &v3))		return false;	      break;	    }	}      return true;    }  /*NOTREACHED*/}