Получение соответствующего узла Gimple для регистра в RTL
Я пытаюсь понять расширенный проход в GCC. Я пишу плагин для анализа кода до и после прохода расширения.
Временные переменные Gimple (переменные, созданные с целью преобразования в 3-адресный код) на этом проходе преобразуются в регистры. Я хочу знать, какой из регистров в RTL соответствует каким временным переменным. Например:
a = b + c + d;
В Gimple:
_1 = b_1 + c_1;
a_2 = _1 + d_1
В RTL:
r90:SI=[r82:DI-0x10]
r91:SI=[r82:DI-0xc]
{r87:SI=r90:SI+r91:SI;clobber flags:CC;}
r95:SI=[r82:DI-0x8]
{r94:SI=r87:SI+r95:SI;clobber flags:CC;}
[r82:DI-0x4]=r94:SI
Здесь r87 напрямую используется для временной переменной _1. Я хочу получить эту переписку.
Изначально я использовал GCC-9. Я использовал макрос MEM_EXPR(RTX), который вернул дерево Gimple, соответствующее этому регистру. Если регистр не соответствует узлу Gimple, этот макрос вернет NULL. Это именно то, что я хотел.
Теперь я пытаюсь реализовать то же самое в GCC-4.7.2 с таким же макросом. Но этот макрос вызывает ошибку сегментации. Я также пробовал использовать MEM_P(RTX), чтобы проверить, соответствует ли регистр временной переменной, прежде чем использовать MEM_EXPR(RTX). Однако этот макрос возвращает значение False, даже если я ожидаю, что он вернет True.
Что я здесь делаю не так? Есть ли другой макрос, который предоставляет информацию в GCC-4.7.2?