[gcc(refs/users/guojiufu/heads/guojiufu-branch)] d: Fix segfault in build_frontend_type on alpha-*-*

Jiu Fu Guo guojiufu@gcc.gnu.org
Wed Jun 10 03:21:50 GMT 2020


https://gcc.gnu.org/g:70f6320462d91e5add99ae5b50226356302a8c0b

commit 70f6320462d91e5add99ae5b50226356302a8c0b
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);


More information about the Gcc-cvs mailing list