public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/autopar_devel] d: Fix segfault in build_frontend_type on alpha-*-*
@ 2020-08-22 21:48 Giuliano Belinassi
0 siblings, 0 replies; only message in thread
From: Giuliano Belinassi @ 2020-08-22 21:48 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:f865d9fb85187eccf10472258e93804838a089ac
commit f865d9fb85187eccf10472258e93804838a089ac
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date: Mon Jun 1 13:27:06 2020 +0200
d: Fix segfault in build_frontend_type on alpha-*-*
The va_list type for Alpha includes a nameless dummy field for alignment
purposes. To transpose this into D, a field named "__pad%d" is inserted
into the struct definition.
It was also noticed that in the D front-end AST copy of the backend
type, all offsets for fields generated by build_frontend_type were set
to zero due to a wrong assumption that DECL_FIELD_OFFSET would have a
non-zero value. This has been fixed to use byte_position instead.
gcc/d/ChangeLog:
* d-builtins.cc (build_frontend_type): Handle struct fields with NULL
DECL_NAME. Use byte_position to get the real field offset.
Diff:
---
gcc/d/d-builtins.cc | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/gcc/d/d-builtins.cc b/gcc/d/d-builtins.cc
index a5654a66bf5..1cb5407f8a9 100644
--- a/gcc/d/d-builtins.cc
+++ b/gcc/d/d-builtins.cc
@@ -238,6 +238,9 @@ build_frontend_type (tree type)
sdecl->type->ctype = type;
sdecl->type->merge2 ();
+ /* Add both named and anonymous fields as members of the struct.
+ Anonymous fields still need a name in D, so call them "__pad%d". */
+ int anonfield_id = 0;
sdecl->members = new Dsymbols;
for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
@@ -249,12 +252,19 @@ build_frontend_type (tree type)
return NULL;
}
- Identifier *fident
- = Identifier::idPool (IDENTIFIER_POINTER (DECL_NAME (field)));
+ Identifier *fident;
+ if (DECL_NAME (field) == NULL_TREE)
+ fident = Identifier::generateId ("__pad", anonfield_id++);
+ else
+ {
+ const char *name = IDENTIFIER_POINTER (DECL_NAME (field));
+ fident = Identifier::idPool (name);
+ }
+
VarDeclaration *vd = VarDeclaration::create (Loc (), ftype, fident,
NULL);
vd->parent = sdecl;
- vd->offset = tree_to_uhwi (DECL_FIELD_OFFSET (field));
+ vd->offset = tree_to_uhwi (byte_position (field));
vd->semanticRun = PASSsemanticdone;
vd->csym = field;
sdecl->members->push (vd);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-08-22 21:48 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-22 21:48 [gcc/devel/autopar_devel] d: Fix segfault in build_frontend_type on alpha-*-* Giuliano Belinassi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).