GNU bug report logs - #48061
Unexpected result from a native-compiled function

Previous Next

Package: emacs;

Reported by: Alan Mackenzie <acm <at> muc.de>

Date: Tue, 27 Apr 2021 14:50:01 UTC

Severity: normal

Merged with 48100

Found in version 28.0.50

Done: Alan Mackenzie <acm <at> muc.de>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 48061 in the body.
You can then email your comments to 48061 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#48061; Package emacs. (Tue, 27 Apr 2021 14:50:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Alan Mackenzie <acm <at> muc.de>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Tue, 27 Apr 2021 14:50:01 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: bug-gnu-emacs <at> gnu.org
Subject: Unexpected result from a native-compiled function
Date: Tue, 27 Apr 2021 14:49:31 +0000
Hello, Emacs.

In certain circumstances (see below for recipe), the natively compiled
version of c-determine-limit-no-macro returns an invalid result, nil.
In the same circumstances, the edebug instrumented version returns the
correct result, a buffer position.

So far I have tried M-x disassemble RET c-determine-limit-no-macro, but
I wasn't able to follow the output (there were no symbols in the
listing).

Question: what else can I do to help isolate and fix this bug?

Recipe for reproduction:

In GNU Emacs 28.0.50 (build 4, x86_64-pc-linux-gnu, GTK+ Version
3.24.26, cairo version 1.16.0)
 of 2021-04-25 built on ACM
Repository revision: 83a915d3dfafd5f3d737afe1e13b75e4dd3aef96
Repository branch: master
System Description: Gentoo/Linux

Configured using:
 'configure --with-gif=no --with-tiff=no --with-gpm
 --with-native-compilation'


(i) emacs -Q
(ii) Make sure CC Mode is natively compiled and loaded into an Emacs
session.
(iii) Evaluate the following (an attempt to time CC Mode's indentation
speed):

(defmacro time-it (&rest forms)
  "Time the running of a sequence of forms using `float-time'.
Call like this: \"M-: (time-it (foo ...) (bar ...) ...)\"."
  `(let ((start (float-time)))
    ,@forms
    (- (float-time) start)))

(defun time-indent ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (not (eobp))
      (delete-horizontal-space)
      (beginning-of-line 2))
    (goto-char (point-min))
    (message "%s"
             (time-it
              (while (not (eobp))
                (c-indent-line)
                (beginning-of-line 2))))))

(iv) Load src/minibuf.c into a buffer.
(v) M-: (time-indent) RET
  This throws an error at line 606 in minibuf.c.  point is at 16972, at
BOL.

(vi) With the current buffer minibuf.c, M-: (c-determine-limit-no-macro
16367 16972) RET.  This returns the invalid result nil.  This looks like
a bug.

(vii) Load lisp/progmodes/cc-engine.el into another buffer.  Move to the
definition of c-determine-limit-no-macro at line 5795.  Instrument the
function for edebug with C-u C-M-x.

(viii) M-: (c-determine-limit-no-macro 16367 16972) RET, followed by the
edebug command c.  This indicates the expected result 16350, which is
different from the nil returned in (vi).


-- 
Alan Mackenzie (Nuremberg, Germany).




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#48061; Package emacs. (Tue, 27 Apr 2021 17:21:02 GMT) Full text and rfc822 format available.

Message #8 received at 48061 <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: 48061 <at> debbugs.gnu.org
Subject: Re: bug#48061: Unexpected result from a native-compiled function
Date: Tue, 27 Apr 2021 17:20:22 +0000
On Tue, Apr 27, 2021 at 14:49:31 +0000, Alan Mackenzie wrote:
> Hello, Emacs.

> In certain circumstances (see below for recipe), the natively compiled
> version of c-determine-limit-no-macro returns an invalid result, nil.
> In the same circumstances, the edebug instrumented version returns the
> correct result, a buffer position.

> So far I have tried M-x disassemble RET c-determine-limit-no-macro, but
> I wasn't able to follow the output (there were no symbols in the
> listing).

I've now managed to get a decent disassembly, and there is indeed a
missing machine instruction in the code which causes it to fail:

The function is:

#########################################################################
(defun c-determine-limit-no-macro (here org-start)
  ;; If HERE is inside a macro, and ORG-START is not also in the same macro,
  ;; return the beginning of the macro.  Otherwise return HERE.  Point is not
  ;; preserved by this function.
  (goto-char here)
  (let ((here-BOM (and (c-beginning-of-macro) (point))))
    (if (and here-BOM
             (not (eq (progn (goto-char org-start)
                             (and (c-beginning-of-macro) (point)))
                      here-BOM)))
        here-BOM
      here)))
#########################################################################

The register use in the compiled function is:

rbp     here
r12     org-start
r13     here-BOM

The disassembly (with some added notes) is this:

00000000000264f0 <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0>:
   264f0:       41 56                   push   %r14
   264f2:       41 55                   push   %r13
   264f4:       41 54                   push   %r12
   264f6:       49 89 f4                mov    %rsi,%r12   org-start
   264f9:       55                      push   %rbp
   264fa:       48 89 fd                mov    %rdi,%rbp   here
   264fd:       53                      push   %rbx
   264fe:       48 83 ec 20             sub    $0x20,%rsp
   26502:       64 48 8b 04 25 28 00    mov    %fs:0x28,%rax
   26509:       00 00
   2650b:       48 89 44 24 18          mov    %rax,0x18(%rsp)
   26510:       48 8b 05 d1 2a 27 00    mov    0x272ad1(%rip),%rax        # 298fe8 <_DYNAMIC+0x1f8>
   26517:       48 8b 18                mov    (%rax),%rbx
   2651a:       ff 93 b8 14 00 00       callq  *0x14b8(%rbx)        goto-char
   26520:       48 8d 74 24 08          lea    0x8(%rsp),%rsi
   26525:       bf 01 00 00 00          mov    $0x1,%edi
   2652a:       4c 8b 35 af 2a 27 00    mov    0x272aaf(%rip),%r14        # 298fe0 <_DYNAMIC+0x1f0>
   26531:       49 8b 86 c8 00 00 00    mov    0xc8(%r14),%rax
   26538:       48 89 44 24 08          mov    %rax,0x8(%rsp)
   2653d:       ff 93 08 1a 00 00       callq  *0x1a08(%rbx)      c-beginning-of-macro
   26543:       48 85 c0                test   %rax,%rax
   26546:       74 52                   je     2659a <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0+0xaa>
   26548:       ff 93 68 14 00 00       callq  *0x1468(%rbx)      point
   2654e:       49 89 c5                mov    %rax,%r13        here-BOM
   26551:       48 85 c0                test   %rax,%rax
   26554:       74 44                   je     2659a <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0+0xaa>
   26556:       4c 89 e7                mov    %r12,%rdi         org-start
   26559:       ff 93 b8 14 00 00       callq  *0x14b8(%rbx)        goto-char
   2655f:       bf 01 00 00 00          mov    $0x1,%edi
   26564:       48 8d 74 24 10          lea    0x10(%rsp),%rsi
   26569:       49 8b 86 c8 00 00 00    mov    0xc8(%r14),%rax
   26570:       48 89 44 24 10          mov    %rax,0x10(%rsp)
   26575:       ff 93 08 1a 00 00       callq  *0x1a08(%rbx)       c-beginning-of-macro
   2657b:       48 89 c7                mov    %rax,%rdi
   2657e:       48 85 c0                test   %rax,%rax
   26581:       74 09                   je     2658c <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0+0x9c>
   26583:       ff 93 68 14 00 00       callq  *0x1468(%rbx)       point
   26589:       48 89 c7                mov    %rax,%rdi
   2658c:       4c 89 ee                mov    %r13,%rsi         here-BOM
   2658f:       ff 93 60 27 00 00       callq  *0x2760(%rbx)       eq
   26595:       48 85 c0                test   %rax,%rax                                  <========================================================
   26598:       74 03                   je     2659d <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0+0xad>
   2659a:       48 89 e8                mov    %rbp,%rax         here
   2659d:       48 8b 54 24 18          mov    0x18(%rsp),%rdx
   265a2:       64 48 2b 14 25 28 00    sub    %fs:0x28,%rdx
   265a9:       00 00
   265ab:       75 0d                   jne    265ba <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0+0xca>
   265ad:       48 83 c4 20             add    $0x20,%rsp
   265b1:       5b                      pop    %rbx
   265b2:       5d                      pop    %rbp
   265b3:       41 5c                   pop    %r12
   265b5:       41 5d                   pop    %r13
   265b7:       41 5e                   pop    %r14
   265b9:       c3                      retq
   265ba:       e8 41 12 fe ff          callq  7800 <__stack_chk_fail <at> plt>
   265bf:       90                      nop

After the indicated line (0x26595), when 0x0 (nil) is in rax (i.e. the
`eq' function has returned nil) the result of the function should be
here-BOM, i.e. r13.  There is no instruction

    mov %r13,%rax

to effect this return.  Instead, rax is still holding nil, and this is
falsely returned.

> -- 
> Alan Mackenzie (Nuremberg, Germany).




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#48061; Package emacs. (Tue, 27 Apr 2021 20:03:01 GMT) Full text and rfc822 format available.

Message #11 received at 48061 <at> debbugs.gnu.org (full text, mbox):

From: Andrea Corallo <akrl <at> sdf.org>
To: Alan Mackenzie <acm <at> muc.de>
Cc: 48061 <at> debbugs.gnu.org
Subject: Re: bug#48061: Unexpected result from a native-compiled function
Date: Tue, 27 Apr 2021 20:02:45 +0000
Alan Mackenzie <acm <at> muc.de> writes:

> On Tue, Apr 27, 2021 at 14:49:31 +0000, Alan Mackenzie wrote:
>> Hello, Emacs.
>
>> In certain circumstances (see below for recipe), the natively compiled
>> version of c-determine-limit-no-macro returns an invalid result, nil.
>> In the same circumstances, the edebug instrumented version returns the
>> correct result, a buffer position.
>
>> So far I have tried M-x disassemble RET c-determine-limit-no-macro, but
>> I wasn't able to follow the output (there were no symbols in the
>> listing).
>
> I've now managed to get a decent disassembly, and there is indeed a
> missing machine instruction in the code which causes it to fail:
>
> The function is:
>
> #########################################################################
> (defun c-determine-limit-no-macro (here org-start)
>   ;; If HERE is inside a macro, and ORG-START is not also in the same macro,
>   ;; return the beginning of the macro.  Otherwise return HERE.  Point is not
>   ;; preserved by this function.
>   (goto-char here)
>   (let ((here-BOM (and (c-beginning-of-macro) (point))))
>     (if (and here-BOM
>              (not (eq (progn (goto-char org-start)
>                              (and (c-beginning-of-macro) (point)))
>                       here-BOM)))
>         here-BOM
>       here)))
> #########################################################################
>
> The register use in the compiled function is:
>
> rbp     here
> r12     org-start
> r13     here-BOM
>
> The disassembly (with some added notes) is this:
>
> 00000000000264f0 <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0>:
>    264f0:       41 56                   push   %r14

[...]

>    26583:       ff 93 68 14 00 00       callq  *0x1468(%rbx)       point
>    26589:       48 89 c7                mov    %rax,%rdi
>    2658c:       4c 89 ee                mov    %r13,%rsi         here-BOM
>    2658f:       ff 93 60 27 00 00       callq  *0x2760(%rbx)       eq
>    26595:       48 85 c0                test   %rax,%rax                                  <========================================================
>    26598:       74 03                   je     2659d <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0+0xad>
>    2659a:       48 89 e8                mov    %rbp,%rax         here
>    2659d:       48 8b 54 24 18          mov    0x18(%rsp),%rdx
>    265a2:       64 48 2b 14 25 28 00    sub    %fs:0x28,%rdx
>    265a9:       00 00
>    265ab:       75 0d                   jne    265ba <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0+0xca>
>    265ad:       48 83 c4 20             add    $0x20,%rsp
>    265b1:       5b                      pop    %rbx
>    265b2:       5d                      pop    %rbp
>    265b3:       41 5c                   pop    %r12
>    265b5:       41 5d                   pop    %r13
>    265b7:       41 5e                   pop    %r14
>    265b9:       c3                      retq
>    265ba:       e8 41 12 fe ff          callq  7800 <__stack_chk_fail <at> plt>
>    265bf:       90                      nop
>
> After the indicated line (0x26595), when 0x0 (nil) is in rax (i.e. the
> `eq' function has returned nil) the result of the function should be
> here-BOM, i.e. r13.  There is no instruction
>
>     mov %r13,%rax
>
> to effect this return.  Instead, rax is still holding nil, and this is
> falsely returned.
>

Hi Alan,

thanks for investigating this!  I had a quick look and I think I see
what's the issue, I'll follow up when I've the fix.

Thanks

  Andrea




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#48061; Package emacs. (Tue, 27 Apr 2021 21:04:02 GMT) Full text and rfc822 format available.

Message #14 received at 48061 <at> debbugs.gnu.org (full text, mbox):

From: Andrea Corallo <akrl <at> sdf.org>
To: Alan Mackenzie <acm <at> muc.de>
Cc: 48061 <at> debbugs.gnu.org
Subject: Re: bug#48061: Unexpected result from a native-compiled function
Date: Tue, 27 Apr 2021 21:03:05 +0000
Andrea Corallo via "Bug reports for GNU Emacs, the Swiss army knife of
text editors" <bug-gnu-emacs <at> gnu.org> writes:

> Alan Mackenzie <acm <at> muc.de> writes:
>
>> On Tue, Apr 27, 2021 at 14:49:31 +0000, Alan Mackenzie wrote:
>>> Hello, Emacs.
>>
>>> In certain circumstances (see below for recipe), the natively compiled
>>> version of c-determine-limit-no-macro returns an invalid result, nil.
>>> In the same circumstances, the edebug instrumented version returns the
>>> correct result, a buffer position.
>>
>>> So far I have tried M-x disassemble RET c-determine-limit-no-macro, but
>>> I wasn't able to follow the output (there were no symbols in the
>>> listing).
>>
>> I've now managed to get a decent disassembly, and there is indeed a
>> missing machine instruction in the code which causes it to fail:
>>
>> The function is:
>>
>> #########################################################################
>> (defun c-determine-limit-no-macro (here org-start)
>>   ;; If HERE is inside a macro, and ORG-START is not also in the same macro,
>>   ;; return the beginning of the macro.  Otherwise return HERE.  Point is not
>>   ;; preserved by this function.
>>   (goto-char here)
>>   (let ((here-BOM (and (c-beginning-of-macro) (point))))
>>     (if (and here-BOM
>>              (not (eq (progn (goto-char org-start)
>>                              (and (c-beginning-of-macro) (point)))
>>                       here-BOM)))
>>         here-BOM
>>       here)))
>> #########################################################################
>>
>> The register use in the compiled function is:
>>
>> rbp     here
>> r12     org-start
>> r13     here-BOM
>>
>> The disassembly (with some added notes) is this:
>>
>> 00000000000264f0 <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0>:
>>    264f0:       41 56                   push   %r14
>
> [...]
>
>>    26583:       ff 93 68 14 00 00       callq  *0x1468(%rbx)       point
>>    26589:       48 89 c7                mov    %rax,%rdi
>>    2658c:       4c 89 ee                mov    %r13,%rsi         here-BOM
>>    2658f:       ff 93 60 27 00 00       callq  *0x2760(%rbx)       eq
>>    26595:       48 85 c0                test   %rax,%rax                                  <========================================================
>>    26598:       74 03                   je     2659d <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0+0xad>
>>    2659a:       48 89 e8                mov    %rbp,%rax         here
>>    2659d:       48 8b 54 24 18          mov    0x18(%rsp),%rdx
>>    265a2:       64 48 2b 14 25 28 00    sub    %fs:0x28,%rdx
>>    265a9:       00 00
>>    265ab:       75 0d                   jne    265ba <F632d64657465726d696e652d6c696d69742d6e6f2d6d6163726f_c_determine_limit_no_macro_0+0xca>
>>    265ad:       48 83 c4 20             add    $0x20,%rsp
>>    265b1:       5b                      pop    %rbx
>>    265b2:       5d                      pop    %rbp
>>    265b3:       41 5c                   pop    %r12
>>    265b5:       41 5d                   pop    %r13
>>    265b7:       41 5e                   pop    %r14
>>    265b9:       c3                      retq
>>    265ba:       e8 41 12 fe ff          callq  7800 <__stack_chk_fail <at> plt>
>>    265bf:       90                      nop
>>
>> After the indicated line (0x26595), when 0x0 (nil) is in rax (i.e. the
>> `eq' function has returned nil) the result of the function should be
>> here-BOM, i.e. r13.  There is no instruction
>>
>>     mov %r13,%rax
>>
>> to effect this return.  Instead, rax is still holding nil, and this is
>> falsely returned.
>>
>
> Hi Alan,
>
> thanks for investigating this!  I had a quick look and I think I see
> what's the issue, I'll follow up when I've the fix.

Hi Alan,

looking at the intermediate representation of this interesting function
I've fixed a bug, I can't prove it solves your issue as I've no
reproducer tho.

Could you try if as of 4e1e0b9dec this is solved?  If is not the case
could you provide a reproducer so I'll not disturb next time until is
solved :)

Thanks

  Andrea




Reply sent to Alan Mackenzie <acm <at> muc.de>:
You have taken responsibility. (Wed, 28 Apr 2021 09:20:02 GMT) Full text and rfc822 format available.

Notification sent to Alan Mackenzie <acm <at> muc.de>:
bug acknowledged by developer. (Wed, 28 Apr 2021 09:20:02 GMT) Full text and rfc822 format available.

Message #19 received at 48061-done <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: Andrea Corallo <akrl <at> sdf.org>
Cc: 48061-done <at> debbugs.gnu.org, acm <at> muc.de
Subject: Re: bug#48061: Unexpected result from a native-compiled function
Date: Wed, 28 Apr 2021 09:19:09 +0000
Hello, Andrea.

On Tue, Apr 27, 2021 at 21:03:05 +0000, Andrea Corallo wrote:
> Andrea Corallo via "Bug reports for GNU Emacs, the Swiss army knife of
> text editors" <bug-gnu-emacs <at> gnu.org> writes:

[ .... ]

> >> After the indicated line (0x26595), when 0x0 (nil) is in rax (i.e. the
> >> `eq' function has returned nil) the result of the function should be
> >> here-BOM, i.e. r13.  There is no instruction

> >>     mov %r13,%rax

> >> to effect this return.  Instead, rax is still holding nil, and this is
> >> falsely returned.


> > Hi Alan,

> > thanks for investigating this!  I had a quick look and I think I see
> > what's the issue, I'll follow up when I've the fix.

> Hi Alan,

> looking at the intermediate representation of this interesting function
> I've fixed a bug, I can't prove it solves your issue as I've no
> reproducer tho.

> Could you try if as of 4e1e0b9dec this is solved?  If is not the case
> could you provide a reproducer so I'll not disturb next time until is
> solved :)

The bug fix does indeed fix my problem.  :-)  My test case now runs to
the end without error, and I had a look at the disassembly too, in which
I no longer see the problem from yesterday.

I'm closing the bug with this post.

Thanks!

> Thanks

>   Andrea

-- 
Alan Mackenzie (Nuremberg, Germany).




Merged 48061 48100. Request was from Alan Mackenzie <acm <at> muc.de> to control <at> debbugs.gnu.org. (Sun, 09 May 2021 09:34:01 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sun, 06 Jun 2021 11:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 2 years and 325 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.