Ошибка LLVM GetAnalysis () с необходимыми проходами - PullRequest
0 голосов
/ 21 октября 2019

У меня есть собственный набор проходов, созданный с использованием LLVM для запуска с некоторым битовым кодом. Мне удалось заставить его скомпилироваться, но всякий раз, когда я пытаюсь запустить его с проходом, который вызывает getAnalysis() для другого типа прохода, он терпит неудачу:

Assertion `ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"' failed.

Пользовательский проход, который вызывает getAnalysis() требует его типа, в частности;

bool Operators::doInitialization(){
ParseConfig &parseConfig = getAnalysis<ParseConfig>(); // Fails here.
}
.
.
.
void Operators::getAnalysisUsage(AnalysisUsage &AU) const{
    AU.addRequired<ParseConfig>();
    return;
}

Я потратил на это несколько дней и совершенно растерялся. Я знаю, что верно следующее:

  • ParseConfig успешно зарегистрирован через шаблон RegisterPass<>, и я прошел его через GDB, чтобы найти, что он действительно зарегистрирован.
  • Такжеиспользуя GDB, я обнаружил, что при просмотре getAnalysis() список зарегистрированных проходов всегда пуст (что вызывает утверждение).

Важное примечание : Я в конечном итоге буду использовать это в проекте на Фортране, который скомпилирован с Flang, таким образом, версия библиотеки LLVM, которую я использую, - это Flang fork (найдено здесь ). Этот ответвление находится прямо рядом с LLVM 7.1, но определенные файлы, связанные с регистрацией проходов, похоже, не отличаются от текущей библиотеки LLVM.

1 Ответ

1 голос
/ 29 октября 2019

Перемещение getAnalysis с doInitialization на runOnFunction заставит ее работать.


С LLVM-страницы

Этот методcall getAnalysis * возвращает ссылку на желаемый проход. Вы можете получить ошибку подтверждения во время выполнения, если попытаетесь получить анализ, который вы не объявили в соответствии с требованиями реализации getAnalysisUsage. Этот метод может быть вызван вашей реализацией метода run * или любым другим локальным методом, вызванным вашим методом * run.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...