Ответ 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)
для этого - хотя я никогда не использовал ее сам.