public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug preprocessor/108900] New: [libcpp] cpp gives wrong line number information
@ 2023-02-23 8:35 libin.dang at gmail dot com
2023-02-25 14:50 ` [Bug preprocessor/108900] [libcpp] cpp gives wrong line number information with a file huge number of lines libin.dang at gmail dot com
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: libin.dang at gmail dot com @ 2023-02-23 8:35 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108900
Bug ID: 108900
Summary: [libcpp] cpp gives wrong line number information
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: preprocessor
Assignee: unassigned at gcc dot gnu.org
Reporter: libin.dang at gmail dot com
Target Milestone: ---
Created attachment 54514
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54514&action=edit
test case
Reproduce:
$ /home/wrsadmin/works/gcc/b0/gcc/cpp -B /home/wrsadmin/works/gcc/b0/gcc main.c
-o main.i
$ tail main.i
header3 begins
header3 begins
# 1 "header2.h" 1
# 327614 "header3.h" 2
header3 ends
# 4 "header1.h" 2
# 1 "header4.h" 1
# 5 "header1.h" 2
header1 ends
# 2 "main.c" 2
$ cat -n header3.h | tail
327606 header3 begins
327607 header3 begins
327608 header3 begins
327609 header3 begins
327610 header3 begins
327611 header3 begins
327612 header3 begins
327613 header3 begins
327614 #include "header2.h"
327615 header3 ends
The line number information for `header3 ends' is wrong.
BTW, this issue is very sensitive to the input files, for example, if we add
another line `header3 begins' above the `#include "header2.h"' in header3.h, we
will get the correct result:
$ cat -n header3.h | tail
327607 header3 begins
327608 header3 begins
327609 header3 begins
327610 header3 begins
327611 header3 begins
327612 header3 begins
327613 header3 begins
327614 header3 begins
327615 #include "header2.h"
327616 header3 ends
$ tail main.i
header3 begins
header3 begins
# 1 "header2.h" 1
# 327616 "header3.h" 2
header3 ends
# 4 "header1.h" 2
# 1 "header4.h" 1
# 5 "header1.h" 2
header1 ends
# 2 "main.c" 2
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug preprocessor/108900] [libcpp] cpp gives wrong line number information with a file huge number of lines
2023-02-23 8:35 [Bug preprocessor/108900] New: [libcpp] cpp gives wrong line number information libin.dang at gmail dot com
@ 2023-02-25 14:50 ` libin.dang at gmail dot com
2023-05-04 10:19 ` libin.dang at gmail dot com
2023-12-28 14:10 ` libin.dang at gmail dot com
2 siblings, 0 replies; 4+ messages in thread
From: libin.dang at gmail dot com @ 2023-02-25 14:50 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108900
--- Comment #1 from Libin Dang <libin.dang at gmail dot com> ---
For this test case, `-fdump-internal-locations' gives:
...
header3.h:327614|loc:1342177760|#include "header2.h"
|77777778888888888888
|78889990001112223334
|92582581481470470360
|24680246802468024680
ORDINARY MAP: 10
location_t interval: 1342178464 <= loc < 1342178464
file: header3.h
starting at line: 327615
column and range bits: 7
column bits: 7
range bits: 0
reason: 2 (LC_RENAME)
included from location: 270816 (in ordinary map 8)
ORDINARY MAP: 11
location_t interval: 1342178464 <= loc < 1342178496
file: header2.h
starting at line: 1
column and range bits: 7
column bits: 7
range bits: 0
reason: 0 (LC_ENTER)
included from location: 1342178336 (in ordinary map 9)
header2.h: 1|loc:1342178464|
|
|
|
|
ORDINARY MAP: 12
location_t interval: 1342178496 <= loc < 1342178528
file: header3.h
starting at line: 327614
column and range bits: 7
column bits: 7
range bits: 0
reason: 1 (LC_LEAVE)
included from location: 270816 (in ordinary map 8)
header3.h:327614|loc:1342178496|#include "header2.h"
|88888888888888888888
|44455555555555555555
|99900000000001111111
|78901234567890123456
...
Map 10 has `location_t interval: 1342178464 <= loc < 1342178464', this does not
look right. And Map 12 suppose to have location information for `header3 ends'
instead of `#include "header2.h"'.
Both the following changes can fix this issue (at least for this test case):
diff --git a/libcpp/line-map.c b/libcpp/line-map.c
index 8a390d0..991170e 100644
--- a/libcpp/line-map.c
+++ b/libcpp/line-map.c
@@ -524,6 +524,10 @@ linemap_add (line_maps *set, enum lc_reason reason,
/* A TO_FILE of NULL is special - we use the natural values. */
if (to_file == NULL)
{
+ /* Adjust for LC_RENAME in some special cases */
+ while (from->to_file == from[1].to_file && from->included_from ==
from[1].included_from)
+ ++from;
+
diff --git a/libcpp/line-map.cc b/libcpp/line-map.cc
index 62077c3857c0..452016f377c9 100644
--- a/libcpp/line-map.cc
+++ b/libcpp/line-map.cc
@@ -775,8 +775,6 @@ linemap_line_start (line_maps *set, linenum_type to_line,
&& line_delta * map->m_column_and_range_bits > 1000)
|| (max_column_hint >= (1U << effective_column_bits))
|| (max_column_hint <= 80 && effective_column_bits >= 10)
- || (highest > LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES
- && map->m_range_bits > 0)
|| (highest > LINE_MAP_MAX_LOCATION_WITH_COLS
&& (set->max_column_hint || highest >= LINE_MAP_MAX_LOCATION)))
add_map = true;
However, neither of them looks right.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug preprocessor/108900] [libcpp] cpp gives wrong line number information with a file huge number of lines
2023-02-23 8:35 [Bug preprocessor/108900] New: [libcpp] cpp gives wrong line number information libin.dang at gmail dot com
2023-02-25 14:50 ` [Bug preprocessor/108900] [libcpp] cpp gives wrong line number information with a file huge number of lines libin.dang at gmail dot com
@ 2023-05-04 10:19 ` libin.dang at gmail dot com
2023-12-28 14:10 ` libin.dang at gmail dot com
2 siblings, 0 replies; 4+ messages in thread
From: libin.dang at gmail dot com @ 2023-05-04 10:19 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108900
--- Comment #2 from Libin Dang <libin.dang at gmail dot com> ---
The reason we rose this issue is that it broken our internal code coverage test
suite.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug preprocessor/108900] [libcpp] cpp gives wrong line number information with a file huge number of lines
2023-02-23 8:35 [Bug preprocessor/108900] New: [libcpp] cpp gives wrong line number information libin.dang at gmail dot com
2023-02-25 14:50 ` [Bug preprocessor/108900] [libcpp] cpp gives wrong line number information with a file huge number of lines libin.dang at gmail dot com
2023-05-04 10:19 ` libin.dang at gmail dot com
@ 2023-12-28 14:10 ` libin.dang at gmail dot com
2 siblings, 0 replies; 4+ messages in thread
From: libin.dang at gmail dot com @ 2023-12-28 14:10 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108900
--- Comment #3 from Libin Dang <libin.dang at gmail dot com> ---
For the uploaded test case, `-fdump-internal-locations' gives the following
output:
ORDINARY MAP: 9
location_t interval: 274912 <= loc < 1342178464
file: header3.h
starting at line: 1
column and range bits: 12
column bits: 7
range bits: 5
reason: 0 (LC_ENTER)
included from location: 270816 (in ordinary map 8)
header3.h: 1|loc:274912|header3 begins
|44555555555555
|99000111222233
|47047036036926
|46802468024680
header3.h: 2|loc:279008|header3 begins
|99999999999999
|00111222233344
|47036036926925
|02468024680246
...
header3.h:327613|loc:1342173664|header3 begins
|33333333334444
|67778889990001
|92692582581481
|68024680246802
header3.h:327614|loc:1342177760|#include "header2.h"
|77777778888888888888
|78889990001112223334
|92582581481470470360
|24680246802468024680
However, location 1342173664 (0x4ffff1e0) <
LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES (0x50000000) but location 1342177760
(0x500001e0) > LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES, therefore these two
locations should not in the same line map.
In linemap_line_start() of libcpp/line-map.cc, if it does not create new line
map (add_map is false), it will return the following new location:
r = set->highest_line + (line_delta << map->m_column_and_range_bits);
and this location will be included in the last ordinary map, even that location
is greater than LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES and therefore should
be in a new line map.
The following patch can fix this issue:
--- a/libcpp/line-map.cc
+++ b/libcpp/line-map.cc
@@ -860,7 +860,9 @@ linemap_line_start (line_maps *set, linenum_type to_line,
|| (highest > LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES
&& map->m_range_bits > 0)
|| (highest > LINE_MAP_MAX_LOCATION_WITH_COLS
- && (set->max_column_hint || highest >= LINE_MAP_MAX_LOCATION)))
+ && (set->max_column_hint || highest >= LINE_MAP_MAX_LOCATION))
+ || ((set->highest_line + (line_delta << map->m_column_and_range_bits))
+ > LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES))
add_map = true;
else
max_column_hint = set->max_column_hint;
After applied this change, the `-fdump-internal-locations' options gives the
following results:
ORDINARY MAP: 9
location_t interval: 274912 <= loc < 1342174176
file: header3.h
starting at line: 1
column and range bits: 12
column bits: 7
range bits: 5
reason: 0 (LC_ENTER)
included from location: 270816 (in ordinary map 8)
header3.h: 1|loc:274912|header3 begins
|44555555555555
|99000111222233
|47047036036926
|46802468024680
header3.h: 2|loc:279008|header3 begins
|99999999999999
|00111222233344
|47036036926925
|02468024680246
...
header3.h:327613|loc:1342173664|header3 begins
|33333333334444
|67778889990001
|92692582581481
|68024680246802
ORDINARY MAP: 10
location_t interval: 1342174176 <= loc < 1342178272
file: header3.h
starting at line: 327614
column and range bits: 12
column bits: 7
range bits: 5
reason: 2 (LC_RENAME)
included from location: 270816 (in ordinary map 8)
header3.h:327614|loc:1342174176|#include "header2.h"
|44444444444444444444
|22233344445556667778
|04703603692692582581
|80246802468024680246
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-12-28 14:10 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-23 8:35 [Bug preprocessor/108900] New: [libcpp] cpp gives wrong line number information libin.dang at gmail dot com
2023-02-25 14:50 ` [Bug preprocessor/108900] [libcpp] cpp gives wrong line number information with a file huge number of lines libin.dang at gmail dot com
2023-05-04 10:19 ` libin.dang at gmail dot com
2023-12-28 14:10 ` libin.dang at gmail dot com
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).