Какой самый простой способ получить предшественники BasicBlock
в рамках LLVM?
Я взглянул на DepthFirstIterator
а также idf_iterator<BasicBlock*>
, но на самом деле мне нужно сделать поиск в ширину на графике потока управления.
Я чувствую, что это должно быть легко, но это не очевидно из документации или примеров, которые я изучал в Интернете.
Из документации не ясно, но базовый класс блоков имеет поддержку итератора pred, который дает предшественникам базовый блок. В стиле C ++ 11 можно проходить циклически по предшественникам блока следующим образом:
BasicBlock* B = ...
for (auto it = pred_begin(B), et = pred_end(B); it != et; ++it)
{
BasicBlock* predecessor = *it;
...
}
Более простой способ итерации по предшественникам или преемникам показан с использованием цикла for-each в руководстве программиста:
Перебор по предшественникам и преемникам блока довольно прост с процедурами, определенными в
llvm/IR/CFG.h
, Просто используйте такой код для перебора всех предшественников BB:#include "llvm/IR/CFG.h"BasicBlock *BB = ...; for (BasicBlock *Pred : predecessors(BB)) { // ... }
Точно так же, чтобы перебрать преемников использовать
successors
,
Это намного чище, чем использование явной итерации с pred_begin
а также pred_end
,