public inbox for libstdc++@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jonathan Wakely <jwakely@redhat.com>
To: "François Dumont" <frs.dumont@gmail.com>
Cc: "libstdc++@gcc.gnu.org" <libstdc++@gcc.gnu.org>,
	gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] Use _GLIBCXX_ASSERTIONS as _GLIBCXX_DEBUG light
Date: Thu, 3 Jun 2021 13:31:27 +0100	[thread overview]
Message-ID: <YLjLn5U7WYbvx/Bc@redhat.com> (raw)
In-Reply-To: <6ccc9e9e-af8b-fd06-4ad3-4bc021aa364e@gmail.com>

On 27/05/21 19:37 +0200, François Dumont via Libstdc++ wrote:
>We have been talking for a long time of a debug mode with less impact 
>on performances.

We already have it, that's what _GLIBCXX_ASSERTIONS already is :-)

>I propose to simply use the existing _GLIBCXX_ASSERTIONS macro.
>
>    libstdc++: [_GLIBCXX_ASSERTIONS] Activate basic debug checks
>
>    Use _GLIBCXX_ASSERTIONS as a _GLIBCXX_DEBUG light mode. When 
>defined it activates
>    all _GLIBCXX_DEBUG checks but skipping those requiring to loop 
>through the iterator
>    range unless in case of constexpr.
>
>    libstdc++-v3/ChangeLog:
>
>            * include/debug/debug.h [_GLIBCXX_ASSERTIONS]: Define 
>debug macros non-empty.
>            * include/debug/helper_functions.h: Cleanup comment about 
>removed _Iter_base.
>            * include/debug/functions.h (__skip_debug_runtime_check): 
>New, returns false if
>            _GLIBCXX_DEBUG is defined or if constant evaluated.
>            (__check_sorted, __check_partitioned_lower, 
>__check_partitioned_upper): Use latter.
>
>Tested under Linux x64.
>
>Ok to commit ?
>
>François
>

>diff --git a/libstdc++-v3/include/debug/debug.h b/libstdc++-v3/include/debug/debug.h
>index 116f2f023e2..2e6ce1c8a93 100644
>--- a/libstdc++-v3/include/debug/debug.h
>+++ b/libstdc++-v3/include/debug/debug.h
>@@ -61,7 +61,7 @@ namespace __gnu_debug
>     struct _Safe_iterator;
> }
> 
>-#ifndef _GLIBCXX_DEBUG
>+#ifndef _GLIBCXX_ASSERTIONS
> 
> # define __glibcxx_requires_cond(_Cond,_Msg)
> # define __glibcxx_requires_valid_range(_First,_Last)
>diff --git a/libstdc++-v3/include/debug/functions.h b/libstdc++-v3/include/debug/functions.h
>index 6cac11f2abd..ee0eb877568 100644
>--- a/libstdc++-v3/include/debug/functions.h
>+++ b/libstdc++-v3/include/debug/functions.h
>@@ -48,6 +48,25 @@ namespace __gnu_debug
>   template<typename _Sequence>
>     struct _Is_contiguous_sequence : std::__false_type { };
> 
>+  _GLIBCXX20_CONSTEXPR

Should this be simply _GLIBCXX_CONSTEXPR so that it can be constexpr
in C++14 mode too? Or are there are never any debug checks in
functions that are already constexpr in C++14 or C++17?

>+  inline bool
>+  __skip_debug_runtime_check()
>+  {
>+    // We could be here while only _GLIBCXX_ASSERTIONS has been defined.
>+    // In this case we skip expensive runtime checks, constexpr will still
>+    // be checked.
>+    return
>+#ifndef _GLIBCXX_DEBUG
>+# if _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
>+      !__builtin_is_constant_evaluated();
>+# else
>+      true;
>+# endif
>+#else
>+      false;
>+#endif

I think this would be simpler without the nesting, and without the
preprocessor checks halfway through the return statement:

#ifdef _GLIBCXX_DEBUG
     return false;
#elif _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
     return !__builtin_is_constant_evaluated();
#else
     return true;
#endif


>+  }
>+
>   /* Checks that [first, last) is a valid range, and then returns
>    * __first. This routine is useful when we can't use a separate
>    * assertion statement because, e.g., we are in a constructor.
>@@ -260,8 +279,9 @@ namespace __gnu_debug
>     inline bool
>     __check_sorted(const _InputIterator& __first, const _InputIterator& __last)
>     {
>-      return __check_sorted_aux(__first, __last,
>-				std::__iterator_category(__first));
>+      return __skip_debug_runtime_check()
>+	|| __check_sorted_aux(__first, __last,
>+			      std::__iterator_category(__first));

Currently this function is never called at all ifndef _GLIBCXX_DEBUG.
With this change, it's going to be present for _GLIBCXX_ASSERTIONS,
and if it isn't inlined it's going to explode the code size.

Some linux distros are already building the entire distro with
_GLIBCXX_ASSERTIONS so I think we need to be quite careful about this
kind of large change affecting every algo.

So maybe we shouldn't enable these checks via _GLIBCXX_ASSERTIONS, but
a new macro.


  parent reply	other threads:[~2021-06-03 12:31 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-27 17:37 François Dumont
2021-05-31 17:17 ` François Dumont
2021-06-03 12:31 ` Jonathan Wakely [this message]
2021-06-07  4:25   ` François Dumont
2021-08-06 14:52     ` François Dumont
2021-08-08 19:34       ` François Dumont
2021-08-23  5:01         ` François Dumont

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=YLjLn5U7WYbvx/Bc@redhat.com \
    --to=jwakely@redhat.com \
    --cc=frs.dumont@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=libstdc++@gcc.gnu.org \
    /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).