コンパイラ作成(13) データ型モデル
clangのアセンブリコード
組み込み関数printのコンパイルをするときに勉強した、clangのアセンブリコードをもう一回眺めてみたよ。
.text .intel_syntax noprefix .file "c.myc" .globl main # -- Begin function main .p2align 4, 0x90 .type main,@function main: # @main # BB#0: push rbp mov rbp, rsp sub rsp, 16 mov edi, 42 mov al, 0 call print xor edi, edi mov dword ptr [rbp - 4], eax # 4-byte Spill mov eax, edi add rsp, 16 pop rbp ret .Lfunc_end0: .size main, .Lfunc_end0-main # -- End function .ident "clang version 5.0.1-4 (tags/RELEASE_501/final)" .section ".note.GNU-stack","",@progbits
見ててまず思ったのが、printの返値をちゃんと保存してるなってこと。それに、この返値32bitだってこと。よく見るとprintへ渡す引数も32bitになってる。mycは64bitにしちゃってる。あ、そうか。LP64か。
データ型モデル
mycのターゲットはx86_64のLinuxにしたんだけど、ほとんどのLinuxの場合データ型モデルはLP64だよね。すっかり忘れてた。データ型モデルが何者かっていうのは64ビット - Wikipediaを見てもらえば良いのかな。
mycの基本データサイズを64bitにしちゃうことも考えられるけど、標準ライブラリのことを考えればやっぱりLP64にしとくべきだろうね。ということで早速修正しとこう。えーと、修正箇所は二箇所かな。修正箇所が増える前に、早めに気が付いてよかったよ。