unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* suppress_checking
@ 2007-10-22 15:59 Juanma Barranquero
  2007-10-23 10:38 ` suppress_checking Richard Stallman
  0 siblings, 1 reply; 13+ messages in thread
From: Juanma Barranquero @ 2007-10-22 15:59 UTC (permalink / raw)
  To: Emacs Devel

Is there any point to the variable suppress_checking, or is it leftover code?

It is defined (and initialized to 0 by default, but not otherwise
modified in any way) in alloc.c, and the only use is in lisp.h:

  /* Extra internal type checking?  */
  extern int suppress_checking;
  extern void die P_((const char *, const char *, int)) NO_RETURN;

  #ifdef ENABLE_CHECKING

  #define CHECK(check,msg) (((check) || suppress_checking		\
  			   ? (void) 0				\
  			   : die ((msg), __FILE__, __LINE__)),	\
  			  0)
  #else

  /* Produce same side effects and result, but don't complain.  */
  #define CHECK(check,msg) ((check),0)

  #endif

Now, I suppose it could perhaps be useful while debugging, but if
that's the intended use, it's undocumented and quite a bit obscure...

             Juanma

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-22 15:59 suppress_checking Juanma Barranquero
@ 2007-10-23 10:38 ` Richard Stallman
  2007-10-23 10:59   ` suppress_checking Juanma Barranquero
  0 siblings, 1 reply; 13+ messages in thread
From: Richard Stallman @ 2007-10-23 10:38 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: emacs-devel

    Is there any point to the variable suppress_checking, or is it leftover code?

Since eassert uses CHECK, this offers the possibility to turn off
eassert checking at run time.  However, eassert is no-op'd by default
at compile time, because ENABLE_CHECKING is normally not defined.

I don't see that it is useful, but I also don't see a point
in deleting it.

suppress_checking is implemented in a funny way: the expression to be
tested is computed and then ignored.  That would make sense if we were
concerned about function calls and side effects in the expression to
be tested.  However, if there were any, ENABLE_CHECKING would not work.
So we may as well test suppress_checking first.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-23 10:38 ` suppress_checking Richard Stallman
@ 2007-10-23 10:59   ` Juanma Barranquero
  2007-10-24  2:49     ` suppress_checking Richard Stallman
  0 siblings, 1 reply; 13+ messages in thread
From: Juanma Barranquero @ 2007-10-23 10:59 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel

On 10/23/07, Richard Stallman <rms@gnu.org> wrote:

> Since eassert uses CHECK, this offers the possibility to turn off
> eassert checking at run time.

Yes, that's why I said that I understood it could be useful when
debugging. My question was more like "it was put there *for*
debugging, or left by accident?". Because if it is intended for
debugging, a comment in the code would've been nice :)

> suppress_checking is implemented in a funny way: the expression to be
> tested is computed and then ignored.  That would make sense if we were
> concerned about function calls and side effects in the expression to
> be tested.  However, if there were any, ENABLE_CHECKING would not work.
> So we may as well test suppress_checking first.

AFAICS, the !ENABLE_CHECKING version of CHECK does evaluate (check)
too, so the side effects are intended.

On the other hand, the !ENABLE_CHECKING version of CHECK is not used
anywhere. CHECK is only used in eassert (in lisp.h) and
NULL_INTERVAL_P (in intervals.h), and always when ENABLE_CHECKING is
defined.

             Juanma

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-23 10:59   ` suppress_checking Juanma Barranquero
@ 2007-10-24  2:49     ` Richard Stallman
  2007-10-24  8:56       ` suppress_checking Juanma Barranquero
  0 siblings, 1 reply; 13+ messages in thread
From: Richard Stallman @ 2007-10-24  2:49 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: emacs-devel

    AFAICS, the !ENABLE_CHECKING version of CHECK does evaluate (check)
    too, so the side effects are intended.

You are right, as regards CHECK by itself.

However, eassert is what the code really uses, and that is a different
story.  When !ENABLE_CHECKING, eassert does not compute the condition
expression at all.

So we might as well make CHECK not compute the condition expression
either.  Which means that it might as well test suppress_checking
first.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-24  2:49     ` suppress_checking Richard Stallman
@ 2007-10-24  8:56       ` Juanma Barranquero
  2007-10-29 17:51         ` suppress_checking Ken Raeburn
  0 siblings, 1 reply; 13+ messages in thread
From: Juanma Barranquero @ 2007-10-24  8:56 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel

On 10/24/07, Richard Stallman <rms@gnu.org> wrote:

> So we might as well make CHECK not compute the condition expression
> either.  Which means that it might as well test suppress_checking
> first.

It would be useful to know what was the intention with
suppress_checking, and how is used (if someone does use it indeed).
Currently there's a difference between

  #undef ENABLE_CHECKING

and

  #define ENABLE_CHECKING 1
  suppress_checking = 1;

because in the latter case, the check tests are still executed, though
its return value is discarded. Perhaps that difference was intended.

             Juanma

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-24  8:56       ` suppress_checking Juanma Barranquero
@ 2007-10-29 17:51         ` Ken Raeburn
  2007-10-29 18:16           ` suppress_checking Ken Raeburn
                             ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Ken Raeburn @ 2007-10-29 17:51 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: rms, emacs-devel

On Oct 24, 2007, at 04:56, Juanma Barranquero wrote:
> On 10/24/07, Richard Stallman <rms@gnu.org> wrote:
>> So we might as well make CHECK not compute the condition expression
>> either.  Which means that it might as well test suppress_checking
>> first.
>
> It would be useful to know what was the intention with
> suppress_checking, and how is used (if someone does use it indeed).
> Currently there's a difference between
>
>   #undef ENABLE_CHECKING
>
> and
>
>   #define ENABLE_CHECKING 1
>   suppress_checking = 1;
>
> because in the latter case, the check tests are still executed, though
> its return value is discarded. Perhaps that difference was intended.
>
>              Juanma

My fault... as I recall, the idea was that the checking could be  
switched on or off at run time, maybe at a breakpoint, or by tweaking  
the executable with gdb, without requiring recompilation.  Doing the  
test of suppress_checking after evaluating the condition meant that  
aside from possibly killing the process, the side effects would be  
the same either way.

Currently CHECK is only used if ENABLE_CHECKING is defined, but that  
wasn't always the case.  When the code was checked in,  
NULL_INTERVAL_P and eassert both unconditionally used CHECK; since  
then, both have been changed so that the possible side effects of  
enabling the checking code are different from running without it.  In  
the eassert case, it looks like Gerd made that change a couple months  
after I checked the code in.

Since CHECK itself just evaluates the test and does nothing with it  
if ENABLE_CHECKING is not defined, assuming you have a decent  
optimizing compiler, the main benefit in conditionalizing the other  
macros is if you think there may be side effects in the arguments,  
and you care more about the performance than keeping similarity of  
behavior when the debugging code is enabled.  Given that XSTRING,  
etc., all call eassert to verify the type before extracting the  
pointer (or other) value, there's a good chance that there are side  
effects in some argument somewhere, so I guess a related question is  
whether that's okay, or we want the X* macro arguments to be side- 
effect-free to improve debugging.  I'll also note that the HAVE_SHM  
version of XPNTR (which we might actually not be using any more?)  
evaluates its argument more than once in non-ENABLE_CHECKING mode.

The changes I was experimenting with at the time were some  
significant low-level changes, and I was trying to add the type  
checking to XSTRING and friends, but evaluate separately whether  
multiple evaluations of arguments were the sources of problems I was  
seeing (versus bugs in the low-level changes I was trying to  
implement).  So getting the double evaluations, independently of  
doing the type checking, was useful at the time.

(As for ENABLE_CHECKING not being defined, I think I offered once to  
create an --enable- option for it, as I think the GCC folks have done  
since, but there wasn't much interest at the time.  Still, it's easy  
enough to tweak sources or set flags through configure.)

Ken

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-29 17:51         ` suppress_checking Ken Raeburn
@ 2007-10-29 18:16           ` Ken Raeburn
  2007-10-29 22:49             ` suppress_checking Juanma Barranquero
  2007-10-29 19:06           ` suppress_checking Stefan Monnier
  2007-10-30  5:24           ` suppress_checking Richard Stallman
  2 siblings, 1 reply; 13+ messages in thread
From: Ken Raeburn @ 2007-10-29 18:16 UTC (permalink / raw)
  To: emacs-devel

I've just added some comments for the CHECK macro in its current  
form, based on what I wrote up in my last email.

Ken

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-29 17:51         ` suppress_checking Ken Raeburn
  2007-10-29 18:16           ` suppress_checking Ken Raeburn
@ 2007-10-29 19:06           ` Stefan Monnier
  2007-10-29 20:47             ` suppress_checking Ken Raeburn
  2007-10-30  5:24           ` suppress_checking Richard Stallman
  2 siblings, 1 reply; 13+ messages in thread
From: Stefan Monnier @ 2007-10-29 19:06 UTC (permalink / raw)
  To: Ken Raeburn; +Cc: Juanma Barranquero, rms, emacs-devel

> is enabled.  Given that XSTRING,  etc., all call eassert to verify the type
> before extracting the  pointer (or other) value, there's a good chance that
> there are side  effects in some argument somewhere, so I guess a related

I always run with -DENABLE_CHECKING and I do know of one significant
side-effect: it requires a bit more than 1.3MB of purespace (as opposed
1.17MB without it).


        Stefan

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-29 19:06           ` suppress_checking Stefan Monnier
@ 2007-10-29 20:47             ` Ken Raeburn
  0 siblings, 0 replies; 13+ messages in thread
From: Ken Raeburn @ 2007-10-29 20:47 UTC (permalink / raw)
  To: emacs-devel

On Oct 29, 2007, at 15:06, Stefan Monnier wrote:
> I always run with -DENABLE_CHECKING and I do know of one significant
> side-effect: it requires a bit more than 1.3MB of purespace (as  
> opposed
> 1.17MB without it).

Interesting.

If we care, it would be possible to go after certain side effects  
like this and rewrite the original code so that the XSTRING etc  
macros are always invoked with side-effect-free expressions.  I can  
think of at least three or four ways to tackle the problem, with  
varying degrees of difficulty.  The question is, do we care....

Ken

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-29 18:16           ` suppress_checking Ken Raeburn
@ 2007-10-29 22:49             ` Juanma Barranquero
  0 siblings, 0 replies; 13+ messages in thread
From: Juanma Barranquero @ 2007-10-29 22:49 UTC (permalink / raw)
  To: Ken Raeburn; +Cc: emacs-devel

On 10/29/07, Ken Raeburn <raeburn@raeburn.org> wrote:

> I've just added some comments for the CHECK macro in its current
> form, based on what I wrote up in my last email.

Thanks for the detailed explanation and the comment in lisp.h.

             Juanma

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-29 17:51         ` suppress_checking Ken Raeburn
  2007-10-29 18:16           ` suppress_checking Ken Raeburn
  2007-10-29 19:06           ` suppress_checking Stefan Monnier
@ 2007-10-30  5:24           ` Richard Stallman
  2007-11-01  3:25             ` suppress_checking Ken Raeburn
  2 siblings, 1 reply; 13+ messages in thread
From: Richard Stallman @ 2007-10-30  5:24 UTC (permalink / raw)
  To: Ken Raeburn; +Cc: lekktu, emacs-devel

    Since CHECK itself just evaluates the test and does nothing with it  
    if ENABLE_CHECKING is not defined, assuming you have a decent  
    optimizing compiler,

We're interested in GCC, not particularly in "decent optimizing
compilers".  Does GCC in fact optimize these cases?

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-10-30  5:24           ` suppress_checking Richard Stallman
@ 2007-11-01  3:25             ` Ken Raeburn
  2007-11-01 19:04               ` suppress_checking Richard Stallman
  0 siblings, 1 reply; 13+ messages in thread
From: Ken Raeburn @ 2007-11-01  3:25 UTC (permalink / raw)
  To: rms; +Cc: lekktu, emacs-devel

On Oct 30, 2007, at 1:24, Richard Stallman wrote:
>     Since CHECK itself just evaluates the test and does nothing  
> with it
>     if ENABLE_CHECKING is not defined, assuming you have a decent
>     optimizing compiler,
>
> We're interested in GCC, not particularly in "decent optimizing
> compilers".  Does GCC in fact optimize these cases?

Certainly GCC would be the main one I'd care about performance-wise,  
and as far as I'm concerned sets the standard for "decent optimizing  
compilers", but I've heard people do sometimes use other compilers. :-)

I haven't actually checked lately if GCC optimizes these cases, but  
given that the test is generally extracting some bits from the object  
value and comparing against a constant, or maybe doing that and then  
fetching a few bits from a computed address to compare against  
another constant, it'd be a real bug in GCC if it failed to optimize  
doing this twice in a row with the same input value and without  
intervening memory writes.  But it is possible, at least in theory,  
that some regression might cause some version of GCC to fail to  
combine the identical calculations, and that it might even escape  
notice until after a release went out.

If there are intervening memory writes or nontrivial function calls,  
and the test in question requires examining the pointed-to values  
(e.g., for misc or vector subtypes), and GCC's alias analysis (which  
is constantly being improved) can't prove they're disjoint locations,  
there would be extra reads from memory, and the associated  
comparisons, unused branches to calls to the "die" function, etc.

...  Okay, I just ran a quick test on my Mac (powerpc, Apple-flavored  
gcc 4.0.1).  The disassembly of a test function that included "if  
(STRINGP (s)) return SDATA (s);", where "s" was an argument to the  
function, showed the test was performed once, and the "die" call  
wasn't present at all.

Ken

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: suppress_checking
  2007-11-01  3:25             ` suppress_checking Ken Raeburn
@ 2007-11-01 19:04               ` Richard Stallman
  0 siblings, 0 replies; 13+ messages in thread
From: Richard Stallman @ 2007-11-01 19:04 UTC (permalink / raw)
  To: Ken Raeburn; +Cc: lekktu, emacs-devel

    > We're interested in GCC, not particularly in "decent optimizing
    > compilers".  Does GCC in fact optimize these cases?

    Certainly GCC would be the main one I'd care about performance-wise,  
    and as far as I'm concerned sets the standard for "decent optimizing  
    compilers", but I've heard people do sometimes use other compilers. :-)

Our priorities do not servo on what people use.  Emacs is part of the
GNU system, so the GNU system is the platform that carries the most
weight for our decisions.  Thus, if a certain choice is bad for use
with GCC and good for use with every other compiler, we won't do it.
That's the way every GNU package should be developed.

    ...  Okay, I just ran a quick test on my Mac (powerpc, Apple-flavored  
    gcc 4.0.1).  The disassembly of a test function that included "if  
    (STRINGP (s)) return SDATA (s);", where "s" was an argument to the  
    function, showed the test was performed once, and the "die" call  
    wasn't present at all.

That is good.

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2007-11-01 19:04 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-22 15:59 suppress_checking Juanma Barranquero
2007-10-23 10:38 ` suppress_checking Richard Stallman
2007-10-23 10:59   ` suppress_checking Juanma Barranquero
2007-10-24  2:49     ` suppress_checking Richard Stallman
2007-10-24  8:56       ` suppress_checking Juanma Barranquero
2007-10-29 17:51         ` suppress_checking Ken Raeburn
2007-10-29 18:16           ` suppress_checking Ken Raeburn
2007-10-29 22:49             ` suppress_checking Juanma Barranquero
2007-10-29 19:06           ` suppress_checking Stefan Monnier
2007-10-29 20:47             ` suppress_checking Ken Raeburn
2007-10-30  5:24           ` suppress_checking Richard Stallman
2007-11-01  3:25             ` suppress_checking Ken Raeburn
2007-11-01 19:04               ` suppress_checking Richard Stallman

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).