dmdのGCの実装を見てみる。


k.inabaさんにおだてられたので、ざっと見てみました。


/src/phobos/gcstats.d
GCのステータスを保持する構造体GCStatsが定義されています。
/src/phobos/std/gc.d
これは、中身は何もないです。


/src/phobos/internal/gc/gc.d
ここに、GCの実態があります。大部分はGCクラスをよんでます。
/src/phobos/internal/gc/gcx.d
ここに、GCクラスの定義があります。
/src/phobos/internal/gc/gclinux.d
linux依存部分
/src/phobos/internal/gc/win32.d
win32依存部分
/src/phobos/internal/gc/gcbits.d
GCBitsクラスの定義
bit単位で何かするんだろうなぁ。
/src/phobos/internal/gc/gcstub.d
GCクラスの何も処理しないクラスがある。
/src/phobos/internal/gc/testgc.d
GCのテストをする
/src/phobos/internal/gc/linux.mak
/src/phobos/internal/gc/win32.mak
makeファイル
dmgc.libを作るらしい。


/src/phobos/win32.mak
/src/phobos/linux.mak
phobos全体のmakeファイル
これで、/src/phobos/internal/gc/
以下もphobosに入るっぽい。


だいたいそんなかんじみたいです。


実際makeしてみてませんが、
たぶん、dmdについてくるmake使えばすぐmakeできるんじゃないかと思います。
あとは、弄くればよさそうです。
うわぁ、これは非常に弄ってみたいところですなぁ。


追記:手元にあったd-for-gcc-r1f.tgzのソースをboehmでgrepした結果です。


phobos\gcc\gcgcc.d


gdcgcの関連部分になってると思います。

config-lang.in(13): target_libs="target-boehm-gc"
README(151):           o Use parts of the Boehm garbage collector to determine the
phobos\configure(5001):     d_use_boehm=1
phobos\configure(5004): d_use_boehm=1
phobos\configure(5006): if test -n "$d_use_boehm"; then
phobos\configure(5007):     D_EXTRA_OBJS="$D_EXTRA_OBJS boehm-gc/d_os_dep.o boehm-gc/dyn_load.o boehm-gc/d_init.o"
phobos\configure(5008):     DCFG_GC_BITS="GNU_Boehm_GC"
phobos\configure(5022): if test -n "$d_use_boehm"; then
phobos\configure(5023):     d_config_subdirs="boehm-gc"
phobos\configure.in(253):     d_use_boehm=1
phobos\configure.in(256): dnl For now, use Boehm GC by default
phobos\configure.in(257): d_use_boehm=1
phobos\configure.in(259): if test -n "$d_use_boehm"; then
phobos\configure.in(260):     D_EXTRA_OBJS="$D_EXTRA_OBJS boehm-gc/d_os_dep.o boehm-gc/dyn_load.o boehm-gc/d_init.o"
phobos\configure.in(261):     DCFG_GC_BITS="GNU_Boehm_GC"
phobos\configure.in(275): if test -n "$d_use_boehm"; then
phobos\configure.in(276):     d_config_subdirs="boehm-gc"
phobos\Makefile.in(126): boehm-gc/d_os_dep.c: $(srcdir)/boehm-gc/os_dep.c
phobos\Makefile.in(127): 	cp $(srcdir)/boehm-gc/os_dep.c $@
phobos\Makefile.in(128): 	patch -p0 < $(srcdir)/patch-boehm-gc-os_dep
phobos\Makefile.in(129): boehm-gc/d_os_dep.o: boehm-gc/d_os_dep.c
phobos\Makefile.in(130): 	cd boehm-gc && $(MAKE) d_os_dep.o
phobos\Makefile.in(131): boehm-gc/dyn_load.o:
phobos\Makefile.in(132): 	cd boehm-gc && $(MAKE) dyn_load.o
phobos\Makefile.in(133): boehm-gc/d_init.c: $(srcdir)/gcc/boehm-gc-d_init.c
phobos\Makefile.in(134): 	cp $(srcdir)/gcc/boehm-gc-d_init.c $@
phobos\Makefile.in(135): boehm-gc/d_init.o: boehm-gc/d_init.c
phobos\Makefile.in(136): 	cd boehm-gc && $(MAKE) d_init.o
phobos\patch-boehm-gc-os_dep(1): *** boehm-gc/os_dep.c	Mon Sep 22 16:00:23 2003
phobos\patch-boehm-gc-os_dep(2): --- boehm-gc/d_os_dep.c	Tue Apr  6 18:17:30 2004
phobos\prepcygwin.sh(7): rm -f boehm-gc
phobos\prepcygwin.sh(8): cp -pR ../../../boehm-gc .
phobos\autom4te.cache\output.0(4990):     d_use_boehm=1
phobos\autom4te.cache\output.0(4993): d_use_boehm=1
phobos\autom4te.cache\output.0(4995): if test -n "$d_use_boehm"; then
phobos\autom4te.cache\output.0(4996):     D_EXTRA_OBJS="$D_EXTRA_OBJS boehm-gc/d_os_dep.o boehm-gc/dyn_load.o boehm-gc/d_init.o"
phobos\autom4te.cache\output.0(4997):     DCFG_GC_BITS="GNU_Boehm_GC"
phobos\autom4te.cache\output.0(5011): if test -n "$d_use_boehm"; then
phobos\autom4te.cache\output.0(5012):     d_config_subdirs="boehm-gc"
phobos\autom4te.cache\output.1(5001):     d_use_boehm=1
phobos\autom4te.cache\output.1(5004): d_use_boehm=1
phobos\autom4te.cache\output.1(5006): if test -n "$d_use_boehm"; then
phobos\autom4te.cache\output.1(5007):     D_EXTRA_OBJS="$D_EXTRA_OBJS boehm-gc/d_os_dep.o boehm-gc/dyn_load.o boehm-gc/d_init.o"
phobos\autom4te.cache\output.1(5008):     DCFG_GC_BITS="GNU_Boehm_GC"
phobos\autom4te.cache\output.1(5022): if test -n "$d_use_boehm"; then
phobos\autom4te.cache\output.1(5023):     d_config_subdirs="boehm-gc"
phobos\gcc\gcgcc.d(73):     // TODO: this isn't quite exclusive with GNU_Boehm_GC...
phobos\gcc\gcgcc.d(85): version (GNU_Boehm_GC) {
phobos\gcc\gcgcc.d(117): version (GNU_Boehm_GC) {
phobos\gcc\gcgcc.d(120): 	// We can get the start/end, but Boehm GC adds the range explicitly
phobos\gcc\gcgcc.d(141): 	// It doesn't seem like the Boehm GC code we use actually calls
phobos\gcc\gcgcc.d(149): /* Really have to register a function to handle dylibs as in boehm gc */
phobos\gcc\gcgcc.d(219):     version (GNU_Boehm_GC) {