compiler, libgo: don't pad sparc64-linux epollevent
Change the compiler to not add zero padding because of zero-sized fields named "_", since those can't be referenced anyhow. Change the sparc-linux64 epollevent struct to name the alignment field "_", to avoid zero padding. Fixes PR go/103847 PR go/103847 * godump.c (go_force_record_alignment): Name the alignment field "_". Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/374914
This commit is contained in:
parent
e5acfcad98
commit
62c3f75fd2
|
@ -1,4 +1,4 @@
|
||||||
3e9f4ee16683883ccfb8661d99318c74bb7a4bef
|
d3be41f0a1fca20e241e1db62b4b0f5262caac55
|
||||||
|
|
||||||
The first line of this file holds the git revision number of the last
|
The first line of this file holds the git revision number of the last
|
||||||
merge done from the gofrontend repository.
|
merge done from the gofrontend repository.
|
||||||
|
|
|
@ -6454,9 +6454,18 @@ get_backend_struct_fields(Gogo* gogo, Struct_type* type, bool use_placeholder,
|
||||||
? p->type()->get_backend_placeholder(gogo)
|
? p->type()->get_backend_placeholder(gogo)
|
||||||
: p->type()->get_backend(gogo));
|
: p->type()->get_backend(gogo));
|
||||||
(*bfields)[i].location = p->location();
|
(*bfields)[i].location = p->location();
|
||||||
lastsize = gogo->backend()->type_size((*bfields)[i].btype);
|
int64_t size = gogo->backend()->type_size((*bfields)[i].btype);
|
||||||
if (lastsize != 0)
|
if (size != 0)
|
||||||
saw_nonzero = true;
|
saw_nonzero = true;
|
||||||
|
|
||||||
|
if (size > 0 || !Gogo::is_sink_name(p->field_name()))
|
||||||
|
lastsize = size;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// There is an unreferenceable field of zero size. This
|
||||||
|
// doesn't affect whether we may need zero padding, so leave
|
||||||
|
// lastsize unchanged.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
go_assert(i == fields->size());
|
go_assert(i == fields->size());
|
||||||
if (saw_nonzero && lastsize == 0 && !type->is_results_struct())
|
if (saw_nonzero && lastsize == 0 && !type->is_results_struct())
|
||||||
|
|
|
@ -651,7 +651,7 @@ go_force_record_alignment (struct obstack *ob, const char *type_string,
|
||||||
unsigned int index, const char *error_string)
|
unsigned int index, const char *error_string)
|
||||||
{
|
{
|
||||||
index = go_append_artificial_name (ob, index);
|
index = go_append_artificial_name (ob, index);
|
||||||
obstack_grow (ob, "_align ", 7);
|
obstack_grow (ob, "_ ", 2);
|
||||||
if (type_string == NULL)
|
if (type_string == NULL)
|
||||||
obstack_grow (ob, error_string, strlen (error_string));
|
obstack_grow (ob, error_string, strlen (error_string));
|
||||||
else
|
else
|
||||||
|
|
|
@ -98,7 +98,7 @@ if grep '^const _epoll_data_offset ' ${OUT} >/dev/null 2>&1; then
|
||||||
echo 'type epollevent struct { events uint32; data [8]byte }' >> ${OUT}
|
echo 'type epollevent struct { events uint32; data [8]byte }' >> ${OUT}
|
||||||
elif test "$val" = "8"; then
|
elif test "$val" = "8"; then
|
||||||
if test "$GOARCH" = "sparc64" -a "$GOOS" = "linux"; then
|
if test "$GOARCH" = "sparc64" -a "$GOOS" = "linux"; then
|
||||||
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte; _align [0]int64 }' >> ${OUT}
|
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte; _ [0]int64 }' >> ${OUT}
|
||||||
else
|
else
|
||||||
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte }' >> ${OUT}
|
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte }' >> ${OUT}
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Reference in New Issue