簡単な解決策:
一般的なアプローチの1つは、インラインアセンブリを追加し、命令バイトを直接エンコードすることです。
例えば:
int main()
{
asm __volatile__ (".byte 0x90\n");
return 0;
}
コンパイル(gcc -o3)に:
00000000004005a0 <main>:
4005a0: 90 nop
4005a1: 31 c0 xor %eax,%eax
4005a3: c3 retq
したがって、0x90をInstバイトに置き換えてください。もちろん、通常のobjdumpに関する実際の指示は見られず、プログラムはシステムで実行されない可能性があります(NOPの組み合わせのいずれかを使用しない限り)が、シミュレーターが適切に実装されている場合はそれを認識する必要があります。
コンパイラがこの命令を知らないときに最適化することを期待できないことに注意してください。また、状態(レジスタ、メモリ)を変更した場合、インラインアセンブリクラッバー/入出力オプションで注意して作業する必要があります。正しさを確保します。最適化を使用する必要がある場合にのみ使用します。
複雑な解決策
別のアプローチは、これをコンパイラに実装することです - GCCで実行できますが、コメントで述べたように、LLVMはおそらくコンパイラ開発プラットフォームとして設計されているため、おそらくプレイするのに最適なものの1つですが、それでも非常に複雑ですLLVMはIRの最適化段階に最適であり、ターゲット固有のバックエンドを変更しようとする場合、やや友好的ではありません。
それでも、それは実行可能であり、コンパイラにこの命令をいつ発行するかを決定させることを計画している場合は、それを行う必要があります。ただし、最初のオプションから始めて、シミュレーターがこの追加で動作するかどうかを確認することをお勧めします。
LLVMでこれを実装することを決定した場合、あなたの最善の策はそれを本質的な関数として定義することです。 http://llvm.org/docs/extendingllvm.html