2010年2月8日月曜日

SBCL1.0.35のlispobj

SBCLのsrc/runtimeディレクトリのC言語で記述された箇所を読む努力をしてみる。脳みそのスペックと英語力と注意力が無いので多々憶測を含む。

lispobjは名前のとおりlispのオブジェクトを表すものだと思われるが、こいつがどのように利用されているか見ていく。

N_WORD_BITS == 32とする(genesis/config.h)。 runtime.hやgenesis/constants.hあたりにタグなどの定義がある。

定義(runtime.h)

/* fake it on alpha32 */
typedef unsigned int lispobj;
#define LOW_WORD(c) ((long)(c) & 0xFFFFFFFFL)

LOWTAG

LOWTAG_MASKはconstants.h(自動生成される)で7と定義されている。 lispobjの下位3ビットを利用したタグ。

  • タグの値:定義されている定数の名前
  • 0:EVEN_FIXNUM_LOWTAG
  • 1:INSTANCE_POINTER_LOWTAG
  • 2:OTHER_IMMEDIATE_0_LOWTAG
  • 3:LIST_POINTER_LOWTAG
  • 4:ODD_FIXNUM_LOWTAG
  • 5:FUN_POINTER_LOWTAG
  • 6:OTHER_IMMEDIATE_1_LOWTAG
  • 7:OTHER_POINTER_LOWTAG

ビット0が立っていれば何らかのポインタである。

整数をN_FIXNUM_TAG_BITS(2)左にシフトすることで偶数ならEVEN_FIXNUM_LOWTAGが、奇数ならODD_FIXNUM_LOWTAGがLOWTAGにセットされる。なのでfixnumが表現できるのは29ビット30ビット。 OTHER_IMMEDIATE_x_LOWTAGはWIDETAGで何を示すのかを表すっぽい。

WIDETAG

WIDETAG_MASKが255と定義されているので、lispobjの下位8ビットがWIDETAG。 xxx_WIDETAGと定義されている定数の下位3ビットが2か6になっているので、LOWTAGが OTHER_IMMEDIATE_x_LOWTAGのときはWIDETAGで値の種類を判別するのだと思う。

メモ

lispobjとはとくに関係ないけど、runtime.hのQSHOW_SIGNALSを真にすると実行中にいろいろメッセージを吐くようになる。 make.shを実行すると、runtimeディレクトリにsbclという実行ファイルが作られる。 --core引数をつけずに実行すると、search_for_core関数でコアファイルを探そうとする。 コアファイルはcoreparse.cのload_core_file関数で読み込まれるが、その際コアファイルと実行ファイルのビルドIDが一致しなければnever_returns [
__attribute__((noreturn))]であるlose関数を呼び出す。

loseはわりといろんなところから呼ばれている。処理を続行できないエラーの場合に呼び出しているのだろう。

load_core_fileは最初に実行すべき関数のlispobjを返す。このlispobjを main関数の終わり付近でcreate_initial_thread関数の引数として利用する。

0 件のコメント:

コメントを投稿