Hi, I am working on an LTO pass which drops unused fields on structs. On my tests, I found that the gimple generated for `sizeof` is a constant. For example, for the following C code:
``` struct astruct_s { _Bool c; _Bool a; _Bool b; }; struct astruct_s astruct; int main() { int size = sizeof(astruct); return 0; } ``` Produces the following gimple code: ``` size_1 = 3; _2 = 0; <L0>: return _2; ``` Is there a way to determine where the value assigned to size_1 is obtained from? I would like to 1. inspect sizeof statements 2. determine whether the argument of sizeof is struct astruct_s 3. substitute struct astruct_s with a modified version of struct astruct_s which has field `a` removed. Therefore, at the end of this transformation we would have size_1 = 2; Similary, I would like pointer arithmetic to be affected. For example: ``` struct astruct_s { _Bool c; _Bool a; _Bool b; }; struct astruct_s astruct; int main() { _Bool *c = &astruct.c; _Bool *b = &astruct.b; ptrdiff_t d = b - c; printf("%d\n", d); } ``` Produces the following gimple code: ``` c_3 = &astruct.c; b_4 = &astruct.b; d_5 = b_4 - c_3; ``` Running the code results in the value 2 being printed . After running the transformation, the result should be 1. Can anyone point me in the right direction? So far I have tried changing the TYPE_FIELDS to drop field a, but that doesn't work and it is not general. I also have some code which creates a copy of RECORD_TYPE tree and modifies the tree and creates a new identifier for this modified RECORD_TYPE tree. However, I believe this may still not produce the intended behaviour. Any help is appreciated. Thanks! -Erick