uint_fast32_t newarc = 1 + exchange_and_add (narcsp, 1);
uint_fast32_t newarc = exchange_and_add (narcsp, 1);
_dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc){  volatile uint16_t *topcindex;  size_t i, fromindex;  struct here_fromstruct *fromp;#if 0  /* XXX I think this is now not necessary anymore.  */  if (! compare_and_swap (&state, GMON_PROF_ON, GMON_PROF_BUSY))    return;#else  if (state != GMON_PROF_ON)    return;#endif  /* Compute relative addresses.  The shared object can be loaded at     any address.  The value of frompc could be anything.  We cannot     restrict it in any way, just set to a fixed value (0) in case it     is outside the allowed range.  These calls show up as calls from     <external> in the gprof output.  */  frompc -= lowpc;  if (frompc >= textsize)    frompc = 0;  selfpc -= lowpc;  if (selfpc >= textsize)    goto done;  /* Getting here we now have to find out whether the location was     already used.  If yes we are lucky and only have to increment a     counter (this also has to be atomic).  If the entry is new things     are getting complicated...  */  /* Avoid integer divide if possible.  */  if ((HASHFRACTION & (HASHFRACTION - 1)) == 0)    i = selfpc >> log_hashfraction;  else    i = selfpc / (hashfraction * sizeof (*tos));  topcindex = &tos[i];  fromindex = *topcindex;  if (fromindex == 0)    goto check_new_or_add;  fromp = &froms[fromindex];  /* We have to look through the chain of arcs whether there is already     an entry for our arc.  */  while (fromp->here->from_pc != frompc)    {      if (fromp->link != 0)	do	  fromp = &froms[fromp->link];	while (fromp->link != 0 && fromp->here->from_pc != frompc);      if (fromp->here->from_pc != frompc)	{	  topcindex = &fromp->link;	check_new_or_add:	  /* Our entry is not among the entries we read so far from the	     data file.  Now see whether we have to update the list.  */	  while (narcs != *narcsp && narcs < fromlimit)	    {	      size_t to_index;	      size_t newfromidx;	      to_index = (data[narcs].self_pc			  / (hashfraction * sizeof (*tos)));	      newfromidx = exchange_and_add (&fromidx, 1) + 1;	      froms[newfromidx].here = &data[narcs];	      froms[newfromidx].link = tos[to_index];	      tos[to_index] = newfromidx;	      atomic_add (&narcs, 1);	    }	  /* If we still have no entry stop searching and insert.  */	  if (*topcindex == 0)	    {	      uint_fast32_t newarc = 1 + exchange_and_add (narcsp, 1);	      /* In rare cases it could happen that all entries in FROMS are		 occupied.  So we cannot count this anymore.  */	      if (newarc >= fromlimit)		goto done;	      *topcindex = exchange_and_add (&fromidx, 1) + 1;	      fromp = &froms[*topcindex];	      fromp->here = &data[newarc];	      data[newarc].from_pc = frompc;	      data[newarc].self_pc = selfpc;	      data[newarc].count = 0;	      fromp->link = 0;	      atomic_add (&narcs, 1);	      break;	    }	  fromp = &froms[*topcindex];	}      else	/* Found in.  */	break;    }  /* Increment the counter.  */  atomic_add (&fromp->here->count, 1); done:#if 0  /* XXX See above,  Shouldn't be necessary anymore.  */  state = GMON_PROF_ON;#else  ;#endif}