続 __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