I just applied both sets of patches to gpc to take it up to 970721 (hopefully properly) and unfortunatly, gpc still segfaults in get_uid.
After some searching of the code for gpi-hash.c, and having a good look at my code that causes gpc to crash, I realised that there is no provision for REMOVING symbols (trees?) from the hash table. I thought of looking for this because the files that cause me problems re-use parameter names or record member names.
If a tree that has been put in the hash table is ever destroyed (I don't know if this happens as I don't know the internals of gpc), it seems a pointer to the destroyed tree/hash bucket will still exist in the hash table. This could very easily be causing the invalid pointer dereferencing.
Hmm, I just tried out my previous sample file (under windows 95) and got a crash as well, so my above reasoning may be incorrect.
here is the stack dump: Exiting due to signal SIGSEGV Page fault at eip=000ee4d0, error=0004 eax=0c000000 ebx=000003f1 ecx=ff905350 edx=ec000009 esi=ff905350 edi=ff8e16a0 ebp=ff8de948 esp=ff8de944 program=C:\DJGPP\BIN\GPC1.EXE cs: sel=0117 base=82f23000 limit=ff975fff ds: sel=011f base=82f23000 limit=ff975fff es: sel=011f base=82f23000 limit=ff975fff fs: sel=00f7 base=0001d710 limit=0000ffff gs: sel=012f base=00000000 limit=ffffffff ss: sel=011f base=82f23000 limit=ff975fff
Call frame traceback EIPs: 0x000ee4d0 _get_uid+32, line 134 of gpi-hash.c 0x000ee61a _hashed_save+34, line 197 of gpi-hash.c 0x000ebf30 _store_tree+24, line 1139 of module.c 0x000ec5a3 _store_tree+1675, line 1417 of module.c 0x000ee741 _flush_suspended+133, line 246 of gpi-hash.c 0x000ed89c _create_gpi_files+576, line 2290 of module.c 0x001113ef _yyparse+31247, line 5994 of parse.c 0x000c9de2 _compile_file+1510, line 2232 of toplev.c 0x000cc1b9 _main+3221, line 3938 of toplev.c 0x00120bc6 ___crt1_startup+290
the command line uses was:gpc -O2 -o foo.o -c foo.pas
The test file is attached.
Sigh, this is getting frustrating (and probably more so for you, Peter)
Bill -- Leave others their otherness.
The following section of this message contains a file attachment prepared for transmission using the Internet MIME message format. If you are using Pegasus Mail, or any another MIME-compliant system, you should be able to save it or view it from within your mailer. If you cannot, please ask your system administrator for assistance.
---- File information ----------- File: foo.pas Date: 17 Jul 1997, 15:04 Size: 381 bytes. Type: Program-source