It seems that gcc not always put COMPONENT_REF when access fields of structures passed by reference. For example I add today simple static function append_name(aux_type_clutch&clutch, const char *name)
It has reference to field txt of structure aux_type_clutch but RTL looks like:
(insn 20 19 21 4 (set (reg/f:DI 0 ax [89])
First instruction just loads in register RAX parm_decl (of type aux_type_clutch) like
(mem/f/c:DI (plus:DI (reg/f:DI 6 bp)
(const_int -8 [0xfffffffffffffff8])) [258 clutch+0 S8 A64])) "gptest.cpp":1364:24 80 {*movdi_internal}
(nil))
(insn 21 20 22 4 (parallel [
(set (reg/f:DI 0 ax [orig:83 _2 ] [83])
(plus:DI (reg/f:DI 0 ax [89])
(const_int 8 [0x8])))
(clobber (reg:CC 17 flags))
]) "gptest.cpp":1364:24 230 {*adddi_1}
(expr_list:REG_EQUAL (plus:DI (mem/f/c:DI (plus:DI (reg/f:DI 19 frame)
(const_int -8 [0xfffffffffffffff8])) [258 clutch+0 S8 A64])
(const_int 8 [0x8]))
(nil)))
mov rax, [rbp+clutch]
and second add to RAX just some const 0x8 (offset to field txt):
add rax, 8
it's impossible from RTL to track back this constant to offset in COMPONENT_REF
What is more even strange - for methods you can track fields access for parameters passed by reference (like this) - for example in constructor of the same aux_type_clutch:
(insn 12 11 13 2 (set (mem:SI (plus:DI (reg/f:DI 0 ax [94])
(const_int 40 [0x28])) [4 this_12(D)->level+0 S4 A64])
(const_int 0 [0])) "gptest.cpp":465:4 81 {*movsi_internal}
(nil))