From: Alan Mackenzie <acm@muc.de>
To: Paul Eggert <eggert@cs.ucla.edu>
Cc: michael_heerdegen@web.de, eliz@gnu.org, emacs-devel@gnu.org,
cpitclaudel@gmail.com, monnier@IRO.UMontreal.CA
Subject: Re: scratch/accurate-warning-pos: Solid progress: the branch now bootstraps.
Date: Mon, 26 Nov 2018 09:48:00 +0000 [thread overview]
Message-ID: <20181126094800.GA4030@ACM> (raw)
In-Reply-To: <60ac9dfc-b540-89f9-68ea-ec7cceaa8511@cs.ucla.edu>
Hello, Paul.
On Sun, Nov 25, 2018 at 17:41:39 -0800, Paul Eggert wrote:
> Alan Mackenzie wrote:
> > Because of macros. These macros are typically already compiled.
> Even a compiled macro operates via the interpreter. So we could have a
> separate interpreter used only by the byte compiler. The byte-compiler
> interpreter would operate more slowly than the normal interpreter, but
> that's OK. The main and the byte-compiler interpreter could mostly be
> written with shared code, without slowing down the main interpreter.
> Admittedly this would not be a project for the fainthearted.
Indeed not. Where and how would this help with getting accurate source
code positions?
> > If you could come up with a solid proposal which would fix the bug
> > without slowing down Emacs at all, we'd all be most appreciative.
> I'm afraid I don't understand the bug well enough yet to know whether
> any proposal I can come up with would be "solid". For one thing, any
> method of outputting source-code locations will founder in the
> presence of macros.
scratch/accurate-warning-pos seems to do rather well in this regard.
> Even GCC, which tries to do a reasonably good job of this and isn't
> limited by the Lisp reader, doesn't do well with the sort of C macros
> I tend to write. My admittedly uninformed guess is that there is no
> such thing as a "solid" solution here, only solutions that work better
> and/or worse on various example sets.
The example set scratch/accurate-warning-pos works well on is the Lisp
code comprising Emacs.
> That being said, here's another possibility: don't bother attaching
> source-code positions to symbols, since duplicate symbols can be
> appear in the input and the source-code positions can't be retrieved
> reliably.
The source code positions are attached not to symbols, but to symbol
_occurrences_.
> Instead, attach positions to input objects that are guaranteed to be
> unique so that retrieval is trivial.
I think you mean conses here. I've tried this approach, spending a lot
of time on it but not getting very far. The problem is, Lisp objects
flow through lots of different conses as they are transformed by the
compiler. Have a look at cconv-convert, which processes every function.
I'm not sure that even a single cons in the input form survives through
to the output. The symbols do survive, though, in the main.
> Do the attachment via a hash table so that the input objects are
> unchanged and we don't need to change much of anything except the
> byte-compiler's diagnostic code (plus a read function that fills in
> the hash table as it reads).
Using conses as keys? See previous paragraph. The approach I tried
before to implement this was to ensure that after any source
transformation, the result was written back to the original cons using
setcar and setcdr. This rapidly became unwieldy, with, for example,
versions of setq and mapcar which had extra parameters indicating the
result cons, and so on. This involved extensive amendment of large
portions of the compiler.
> When the byte compiler needs the source code location corresponding to
> a symbol, it looks for the closest unique object nearby and uses its
> location.
"Nearby"? Warning messages are typically associated with symbol
occurences (not conses), and are found when a recursive compiler routine
is presented with a symbol rather than a cons. Not all the time, but a
lot of the time. Hence the scratch/accurate-warning-pos approach of
attaching source positions to symbol occurrences.
> For example, the source expression for the bug#22288 test case:
> (defun test () (let (a)) a)
> has five conses in its top level list, two conses at the top of its
> second level list (let (a)), and one cons in its third level list (a).
> Each cons corresponds to a source code position (or if you prefer more
> accuracy, multiple positions for the start and end of the
> corresponding source-code and/or for the starts and ends of the source
> code corresponding to the cons's car and cdr). This will let the byte
> compiler narrow down where every subexpression lies, with
> significantly more accuracy than what we have now. In the bug#22288
> example, the last cons in the top-level list should be attached to the
> precise source code location for the 'a' that we want to issue a
> diagnostic about.
Yes, in theory. In practice, as already said, the source code flows
between lots of cons cells as it is transformed by functions like
cconv-convert and those in byte-opt.el. As said, countering this would
involve lots of tedious amendment to the compiler, with the emphasis on
"lots". I've already tried this, and given up.
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2018-11-26 9:48 UTC|newest]
Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-17 12:45 scratch/accurate-warning-pos: First tentative successes Alan Mackenzie
2018-11-17 13:13 ` Eli Zaretskii
2018-11-23 13:09 ` scratch/accurate-warning-pos: Solid progress: the branch now bootstraps Alan Mackenzie
2018-11-25 11:26 ` Charles A. Roelli
2018-11-25 14:31 ` Alan Mackenzie
2018-11-25 15:12 ` Andreas Schwab
2018-11-25 15:42 ` Alan Mackenzie
2018-11-25 16:40 ` Eli Zaretskii
2018-11-25 17:59 ` Alan Mackenzie
2018-11-25 18:15 ` Eli Zaretskii
2018-11-25 18:23 ` Alan Mackenzie
2018-11-25 19:36 ` Alan Mackenzie
2018-11-25 16:22 ` Stefan Monnier
2018-11-25 17:35 ` Alan Mackenzie
2018-11-25 18:22 ` Stefan Monnier
2018-11-25 19:54 ` Alan Mackenzie
2018-11-25 20:08 ` Stefan Monnier
2018-11-26 9:52 ` Alan Mackenzie
2018-11-26 10:16 ` Alan Mackenzie
2018-11-25 16:38 ` Eli Zaretskii
2018-11-25 17:27 ` Andreas Schwab
2018-11-25 17:31 ` Alan Mackenzie
2018-11-25 17:39 ` Eli Zaretskii
2018-11-25 18:08 ` Alan Mackenzie
2018-11-25 18:45 ` Paul Eggert
2018-11-25 19:30 ` Alan Mackenzie
2018-11-25 20:12 ` Paul Eggert
2018-11-25 21:29 ` Alan Mackenzie
2018-11-26 1:41 ` Paul Eggert
2018-11-26 3:41 ` Eli Zaretskii
2018-11-26 17:43 ` Paul Eggert
2018-11-26 18:43 ` Alan Mackenzie
2018-11-26 19:18 ` Clément Pit-Claudel
2018-11-26 19:42 ` Alan Mackenzie
2018-11-27 1:07 ` Gemini Lasswell
2018-11-27 1:45 ` Alan Mackenzie
2018-11-27 6:06 ` Eli Zaretskii
2018-11-27 2:48 ` Paul Eggert
2018-11-27 7:43 ` Alan Mackenzie
2018-11-27 20:27 ` Paul Eggert
2018-11-27 21:15 ` Alan Mackenzie
2018-11-27 21:37 ` Paul Eggert
2018-11-27 21:53 ` Alan Mackenzie
2018-11-28 1:11 ` Paul Eggert
2018-11-28 12:04 ` Alan Mackenzie
2018-11-29 21:28 ` Paul Eggert
2018-11-29 22:05 ` Alan Mackenzie
2018-11-30 17:50 ` Paul Eggert
2018-11-30 18:55 ` Alan Mackenzie
2018-11-30 20:14 ` Paul Eggert
2018-11-30 22:02 ` Alan Mackenzie
2018-11-30 23:46 ` Paul Eggert
2018-12-01 7:35 ` martin rudalics
2018-12-01 8:25 ` Eli Zaretskii
2018-12-01 11:08 ` Alan Mackenzie
2018-12-01 11:36 ` Eli Zaretskii
2018-12-01 12:47 ` Alan Mackenzie
2018-12-01 14:09 ` martin rudalics
2018-12-01 14:30 ` Stefan Monnier
2018-12-01 16:30 ` martin rudalics
2018-12-01 19:56 ` Stefan Monnier
2018-12-01 14:59 ` Eli Zaretskii
2018-12-01 16:31 ` martin rudalics
2018-12-01 16:53 ` Eli Zaretskii
2018-12-01 19:04 ` martin rudalics
2018-12-01 19:22 ` Eli Zaretskii
2018-12-01 17:21 ` Alan Mackenzie
2018-12-01 17:44 ` Michael Heerdegen
2018-12-01 18:58 ` Alan Mackenzie
2018-12-01 20:26 ` Alan Mackenzie
2018-12-01 17:48 ` Eli Zaretskii
2018-12-01 21:00 ` Paul Eggert
2018-12-01 17:50 ` Clément Pit-Claudel
2018-12-01 18:26 ` Yuri Khan
2018-12-01 19:15 ` Clément Pit-Claudel
2018-12-01 21:26 ` Paul Eggert
2018-12-02 6:48 ` Yuri Khan
2018-12-02 18:39 ` Gemini Lasswell
2018-12-03 2:28 ` Stefan Monnier
2018-12-01 19:04 ` martin rudalics
2018-12-02 22:53 ` Dmitry Gutov
2018-12-01 0:26 ` Gemini Lasswell
2018-12-01 11:48 ` Alan Mackenzie
2018-11-27 22:09 ` Stefan Monnier
2018-11-28 2:18 ` Paul Eggert
2018-11-28 2:43 ` Stefan Monnier
2018-11-28 5:13 ` Paul Eggert
2018-11-28 6:03 ` Gemini Lasswell
2018-11-28 5:39 ` Gemini Lasswell
2018-11-28 13:06 ` Stefan Monnier
2018-11-28 6:28 ` Eli Zaretskii
2018-11-28 22:50 ` Paul Eggert
2018-11-29 7:19 ` Eli Zaretskii
2018-11-29 10:54 ` Alan Mackenzie
2018-11-29 11:13 ` Eli Zaretskii
2018-11-29 11:37 ` Alan Mackenzie
2018-11-29 21:12 ` Paul Eggert
2018-11-29 21:28 ` Alan Mackenzie
2018-11-28 0:53 ` Gemini Lasswell
2018-11-26 20:04 ` Stefan Monnier
2018-11-27 2:51 ` Paul Eggert
2018-11-26 9:48 ` Alan Mackenzie [this message]
2018-11-26 18:27 ` Paul Eggert
2018-11-25 18:48 ` Gemini Lasswell
2018-11-25 20:02 ` Stefan Monnier
2018-11-26 12:39 ` Alan Mackenzie
2018-11-26 16:14 ` Gemini Lasswell
2018-11-26 17:06 ` Alan Mackenzie
2018-11-26 17:24 ` Alan Mackenzie
2018-11-29 12:26 ` scratch/accurate-warning-pos: Some real world timings Alan Mackenzie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181126094800.GA4030@ACM \
--to=acm@muc.de \
--cc=cpitclaudel@gmail.com \
--cc=eggert@cs.ucla.edu \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=michael_heerdegen@web.de \
--cc=monnier@IRO.UMontreal.CA \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).