mirror of git://gcc.gnu.org/git/gcc.git
target.c (gomp_map_pointer): New function abstracting out GOMP_MAP_POINTER handling.
2015-05-27 Chung-Lin Tang <cltang@codesourcery.com> libgomp/ * target.c (gomp_map_pointer): New function abstracting out GOMP_MAP_POINTER handling. (gomp_map_vars): Remove GOMP_MAP_POINTER handling code and use gomp_map_pointer(). From-SVN: r223737
This commit is contained in:
parent
7553271edd
commit
1716efeb6d
|
|
@ -1,3 +1,10 @@
|
||||||
|
2015-05-27 Chung-Lin Tang <cltang@codesourcery.com>
|
||||||
|
|
||||||
|
* target.c (gomp_map_pointer): New function abstracting out
|
||||||
|
GOMP_MAP_POINTER handling.
|
||||||
|
(gomp_map_vars): Remove GOMP_MAP_POINTER handling code and use
|
||||||
|
gomp_map_pointer().
|
||||||
|
|
||||||
2015-05-19 Jakub Jelinek <jakub@redhat.com>
|
2015-05-19 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR middle-end/66199
|
PR middle-end/66199
|
||||||
|
|
|
||||||
160
libgomp/target.c
160
libgomp/target.c
|
|
@ -163,6 +163,60 @@ get_kind (bool is_openacc, void *kinds, int idx)
|
||||||
: ((unsigned char *) kinds)[idx];
|
: ((unsigned char *) kinds)[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gomp_map_pointer (struct target_mem_desc *tgt, uintptr_t host_ptr,
|
||||||
|
uintptr_t target_offset, uintptr_t bias)
|
||||||
|
{
|
||||||
|
struct gomp_device_descr *devicep = tgt->device_descr;
|
||||||
|
struct splay_tree_s *mem_map = &devicep->mem_map;
|
||||||
|
struct splay_tree_key_s cur_node;
|
||||||
|
|
||||||
|
cur_node.host_start = host_ptr;
|
||||||
|
if (cur_node.host_start == (uintptr_t) NULL)
|
||||||
|
{
|
||||||
|
cur_node.tgt_offset = (uintptr_t) NULL;
|
||||||
|
/* FIXME: see comment about coalescing host/dev transfers below. */
|
||||||
|
devicep->host2dev_func (devicep->target_id,
|
||||||
|
(void *) (tgt->tgt_start + target_offset),
|
||||||
|
(void *) &cur_node.tgt_offset,
|
||||||
|
sizeof (void *));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* Add bias to the pointer value. */
|
||||||
|
cur_node.host_start += bias;
|
||||||
|
cur_node.host_end = cur_node.host_start + 1;
|
||||||
|
splay_tree_key n = splay_tree_lookup (mem_map, &cur_node);
|
||||||
|
if (n == NULL)
|
||||||
|
{
|
||||||
|
/* Could be possibly zero size array section. */
|
||||||
|
cur_node.host_end--;
|
||||||
|
n = splay_tree_lookup (mem_map, &cur_node);
|
||||||
|
if (n == NULL)
|
||||||
|
{
|
||||||
|
cur_node.host_start--;
|
||||||
|
n = splay_tree_lookup (mem_map, &cur_node);
|
||||||
|
cur_node.host_start++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (n == NULL)
|
||||||
|
{
|
||||||
|
gomp_mutex_unlock (&devicep->lock);
|
||||||
|
gomp_fatal ("Pointer target of array section wasn't mapped");
|
||||||
|
}
|
||||||
|
cur_node.host_start -= n->host_start;
|
||||||
|
cur_node.tgt_offset
|
||||||
|
= n->tgt->tgt_start + n->tgt_offset + cur_node.host_start;
|
||||||
|
/* At this point tgt_offset is target address of the
|
||||||
|
array section. Now subtract bias to get what we want
|
||||||
|
to initialize the pointer with. */
|
||||||
|
cur_node.tgt_offset -= bias;
|
||||||
|
/* FIXME: see comment about coalescing host/dev transfers below. */
|
||||||
|
devicep->host2dev_func (devicep->target_id,
|
||||||
|
(void *) (tgt->tgt_start + target_offset),
|
||||||
|
(void *) &cur_node.tgt_offset,
|
||||||
|
sizeof (void *));
|
||||||
|
}
|
||||||
|
|
||||||
attribute_hidden struct target_mem_desc *
|
attribute_hidden struct target_mem_desc *
|
||||||
gomp_map_vars (struct gomp_device_descr *devicep, size_t mapnum,
|
gomp_map_vars (struct gomp_device_descr *devicep, size_t mapnum,
|
||||||
void **hostaddrs, void **devaddrs, size_t *sizes, void *kinds,
|
void **hostaddrs, void **devaddrs, size_t *sizes, void *kinds,
|
||||||
|
|
@ -336,54 +390,8 @@ gomp_map_vars (struct gomp_device_descr *devicep, size_t mapnum,
|
||||||
k->host_end - k->host_start);
|
k->host_end - k->host_start);
|
||||||
break;
|
break;
|
||||||
case GOMP_MAP_POINTER:
|
case GOMP_MAP_POINTER:
|
||||||
cur_node.host_start
|
gomp_map_pointer (tgt, (uintptr_t) *(void **) k->host_start,
|
||||||
= (uintptr_t) *(void **) k->host_start;
|
k->tgt_offset, sizes[i]);
|
||||||
if (cur_node.host_start == (uintptr_t) NULL)
|
|
||||||
{
|
|
||||||
cur_node.tgt_offset = (uintptr_t) NULL;
|
|
||||||
/* FIXME: see above FIXME comment. */
|
|
||||||
devicep->host2dev_func (devicep->target_id,
|
|
||||||
(void *) (tgt->tgt_start
|
|
||||||
+ k->tgt_offset),
|
|
||||||
(void *) &cur_node.tgt_offset,
|
|
||||||
sizeof (void *));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Add bias to the pointer value. */
|
|
||||||
cur_node.host_start += sizes[i];
|
|
||||||
cur_node.host_end = cur_node.host_start + 1;
|
|
||||||
n = splay_tree_lookup (mem_map, &cur_node);
|
|
||||||
if (n == NULL)
|
|
||||||
{
|
|
||||||
/* Could be possibly zero size array section. */
|
|
||||||
cur_node.host_end--;
|
|
||||||
n = splay_tree_lookup (mem_map, &cur_node);
|
|
||||||
if (n == NULL)
|
|
||||||
{
|
|
||||||
cur_node.host_start--;
|
|
||||||
n = splay_tree_lookup (mem_map, &cur_node);
|
|
||||||
cur_node.host_start++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (n == NULL)
|
|
||||||
{
|
|
||||||
gomp_mutex_unlock (&devicep->lock);
|
|
||||||
gomp_fatal ("Pointer target of array section "
|
|
||||||
"wasn't mapped");
|
|
||||||
}
|
|
||||||
cur_node.host_start -= n->host_start;
|
|
||||||
cur_node.tgt_offset = n->tgt->tgt_start + n->tgt_offset
|
|
||||||
+ cur_node.host_start;
|
|
||||||
/* At this point tgt_offset is target address of the
|
|
||||||
array section. Now subtract bias to get what we want
|
|
||||||
to initialize the pointer with. */
|
|
||||||
cur_node.tgt_offset -= sizes[i];
|
|
||||||
/* FIXME: see above FIXME comment. */
|
|
||||||
devicep->host2dev_func (devicep->target_id,
|
|
||||||
(void *) (tgt->tgt_start
|
|
||||||
+ k->tgt_offset),
|
|
||||||
(void *) &cur_node.tgt_offset,
|
|
||||||
sizeof (void *));
|
|
||||||
break;
|
break;
|
||||||
case GOMP_MAP_TO_PSET:
|
case GOMP_MAP_TO_PSET:
|
||||||
/* FIXME: see above FIXME comment. */
|
/* FIXME: see above FIXME comment. */
|
||||||
|
|
@ -405,58 +413,12 @@ gomp_map_vars (struct gomp_device_descr *devicep, size_t mapnum,
|
||||||
{
|
{
|
||||||
tgt->list[j] = k;
|
tgt->list[j] = k;
|
||||||
k->refcount++;
|
k->refcount++;
|
||||||
cur_node.host_start
|
gomp_map_pointer (tgt,
|
||||||
= (uintptr_t) *(void **) hostaddrs[j];
|
(uintptr_t) *(void **) hostaddrs[j],
|
||||||
if (cur_node.host_start == (uintptr_t) NULL)
|
k->tgt_offset
|
||||||
{
|
|
||||||
cur_node.tgt_offset = (uintptr_t) NULL;
|
|
||||||
/* FIXME: see above FIXME comment. */
|
|
||||||
devicep->host2dev_func (devicep->target_id,
|
|
||||||
(void *) (tgt->tgt_start + k->tgt_offset
|
|
||||||
+ ((uintptr_t) hostaddrs[j]
|
+ ((uintptr_t) hostaddrs[j]
|
||||||
- k->host_start)),
|
- k->host_start),
|
||||||
(void *) &cur_node.tgt_offset,
|
sizes[j]);
|
||||||
sizeof (void *));
|
|
||||||
i++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* Add bias to the pointer value. */
|
|
||||||
cur_node.host_start += sizes[j];
|
|
||||||
cur_node.host_end = cur_node.host_start + 1;
|
|
||||||
n = splay_tree_lookup (mem_map, &cur_node);
|
|
||||||
if (n == NULL)
|
|
||||||
{
|
|
||||||
/* Could be possibly zero size array section. */
|
|
||||||
cur_node.host_end--;
|
|
||||||
n = splay_tree_lookup (mem_map, &cur_node);
|
|
||||||
if (n == NULL)
|
|
||||||
{
|
|
||||||
cur_node.host_start--;
|
|
||||||
n = splay_tree_lookup (mem_map, &cur_node);
|
|
||||||
cur_node.host_start++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (n == NULL)
|
|
||||||
{
|
|
||||||
gomp_mutex_unlock (&devicep->lock);
|
|
||||||
gomp_fatal ("Pointer target of array section "
|
|
||||||
"wasn't mapped");
|
|
||||||
}
|
|
||||||
cur_node.host_start -= n->host_start;
|
|
||||||
cur_node.tgt_offset = n->tgt->tgt_start
|
|
||||||
+ n->tgt_offset
|
|
||||||
+ cur_node.host_start;
|
|
||||||
/* At this point tgt_offset is target address of the
|
|
||||||
array section. Now subtract bias to get what we
|
|
||||||
want to initialize the pointer with. */
|
|
||||||
cur_node.tgt_offset -= sizes[j];
|
|
||||||
/* FIXME: see above FIXME comment. */
|
|
||||||
devicep->host2dev_func (devicep->target_id,
|
|
||||||
(void *) (tgt->tgt_start + k->tgt_offset
|
|
||||||
+ ((uintptr_t) hostaddrs[j]
|
|
||||||
- k->host_start)),
|
|
||||||
(void *) &cur_node.tgt_offset,
|
|
||||||
sizeof (void *));
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue