public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Question about struct identifiers after modifications.
@ 2019-12-16 23:24 Erick Ochoa
  2019-12-16 23:36 ` Andrew Pinski
  0 siblings, 1 reply; 2+ messages in thread
From: Erick Ochoa @ 2019-12-16 23:24 UTC (permalink / raw)
  To: GCC Development, Christoph Müllner, Dr. Philipp Tomsich

Hello,

I am working on a struct reorganization optimization pass.
I am able to identify which structs I want to reorganize
and I am also able to create new structs with these modifications.
The way the new structs are generated is the following code
(I am keeping it high-level for conciseness but feel free to ask
for more details).

static tree
get_sorted_record(tree record)
{
  gcc_assert(TREE_CODE(record) == RECORD_TYPE);
  log(2, "printing original");
  print_record(record);
  tree copy = copy_record(record);
  sort_fields_in_place(copy);
  log(2, "printing sorted copy");
  print_record(copy);
  return copy;
}

Output:

[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_record(tree):183)printing record aStruct
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)e,boolean_type,8
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)a,integer_type,32
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)b,integer_type,8
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)c,real_type,32
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)d,real_type,64
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)f,boolean_type,8
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)h,integer_type,64
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:tree_node* get_sorted_record(tree):218)printing sorted copy
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_record(tree):183)printing record aStruct
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)e,boolean_type,8
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)b,integer_type,8
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)f,boolean_type,8
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)a,integer_type,32
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)c,real_type,32
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)d,real_type,64
[log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)h,integer_type,64

Basically, we copy the tree of structs of interest.
We modify the DECL_CHAIN so that the fields are in the order that
we want. And finally, we would like to replace trees of type `record`
with `copy`.

At the moment, IDENTIFIER_POINTER for copy and record are the same.
However, I want to keep my design as general as possible.
If I understand correctly, with the current design it is possible
to change all trees of type record with those of type copy.
However, if one wished to change only a subset of these trees,
wouldn't there be a need for a different IDENTIFIER_NODE in clone?
Otherwise, there would be confusion as to how clone and record
differ. (Their IDENTIFIER_POINTERS are the same.)

So, is the correct way to specialize a type is to modify the
identifier myself or is there an API that allows me to do so?

Thanks!

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Question about struct identifiers after modifications.
  2019-12-16 23:24 Question about struct identifiers after modifications Erick Ochoa
@ 2019-12-16 23:36 ` Andrew Pinski
  0 siblings, 0 replies; 2+ messages in thread
From: Andrew Pinski @ 2019-12-16 23:36 UTC (permalink / raw)
  To: Erick Ochoa; +Cc: GCC Development, Christoph Müllner, Dr. Philipp Tomsich

On Mon, Dec 16, 2019 at 3:24 PM Erick Ochoa
<erick.ochoa@theobroma-systems.com> wrote:
>
> Hello,
>
> I am working on a struct reorganization optimization pass.
> I am able to identify which structs I want to reorganize
> and I am also able to create new structs with these modifications.
> The way the new structs are generated is the following code
> (I am keeping it high-level for conciseness but feel free to ask
> for more details).
>
> static tree
> get_sorted_record(tree record)
> {
>   gcc_assert(TREE_CODE(record) == RECORD_TYPE);
>   log(2, "printing original");
>   print_record(record);
>   tree copy = copy_record(record);
>   sort_fields_in_place(copy);
>   log(2, "printing sorted copy");
>   print_record(copy);
>   return copy;
> }
>
> Output:
>
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_record(tree):183)printing record aStruct
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)e,boolean_type,8
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)a,integer_type,32
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)b,integer_type,8
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)c,real_type,32
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)d,real_type,64
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)f,boolean_type,8
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)h,integer_type,64
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:tree_node* get_sorted_record(tree):218)printing sorted copy
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_record(tree):183)printing record aStruct
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)e,boolean_type,8
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)b,integer_type,8
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)f,boolean_type,8
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)a,integer_type,32
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)c,real_type,32
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)d,real_type,64
> [log](/home/eochoa/code/gcc/gcc/ipa-hello-world.c:void print_field(tree):199)h,integer_type,64
>
> Basically, we copy the tree of structs of interest.
> We modify the DECL_CHAIN so that the fields are in the order that
> we want. And finally, we would like to replace trees of type `record`
> with `copy`.
>
> At the moment, IDENTIFIER_POINTER for copy and record are the same.
> However, I want to keep my design as general as possible.
> If I understand correctly, with the current design it is possible
> to change all trees of type record with those of type copy.
> However, if one wished to change only a subset of these trees,
> wouldn't there be a need for a different IDENTIFIER_NODE in clone?
> Otherwise, there would be confusion as to how clone and record
> differ. (Their IDENTIFIER_POINTERS are the same.)
>
> So, is the correct way to specialize a type is to modify the
> identifier myself or is there an API that allows me to do so?

This is what I did:
+  if (TYPE_NAME (type) != NULL)
+    {
+      if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
+        tname = IDENTIFIER_POINTER (TYPE_NAME (type));
+      else if (DECL_NAME (TYPE_NAME (type)) != NULL)
+        tname = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
+    }
...
+      char id[10];
+      sprintf(id, "%d", i);
+      if (tname)
+ {
+          name = concat (tname, ".reorg.", id, NULL);
+          TYPE_NAME (newtype[i]) = get_identifier (name);
+          free (name);
+        }

Where i is the nth new type for the original type.

For the fields that have a new type, I did this:
+      if (nt[1] != NULL && DECL_NAME (fielddecl))
+ {
+   const char *tname = IDENTIFIER_POINTER (DECL_NAME (fielddecl));
+   char id[10];
+   char *name;
+
+   sprintf(id, "%d", i);
+   name = concat (tname, ".reorg.", id, NULL);
+   DECL_NAME (field) = get_identifier (name);
+   free (name);
+ }
+      else
+ DECL_NAME (field) = DECL_NAME (fielddecl);

Where nt was the new types for that field.

Thanks,
Andrew Pinski

>
> Thanks!

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-12-16 23:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-16 23:24 Question about struct identifiers after modifications Erick Ochoa
2019-12-16 23:36 ` Andrew Pinski

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