У меня есть собственный набор проходов, созданный с использованием 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.