Я пытаюсь понять проход расширения в G CC. Я пишу плагин для анализа кода до и после расширенного прохода.
Временные переменные 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. Я хотел бы получить эту корреспонденцию.
Я изначально использовал G CC -9. Я использовал макрос MEM_EXPR (RTX), который возвращал дерево Gimple, соответствующее этому регистру. Если регистр не соответствует узлу Gimple, этот макрос вернет NULL. Это именно то, что я хотел.
Теперь я пытаюсь реализовать то же самое в G CC -4.7.2, который имеет тот же макрос. Но этот макрос вызывает ошибку сегментации. Я также попытался использовать MEM_P (RTX), чтобы проверить, соответствует ли регистр временной переменной перед использованием MEM_EXPR (RTX). Однако этот макрос возвращает значение False, даже если я ожидаю, что он вернет значение True.
Что я здесь не так делаю? Есть ли другой макрос, который дает информацию в G CC -4.7.2?