public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Pedro Alves <palves@redhat.com>
To: Simon Marchi <simon.marchi@polymtl.ca>
Cc: Joel Brobecker <brobecker@adacore.com>,
	Simon Marchi <simon.marchi@ericsson.com>,
	gdb-patches@sourceware.org
Subject: Re: [PATCH] Define GNULIB_NAMESPACE in unittests/string_view-selftests.c
Date: Wed, 09 May 2018 13:50:00 -0000	[thread overview]
Message-ID: <a91edf80-591b-b0ed-8f5a-23d50c9daa29@redhat.com> (raw)
In-Reply-To: <e732737f236d83f6ebb9d382b600fb25@polymtl.ca>

On 05/08/2018 09:47 PM, Simon Marchi wrote:

> Could you remind me what's the link between putting gdb in its own namespace and putting gnulib in its own namespace?  How are they related?

You can see the whole story in more detail in my C++ dogfooding talk
in last year's Caldron (around 11mins in), but the gist of it is

So late 2016 / early 2017 I looked at fixing this whole gnulib
issue with macros for good, by using gnulib's namespace support,
by putting:

 #define GNULIB_NAMESPACE gnulib

in common/common-defs.h, and then fix up the whole tree.

The problem with that is you have to adjust _all_  calls to
functions that gnulib replaces, like e.g.:

  - "printf" => "gnulib::printf"
  - "fwrite" => "gnulib::fwrite"

And it's not a small number.  After a lot of tedious hacking, I got
GDB to build on x86 GNU/Linux, see here:

  https://github.com/palves/gdb/commits/palves/cxx-gnulib-namespace

Specifically:

  https://github.com/palves/gdb/commit/bad0ab49ccc3c0de131bc6788da3703924d0903e

Note that patch has a detailed commit log as well, as I almost
posted it at the time.  But then the ugliness of having to write
(and read!) "gnulib::" all over the place put me off more and more
and eventually I caved in and looked for a better idea -- some way
to avoid those explicit "gnulib::"s.

The alternative idea was to put _all_ of gdb in a namespace
instead.

I'd argue that that's a good thing on its own, but the
connection with gnulib is that while you can't do

  using gnulib::printf;

at top level to avoid having to explicitly write the "gnulib::"
namespace throughout all the calls, because that would conflict with
the system's "printf" (it wouldn't compile), you can do that in
a namespace, like:

  namespace gdb {
    using gnulib::printf;
    ...
  }

or simpler, just do:

 #define GNULIB_NAMESPACE gdb

And with that, if all of gdb including the gnulib replacements are in
the same namespace then the calls to printf etc no longer need any
explicit "gnulib::" namespace qualifier, a plain "printf" call
calls "gdb::printf", etc.

That is the approach taken in the palves/cxx-gdb-namespace branch:

  https://github.com/palves/gdb/compare/palves/cxx-gdb-namespace

The downside of putting all of gdb in a namespace is that
gdb becomes a little harder to debug, as you now must
prefix breakpoint locations with "gdb::", like:

  (gdb) b gdb::internal_error
  (gdb) b gdb::foo_bar

... and that's what led to last year's C++ wildmatching support,
"b -qualified", tab completion improvements, etc.

So I was waiting for gdb 8.1 (at least) to be out before proposing
moving all of gdb to a namespace, in order to give folks a little
time to get comfortable with the new features, and make it
reasonable to suggest that folks upgrade their top gdb to 8.1 (a
released version) instead of to git/trunk gdb if they want to gdb
a bit more conveniently.  That's why I was wondering whether
now would be good time to propose moving forward with the
"namespace gdb" approach, since 8.1 has been out for a bit.

Thanks,
Pedro Alves

  parent reply	other threads:[~2018-05-09 13:50 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-03 21:25 Simon Marchi
2018-05-04 16:55 ` Joel Brobecker
2018-05-04 16:59   ` Joel Brobecker
2018-05-04 17:11   ` Pedro Alves
2018-05-04 17:24     ` Joel Brobecker
2018-05-08 20:47     ` Simon Marchi
2018-05-08 21:22       ` Joel Brobecker
2018-05-09 13:50       ` Pedro Alves [this message]
2018-05-09 14:00         ` Joel Brobecker
2018-05-09 15:19         ` Simon Marchi
2018-05-04 17:14   ` Simon Marchi
2018-05-04 17:20     ` Joel Brobecker

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=a91edf80-591b-b0ed-8f5a-23d50c9daa29@redhat.com \
    --to=palves@redhat.com \
    --cc=brobecker@adacore.com \
    --cc=gdb-patches@sourceware.org \
    --cc=simon.marchi@ericsson.com \
    --cc=simon.marchi@polymtl.ca \
    /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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).