unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Emacs build fails [MSYS2/MINGW64]
@ 2019-04-28 15:37 Angelo Graziosi
  2019-04-28 16:10 ` Paul Eggert
                   ` (2 more replies)
  0 siblings, 3 replies; 20+ messages in thread
From: Angelo Graziosi @ 2019-04-28 15:37 UTC (permalink / raw)
  To: emacs-devel

Starting with this commit:

Paul Eggert :
Mark _Noreturn error functions as cold
2019-04-18 00:35:18

the build of Emacs up to master (the last I tried is 75ee20364) fails (bootstrap-emacs.pdmp SEGMENT FAULT). 

The last commit which builds is

YAMAMOTO Mitsuharu :
src/ftcrfont.c (ftcrfont_glyph_extents): Fix last change
2019-04-18 11:30:17

I have found this with a binary search using the tarballs from http://git.savannah.gnu.org/cgit/emacs.git/snapshot.

This seems to affect only Windows build (MSYS2/MINGW64) because master builds on GNU/Linux Mint.

To reproduce, update your MSYS2 installation (pacman -Syu) and if you have ImageMagick installed, add '--without-imagemagick' to 'configure' otherwise it fails at compile time. 

In a MINGW64 shell:

  wget http://git.savannah.gnu.org/cgit/emacs.git/snapshot/emacs-master.tar.gz
  tar -xof emacs-master.tar.gz
  cd emacs-master
  ./autogen.sh
  ./configure [--without-imagemagick]
  make
  [...]
  Loading c:/msys64/tmp/emacs-master/lisp/emacs-lisp/lisp-mode.el (source)...
  Loading c:/msys64/tmp/emacs-master/lisp/progmodes/elisp-mode.el (source)...
  make[1]: *** [Makefile:808: bootstrap-emacs.pdmp] Segmentation fault
  make[1]: uscita dalla directory "/tmp/emacs-master/src"
  make: *** [Makefile:423: src] Error 2


Ciao,
 Angelo.



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 15:37 Emacs build fails [MSYS2/MINGW64] Angelo Graziosi
@ 2019-04-28 16:10 ` Paul Eggert
  2019-04-28 16:43   ` Angelo Graziosi
  2019-04-29 11:53   ` Angelo Graziosi
  2019-04-28 16:21 ` Eli Zaretskii
  2019-04-28 17:46 ` Stephen Leake
  2 siblings, 2 replies; 20+ messages in thread
From: Paul Eggert @ 2019-04-28 16:10 UTC (permalink / raw)
  To: Angelo Graziosi; +Cc: emacs-devel

Angelo Graziosi wrote:
> Starting with this commit:
> 
> Paul Eggert :
> Mark _Noreturn error functions as cold
> 2019-04-18 00:35:18
> 
> the build of Emacs up to master (the last I tried is 75ee20364) fails (bootstrap-emacs.pdmp SEGMENT FAULT).

That's odd, since adding __attribute__ ((cold)) should affect only performance. 
If it causes a core dump, that suggests that there is a bug either somewhere 
else in Emacs (which __attribute__ ((cold)) happens to tickle) or in the 
compiler. Can you reproduce the problem when compiling with '-g3 -O0 -gdwarf-4' 
and get a backtrace, as suggested in etc/DEBUG?



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 15:37 Emacs build fails [MSYS2/MINGW64] Angelo Graziosi
  2019-04-28 16:10 ` Paul Eggert
@ 2019-04-28 16:21 ` Eli Zaretskii
  2019-04-28 16:41   ` Angelo Graziosi
  2019-04-28 17:46 ` Stephen Leake
  2 siblings, 1 reply; 20+ messages in thread
From: Eli Zaretskii @ 2019-04-28 16:21 UTC (permalink / raw)
  To: Angelo Graziosi; +Cc: emacs-devel

> Date: Sun, 28 Apr 2019 17:37:44 +0200 (CEST)
> From: Angelo Graziosi <angelo.g0@libero.it>
> 
> To reproduce, update your MSYS2 installation (pacman -Syu) and if you have ImageMagick installed, add '--without-imagemagick' to 'configure' otherwise it fails at compile time. 

Please also show how it fails at compile time, we would want to fix
that part as well.

> In a MINGW64 shell:
> 
>   wget http://git.savannah.gnu.org/cgit/emacs.git/snapshot/emacs-master.tar.gz
>   tar -xof emacs-master.tar.gz
>   cd emacs-master
>   ./autogen.sh
>   ./configure [--without-imagemagick]
>   make
>   [...]
>   Loading c:/msys64/tmp/emacs-master/lisp/emacs-lisp/lisp-mode.el (source)...
>   Loading c:/msys64/tmp/emacs-master/lisp/progmodes/elisp-mode.el (source)...
>   make[1]: *** [Makefile:808: bootstrap-emacs.pdmp] Segmentation fault
>   make[1]: uscita dalla directory "/tmp/emacs-master/src"
>   make: *** [Makefile:423: src] Error 2

Thanks.  But please in the future report bugs to the bug tracker using
"M-x report-emacs-bug RET".



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 16:21 ` Eli Zaretskii
@ 2019-04-28 16:41   ` Angelo Graziosi
  2019-04-28 17:30     ` Eli Zaretskii
  2019-04-29 14:54     ` Eli Zaretskii
  0 siblings, 2 replies; 20+ messages in thread
From: Angelo Graziosi @ 2019-04-28 16:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel


> Il 28 aprile 2019 alle 18.21 Eli Zaretskii <eliz@gnu.org> ha scritto:
> 
> 
> > Date: Sun, 28 Apr 2019 17:37:44 +0200 (CEST)
> > From: Angelo Graziosi <angelo.g0@libero.it>
> > 
> > To reproduce, update your MSYS2 installation (pacman -Syu) and if you have ImageMagick installed, add '--without-imagemagick' to 'configure' otherwise it fails at compile time. 
> 
> Please also show how it fails at compile time, we would want to fix
> that part as well.

[...]
CCLD     temacs.exe
image.o:image.c:(.data+0x60): undefined reference to `init_imagemagick_functions'
collect2.exe: error: ld returned 1 exit status
make[1]: *** [Makefile:643: temacs.exe] Error 1


> 
> > In a MINGW64 shell:
> > 
> >   wget http://git.savannah.gnu.org/cgit/emacs.git/snapshot/emacs-master.tar.gz
> >   tar -xof emacs-master.tar.gz
> >   cd emacs-master
> >   ./autogen.sh
> >   ./configure [--without-imagemagick]
> >   make
> >   [...]
> >   Loading c:/msys64/tmp/emacs-master/lisp/emacs-lisp/lisp-mode.el (source)...
> >   Loading c:/msys64/tmp/emacs-master/lisp/progmodes/elisp-mode.el (source)...
> >   make[1]: *** [Makefile:808: bootstrap-emacs.pdmp] Segmentation fault
> >   make[1]: uscita dalla directory "/tmp/emacs-master/src"
> >   make: *** [Makefile:423: src] Error 2
> 
> Thanks.  But please in the future report bugs to the bug tracker using
> "M-x report-emacs-bug RET".

I don't see how.. I am non inside Emacs when building a new Emacs... I don't think MinTTY understands that...

Any way, with

  CFLAGS="-g3 -O0 -gdwarf-4" ./configure ...

as suggested by Paul seems to work: it does not fails...



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 16:10 ` Paul Eggert
@ 2019-04-28 16:43   ` Angelo Graziosi
  2019-04-29 11:53   ` Angelo Graziosi
  1 sibling, 0 replies; 20+ messages in thread
From: Angelo Graziosi @ 2019-04-28 16:43 UTC (permalink / raw)
  To: Paul Eggert; +Cc: emacs-devel


> Il 28 aprile 2019 alle 18.10 Paul Eggert <eggert@cs.ucla.edu> ha scritto:
> 
> 
> Angelo Graziosi wrote:
> > Starting with this commit:
> > 
> > Paul Eggert :
> > Mark _Noreturn error functions as cold
> > 2019-04-18 00:35:18
> > 
> > the build of Emacs up to master (the last I tried is 75ee20364) fails (bootstrap-emacs.pdmp SEGMENT FAULT).
> 
> That's odd, since adding __attribute__ ((cold)) should affect only performance. 
> If it causes a core dump, that suggests that there is a bug either somewhere 
> else in Emacs (which __attribute__ ((cold)) happens to tickle) or in the 
> compiler. Can you reproduce the problem when compiling with '-g3 -O0 -gdwarf-4' 
> and get a backtrace, as suggested in etc/DEBUG?

No, see my replay to Eli...



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 16:41   ` Angelo Graziosi
@ 2019-04-28 17:30     ` Eli Zaretskii
  2019-04-28 21:22       ` Angelo Graziosi
  2019-04-28 21:24       ` Angelo Graziosi
  2019-04-29 14:54     ` Eli Zaretskii
  1 sibling, 2 replies; 20+ messages in thread
From: Eli Zaretskii @ 2019-04-28 17:30 UTC (permalink / raw)
  To: Angelo Graziosi; +Cc: emacs-devel

> Date: Sun, 28 Apr 2019 18:41:24 +0200 (CEST)
> From: Angelo Graziosi <angelo.g0@libero.it>
> Cc: emacs-devel@gnu.org
> 
> > Thanks.  But please in the future report bugs to the bug tracker using
> > "M-x report-emacs-bug RET".
> 
> I don't see how.. I am non inside Emacs when building a new Emacs... I don't think MinTTY understands that...

It doesn't have to be from the same Emacs which crashes, it can be a
different version, if the problematic version cannot be built.



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 15:37 Emacs build fails [MSYS2/MINGW64] Angelo Graziosi
  2019-04-28 16:10 ` Paul Eggert
  2019-04-28 16:21 ` Eli Zaretskii
@ 2019-04-28 17:46 ` Stephen Leake
  2019-04-29 14:56   ` Eli Zaretskii
  2 siblings, 1 reply; 20+ messages in thread
From: Stephen Leake @ 2019-04-28 17:46 UTC (permalink / raw)
  To: emacs-devel

Angelo Graziosi <angelo.g0@libero.it> writes:

> Starting with this commit:
>
> Paul Eggert :
> Mark _Noreturn error functions as cold
> 2019-04-18 00:35:18
>
> the build of Emacs up to master (the last I tried is 75ee20364) fails (bootstrap-emacs.pdmp SEGMENT FAULT). 
>
> To reproduce, update your MSYS2 installation (pacman -Syu) and if you
> have ImageMagick installed, add '--without-imagemagick' to 'configure'
> otherwise it fails at compile time. 

I'm also using MSYS2/MINGW64, and building master works for me.

I have not updated mingw64 gcc in a while, so it seems a recent update
to that causes this problem. I have gcc 7.3.0; what do you have?

-- 
-- Stephe



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 17:30     ` Eli Zaretskii
@ 2019-04-28 21:22       ` Angelo Graziosi
  2019-04-28 21:24       ` Angelo Graziosi
  1 sibling, 0 replies; 20+ messages in thread
From: Angelo Graziosi @ 2019-04-28 21:22 UTC (permalink / raw)
  To: emacs-devel

Stephen Leake wrote:
> I have not updated mingw64 gcc in a while, so it seems a recent update
> to that causes this problem. I have gcc 7.3.0

Indeed I wrote to update MSYS2 to reproduce the issue... mingw-w64-gcc is now 8.3..



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 17:30     ` Eli Zaretskii
  2019-04-28 21:22       ` Angelo Graziosi
@ 2019-04-28 21:24       ` Angelo Graziosi
  2019-04-29  2:29         ` Eli Zaretskii
  1 sibling, 1 reply; 20+ messages in thread
From: Angelo Graziosi @ 2019-04-28 21:24 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel


> Il 28 aprile 2019 alle 19.30 Eli Zaretskii <eliz@gnu.org> ha scritto:
> 
> 
> > Date: Sun, 28 Apr 2019 18:41:24 +0200 (CEST)
> > From: Angelo Graziosi <angelo.g0@libero.it>
> > Cc: emacs-devel@gnu.org
> > 
> > > Thanks.  But please in the future report bugs to the bug tracker using
> > > "M-x report-emacs-bug RET".
> > 
> > I don't see how.. I am non inside Emacs when building a new Emacs... I don't think MinTTY understands that...
> 
> It doesn't have to be from the same Emacs which crashes, it can be a
> different version, if the problematic version cannot be built.

but the working copy here (built on March 30) has a different configuration.. I wonted to reproduce the issu in the simplest manner: ./configure && make..



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 21:24       ` Angelo Graziosi
@ 2019-04-29  2:29         ` Eli Zaretskii
  0 siblings, 0 replies; 20+ messages in thread
From: Eli Zaretskii @ 2019-04-29  2:29 UTC (permalink / raw)
  To: Angelo Graziosi; +Cc: emacs-devel

> Date: Sun, 28 Apr 2019 23:24:55 +0200 (CEST)
> From: Angelo Graziosi <angelo.g0@libero.it>
> Cc: emacs-devel@gnu.org
> 
> > It doesn't have to be from the same Emacs which crashes, it can be a
> > different version, if the problematic version cannot be built.
> 
> but the working copy here (built on March 30) has a different configuration.. I wonted to reproduce the issu in the simplest manner: ./configure && make..

That's okay: it's the best you can do when the problematic
configuration doesn't build.

The main reason for my request is to have the bugs recorded and
discussed on the bug forum, where they belong.



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 16:10 ` Paul Eggert
  2019-04-28 16:43   ` Angelo Graziosi
@ 2019-04-29 11:53   ` Angelo Graziosi
  2019-04-29 12:49     ` martin rudalics
  1 sibling, 1 reply; 20+ messages in thread
From: Angelo Graziosi @ 2019-04-29 11:53 UTC (permalink / raw)
  To: Paul Eggert; +Cc: emacs-devel


> Il 28 aprile 2019 alle 18.10 Paul Eggert <eggert@cs.ucla.edu> ha scritto:
> 
> 
> Angelo Graziosi wrote:
> > Starting with this commit:
> > 
> > Paul Eggert :
> > Mark _Noreturn error functions as cold
> > 2019-04-18 00:35:18
> > 
> > the build of Emacs up to master (the last I tried is 75ee20364) fails (bootstrap-emacs.pdmp SEGMENT FAULT).
> 
> That's odd, since adding __attribute__ ((cold)) should affect only performance. 
> If it causes a core dump, that suggests that there is a bug either somewhere 
> else in Emacs (which __attribute__ ((cold)) happens to tickle) or in the 
> compiler. Can you reproduce the problem when compiling with '-g3 -O0 -gdwarf-4' 
> and get a backtrace, as suggested in etc/DEBUG?

Just for completeness...

It seems that it is the optimization flag which causes the issue. Using "-O0" on place of "-O2" or "-O3" in my script fixes the issue...



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-29 11:53   ` Angelo Graziosi
@ 2019-04-29 12:49     ` martin rudalics
  2019-04-29 14:53       ` Eli Zaretskii
  0 siblings, 1 reply; 20+ messages in thread
From: martin rudalics @ 2019-04-29 12:49 UTC (permalink / raw)
  To: Angelo Graziosi, Paul Eggert; +Cc: emacs-devel

 > It seems that it is the optimization flag which causes the issue. Using "-O0" on place of "-O2" or "-O3" in my script fixes the issue...

Same here.  See also Bug#35410 for different behaviors of O3 and O0
builds with gcc 7.3.0 32-bit builds using MSYS2.

martin



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-29 12:49     ` martin rudalics
@ 2019-04-29 14:53       ` Eli Zaretskii
  2019-04-29 19:38         ` Paul Eggert
  0 siblings, 1 reply; 20+ messages in thread
From: Eli Zaretskii @ 2019-04-29 14:53 UTC (permalink / raw)
  To: martin rudalics; +Cc: eggert, angelo.g0, emacs-devel

> From: martin rudalics <rudalics@gmx.at>
> Date: Mon, 29 Apr 2019 14:49:42 +0200
> Cc: emacs-devel@gnu.org
> 
>  > It seems that it is the optimization flag which causes the issue. Using "-O0" on place of "-O2" or "-O3" in my script fixes the issue...
> 
> Same here.  See also Bug#35410 for different behaviors of O3 and O0
> builds with gcc 7.3.0 32-bit builds using MSYS2.

So GCC 7.x might also have problems with 'cold'...

I can confirm that building with MinGW GCC 8.2.0 and -O2 causes
crashes in several places during the bootstrap.  The crashes that I
saw are different from what Angelo reported, and are also different
from the report in bug#35409, but I guess this is a kind of Heisenbug,
so I'm not surprised to see it pop in different places on different
systems.  In one case the cause of the crash was a wrong-type-argument
error where the offending object was a pseudo-vector of the type
PVEC_FREE, i.e. it was already put on the free list; this caused a
print.c function to barf trying to display the object.  Clearly, some
bad code was involved, and I suspect that bad code came from GCC, not
from us.

Just applying the simple patch below allows the build to run
flawlessly to completion:

--- src/conf_post.h~0	2019-04-28 09:39:12.000000000 +0300
+++ src/conf_post.h	2019-04-29 08:08:30.619991000 +0300
@@ -225,7 +225,7 @@
 extern char *emacs_getenv_TZ (void);
 extern int emacs_setenv_TZ (char const *);
 
-#if __has_attribute (cold)
+#if __has_attribute_cold && !defined(__MINGW32__)
 # define ATTRIBUTE_COLD __attribute__ ((cold))
 #else
 # define ATTRIBUTE_COLD

This could be a MinGW-specific bug, but then again, it could be that
other platforms are just lucky, or maybe not enough people tried to
build the master branch with optimizations lately.

Stepping back a little, I'm not sure we want this ATTRIBUTE_COLD
business in Emacs, on any platform.  At the very least, it causes
unintended consequences, see, for example, the comments by Florian
Weimer in this GCC bug report:

  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88793

Also, the GCC manual indicates that marking a function as 'cold'
causes that function to be optimized for size, and we already know
that GCC 8.x has at least one bug with -Os used together with -O2,
which seems to be exactly what happens when 'cold' is being used in an
otherwise -O2 build.

Moreover, I think we have way too many functions marked with this
attribute.  Functions like wrong_type_argument or Fthrow or
Fabort_recursive_edit or Fsignal or error or Ftop_level -- do they
really fit the below description?

       The 'cold' attribute on functions is used to inform the compiler
       that the function is unlikely to be executed.  The function is
       optimized for size rather than speed and on many targets it is
       placed into a special subsection of the text section so all cold
       functions appear close together, improving code locality of
       non-cold parts of program.  The paths leading to calls of cold
       functions within code are marked as unlikely by the branch
       prediction mechanism.  It is thus useful to mark functions used to
       handle unlikely conditions, such as 'perror', as cold to improve
       optimization of hot functions that do call marked functions in rare
       occasions.

I don't think the above functions are called "rarely" enough in Emacs
to justify marking them as 'cold'.  Stuff like emacs_abort or
memory_full, maybe; but functions that jump to top-level are not in
that class, IMO, not in Emacs Lisp.

The problem I see with marking too many functions 'cold' is that then
any path leading to those functions is also considered "unlikely", and
who knows what that does to our code?  "nm -A" on an Emacs executable
compiled with ATTRIBUTE_COLD shows no less than 2400(!) local symbols
with the ".cold" suffix, whereas a "normal" executable has just 7 of
them.  And what are the benefits we get for all this risky business?

IMO, we should simply avoid this feature.  But if we leave it in the
sources, we should disable it for MinGW, it seems.



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 16:41   ` Angelo Graziosi
  2019-04-28 17:30     ` Eli Zaretskii
@ 2019-04-29 14:54     ` Eli Zaretskii
  1 sibling, 0 replies; 20+ messages in thread
From: Eli Zaretskii @ 2019-04-29 14:54 UTC (permalink / raw)
  To: Angelo Graziosi; +Cc: emacs-devel

> Date: Sun, 28 Apr 2019 18:41:24 +0200 (CEST)
> From: Angelo Graziosi <angelo.g0@libero.it>
> Cc: emacs-devel@gnu.org
> 
> CCLD     temacs.exe
> image.o:image.c:(.data+0x60): undefined reference to `init_imagemagick_functions'
> collect2.exe: error: ld returned 1 exit status
> make[1]: *** [Makefile:643: temacs.exe] Error 1

This isn't a new problem, is it?  AFAICT, it exists for the past 7
years.



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-28 17:46 ` Stephen Leake
@ 2019-04-29 14:56   ` Eli Zaretskii
  0 siblings, 0 replies; 20+ messages in thread
From: Eli Zaretskii @ 2019-04-29 14:56 UTC (permalink / raw)
  To: Stephen Leake; +Cc: emacs-devel

> From: Stephen Leake <stephen_leake@stephe-leake.org>
> Date: Sun, 28 Apr 2019 09:46:32 -0800
> 
> I'm also using MSYS2/MINGW64, and building master works for me.
> 
> I have not updated mingw64 gcc in a while, so it seems a recent update
> to that causes this problem. I have gcc 7.3.0; what do you have?

Try building a fresh checkout (so the build performs a full
bootstrap), and use the default compiler switches, which should
include -O2.  I'm interested to know whether the problem is limited to
GCC 8.x.

TIA



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-29 14:53       ` Eli Zaretskii
@ 2019-04-29 19:38         ` Paul Eggert
  2019-04-30 15:45           ` Eli Zaretskii
  2019-05-01  8:28           ` martin rudalics
  0 siblings, 2 replies; 20+ messages in thread
From: Paul Eggert @ 2019-04-29 19:38 UTC (permalink / raw)
  To: Eli Zaretskii, martin rudalics; +Cc: angelo.g0, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2984 bytes --]

On 4/29/19 7:53 AM, Eli Zaretskii wrote:
> see, for example, the comments by Florian
> Weimer in this GCC bug report:
>
>   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88793

Those comments don't invalidate all uses of __attribute__ ((cold)) in
Emacs. Florian says that in cold functions on some platforms, strlen on
large (5000-byte) strings can be as much as 60 times slower due to
questionable optimizations in GCC that are currently being rethought
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88809#c5>. However, if the
functions currently marked 'cold' in Emacs are called so rarely (at
least on such large strings) that the performance cost (factor of 60 for
rarely-used code) is outweighed by the performance benefit (small factor
of improvement in commonly-used code), then from a performance viewpoint
it's still preferable to mark these functions 'cold'.


> the GCC manual indicates that marking a function as 'cold'
> causes that function to be optimized for size, and we already know
> that GCC 8.x has at least one bug with -Os used together with -O2,

The GCC bug report <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90020>
says that the bug can also occur with -O2, and can occur without
__attribute__ ((cold)). So it's not as simple as saying "__attribute__
((cold)) is buggy".


> I think we have way too many functions marked with this
> attribute.  Functions like wrong_type_argument or Fthrow or
> Fabort_recursive_edit or Fsignal or error or Ftop_level -- do they
> really fit the below description?

It should be purely a performance issue.

For example, on my platform (x86-64, GCC 8.3.1, -O2, Fedora 29) after
inlining, Emacs has 1066 static calls to wrong_type_argument, and with
__attribute__ ((cold)) all these calling sites can be optimized. In
bytecode.c this causes GCC to move wrong_type_argument calls to a cold
section of the text, which means the bytecode interpreter should run
faster for all the usual branch-prediction and icache reasons.

I measured the effect of __attribute__ ((cold)) (including both costs
and benefits) as improving overall performance of a big benchmark ('make
compile-always') by 1.3% on my platform. This test included all the
roughly 50 functions currently marked as cold in Emacs. Although I can
imagine that removing __attribute__ ((cold)) from some of these
functions would not hurt overall performance significantly, I didn't
think it worth the time to investigate which ones. That is, I didn't
investigate marking a smaller set of functions. If someone wants to do
that work then I expect that we should be able to remove markings from
some of these functions without affecting performance significantly.


> if we leave it in the
> sources, we should disable it for MinGW, it seems.

Yes, that sounds like a good idea. I installed the attached patch. It
would be good to know what the actual bug is (it's possible that it's
not a compiler bug at all, but is a portability bug in Emacs), but
that's less urgent.


[-- Attachment #2: 0001-Disable-__attribute__-cold-on-MinGW.patch --]
[-- Type: text/x-patch, Size: 1374 bytes --]

From aaf33358e79e0210f2e8dab17fd8a33ac97383b9 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Mon, 29 Apr 2019 12:27:04 -0700
Subject: [PATCH] Disable __attribute__ ((cold)) on MinGW

* src/conf_post.h (ATTRIBUTE_COLD) [__MINGW32__]:
Define to empty on this platform.
---
 src/conf_post.h | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/conf_post.h b/src/conf_post.h
index 7699d2c95b..4af1ba9331 100644
--- a/src/conf_post.h
+++ b/src/conf_post.h
@@ -59,7 +59,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
    into the same 1-, 2-, or 4-byte allocation unit in the MinGW
    builds.  It was also needed to port to pre-C99 compilers, although
    we don't care about that any more.  */
-#if NS_IMPL_GNUSTEP || defined(__MINGW32__)
+#if NS_IMPL_GNUSTEP || defined __MINGW32__
 typedef unsigned int bool_bf;
 #else
 typedef bool bool_bf;
@@ -225,7 +225,9 @@ extern void _DebPrint (const char *fmt, ...);
 extern char *emacs_getenv_TZ (void);
 extern int emacs_setenv_TZ (char const *);
 
-#if __has_attribute (cold)
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+   <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>. */
+#if __has_attribute (cold) && !defined __MINGW32__
 # define ATTRIBUTE_COLD __attribute__ ((cold))
 #else
 # define ATTRIBUTE_COLD
-- 
2.20.1


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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-29 19:38         ` Paul Eggert
@ 2019-04-30 15:45           ` Eli Zaretskii
  2019-04-30 16:49             ` Paul Eggert
  2019-05-01  8:28           ` martin rudalics
  1 sibling, 1 reply; 20+ messages in thread
From: Eli Zaretskii @ 2019-04-30 15:45 UTC (permalink / raw)
  To: Paul Eggert; +Cc: emacs-devel

> From: Paul Eggert <eggert@cs.ucla.edu>
> Date: Mon, 29 Apr 2019 12:38:02 -0700
> Cc: angelo.g0@libero.it, emacs-devel@gnu.org
> 
> -#if __has_attribute (cold)
> +/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
> +   <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>. */
> +#if __has_attribute (cold) && !defined __MINGW32__

We defined __has_attribute_cold, so no need to use __has_attribute
here, right?



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-30 15:45           ` Eli Zaretskii
@ 2019-04-30 16:49             ` Paul Eggert
  2019-04-30 16:53               ` Eli Zaretskii
  0 siblings, 1 reply; 20+ messages in thread
From: Paul Eggert @ 2019-04-30 16:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

On 4/30/19 8:45 AM, Eli Zaretskii wrote:
>> From: Paul Eggert <eggert@cs.ucla.edu>
>> Date: Mon, 29 Apr 2019 12:38:02 -0700
>> Cc: angelo.g0@libero.it, emacs-devel@gnu.org
>>
>> -#if __has_attribute (cold)
>> +/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
>> +   <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>. */
>> +#if __has_attribute (cold) && !defined __MINGW32__
> We defined __has_attribute_cold, so no need to use __has_attribute
> here, right?

conf_post.h defines __has_attribute_cold only on older compilers that
lack support for __has_attribute. So we still need to use
__has_attribute here, for newer compilers (GCC 5 and later, for example).




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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-30 16:49             ` Paul Eggert
@ 2019-04-30 16:53               ` Eli Zaretskii
  0 siblings, 0 replies; 20+ messages in thread
From: Eli Zaretskii @ 2019-04-30 16:53 UTC (permalink / raw)
  To: Paul Eggert; +Cc: emacs-devel

> Cc: emacs-devel@gnu.org
> From: Paul Eggert <eggert@cs.ucla.edu>
> Date: Tue, 30 Apr 2019 09:49:29 -0700
> 
> conf_post.h defines __has_attribute_cold only on older compilers that
> lack support for __has_attribute. So we still need to use
> __has_attribute here, for newer compilers (GCC 5 and later, for example).

Oh, it's the other way around...  Right, sorry for the noise.



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

* Re: Emacs build fails [MSYS2/MINGW64]
  2019-04-29 19:38         ` Paul Eggert
  2019-04-30 15:45           ` Eli Zaretskii
@ 2019-05-01  8:28           ` martin rudalics
  1 sibling, 0 replies; 20+ messages in thread
From: martin rudalics @ 2019-05-01  8:28 UTC (permalink / raw)
  To: Paul Eggert, Eli Zaretskii; +Cc: angelo.g0, emacs-devel

 > I installed the attached patch. It
 > would be good to know what the actual bug is (it's possible that it's
 > not a compiler bug at all, but is a portability bug in Emacs), but
 > that's less urgent.

Thanks.  Builds now without problems.

martin



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

end of thread, other threads:[~2019-05-01  8:28 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-28 15:37 Emacs build fails [MSYS2/MINGW64] Angelo Graziosi
2019-04-28 16:10 ` Paul Eggert
2019-04-28 16:43   ` Angelo Graziosi
2019-04-29 11:53   ` Angelo Graziosi
2019-04-29 12:49     ` martin rudalics
2019-04-29 14:53       ` Eli Zaretskii
2019-04-29 19:38         ` Paul Eggert
2019-04-30 15:45           ` Eli Zaretskii
2019-04-30 16:49             ` Paul Eggert
2019-04-30 16:53               ` Eli Zaretskii
2019-05-01  8:28           ` martin rudalics
2019-04-28 16:21 ` Eli Zaretskii
2019-04-28 16:41   ` Angelo Graziosi
2019-04-28 17:30     ` Eli Zaretskii
2019-04-28 21:22       ` Angelo Graziosi
2019-04-28 21:24       ` Angelo Graziosi
2019-04-29  2:29         ` Eli Zaretskii
2019-04-29 14:54     ` Eli Zaretskii
2019-04-28 17:46 ` Stephen Leake
2019-04-29 14:56   ` Eli Zaretskii

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