Могу ли я вставить новый край, изменив его пункт назначения и удалив другое ребро из его источника и адресата. Другими словами, можно ли заменить базовый блок назначения края другим, чтобы внести некоторые изменения в CFG?Как я могу вставить/удалить ребро в LLVM?
Я попытался getEdge()
функцию в ProfileInfo
, но это не сработало:
// to replace the basic block
Bb->getTerminator()->replaceUsesOfWith((*SI), (*rit));
// trying to set the new basic block as a new destination
xx = ProfileInfo::getEdge(Bb,(*rit));
Итак, согласно каждому типу инструкции терминатора существует функция добавления нового базового блока для изменения края. Как я могу определить тип terminatorInst и установить новый базовый блок в переходе LLVM –
@ R.Omar: 'BasicBlock :: getTerminator' дает вам инструкцию терминатора, и ее можно протестировать, чтобы увидеть ее подтип с помощью обычного LLVM RTTI методы. См. Диаграмму для доступных подклассов «TerminatorInst»: http://llvm.org/docs/doxygen/html/classllvm_1_1TerminatorInst.html –
Это действительно помогло мне, спасибо –