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