GNU bug report logs -
#8623
23.3.50; (woman "git-remote") crashes
Previous Next
Reported by: Sven Joachim <svenjoac <at> gmx.de>
Date: Thu, 5 May 2011 20:10:03 UTC
Severity: normal
Found in version 23.3.50
Done: Eli Zaretskii <eliz <at> gnu.org>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
On 2011-05-06 12:50 +0200, Sven Joachim wrote:
> On 2011-05-06 12:15 +0200, Eli Zaretskii wrote:
>
>>> From: Sven Joachim <svenjoac <at> gmx.de>
>>> Cc: 8623 <at> debbugs.gnu.org
>>> Date: Thu, 05 May 2011 23:12:18 +0200
>>>
>>> $ gcc --version | head -n1
>>> gcc (Debian 4.6.0-6) 4.6.1 20110428 (prerelease)
>>>
>>> > Also, can you build Emacs without optimizations, and try reproducing
>>> > in the unoptimized binary?
>>>
>>> Alas, the unoptimized binary does not crash.
>>
>> Darn! Debugging optimized code is pretty much hopeless with current
>> versions of GCC.
>>
>> Paul, could you please take a look at this? Could this be due to the
>> same problems with GCC 4.6 optimizations you recently fixed on the
>> trunk? If so, we may need similar changes on the release branch.
>
> I suspect so, becauseā¦
>
>> Sven, could you also try with the trunk build?
>
> The trunk is fine. I'm already bisecting the problem, but have to leave
> in 1.5 hours and will then be unavailable until Sunday. If I find out
> the commit which fixed the bug, I'll let you know.
The following commit (merged into the trunk as revision 104021)
contained the fix:
,----
| revno: 103939.1.42
| committer: Paul Eggert <eggert <at> cs.ucla.edu>
| branch nick: atest
| timestamp: Mon 2011-04-25 00:14:46 -0700
| message:
| lisp.h: Fix a problem with aliasing and vector headers.
|
| GCC 4.6.0 optimizes based on type-based alias analysis. For
| example, if b is of type struct buffer * and v of type struct
| Lisp_Vector *, then gcc -O2 was incorrectly assuming that &b->size
| != &v->size, and therefore "v->size = 1; b->size = 2; return
| v->size;" must therefore return 1. This assumption is incorrect
| for Emacs, since it type-puns struct Lisp_Vector * with many other
| types. To fix this problem, this patch adds a new type struct
| vector_header that documents the constraints on layout of vectors
| and pseudovectors, and helps optimizing compilers not get fooled
| by Emacs's type punning. It also adds the macros XSETTYPED_PVECTYPE
| XSETTYPED_PSEUDOVECTOR, TYPED_PSEUDOVECTORP, for similar reasons.
| * lisp.h (XVECTOR_SIZE): New convenience macro. All previous uses of
| XVECTOR (foo)->size replaced to use this macro, to avoid the hassle
| of writing XVECTOR (foo)->header.size.
| (XVECTOR_HEADER_SIZE): New macro, for use in XSETPSEUDOVECTOR.
| (XSETTYPED_PVECTYPE): New macro, specifying the name of the size
| member.
| (XSETPVECTYPE): Rewrite in terms of new macro.
| (XSETPVECTYPESIZE): New macro, specifying both type and size.
| This is a bit clearer, and further avoids the possibility of
| undesirable aliasing.
| (XSETTYPED_PSEUDOVECTOR): New macro, specifying the size.
| (XSETPSEUDOVECTOR): Rewrite in terms of XSETTYPED_PSEUDOVECTOR
| and XVECTOR_HEADER_SIZE.
| (XSETSUBR): Rewrite in terms of XSETTYPED_PSEUDOVECTOR and XSIZE,
| since Lisp_Subr is a special case (no "next" field).
| (ASIZE): Rewrite in terms of XVECTOR_SIZE.
| (struct vector_header): New type.
| (TYPED_PSEUDOVECTORP): New macro, also specifying the C type of the
| object, to help avoid aliasing.
| (PSEUDOVECTORP): Rewrite in terms of TYPED_PSEUDOVECTORP.
| (SUBRP): Likewise, since Lisp_Subr is a special case.
| * lisp.h (struct Lisp_Vector, struct Lisp_Char_Table):
| (struct Lisp_Sub_Char_Table, struct Lisp_Bool_Vector):
| (struct Lisp_Hash_Table): Combine first two members into a single
| struct vector_header member. All uses of "size" and "next" members
| changed to be "header.size" and "header.next".
| * buffer.h (struct buffer): Likewise.
| * font.h (struct font_spec, struct font_entity, struct font): Likewise.
| * frame.h (struct frame): Likewise.
| * process.h (struct Lisp_Process): Likewise.
| * termhooks.h (struct terminal): Likewise.
| * window.c (struct save_window_data, struct saved_window): Likewise.
| * window.h (struct window): Likewise.
| * alloc.c (allocate_buffer, Fmake_bool_vector, allocate_pseudovector):
| Use XSETPVECTYPESIZE, not XSETPVECTYPE, to avoid aliasing problems.
| * buffer.c (init_buffer_once): Likewise.
| * lread.c (defsubr): Use XSETTYPED_PVECTYPE, since Lisp_Subr is a
| special case.
| * process.c (Fformat_network_address): Use local var for size,
| for brevity.
|
`----
This commit touches 39 files. How to backport it to the emacs-23 branch
is left as an exercise for the reader.
Bye,
Sven
This bug report was last modified 14 years and 100 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.