Получить Предшественники для BasicBlock в LLVM

Какой самый простой способ получить предшественники BasicBlock в рамках LLVM?

Я взглянул на DepthFirstIterator а также idf_iterator<BasicBlock*>, но на самом деле мне нужно сделать поиск в ширину на графике потока управления.

Я чувствую, что это должно быть легко, но это не очевидно из документации или примеров, которые я изучал в Интернете.

8

Решение

Из документации не ясно, но базовый класс блоков имеет поддержку итератора pred, который дает предшественникам базовый блок. В стиле C ++ 11 можно проходить циклически по предшественникам блока следующим образом:

BasicBlock* B = ...
for (auto it = pred_begin(B), et = pred_end(B); it != et; ++it)
{
BasicBlock* predecessor = *it;
...
}
16

Другие решения

Более простой способ итерации по предшественникам или преемникам показан с использованием цикла for-each в руководстве программиста:

Перебор по предшественникам и преемникам блока довольно прост с процедурами, определенными в llvm/IR/CFG.h, Просто используйте такой код для перебора всех предшественников BB:

#include "llvm/IR/CFG.h"BasicBlock *BB = ...;
for (BasicBlock *Pred : predecessors(BB)) {
// ...
}

Точно так же, чтобы перебрать преемников использовать successors,

Это намного чище, чем использование явной итерации с pred_begin а также pred_end,

5

По вопросам рекламы [email protected]