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).