2016-11-13 3 views
0

Мне нужно обновить адресное пространство свойств в некоторых структурах модуля llvm. Достаточно просто обновить один тип структуры, клонируя его на новый тип с соответствующим новым типом структуры. Это требует рекурсивного применения метода для любых дочерних структур, но работает нормально.Как изменить тип структуры в модуле llvm?

Но моя задача - как обновить использование этой структуры в модуле? Есть две проблемы, которые я вижу:

  • Нет очевидного способа запроса, который Values s использует старый тип структуры?
  • возможно иметь типы указателей, которые также используют старый тип, поэтому мне нужно будет искать их тоже, возможно, путем поиска исчерпывающего каждого типа указателя, с которым я сталкиваюсь?

ответ

0

Я не совсем уверен, чего вы пытаетесь достичь, но я думаю, что могу решить ваши проблемы, предполагая, что вы говорите о чем-то подобном, например, ConstantStruct.

  1. Вы можете легко запросить для всех видов или пользователей с функциями членов Value в Value::uses() или Value::users() соответственно. Он возвращает iterator_range, который вы можете использовать для их перебора. Однако, если вы просто хотите заменить старую структуру на новую, все, что вам нужно, это Value::replaceAllUsesWith (Value *V). Это относится к любому Value в LLVM.
  2. Если вы сохранили указатели на старую структуру самостоятельно, они действительно будут признаны недействительными, и, как вы ожидаете, вам придется постоянно их обновлять. Однако вызов функции replaceAllUsesWith гарантирует, что на стороне LLVM указатели на структуру остаются в силе. Это означает, что вам не нужно беспокоиться о том, чтобы получить указатель на старую структуру, если вы снова запросите модуль после замены всех использований, используя вышеупомянутый метод.
+0

Несомненно, 'Value :: uses()' применяется только к значению, а не по типу. Я не использую константу, это структура, используемая как аргумент функции, и во всей этой функции, и в других функциях внутри одного и того же модуля. –

 Смежные вопросы

  • Нет связанных вопросов^_^