[Bug preprocessor/83173] New: C preprocessor generates incorrect linemarkers
mgulick at mathworks dot com
gcc-bugzilla@gcc.gnu.org
Mon Nov 27 02:27:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83173
Bug ID: 83173
Summary: C preprocessor generates incorrect linemarkers
Product: gcc
Version: 7.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: preprocessor
Assignee: unassigned at gcc dot gnu.org
Reporter: mgulick at mathworks dot com
Target Milestone: ---
Created attachment 42724
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=42724&action=edit
invalid linemarker reproduction source code
GCC is generating incorrect line markers when processing source files with a
large number of includes (e.g. where the internal line map's source location is
greater than LINE_MAP_MAX_LOCATION_WITH_COLS. This results in warnings from
gcc when it compiles this previously preprocessed output. It also results in
gcc generating incorrect line mappings in the debug symbols, as well as
producing compiler warnings and errors that are associated with the wrong file
name and line number.
This invalid line marker is generated for include files that have a '#include'
as the last line in the file. Simply adding an additional newline after the
last include will eliminate this issue.
This issue only occurs when the preprocessor is run as a separate phase, as
when using -save-temps, -no-integrated-cpp, or -E (as is used by distcc).
See also: https://gcc.gnu.org/ml/gcc-help/2017-11/msg00073.html
I have tested gcc 6.3, 7.2, as well as the latest git master (as of yesterday).
These all exhibit this bug. gcc 5.4 does *not* exhibit this bug.
The attached reproducer is able to reproduce this issue on a trivial source
file by using a gcc plugin that artificially increases the line map's starting
location before the preprocessor runs. See README.txt included in the
reproduction tarball for instructions on running the reproducer.
[mgulick@mgulick2-deb9-64:/local-ssd/mgulick/src/gcc/linemarker_repro] ...
$ make
/local-ssd/mgulick/src/gcc/git/debug/gcc/xgcc -B
/local-ssd/mgulick/src/gcc/git/debug/gcc -E repro.c -o repro.i
-fplugin=./location_overflow_plugin.so
-fplugin-arg-location_overflow_plugin-value=0x60000000
setting line_table location offset: 1610612736 was (32)
/local-ssd/mgulick/src/gcc/git/debug/gcc/xgcc -B
/local-ssd/mgulick/src/gcc/git/debug/gcc -c repro.i -o repro.o -Werror
In file included from repro_1.h:3,
from repro.c:1:
repro_2.h:2:16: error: file "repro.h" linemarker ignored due to incorrect
nesting [-Werror]
^
repro_2.h:3:16: error: file "repro.c" linemarker ignored due to incorrect
nesting [-Werror]
#define REPRO_2_H
^
cc1: all warnings being treated as errors
Makefile:45: recipe for target 'test_compile' failed
make: *** [test_compile] Error 1
[mgulick@mgulick2-deb9-64:/local-ssd/mgulick/src/gcc/linemarker_repro] ...
$ cat repro.i
# 1 "repro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "repro.c"
# 1 "repro.h" 1
# 1 "repro_1.h" 1
# 2 "repro.h" 2
# 3 "repro_1.h"
# 1 "repro_2.h" 1
# 2 "repro.h" 2
# 2 "repro.c" 2
The line "# 3 repro_1.h" is incorrect and should not appear.
More information about the Gcc-bugs
mailing list