Frank Heckenbach wrote:
+#ifndef EGCS97 newlevel->shared_decl_lang_specific = (struct lang_decl *) xmalloc (sizeof (*(newlevel->shared_decl_lang_specific))); #else newlevel->shared_decl_lang_specific = (struct lang_decl *) ggc_alloc (sizeof (*(newlevel->shared_decl_lang_specific)));
BTW, the same change could perhaps be made in line 315 above. But as I can't test it ATM, I better no do it. It's probably not very important there, and if 3.2 is dropped after integrating the preprocessor, it won't matter much in the long run anyway.
AFAICS the code is correct (for 3.2) now: we allocate binding level with xmalloc in pushlevel and we free it in poplevel. We could use `ggc_alloc', mark it and forget free. The patch below is doing that and apparently works, but I do not know if it worth switching to garbage collector here (if you would like to install the patch I can do more testing).
--- p.pp/declarations.c Fri Apr 1 20:57:29 2005 +++ p/declarations.c Fri Apr 1 20:53:30 2005 @@ -312,7 +312,7 @@ void pushlevel (int transparent) { -#ifndef GCC_3_3 +#ifndef EGCS97 struct binding_level *newlevel = (struct binding_level *) xmalloc (sizeof (*newlevel)); #else struct binding_level *newlevel = (struct binding_level *) ggc_alloc (sizeof (*newlevel)); @@ -328,7 +328,7 @@ } else { -#ifndef GCC_3_3 +#ifndef EGCS97 newlevel->shared_decl_lang_specific = (struct lang_decl *) xmalloc (sizeof (*(newlevel->shared_decl_lang_specific))); #else newlevel->shared_decl_lang_specific = (struct lang_decl *) ggc_alloc (sizeof (*(newlevel->shared_decl_lang_specific))); @@ -455,7 +455,7 @@ else if (level->blocks) current_binding_level->blocks = chainon (current_binding_level->blocks, level->blocks);
-#ifndef GCC_3_3 +#ifndef EGCS97 free (level); #endif
@@ -1585,6 +1585,7 @@ ggc_mark_tree (level->blocks); ggc_mark_tree (level->this_block); ggc_mark (level->shared_decl_lang_specific); + ggc_mark (level); } } #endif