On Thu, 1 Sep 2005, Nattfodd wrote:
today is the deadline for the google summer of code projects, and it's time
anyway for a "release" of GMC.
GMC is a generational garbage collector for parrot that allows copying of
objects and thus copying GC schemes.
Thanks for submitting this. I also appreciated the extensive comments in
the source (even if I didn't actually read most of them :-).
svn co https://svn.perl.org/parrot/branches/gmc
First, I needed the following simple patch to MANIFEST
--- gmc/MANIFEST Thu Sep 1 09:12:48 2005
+++ parrot-andy/MANIFEST Thu Sep 1 10:19:20 2005
@@ -1639,6 +1639,7 @@
src/exec_start.c []
src/exit.c []
src/extend.c []
+src/gc_gmc.c []
src/gc_gms.c []
src/gc_ims.c []
src/generic_register.c []
After that, with Sparc/Solaris 8, with Sun's CC, I got a core dump
even on a simple
./miniparrot -h
I rebuilt with debugging, and it again core dumped (although somewhere
else). Here's the backtrace:
(dbx) run -h
Running: miniparrot -h
(process id 21433)
[EMAIL PROTECTED] ([EMAIL PROTECTED]) signal SEGV (no mapping at the fault address) in
gc_gmc_copy_gen at line 879 in file "gc_gmc.c"
879 PMC_body(Gmc_PMC_hdr_get_PMC(ptr)) = Gmc_PMC_hdr_get_BODY(ptr);
(dbx) where
current thread: [EMAIL PROTECTED]
=>[1] gc_gmc_copy_gen(from = 0x32dbe8, dest = 0x4d31f8), line 879 in "gc_gmc.c"
[2] gc_gmc_more_bodies(interpreter = 0x2b6ce8, pool = 0x31d860), line 933 in
"gc_gmc.c"
[3] gc_gmc_new_body(interpreter = 0x2b6ce8, pool = 0x31d860, size = 40U, aggreg = 4),
line 705 in "gc_gmc.c"
[4] gc_gmc_get_free_object_of_size(interpreter = 0x2b6ce8, pool = 0x31d860, size = 40U,
aggreg = 4), line 741 in "gc_gmc.c"
[5] gc_gmc_get_free_typed_object(interpreter = 0x2b6ce8, pool = 0x31d860, base_type =
62), line 796 in "gc_gmc.c"
[6] new_pmc_alloc_header(interpreter = 0x2b6ce8, flags = 132096U, is_typed = 1,
base_type = 62), line 270 in "headers.c"
[7] new_pmc_typed_header(interpreter = 0x2b6ce8, flags = 132096U, base_type = 62), line
343 in "headers.c"
[8] get_new_pmc_header(interpreter = 0x2b6ce8, base_type = 62, flags = 132096U), line
231 in "pmc.c"
[9] constant_pmc_new(interpreter = 0x2b6ce8, base_type = 62), line 310 in
"pmc.c"
[10] mmd_create_builtin_multi_meth_2(interpreter = 0x2b6ce8, func_nr = 5, type = 33, right =
-100, func_ptr = 0x1edce0 = &Parrot_Complex_i_multiply_int()), line 2116 in
"mmd.c"
[11] mmd_create_builtin_multi_meth(interpreter = 0x2b6ce8, type = 33, entry =
0xffbef444), line 2139 in "mmd.c"
[12] Parrot_mmd_register_table(interpreter = 0x2b6ce8, type = 33, mmd_table =
0xffbef2e4, n = 35), line 2182 in "mmd.c"
[13] Parrot_Complex_class_init(interp = 0x2b6ce8, entry = 33, pass = 1), line 1390 in
"complex.c"
[14] Parrot_initialize_core_pmcs(interp = 0x2b6ce8), line 126 in "core_pmcs.c"
[15] init_world(interpreter = 0x2b6ce8), line 85 in "global_setup.c"
[16] Parrot_init(interpreter = 0x2b6ce8), line 84 in "embed.c"
[17] make_interpreter(parent = (nil), flags = PARROT_NO_FLAGS), line 165 in
"inter_create.c"
[18] Parrot_new(parent = (nil)), line 47 in "embed.c"
[19] main(argc = 2, argv = 0xffbefa8c), line 452 in "main.c"
I #defined GMC_DEBUG and BIG_DUMP, and the last entries may be relevant:
Copying gen (32e730,32f760) to gen (4d3d40,4d4d70)
copy_gen: ptr 4c0904, old_body 32f554, new_body 4d4b64, struct_val: deadbeef
copy_gen: ptr 47e078, old_body 32f57c, new_body 4d4b8c, struct_val: deadbeef
copy_gen: ptr 46f7bc, old_body 32f5a4, new_body 4d4bb4, struct_val: deadbeef
copy_gen: ptr 4683d8, old_body 32f5cc, new_body 4d4bdc, struct_val: deadbeef
copy_gen: ptr 46845c, old_body 32f5f4, new_body 4d4c04, struct_val: deadbeef
copy_gen: ptr 4684d4, old_body 32f61c, new_body 4d4c2c, struct_val: deadbeef
copy_gen: ptr 3555a4, old_body 32f644, new_body 4d4c54, struct_val: deadbeef
copy_gen: ptr 3555b0, old_body 32f66c, new_body 4d4c7c, struct_val: deadbeef
copy_gen: ptr 355820, old_body 32f694, new_body 4d4ca4, struct_val: deadbeef
Overall, I wonder if it's an alignment issue, since SPARC tends to be
much more sensitve to that than x86. I haven't looked deeply at the
code at all, but do you do anything special to ensure that the blocks
of memory you are moving around maintain their aligment?