gcc のバグ?
QT を arm用にコンパイルしていたらうまく動かないことがわかった。
どうやら、コンパイラがバグっているようだ。(疑心暗鬼だが、、、)
bool QLinuxFbScreen::useOffscreen() { if ((mapsize - size) < 16*1024) return false; return true; }
このコードを次のようにはく。
ldr r0, [r0, #1084] ldr r3, [r0, #1080] sub r0, r3, r0
r0 は隠された引数で this にあたる。
r0 から #1084 のオフセットは恐らく mapsize
r0 から #1080 のオフセットは恐らく size
確かに struct でそうなっている。
int size; // Screen size int mapsize; // Total mapped memory
上のアセンブラコードだと r0 を書きつぶす。
C 風に書けば
r0 = this; r0 = r0->mapsize; r3 = r0->size;
いくつかの gcc (4.1.2, 4.2.4, 4.3.3) で試したが変わらない。gcc の arm.md にその記述があるところまでは追ったが、依存関係の記述問題にあたるので gnu に登録しておしまい。
とりあえず -O0 で回避。これでやっと armadillo 500FX で QT が動くようになった。