1 つの可能性は、それらを CLang でコンパイルし、出力を LLVM IR として取得することです。メモリが機能する場合、これは のコマンド ライン引数である必要があり-S -emit-llvm
ます。
gcc/g++ で同じことを行うには、そのフラグの 1 つを使用して、コンパイルのある段階で中間表現を含むファイルを生成できます。初期段階では、空白などの変更による違いがまだ見られますが、簡単なテストでは、SSA 段階までに、そのような非運用上の変更が IR から消えていることが示されています。
g++ -c -fdump-tree-ssa foo.cpp
通常のオブジェクト ファイルに加えて、foo.cpp.018t.ssa
ソース ファイル内のセマンティック アクションを表すという名前のファイルが生成されます。
上で述べたように、私はこれほど広範なテストを行っていませんが、この段階では、操作に関係のない変更によって、異なる出力ファイルが生成される可能性があります (ちょっと疑問ですが)。必要に応じて、コンパイルのすべての-fdump-tree-all
段階から出力を取得するために使用できます1。単純な経験則として、後の段階では書式設定などの変更の影響を受けにくいと予想されるため、ssa 段階が機能しない場合、次の選択肢はおそらく最後の段階の 1 つである段階になるでしょう。 (注: 生成されたファイルは、各ファイルを生成した段階の順に番号が付けられているため、すべての段階をダンプすると、初期段階で生成されたものと後の段階で生成されたものは明らかです)。optimized
1. これによりかなりの数のファイルが生成され、その多くは非常に大きいことに注意してください。初めてこれを行うときは、いわば、ファイルに溺れないように、ディレクトリ内の単一のソース ファイルに対して単独で実行することをお勧めします。また、この方法でのコンパイルに通常よりかなり長い時間がかかっても驚かないでください。