该表达式&ptr->fld
不代表取消引用,而是应将其视为(uint32_t)ptr + offsetof (ptr, fld)
. 我确信 GCC 做了这种简化,但我在代码中找不到。
上面的内容ADDR_EXPR(COMPONENT_REF (INDIRECT_REF (ptr), fld))
与 AST 一样,但在某些时候它应该通过并简化它。在 gcc 树中查找了几乎所有出现的 ADDR_EXPR、COMPONENT_REF 和 INDIRECT_REF 之后,我很难找到位置。有任何想法吗?
请注意,我已经尝试向 GCC 人员寻求帮助。一般来说,它们非常无用,但这里的人可能知道答案。如果这是一个不好的问题,我会理解它是否已关闭。