libcpp: Directly peek for initial line marker
authorNathan Sidwell <nathan@acm.org>
Thu, 8 Oct 2020 19:11:37 +0000 (12:11 -0700)
committerNathan Sidwell <nathan@acm.org>
Thu, 8 Oct 2020 19:16:21 +0000 (12:16 -0700)
commitd1c566d72d9361b37213881222c7e2713cdf05b7
treeaa7640d9fb655ceb26caddbd903344fb6662a1e1
parentcd23ed8af236db2d28314e0652d04e5a0e1540b6
libcpp: Directly peek for initial line marker

Using the tokenizer to sniff for an initial line marker for
preprocessed input is a little brittle, particularly with
-fdirectives-only.  If there is no marker we'll happily munch initial
comments.  This patch directly sniffs the buffer.  This is safe
because the initial line marker was machine generated and must be
right at the beginning of the file.  Anything else is not such a line
marker.  The same is true for the initial directory marker.  For that
tokenizing the string is simplest, but at that point it's either a
regular line marker or a directory marker.  If it's a regular marker,
unwinding tokens is fine.

libcpp/
* internal.h (enum include_type): Rename IT_MAIN_INJECT to
IT_PRE_MAIN.
* init.c (cpp_read_main_file): If there is no line marker, adjust
the initial line marker.
(read_original_filename): Return bool, peek the buffer directly
before trying to tokenize.
(read_original_directory): Likewise.  Directly prod the string
literal.
* files.c (_cpp_stack_file): Adjust for IT_PRE_MAIN change.
libcpp/files.c
libcpp/init.c
libcpp/internal.h