読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

H8でリンク時最適化など

折角gcc4.7系を使つてゐる訣だしリンク時最適化を試してみようとかさういふあれです。
コンパイルオプションに

-lto

を付けると別飜譯單位の函數も空氣讀んでインライン化してくれるらしいです。
結論からいふとされました。

//interrupt.cc
namespace aq { namespace {interrupt {
void disable() {
  asm volatile ("orc.b #0xc0,ccr");
}}
}}

//main.cc
int main_crt_startup() {
  aq::interrupt::disable();
  ...

// アセンブリ(-fltoなし)
00000124 <__ZN2aq9interrupt7disableEv>:
     124:	01 00 6d f6 	mov.l	er6,@-er7
     128:	0f f6       	mov.l	er7,er6
     12a:	04 c0       	orc	#0xc0,ccr
     12c:	01 00 6d 76 	mov.l	@er7+,er6
     130:	54 70       	rts	

00000154 <_main>:
     154:	01 00 6d f6 	mov.l	er6,@-er7
     158:	0f f6       	mov.l	er7,er6
     15a:	01 00 6d f4 	mov.l	er4,@-er7
     15e:	1b 97       	subs	#4,er7
     160:	5e 00 01 24 	jsr	@0x124:24
     ...

// アセンブリ(-fltoあり)
00000100 <_main>:
     100:	01 00 6d f6 	mov.l	er6,@-er7
     104:	0f f6       	mov.l	er7,er6
     106:	01 00 6d f4 	mov.l	er4,@-er7
     10a:	04 c0       	orc	#0xc0,ccr
     ...

これでinline化したいけどヘッダに變な實裝晒したくないみたいな時に幸せになれさうです。しかも律儀にinline化で消滅した函數の實體__ZN2aq9interrupt7disableEvも綺麗に消し去つてくれるやうなのでサイズ厨になりがちのこの界隈的にも嬉しいです。
しかしCの配列形式での割り込みベクタの登録だとどうも消えてしまふやうなので、Cは諦めてリンカスクリプトに書いて登録するなりしないと殘當します。

SECTIONS {
  .vectors : {
    LONG(ABSOLUTE(_start))
  } > vectors