2013年1月31日木曜日

Xcode4.6のバグ

Xcode4.6が出た。

「おっ、今回はバグが出ないじゃん」と思ってたら、やっぱりというか案の定というか
バグがいた。

・memcpyで転送サイズがlongサイズの定数倍の時、インライン展開がいらんお世話をする
・double変数のくせに8バイト境界から確保されない

正確にはXcodeのバグというよりコンパイラのバグ。
ARM実機でのみ発現する。

ARMではlongでは4バイト境界、doubleでは8バイト境界から始まっていなければならない。そうしないとアクセス時にCPUが例外を発生してしまう。ところが、Xcode4.6のコンパイラでは事もあろうにそれらをワード境界から確保することがある。

さらに、それを見越してmemcpy()で内容をコピーするようにしたのに、全く要らんことにmemcpy()がインライン展開する際に、サイズが定数(相当)で指定されている場合、常にバイト単位転送ではなく、サイズが4で割り切れる時は4バイト単位転送にしてしまいやがる。これじゃ意味無いじゃん。

定数相当と書いたのは、定数*変数で定数が4バイトの倍数の時も同じということ。

コンパイルオプションに-fno-inline-functionsを入れてみたけど変わらず。これはユーザー関数のインライン展開のみを制御するのかもしれない。
シミュレーター上では86のコードが出力され、86はどの位置からでもいかなるサイズでもアクセス可能なため発現しない。
ARMと86で同じ最適化というか境界配置にしてるんじゃないか?

実機でしか発現しないし、実機でも同じコードでも出る場所と出ない場所があったりして
非常に厄介なバグである。

ということで、バイト単位コピーを所望する場合は、自前で相当関数を実装しなければならないようである。

・・・補足
同じようにインライン展開される関数でも、memcmp()は1バイトづつ比較するしかないから多分大丈夫だろうし、strcpy()も1バイトコピーが必須なので大丈夫だと思う。
引っかかる可能性があるのはmemcpy(相当)の定数サイズ時だけだと思う。

ちなみに、GCCにも同じバグがいるらしい。XcodeはGCCじゃなくなったけど同じということで。

2013年1月8日火曜日

X-BASIC for iOS 次バージョン開発状況

「X-BASIC for iOS」の次バージョンの開発状況などをお知らせします。


今後X-BASIC for iOSのサポートは専用ページに移行します。


・・・

バージョン V1.60->発売中

・指定時間待ち関数
・テキストおよびグラフィック色の合成RGBでの指定
・pset()
・bitmap関数群
・picLoader
   X68での事実上標準画像フォーマットであった.PICを表示出来る
・cutLoader
   電脳倶楽部で使われていたCUTファイルを表示出来る
・最新取説への更新
・いくつかのバグ修正
 エラー発生行番号がずれる/キーリピートが止まらなくなることがある/bingo.basのバグ他
・描画高速化(50倍位)

・・・

バージョン V1.70→拒絶
・PCM/M44/M30/P16音声ファイルサポート
 a_play()で直接再生可能
・files()で正規表現を使えるようにした
・(プログラム実行開始時を含む)cls()直後のprint表示が抜けることがあるのを修正
・ビットマップにline/box/fill/circle/paint/get/put関数を追加・エラー番号とメッセージが一致していないのを修正
・エラー表示発生行が実発生行と一致しないことがあるのを修正
・キー表示画面の優先順位が一番高くないのを修正

プログラムのインポート機能が「やっぱりだめ」と言われてしまいました。
V1.60では通ったのに。
現在対策を検討中ですが、場合によっては、プログラムを外部から入れる機能は
Webサイト等からのCopy&Pasteのみになるかもしれません。

・・・ということで

バージョン V1.71→発売中(2013/2/11)

・プログラムのインポート機能を削除
 単独ファイルだけでなく、ZIP内も禁止。
 テキストでのCopy&Pasteしか仕方ない様子。このことも取説には書けない。なんてこったい。
・Xcode4.6コンパイラのバグを回避するコードを実装