Получение соответствующего узла 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?

0 ответов

Другие вопросы по тегам