コンパイラ作成(27) System V AMD64 ABI

Application Binary Interface

今回はABIのお勉強だよ。なんとなくは知ってるんだけど、細かいことまでは把握できてなかったんで、ちゃんと調べてみる。
X86 psABI · hjl-tools/x86-psABI Wiki · GitHubからpdfを開いて見てみる。
3.2 Function Calling Sequenceのところを熟読。関数の引数がレジスタ渡しされることが書かれてるね。これは一応知ってたよ。でも知らなかったこともいくつか。その辺を詳しく見てくよ。

red zone

red zoneっていう知らない言葉が出てきたよ。なんじゃらほいって調べてみたら、関数コールをちょっと早くするための仕組みみたい。これが使用できるのは子関数を呼ばないリーフ関数の場合だけだって。場合分けして二パターン作らなきゃいけなくなるんで、mycではサポートしないことにしたよ。

スタックのアライメント

3.2.2 The Stack Frameのところにスタックは16バイトバウンダリーにしないとダメだって書いてあるね。mycはそんなのお構いなしにコード生成してるんで拙いかもしれないなあ。これ守らないとSSEを使ったときにセグメンテーションフォルトが起きるらしいよ。うーん、SSEの知識は全くない。その辺から勉強しないとダメかな。実際に拙いことが起こるか調べてみたいんだけどね。

レジスタ

mycは式の計算でeax、ebx、edxをつかってるんだけど、いくつか注意点があるね。まずebxは呼ばれた関数側で保存が必要だってこと。二つ目はedxは関数の引数を渡すために使われるんで、無条件で使っちゃまずそうだってこと。乗算除算で使ってるけど、ちゃんと退避しないとダメかな。この辺、見直しが必要だな。

hidden argument

3.2.3 Parameter Passingのところをよく読むとalがhidden argumentとして使われることがあるって書いてあるね。printfみたいな可変長引数の関数とプロトタイプ宣言がない関数の場合に使われるって。そういやclangのコンパイル結果のコードでalが使われてるのあって、何でかなあと疑問に思ったことあるなあ。