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