2010-01-18 2 views
4

표현식 &ptr->fld은 참조를 나타내지 않으므로 (uint32_t)ptr + offsetof (ptr, fld)으로 처리해야합니다. 나는 GCC가이 단순화를 수행했음을 확신하지만 코드에서 어디에서 찾을 수없는 것입니다.GCC 내부 : 가짜 참조가 제거 된 곳은 어디입니까?

위의 내용은 AST에서 ADDR_EXPR(COMPONENT_REF (INDIRECT_REF (ptr), fld))으로 끝납니다. 그러나 어느 시점에서는이를 통과시켜 단순화해야합니다. gcc 트리에서 ADDR_EXPR, COMPONENT_REF 및 INDIRECT_REF의 거의 모든 항목을 검색 했으므로 어디에 문제가 있는지 찾아야합니다. 어떤 아이디어?

나는 GCC 사람들로부터 도움을 구하려고 노력했다. 일반적으로 그들은별로 도움이되지 않지만 여기있는 사람들은 답을 알고있을 것입니다. 이 질문이 잘못된 경우 닫으면 이해할 것입니다.

+0

"너무 지역화 된"것으로 폐쇄해야한다고 생각하지만 그래도 여전히 이점은 없습니다 –

답변

1

GCC의 AST에 익숙하므로, gcc -fdump-tree-all -fdump-rtl-all을 사용하여 모든 트리 및 RTL 덤프를 생성 한 다음 변환을 수행하는 패스를 지역화하기 위해 이진 검색을 수행하는 것이 좋습니다.

+0

이것은 좋은 제안입니다. 그러나 다른 덤프가 어떻게 작동하는지 또는 어떻게 비교하는지 명확하지 않습니다. 그럼에도 불구하고 프런트 엔드 또는 중간 엔드에서 이러한 최적화가 발생했다는 어떠한 증거도 보지 못했기 때문에 아마도 코드 생성까지 지연 될 것입니다. –