On Fri, Jan 1, 2021 at 10:16 PM Gary Oblock via Gcc <gcc@gcc.gnu.org> wrote: > > The offsets seem to actually be created. However, > they are almost immediately are being deleted.
Use a watchpoint to see where. > Any ideas what's going on? Has some kind > of memory management gizmo gone awry? > > Gary > > PS For anybody who has been following my travails with the instance > interleaving structure > reorganization optimization, this is occurring > with the Mcf sources from SPEC17. > > ________________________________ > From: Gary Oblock <g...@amperecomputing.com> > Sent: Wednesday, December 30, 2020 11:00 PM > To: gcc@gcc.gnu.org <gcc@gcc.gnu.org> > Subject: A problem with field decl offsets in newly minted types > > I'm having some grief with creating/using some modified types. > > I problem occurs in tree-ssa-sccvn.c when some code tries > to take a DECL_FIELD_OFFSET and unfortuenately gets a null > that causes a crash. > > So, I traced this back the to types I created. Note, the method I used > has seemed to be fairly robust (some other engineers in our China > group even successfully copied it for thier own optimization.) > However, the DECL_FIELD_OFFSET offset is definitely null for > the fields which I created in the new versions of the types. > > Here is what I'm doing. > > tree type_prime = lang_hooks.types.make_type (RECORD_TYPE); > > const char *base_type_name = > identifier_to_locale ( IDENTIFIER_POINTER ( TYPE_NAME ( type))); > size_t len = strlen ( MY_PREFIX) + strlen ( base_type_name); > char *rec_name = ( char*)alloca ( len + 1); > strcpy ( rec_name, MY_PREFIX); > strcat ( rec_name, base_type_name); > > TYPE_NAME ( reorg_type_prime) = get_identifier ( rec_name); > > tree field; > tree new_fields = NULL; > for ( field = TYPE_FIELDS ( type); field; field = DECL_CHAIN ( field)) > { > // Probably useful in creating the new field type. > tree old_fld_type = TREE_TYPE ( field); > > // Whatever you want the new field type to be > tree new_fld_type = ...; > tree new_decl = > build_decl ( DECL_SOURCE_LOCATION (field), > FIELD_DECL, DECL_NAME (field), new_fld_type); > DECL_CONTEXT ( new_decl) = type_prime; > layout_decl ( new_decl, 0); > DECL_CHAIN ( new_decl) = new_fields; > new_fields = new_decl; > } > > TYPE_FIELDS ( type_prime) = nreverse ( new_fields); > layout_type ( type_prime); > > Note, when I change any declaration to have a modified type > I run relayout_decl on them. > > If somebody could please tell what bit I'm missing or what I'm doing > wrong I'd really appreciate it. Looking at the code in layout_type, > it should be setting the decl field offsets with place_field and I > don't have a clue what's going on. > > Thanks, > > Gary > > > CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is > for the sole use of the intended recipient(s) and contains information that > is confidential and proprietary to Ampere Computing or its subsidiaries. It > is to be used solely for the purpose of furthering the parties' business > relationship. Any unauthorized review, copying, or distribution of this email > (or any attachments thereto) is strictly prohibited. If you are not the > intended recipient, please contact the sender immediately and permanently > delete the original and any copies of this email and any attachments thereto. >