コンパイラ作成(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にしとくべきだろうね。ということで早速修正しとこう。えーと、修正箇所は二箇所かな。修正箇所が増える前に、早めに気が付いてよかったよ。