* 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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.