mirror of git://gcc.gnu.org/git/gcc.git
libgomp/gcn: fix/improve struct output
output.printf_data.(value union) contains text[128], which has the size of 128 bytes, sufficient for 16 uint64_t variables; hence value_u64[2] could be extended to value_u64[6] - sufficient for all required arguments to gomp_target_rev. Additionally, next_output.printf_data.(msg union) contained msg_u64 which then is no longer needed and also caused 32bit vs 64bit alignment issues. libgomp/ * config/gcn/libgomp-gcn.h (struct output): Remove 'msg_u64' from the union, change value_u64[2] to value_u64[6]. * config/gcn/target.c (GOMP_target_ext): Update accordingly. * plugin/plugin-gcn.c (process_reverse_offload, console_output): Likewise.
This commit is contained in:
parent
711f56ad90
commit
6edcb5dc42
|
@ -37,16 +37,13 @@ struct output
|
||||||
unsigned int next_output;
|
unsigned int next_output;
|
||||||
struct printf_data {
|
struct printf_data {
|
||||||
int written;
|
int written;
|
||||||
union {
|
char msg[128];
|
||||||
char msg[128];
|
|
||||||
uint64_t msg_u64[2];
|
|
||||||
};
|
|
||||||
int type;
|
int type;
|
||||||
union {
|
union {
|
||||||
int64_t ivalue;
|
int64_t ivalue;
|
||||||
double dvalue;
|
double dvalue;
|
||||||
char text[128];
|
char text[128];
|
||||||
uint64_t value_u64[2];
|
uint64_t value_u64[16];
|
||||||
};
|
};
|
||||||
} queue[1024];
|
} queue[1024];
|
||||||
unsigned int consumed;
|
unsigned int consumed;
|
||||||
|
|
|
@ -102,12 +102,12 @@ GOMP_target_ext (int device, void (*fn) (void *), size_t mapnum,
|
||||||
asm ("s_sleep 64");
|
asm ("s_sleep 64");
|
||||||
|
|
||||||
unsigned int slot = index % 1024;
|
unsigned int slot = index % 1024;
|
||||||
uint64_t addrs_sizes_kind[3] = {(uint64_t) hostaddrs, (uint64_t) sizes,
|
data->queue[slot].value_u64[0] = (uint64_t) fn;
|
||||||
(uint64_t) kinds};
|
data->queue[slot].value_u64[1] = (uint64_t) mapnum;
|
||||||
data->queue[slot].msg_u64[0] = (uint64_t) fn;
|
data->queue[slot].value_u64[2] = (uint64_t) hostaddrs;
|
||||||
data->queue[slot].msg_u64[1] = (uint64_t) mapnum;
|
data->queue[slot].value_u64[3] = (uint64_t) sizes;
|
||||||
data->queue[slot].value_u64[0] = (uint64_t) &addrs_sizes_kind[0];
|
data->queue[slot].value_u64[4] = (uint64_t) kinds;
|
||||||
data->queue[slot].value_u64[1] = (uint64_t) GOMP_ADDITIONAL_ICVS.device_num;
|
data->queue[slot].value_u64[5] = (uint64_t) GOMP_ADDITIONAL_ICVS.device_num;
|
||||||
|
|
||||||
data->queue[slot].type = 4; /* Reverse offload. */
|
data->queue[slot].type = 4; /* Reverse offload. */
|
||||||
__atomic_store_n (&data->queue[slot].written, 1, __ATOMIC_RELEASE);
|
__atomic_store_n (&data->queue[slot].written, 1, __ATOMIC_RELEASE);
|
||||||
|
|
|
@ -1919,16 +1919,12 @@ create_kernel_dispatch (struct kernel_info *kernel, int num_teams)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
process_reverse_offload (uint64_t fn, uint64_t mapnum, uint64_t rev_data,
|
process_reverse_offload (uint64_t fn, uint64_t mapnum, uint64_t hostaddrs,
|
||||||
uint64_t dev_num64)
|
uint64_t sizes, uint64_t kinds, uint64_t dev_num64)
|
||||||
{
|
{
|
||||||
int dev_num = dev_num64;
|
int dev_num = dev_num64;
|
||||||
uint64_t addrs_sizes_kinds[3];
|
GOMP_PLUGIN_target_rev (fn, mapnum, hostaddrs, sizes, kinds, dev_num,
|
||||||
GOMP_OFFLOAD_host2dev (dev_num, &addrs_sizes_kinds, (void *) rev_data,
|
NULL, NULL, NULL);
|
||||||
sizeof (addrs_sizes_kinds));
|
|
||||||
GOMP_PLUGIN_target_rev (fn, mapnum, addrs_sizes_kinds[0],
|
|
||||||
addrs_sizes_kinds[1], addrs_sizes_kinds[2],
|
|
||||||
dev_num, NULL, NULL, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output any data written to console output from the kernel. It is expected
|
/* Output any data written to console output from the kernel. It is expected
|
||||||
|
@ -1976,8 +1972,9 @@ console_output (struct kernel_info *kernel, struct kernargs *kernargs,
|
||||||
case 2: printf ("%.128s%.128s\n", data->msg, data->text); break;
|
case 2: printf ("%.128s%.128s\n", data->msg, data->text); break;
|
||||||
case 3: printf ("%.128s%.128s", data->msg, data->text); break;
|
case 3: printf ("%.128s%.128s", data->msg, data->text); break;
|
||||||
case 4:
|
case 4:
|
||||||
process_reverse_offload (data->msg_u64[0], data->msg_u64[1],
|
process_reverse_offload (data->value_u64[0], data->value_u64[1],
|
||||||
data->value_u64[0],data->value_u64[1]);
|
data->value_u64[2], data->value_u64[3],
|
||||||
|
data->value_u64[4], data->value_u64[5]);
|
||||||
break;
|
break;
|
||||||
default: printf ("GCN print buffer error!\n"); break;
|
default: printf ("GCN print buffer error!\n"); break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue