2013-05-26 7 views
2

Могу ли я вставить новый край, изменив его пункт назначения и удалив другое ребро из его источника и адресата. Другими словами, можно ли заменить базовый блок назначения края другим, чтобы внести некоторые изменения в 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)); 

ответ

1

Базовый блок имеет одну команду терминатора. Однако этот терминатор может быть one of several instructions, которые совершенно разные. Некоторые могут иметь несколько ребер. Так что это не так просто, как кажется.

Что вы может do - это смотреть на терминатор блока и изменять инструкцию для перехода в другое место назначения. Это зависит от инструкции и (конечно) от ваших конкретных потребностей.

+0

Итак, согласно каждому типу инструкции терминатора существует функция добавления нового базового блока для изменения края. Как я могу определить тип terminatorInst и установить новый базовый блок в переходе LLVM –

+1

@ R.Omar: 'BasicBlock :: getTerminator' дает вам инструкцию терминатора, и ее можно протестировать, чтобы увидеть ее подтип с помощью обычного LLVM RTTI методы. См. Диаграмму для доступных подклассов «TerminatorInst»: http://llvm.org/docs/doxygen/html/classllvm_1_1TerminatorInst.html –

+0

Это действительно помогло мне, спасибо –