From: Michal Ludvig <mludvig@suse.cz>
To: Michal Ludvig <mludvig@suse.cz>
Cc: Elena Zannoni <ezannoni@redhat.com>,
GDB Patches <gdb-patches@sources.redhat.com>,
Andrew Cagney <ac131313@redhat.com>
Subject: PING: [RFA] Runtime Dwarf2 CFI engine cleanup
Date: Wed, 26 Feb 2003 15:35:00 -0000 [thread overview]
Message-ID: <3E5CDEB8.2050008@suse.cz> (raw)
In-Reply-To: <3E479B6A.30705@suse.cz>
Michal Ludvig wrote:
> Elena Zannoni wrote:
>
>> Michal Ludvig writes:
>> > Hi all,
>> > the attached is a fix for the problem described here:
>> > http://sources.redhat.com/ml/gdb/2002-12/msg00246.html
>> > > I've created a new function cleanup_cfi() in dwarf2cfi.c that
>> deletes > all CIEs and FDEs of objfiles removed later by
>> objfile_purge_solibs().
>> > So far it works fine but I don't know how should I correctly call it.
>>
>> I have tried your function, and it does fixes some weird errors which
>> occur
>> on rerun.
>> I just tried by using the hack of defining GDB_TARGET_IS_X86_64, which
>> is definitely a bad thing.
>>
>> I think that the best way is to define a gdbarch method, just like it
>> was done for gdbarch_dwarf2_build_frame_info.
>
>
> How about adding dwarf2cfi.o to all targets? When there is for example
> mipsread.o compiled into gdb on x86-64 (why? because there is no option
> to say what features a given target needs.) than dwarf2cfi.o could go
> there as well...
> I hope more and more targets will use it in the near future.
>
> The attached is a version that adds dwarf2cfi.o for all targets. If it's
> unacceptable this way I'll provide gdbarch-ed version instead. But I
> think that gdbarch_*() functions are good for the case when on different
> targets a different functions are called to do a given task (eg. read
> register). But in this case you must call cleanup_cfi() in all targets
> that use CFI. No option. Calling it shouldn't depend on setting gdbarch
> value. Instead it should depend on linking dwarf2cfi.o into the gdb.
>
>> In the patch below, you cannot use printf's. Use printf_filtered. But
>> maybe, better yet, using a warning here would be more appropriate.
>
>
> It isn't a warning, just an informational message. Now it's printed only
> when info_verbose is set.
>
>> Watch out for the non-GNU indentation and spacing.
>
>
> Reindented.
>
> OK to commit?
>
> Michal Ludvig
Could someone *please* comment on this two months old patch?
Can I at least commit the dwarf2cfi.c part (proven to be stable since
it's in use in our GDB package), so that it could eventually be
triggered by adding one single line to infcmd.c?
Without this patch the CFI engine is very unstable. Is there a reason
why not to commit it?
Ad triggering cleanup_cfi() - there are several possibilities:
1) Add dwarf2cfi.o to all targets in Makefile.in and call cleanup_cfi()
from run_command() w/o obstructions.
2) To all targets that use CFI add macro USE_DWARF2CFI to their
config/what/ever.h and wrap call to cleanup_cfi() by appropriate ifdefs.
3) Create gdbarch_whatever(_p) to call it. I don't think it's a good
idea - there is no point in setting this macro to something else or
unsetting it.
[in order of preference]
I would really like to get rid of this pending patch from my todo list.
Thanks in advance
Michal Ludvig
> ------------------------------------------------------------------------
>
> 2003-02-10 Michal Ludvig <mludvig@suse.cz>
>
> * 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
next prev parent reply other threads:[~2003-02-26 15:35 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-01-06 12:55 Michal Ludvig
2003-02-03 16:23 ` Elena Zannoni
2003-02-10 12:30 ` Michal Ludvig
2003-02-26 15:35 ` Michal Ludvig [this message]
2003-02-26 15:47 ` PING: " Daniel Jacobowitz
2003-02-26 18:20 ` Andrew Cagney
2003-02-26 18:36 ` Daniel Jacobowitz
2003-02-26 19:32 ` Andrew Cagney
2003-02-26 19:38 ` Daniel Jacobowitz
2003-02-27 8:14 ` Michal Ludvig
2003-02-27 10:15 ` Michal Ludvig
2003-02-27 14:17 ` Daniel Jacobowitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3E5CDEB8.2050008@suse.cz \
--to=mludvig@suse.cz \
--cc=ac131313@redhat.com \
--cc=ezannoni@redhat.com \
--cc=gdb-patches@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox