So-net無料ブログ作成

amalgamationの様子をみる~その3 [SQLite]

「./tool/vdbe-compress.tcl」を見て行きます。冒頭にコメントが書かれているので、とりあえずそれを読んでみましょう・・。

ソースファイル「vdbe.c」をいじって「sqlite3VdbeExec()」実行時のスタックサイズを減らすとのこと。「vdbe.c」って、どっかから持ってきたソースなんでしょうかねぇ・・。

ところで、前回、このスクリプトが「target_source」を作成してるとか想像してましたが、「target_source」のルールの末尾に書かれている「touch target_source」が該当のファイルを作っているようですね。「touch」コマンドはファイルが無い場合に空のファイルを作成するそうです。タイムスタンプを変えるだけかと思ってました・・。

*

それはさておき、このスクリプトは特に実行しなくてもいいとのこと。実行してもしなくてもソースの動作結果は変わらない様です。単純にスタックを減らすためとのこと。組み込み向けですかね・・?

スタックの削減方法ですが、ローカル変数を個々の「opcode」の実装から抜き出して、一つの共用体(union)に詰め込んでいるとのこと。まあ、具体的には変更前と変更後のソースを見比べないと何ともわかんないですね。


ま、こういう処理もしていると言うことで、これについてはここまでにしておきます。







amalgamationの様子をみる~その2 [SQLite]

次は、前々回の記事で出てきた、「main.mk」内の「target_src」のルールに戻ります。ルールを再度掲載すると、こんな感じ。

target_source:	$(SRC) $(TOP)/tool/vdbe-compress.tcl
	rm -rf tsrc
	mkdir tsrc
	cp -f $(SRC) tsrc
	rm tsrc/sqlite.h.in tsrc/parse.y
	tclsh $(TOP)/tool/vdbe-compress.tcl vdbe.new
	mv vdbe.new tsrc/vdbe.c
	touch target_source


いきなり、「tsrc」と言うディレクトリを消して、再度作成しています。処理後には消さない様ですね・・。って、これはどこのディレクトリを起点に実行してるんでしたっけ??

「README」を読み返したところ、特に何も書いていない様で、「publish.sh」を見てみると、何となく任意のディレクトリで実行できそうな感じです。が、ソースのトップレベルのディレクトリが安全そうな気がしますね・・。まあ、今はどっちでもいいですか・・。

次に、対象のソースを全て、「tsrc」にコピーしていますね。その後、「SRC」内に含まれているソース以外のファイル「sqlite.h.in」「parse.y」を削除しています。

で、「./tool/vdbe-compress.tcl」に「tsrc/vdbe.c」を与えて実行しているようですね。後の行から、このスクリプトが「target_source」を作成しているのだろうと想像できます。

tclのソースの様ですが、分かりますかねぇ・・・。つづく。



トレンドマイクロダイレクトストア

amalgamationの様子をみる~その1 [SQLite]

前回の最後に上げた6つのソースの生成ルールは次の様に定義されています。

opcodes.c:	opcodes.h $(TOP)/mkopcodec.awk
	$(NAWK) -f $(TOP)/mkopcodec.awk opcodes.h >opcodes.c

opcodes.h:	parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk
	cat parse.h $(TOP)/src/vdbe.c | \
		$(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h

parse.h:	parse.c

parse.c:	$(TOP)/src/parse.y lemon $(TOP)/addopcodes.awk
	cp $(TOP)/src/parse.y .
	rm -f parse.h
	./lemon $(OPTS) parse.y
	mv parse.h parse.h.temp
	$(NAWK) -f $(TOP)/addopcodes.awk parse.h.temp >parse.h

sqlite3.h:	$(TOP)/src/sqlite.h.in $(TOP)/manifest.uuid $(TOP)/VERSION
	tclsh $(TOP)/tool/mksqlite3h.tcl $(TOP) >sqlite3.h

keywordhash.h:	$(TOP)/tool/mkkeywordhash.c
	$(BCC) -o mkkeywordhash $(OPTS) $(TOP)/tool/mkkeywordhash.c
	./mkkeywordhash >keywordhash.h


それぞれのソースの生成スクリプトはawkやtclで書かれている様ですね。スクリプトの中身をちらっと見てみたところ、たんに元ソースを加工するだけでなく、何らかのコードか定義を追加して行っているようです。この辺、なんでソースに含まれていないのかは分かりませんが、結合時に必要になったものを別途付けてる感じなんですかねぇ・・。

tclって、文法とかを知らないんですよねぇ・・。

最後の「keywordhash.h」は完全にプログラムで生成しているようです。なぜ、プログラムで生成する必要があるのかは、実際に出力を見ないと分かりそうにないですね。

これらのファイルについては、この辺にしておきます。


つづく。





the amalgamation generator script [SQLite]

Amalgamationってどうやってんの~? と、脱線気味に探していたところ、「the amalgamation generator script」と言うものが存在してそうな記述を見つけました。・・・それはどこにあるんかなぁ?

*

ズバリそのものが見つかりそうにないので、「README」に書かれていた「publish.sh」と言うのを見て行きます。すると「make sqlite3.c」と言う記述が!

ソースツリー内には「sqlite3.c」が無いため、それを作成する(Amalgamationする?)動作だと思われます。と言うことなので、「Makfile」を見て行こうと思いますが、これは、「publish.sh」の頭の方で「Makefile.linux-gcc」をコピーすることで作成している様なので、「Makefile.linux-gcc」を見て行きます。

「Makefile.linux-gcc」の中は定義っぽいのばかりで、最後に「main.mk」と言うのをインクルードしていますので、そっちを見ることに。「sqlite3.c」を作成する箇所は下記の様な記述になっていました。

sqlite3.c:	target_source $(TOP)/tool/mksqlite3c.tcl
	tclsh $(TOP)/tool/mksqlite3c.tcl
	echo '#ifndef USE_SYSTEM_SQLITE' >tclsqlite3.c
	cat sqlite3.c >>tclsqlite3.c
	echo '#endif /* USE_SYSTEM_SQLITE */' >>tclsqlite3.c
	cat $(TOP)/src/tclsqlite.c >>tclsqlite3.c


「target_source」と「mksqlite3c.tcl」を参照してますね・・。

「target_source」の作成はこんな記述になってました。「mksqlite3c.tcl」は「./tool」配下にある様です。

target_source:	$(SRC) $(TOP)/tool/vdbe-compress.tcl
	rm -rf tsrc
	mkdir tsrc
	cp -f $(SRC) tsrc
	rm tsrc/sqlite.h.in tsrc/parse.y
	tclsh $(TOP)/tool/vdbe-compress.tcl vdbe.new
	mv vdbe.new tsrc/vdbe.c
	touch target_source


こちらは「SRC」と「vdbe-compress.tcl」を参照しています。

「SRC」は「./src」「./ext」に含まれている全ソース(たぶん)と自動生成される(と言うかさせる)下記のファイルの全てを含む様です。

  • keywordhash.h
  • opcodes.c
  • opcodes.h
  • parse.c
  • parse.h
  • sqlite3.h


これらのルールもまた、この「main.mk」に書かれているようですね・・・。


長くなったので、つづく。








ブログを作る(無料) powered by So-netブログ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。