Beispiel #1
0
/* parse execution position *PSTR to *POS */
char *						/* error string, or NULL */
range_parse_pos(char *pstr,			/* execution position string */
		struct range_pos_t *pos)	/* position return buffer */
{
  char *s, *endp;
  struct sym_sym_t *sym;

  /* determine position type */
  if (pstr[0] == '@')
    {
      /* address position */
      pos->ptype = pt_addr;
      s = pstr + 1;
    }
  else if (pstr[0] == '#')
    {
      /* cycle count position */
      pos->ptype = pt_cycle;
      s = pstr + 1;
    }
  else
    {
      /* inst count position */
      pos->ptype = pt_inst;
      s = pstr;
    }

  /* get position value */
  errno = 0;
  pos->pos = (counter_t)strtoul(s, &endp, /* parse base */0);
  if (!errno && !*endp)
    {
      /* good conversion */
      return NULL;
    }

  /* else, not an integer, attempt double conversion */
  errno = 0;
  pos->pos = (counter_t)strtod(s, &endp);
  if (!errno && !*endp)
    {
      /* good conversion */
      /* FIXME: ignoring decimal point!! */
      return NULL;
    }

  /* else, attempt symbol lookup */
  sym_loadsyms(ld_prog_fname, /* !locals */FALSE);
  sym = sym_bind_name(s, NULL, sdb_any);
  if (sym != NULL)
    {
      pos->pos = (counter_t)sym->addr;
      return NULL;
    }

  /* else, no binding made */
  return "cannot bind execution position to a value";
}
Beispiel #2
0
//parse execution position *PSTR to *POS, returns error string or NULL
const char * range_parse_pos(char *pstr,		//execution position string
	range_pos_t *pos,				//position return buffer
	mem_t* my_mem)
{
	char *s, *endp;

	//determine position type
	if (pstr[0] == '@')
	{
		//address position
		pos->ptype = pt_addr;
		s = pstr + 1;
	}
	else if (pstr[0] == '#')
	{
		//cycle count position
		pos->ptype = pt_cycle;
		s = pstr + 1;
	}
	else
	{
		//inst count position
		pos->ptype = pt_inst;
		s = pstr;
	}

	//get position value
	errno = 0;
	pos->pos = (counter_t)strtoul(s, &endp, /*parse base*/0);
	if(!errno && !*endp)
	{
		//good conversion
		return NULL;
	}

	//else, not an integer, attempt double conversion
	errno = 0;
	pos->pos = (counter_t)strtod(s, &endp);
	if(!errno && !*endp)
	{
		//good conversion
		//FIXME: ignoring decimal point!!
		return NULL;
	}

	//else, attempt symbol lookup
	sym_loadsyms(my_mem->ld_prog_fname.c_str(), /*!locals*/FALSE, my_mem);
	sym_sym_t *sym = sym_bind_name(s, NULL, sdb_any);
	if(sym != NULL)
	{
		pos->pos = (counter_t)sym->addr;
		return NULL;
	}

	//else, no binding made
	return "cannot bind execution position to a value";
}