2003-02-27 Michal Ludvig * config/i386/x86-64linux.mt (TDEPFILES): Remove dwarf2cfi.o (USED_DWARF2CFI): New define. * Makefile.in: Handle USED_DWARF2CFI define. * infcmd.c (run_command): Add cleanup_cfi() if USED_DWARF2CFI is defined. * dwarf2cfi.c (struct cie_unit): New fields keep, refs. (cleanup_cfi): New function. Index: config/i386/x86-64linux.mt =================================================================== RCS file: /cvs/src/src/gdb/config/i386/x86-64linux.mt,v retrieving revision 1.5 diff -u -p -r1.5 x86-64linux.mt --- config/i386/x86-64linux.mt 1 Jul 2002 22:09:52 -0000 1.5 +++ config/i386/x86-64linux.mt 27 Feb 2003 10:01:03 -0000 @@ -1,7 +1,9 @@ # Target: AMD x86-64 running GNU/Linux -TDEPFILES= x86-64-tdep.o x86-64-linux-tdep.o dwarf2cfi.o \ +TDEPFILES= x86-64-tdep.o x86-64-linux-tdep.o \ solib.o solib-svr4.o solib-legacy.o GDB_MULTI_ARCH=GDB_MULTI_ARCH_TM TM_FILE=tm-x86-64linux.h + +USED_DWARF2CFI=1 Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.257.2.5 diff -u -p -r1.257.2.5 Makefile.in --- Makefile.in 25 Nov 2002 22:05:38 -0000 1.257.2.5 +++ Makefile.in 27 Feb 2003 10:01:03 -0000 @@ -414,6 +414,12 @@ ANNOTATE_OBS = annotate.o @target_makefile_frag@ # End of host and target-dependent makefile fragments +# Make a list of linked files depending on target's defines. +ifeq ($(USED_DWARF2CFI), 1) + TDEPFILES+=dwarf2cfi.o + CFLAGS+=-DUSED_DWARF2CFI +endif + # Possibly ignore the simulator. If the simulator is being ignored, # these expand into SIM= and SIM_OBJ=, overriding the entries from # target_makefile_frag Index: infcmd.c =================================================================== RCS file: /cvs/src/src/gdb/infcmd.c,v retrieving revision 1.54.6.2 diff -u -p -r1.54.6.2 infcmd.c --- infcmd.c 25 Sep 2002 20:43:21 -0000 1.54.6.2 +++ infcmd.c 27 Feb 2003 10:01:03 -0000 @@ -390,6 +390,10 @@ Start it from the beginning? ")) clear_breakpoint_hit_counts (); +#if defined(USED_DWARF2CFI) + cleanup_cfi (); +#endif + /* Purge old solib objfiles. */ objfile_purge_solibs (); Index: dwarf2cfi.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2cfi.c,v retrieving revision 1.16.6.1 diff -u -p -r1.16.6.1 dwarf2cfi.c --- dwarf2cfi.c 3 Feb 2003 14:40:09 -0000 1.16.6.1 +++ dwarf2cfi.c 27 Feb 2003 10:01:04 -0000 @@ -54,6 +54,12 @@ struct cie_unit /* Next in chain. */ struct cie_unit *next; + + /* Keep or destroy this CIE on new run? */ + int keep; + + /* How many FDEs refer to this CIE? */ + int refs; }; /* Frame Description Entry. */ @@ -319,6 +260,90 @@ frame_state_alloc (void) return fs; } +void +cleanup_cfi (void *name) +{ + struct objfile *ofp; + struct cie_unit *cie, *cie_prev; + int fde_index = 0, fde_free = 0; + + cie = cie_chunks; + while (cie) + { + cie->refs = 0; + cie->keep = 0; + cie = cie->next; + } + + /* Mark all unwanted CIEs. */ + ALL_OBJFILES (ofp) + { + if (!(ofp->flags & OBJF_USERLOADED) && (ofp->flags & OBJF_SHARED)) + { + if (info_verbose) + printf_filtered ("\tRemoving %s...\n", ofp->name); + } + else + { + if (info_verbose) + printf_filtered ("\tKeeping %s...\n", ofp->name); + + cie = cie_chunks; + while (cie) + { + if (cie->objfile == ofp) + cie->keep = 1; + cie = cie->next; + } + } + } + + /* Remove all FDEs pointing to unwanted CIEs. */ + for (fde_index = 0, fde_free = 0; + fde_index < fde_chunks.elems; fde_index++, fde_free++) + { + if (!fde_chunks.array[fde_index]->cie_ptr->keep) + { + fde_free--; + continue; + } + else if (fde_free < fde_index) + fde_chunks.array[fde_free] = fde_chunks.array[fde_index]; + fde_chunks.array[fde_free]->cie_ptr->refs++; + } + fde_chunks.elems = fde_free; + + /* Remove all unwanted CIEs. */ + cie = cie_chunks; + cie_prev = NULL; + while (cie) + { + struct cie_unit *cie_tmp; + + if (!cie->keep || !cie->refs) + { + cie_tmp = cie; + if (cie_prev == NULL) + { + cie_chunks = cie->next; + cie = cie_chunks; + } + else + { + cie_prev->next = cie->next; + cie = cie->next; + } + /* cie_prev must remain unchanged. */ + xfree (cie_tmp); + } + else + { + cie_prev = cie; + cie = cie->next; + } + } +} + static void unwind_tmp_obstack_init (void) {