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:
Ian Lance Taylor 2021-12-29 15:08:32 -08:00
parent e5acfcad98
commit 62c3f75fd2
4 changed files with 15 additions and 6 deletions

View File

@ -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.

View File

@ -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())

View File

@ -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

View File

@ -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