私は任意のILからCFGを構築し、そのCFGをILに戻したいと考えています。もちろん、CFGの頂点の順序は、元のIL命令の順序と同じではありません。CFGからILへの変換
これは問題ありませんが、いくつかのものを過度に複雑にします。想像:
Jump 'B'
'C': Return
'B': Jump 'C'
これは、このようなフローグラフをもたらす:(Bジャンプ) - >(ジャンプC) - >(リターン) これはもちろんの簡略化した例であるが、アウト変換するとき、それは問題を示していますCFGの
アカデミアでこのトピックに関する情報はありますか?グラフをボトムアップするのは非常にエレガントだが、それはもっと複雑なケースではうまくいかないと思った。
解決策は、トップダウンで歩いてCFマージを検索することですが、その場合は正しいループを処理できない可能性があります。この権利を得るための唯一の方法は、可能な場合に起こりうるCFマージを検索することです。そうでない場合は、ループを作成する必要があります。つまり、ループが優先され、その後に継続するパスが評価されます。これは解決可能な問題のように聞こえるが、それはまた非常に高価であり、問題に対するよりエレガントな解決策が存在する可能性がある。ループのほかに、 "break"ステートメントについて考えるときにCFマージが発生する可能性もあります。
命令には、先行操作がないか、複数の先行操作、または前の操作が1つしかないが、先行操作に複数の後続操作がある基本ブロックのリーダーであるため、ラベルが必要です。 – inv