続 __attribute__)((naked))(
とりあえず ARM で試してみる。ARM のレジスタ、命令についてはLinux Zaurusでアセンブリプログラミングを参照。
で、以下のソースを gcc -O0 でコンパイルしてみた。
#if 0 __attribute__((naked)) #endif int kma(int a) { int b; b = a * 2; return b; }
@ __attribute__)((naked))(
無し
mov ip, sp
stmdb sp!, {fp, ip, lr, pc}
sub fp, ip, #4
sub sp, sp, #8
str r0, [fp, -#16]
ldr r3, [fp, -#16]
mov r3, r3, lsl #1
str r3, [fp, -#20]
ldr r3, [fp, -#20]
mov r0, r3
ldmdb fp, {fp, sp, pc}
@ __attribute__)((naked))(
有り
@ あたりまえだけどこのままじゃ動作しない
str r0, [fp, -#16]
ldr r3, [fp, -#16]
mov r3, r3, lsl #1
str r3, [fp, -#20]
ldr r3, [fp, -#20]
mov r0, r3
確かに関数プロローグ・エピローグコードが消えてるね。
ちなみに gcc -O2 の結果。
mov r0, r0, lsl #1 mov pc, lr