Я строю CFG из произвольного IL и хочу преобразовать этот CFG обратно в IL. Порядок вершин в CFG, конечно, не равен порядку исходных инструкций IL.Преобразование CFG в IL
Это нормально, но слишком сложно. Представьте:
Jump 'B'
'C': Return
'B': Jump 'C'
Это приведет к графике потока, как это: (Перейти B) -> (Перейти С) -> (Возврат) Это, конечно, упрощенный пример, но он показывает проблему при преобразовании из от CFG.
Есть ли какая-либо информация по этой теме в academia? Я думал, что пересечение графика снизу вверх будет очень элегантным, но это не работает в более сложных случаях.
Решение может состоять в том, чтобы ходить сверху вниз и искать слияние CF, но в этом случае я не смог бы правильно обрабатывать петли. Таким образом, единственный способ получить это право - это поиск возможного слияния CF, если это произойдет. Если нет, мы должны иметь цикл, который означает, что цикл является предпочтительным, а последующий путь оценивается впоследствии. Это звучит как решаемая проблема, но она также очень дорога, и может возникнуть более элегантное решение проблемы. Кроме того, цикл может также приводить к слиянию CF, когда вы думаете о выражении «break».
Инструкция требует ярлыка, потому что она является лидером базового блока, у которого нет предшественника или нескольких предшественников, или только у одного предшественника, но у предшественника более одного преемника. – inv