2003-02-10 Michal Ludvig * dwarf2cfi.c (struct cie_unit): New items 'keep' and 'refs'. (cleanup_cfi): New function. * infcmd.c (run_command): Call cleanup_cfi(). * Makefile.in: Link dwarf2cfi.[co] to all targets. * config/i386/x86-64linux.mt: Remove dwarf2cfi.o from TDEPFILES. Index: dwarf2cfi.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2cfi.c,v retrieving revision 1.31 diff -u -p -r1.31 dwarf2cfi.c --- dwarf2cfi.c 10 Feb 2003 11:50:20 -0000 1.31 +++ dwarf2cfi.c 10 Feb 2003 12:10:21 -0000 @@ -64,6 +64,12 @@ struct cie_unit struct objfile *objfile; + /* Keep or destroy this CIE on new run? */ + int keep; + + /* How many FDEs refer to this CIE? */ + int refs; + /* Next in chain. */ struct cie_unit *next; }; @@ -289,6 +295,90 @@ frame_state_alloc (void) (struct frame_state_reg *) obstack_alloc (&unwind_tmp_obstack, regs_size); memset (fs->regs.reg, 0, regs_size); 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 Index: infcmd.c =================================================================== RCS file: /cvs/src/src/gdb/infcmd.c,v retrieving revision 1.72 diff -u -p -r1.72 infcmd.c --- infcmd.c 1 Feb 2003 17:28:40 -0000 1.72 +++ infcmd.c 10 Feb 2003 12:10:21 -0000 @@ -401,6 +401,8 @@ Start it from the beginning? ")) clear_breakpoint_hit_counts (); + cleanup_cfi (); + /* Purge old solib objfiles. */ objfile_purge_solibs (); Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.328 diff -u -p -r1.328 Makefile.in --- Makefile.in 7 Feb 2003 05:33:44 -0000 1.328 +++ Makefile.in 10 Feb 2003 12:10:21 -0000 @@ -514,7 +514,7 @@ SFILES = ada-exp.y ada-lang.c ada-typepr charset.c cli-out.c coffread.c complaints.c completer.c corefile.c \ cp-abi.c cp-support.c cp-valprint.c \ dbxread.c demangle.c disasm.c doublest.c \ - dummy-frame.c dwarfread.c dwarf2read.c \ + dummy-frame.c dwarfread.c dwarf2read.c dwarf2cfi.c \ elfread.c environ.c eval.c event-loop.c event-top.c expprint.c \ f-exp.y f-lang.c f-typeprint.c f-valprint.c findvar.c frame.c \ frame-unwind.c \ @@ -835,7 +835,7 @@ COMMON_OBS = version.o blockframe.o brea gdb-events.o \ exec.o bcache.o objfiles.o minsyms.o maint.o demangle.o \ dbxread.o coffread.o elfread.o \ - dwarfread.o dwarf2read.o mipsread.o stabsread.o corefile.o \ + dwarfread.o dwarf2read.o dwarf2cfi.o mipsread.o stabsread.o corefile.o \ c-lang.o f-lang.o \ ui-out.o cli-out.o \ varobj.o wrapper.o \ Index: config/i386/x86-64linux.mt =================================================================== RCS file: /cvs/src/src/gdb/config/i386/x86-64linux.mt,v retrieving revision 1.6 diff -u -p -r1.6 x86-64linux.mt --- config/i386/x86-64linux.mt 21 Dec 2002 21:09:58 -0000 1.6 +++ config/i386/x86-64linux.mt 10 Feb 2003 12:10:21 -0000 @@ -1,6 +1,6 @@ # Target: AMD x86-64 running GNU/Linux -TDEPFILES= x86-64-tdep.o x86-64-linux-tdep.o dwarf2cfi.o \ - i386-tdep.o i387-tdep.o \ +TDEPFILES= x86-64-tdep.o x86-64-linux-tdep.o \ + i386-tdep.o i386-linux-tdep.o i387-tdep.o \ solib.o solib-svr4.o solib-legacy.o GDB_MULTI_ARCH=GDB_MULTI_ARCH_TM