Подтвердить что ты не робот

Добавление метаданных к инструкциям в LLVM IR

Во-первых, я новичок в передачах LLVM.

Я пытаюсь добавить метаданные к инструкциям в LLVM после прохождения преобразования (с С++ API). Я намерен хранить эту информацию для использования другим инструментом в цепочке инструментов. У меня есть два вопроса относительно этого.

  • Я ожидаю, что информация, которую я храню в качестве метаданных, передается в другой инструмент, который работает на LLVM IR. Значит, метаданные - хорошая идея? Я намерен хранить строки как метаданные с некоторыми инструкциями.

  • Если метаданные - это правильный путь, мне нужна помощь в создании метаданных node. Я планирую использовать функцию setMedata() для присоединения к инструкции. Какой вариант setMetadata() является правильным для использования. Я не уверен, в каких MDKind должны быть мои данные. Я хочу создать MDString, прикрепить его к моему MDNode, а затем вызвать setMetadata() с инструкцией. Какой контекст следует использовать в setMedata(), если я хочу приложить метаданные к инструкции внутри функции. Какова актуальность контекста для метаданных?

Я пробовал читать много дискуссий на форумах и документах llvm doxygen, но я не получил четкого и полного ответа на все мои вопросы. Я ценю вашу помощь или какой-то материал, который мог бы помочь мне понять это.

4b9b3361

Ответ 1

По-моему:

1. Являются ли метаданные правильным механизмом для использования?

Если ваш "другой инструмент" не является проходом сам по себе, то да, я думаю, что метаданные - лучший подход - держит все в IR, легко идентифицируется глазом, просто добавляется для тестирования вручную, и, возможно, большинство важно - не сталкивается ни с чем другим, пока вы не будете повторно использовать существующие типы метаданных.

Однако, если ваш "другой инструмент" является проходом сам по себе, есть альтернатива: вы можете сделать один проход зависимым от другого, а не использовать информацию из ранее непосредственно в последнем проходе. Преимущество состоит в том, что вам не нужно изменять IR.

2. Как использовать настраиваемые метаданные node?

Используйте char* вариант setMetadata, например:

LLVMContext& C = Inst->getContext();
MDNode* N = MDNode::get(C, MDString::get(C, "my md string content"));
Inst->setMetadata("my.md.name", N);

И если это первый раз, когда строка используется в setMetadata, она автоматически зарегистрирует my.md.name как новый вид в модуле (по-моему, это действительно согласовано во всем контексте). Впоследствии вы можете получить строку, используя:

cast<MDString>(Inst->getMetadata("my.md.name")->getOperand(0))->getString();

Если вы хотите повторно вызывать getMetadata или setMetadata из той же области видимости, однако, вы также можете использовать Module::getMDKindID, чтобы просто использовать фактический вид, и использовать вариации этих методов, которые используют значение вида.

Наконец, имейте в виду, что вы можете ограничить область видимости метаданных node внутри функции - используйте вариант MDNode::get(..., ..., true) для этого - хотя я никогда не использовал ее сам.