]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Backport r268789
authorMartin Liska <mliska@suse.cz>
Mon, 11 Mar 2019 11:18:08 +0000 (12:18 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 11 Mar 2019 11:18:08 +0000 (11:18 +0000)
2019-03-11  Martin Liska  <mliska@suse.cz>

Backport from mainline
2019-02-11  David Malcolm  <dmalcolm@redhat.com>

PR lto/88147
* input.c (selftest::test_line_offset_overflow): New selftest.
(selftest::input_c_tests): Call it.
2019-03-11  Martin Liska  <mliska@suse.cz>

Backport from mainline
2019-02-11  Martin Liska  <mliska@suse.cz>

PR lto/88147
* line-map.c (linemap_line_start): Don't reuse the existing line
map if the line offset is sufficiently large to cause overflow
when computing location_t values.

From-SVN: r269576

gcc/ChangeLog
gcc/input.c
libcpp/ChangeLog
libcpp/line-map.c

index a60cfb6c7b220bb612cb67c497c182b79b514952..a8bf724062169a87cc75e80dcb0d7450de8915f2 100644 (file)
@@ -1,3 +1,12 @@
+2019-03-11  Martin Liska  <mliska@suse.cz>
+
+       Backport from mainline
+       2019-02-11  David Malcolm  <dmalcolm@redhat.com>
+
+       PR lto/88147
+       * input.c (selftest::test_line_offset_overflow): New selftest.
+       (selftest::input_c_tests): Call it.
+
 2019-03-07  Xiong Hu Luo  <luoxhu@linux.ibm.com>
 
        Backport of r268834 from mainline to gcc-7-branch.
index 80718100d0c5fac5baf22d8518aebad0788f89f3..6412d70f4e2623364a9c3b6d9a424b36e9e1f9e4 100644 (file)
@@ -3480,6 +3480,34 @@ for_each_line_table_case (void (*testcase) (const line_table_case &))
   ASSERT_EQ (num_cases_tested, 2 * 12);
 }
 
+/* Verify that when presented with a consecutive pair of locations with
+   a very large line offset, we don't attempt to consolidate them into
+   a single ordinary linemap where the line offsets within the line map
+   would lead to overflow (PR lto/88147).  */
+
+static void
+test_line_offset_overflow ()
+{
+  line_table_test ltt (line_table_case (5, 0));
+
+  linemap_add (line_table, LC_ENTER, false, "foo.c", 0);
+  linemap_line_start (line_table, 1, 100);
+  location_t loc_a = linemap_line_start (line_table, 2578, 255);
+  assert_loceq ("foo.c", 2578, 0, loc_a);
+
+  const line_map_ordinary *ordmap_a = LINEMAPS_LAST_ORDINARY_MAP (line_table);
+  ASSERT_EQ (ordmap_a->m_column_and_range_bits, 13);
+  ASSERT_EQ (ordmap_a->m_range_bits, 5);
+
+  location_t loc_b = linemap_line_start (line_table, 404198, 512);
+  assert_loceq ("foo.c", 404198, 0, loc_b);
+
+  /* We should have started a new linemap, rather than attempting to store
+     a very large line offset.  */
+  const line_map_ordinary *ordmap_b = LINEMAPS_LAST_ORDINARY_MAP (line_table);
+  ASSERT_NE (ordmap_a, ordmap_b);
+}
+
 /* Run all of the selftests within this file.  */
 
 void
@@ -3518,6 +3546,8 @@ input_c_tests ()
   for_each_line_table_case (test_lexer_char_constants);
 
   test_reading_source_line ();
+
+  test_line_offset_overflow ();
 }
 
 } // namespace selftest
index a320882ab0df8926d8310f421951d8b00b7198eb..df7072e6fa194191d45c9f6fa0e554c43f811097 100644 (file)
@@ -1,3 +1,13 @@
+2019-03-11  Martin Liska  <mliska@suse.cz>
+
+       Backport from mainline
+       2019-02-11  Martin Liska  <mliska@suse.cz>
+
+       PR lto/88147
+       * line-map.c (linemap_line_start): Don't reuse the existing line
+       map if the line offset is sufficiently large to cause overflow
+       when computing location_t values.
+
 2018-12-06  Release Manager
 
        * GCC 7.4.0 released.
index 949489eb1a1b645e6b7b58f307a5d27b9a23a0f7..5827f303b6df97581be6fe9ea2ef70fb387fff6e 100644 (file)
@@ -753,6 +753,10 @@ linemap_line_start (struct line_maps *set, linenum_type to_line,
       if (line_delta < 0
          || last_line != ORDINARY_MAP_STARTING_LINE_NUMBER (map)
          || SOURCE_COLUMN (map, highest) >= (1U << (column_bits - range_bits))
+         || ( /* We can't reuse the map if the line offset is sufficiently
+                 large to cause overflow when computing location_t values.  */
+             (to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
+             >= (1U << (CHAR_BIT * sizeof (linenum_type) - column_bits)))
          || range_bits < map->m_range_bits)
        map = linemap_check_ordinary
                (const_cast <line_map *>