On Tue, Mar 31, 2015 at 03:52:06PM +0300, Ilya Verbin wrote:
> > What is the reason to register and allocate these one at a time, rather than
> > using one struct target_mem_desc with one tgt->array for all splay tree
> > nodes registered from one image?
> > Perhaps you would just use tgt_start of 0 and tgt_end of 0 too (to make it
> > clear it is special) and just use tgt_offset relative to that (i.e.
> > absolute), but having to malloc each node individually and having to malloc
> > a target_mem_desc for each one sounds expensive.
> > Everything is freed just once anyway, isn't it?
> 
> Here is WIP patch, does this look like what you suggested?  It works fine with
> functions, however I'm not sure what to do with variables.  Will gomp_map_vars
> work when tgt_start and tgt_end are equal to 0?

Can you explain what you are afraid of?  The mapped images (both their
mapping and unmapping) are done in pairs, and in a valid program the
addresses shouldn't be already mapped when the image is mapped in etc.
So, for gomp_map_vars, the var allocations should just be the pre-existing
mappings, i.e.
      splay_tree_key n = splay_tree_lookup (&mm->splay_tree, &cur_node);
      if (n)
        {
          tgt->list[i] = n;
          gomp_map_vars_existing (n, &cur_node, kind & typemask);
        }
case and
  if (is_target)
    {
      for (i = 0; i < mapnum; i++)
        {
          if (tgt->list[i] == NULL)
            cur_node.tgt_offset = (uintptr_t) NULL;
          else
            cur_node.tgt_offset = tgt->list[i]->tgt->tgt_start
                                  + tgt->list[i]->tgt_offset;
          /* FIXME: see above FIXME comment.  */
          devicep->host2dev_func (devicep->target_id,
                                  (void *) (tgt->tgt_start
                                            + i * sizeof (void *)),
                                  (void *) &cur_node.tgt_offset,
                                  sizeof (void *));
        }
    }
at the end.  tgt->list[i] will be non-NULL, tgt->list[i]->tgt->tgt_start
will be 0, but tgt->list[i]->tgt_offset will be absolute and so should DTRT.

> +  for (i = 0; i < num_vars; i++)
> +    {
> +      struct addr_pair host_addr;
> +      host_addr.start = (uintptr_t) host_var_table[i*2];
> +      host_addr.end = host_addr.start + (uintptr_t) host_var_table[i*2+1];

Formatting, spaces around + or *.  But, as said earlier, I don't see why
this wouldn't work for variables too.

        Jakub

Reply via email to