diff mbox

Fix linemap_line_start (PR preprocessor/60436)

Message ID 20141124232224.GL1674@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Nov. 24, 2014, 11:22 p.m. UTC
Hi!

As mentioned in the PR, when preprocessing very large files, if there are
huge numbers of lines where no #line is emitted, we might not detect
overflowinging into adhoc locations.
Apparently in the add_map case we already handle that fine, by first
stopping tracking columns and after another 256M lines give up on tracking
locations, so this patch just makes sure we enter that path if
going over those limits.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2014-11-24  Jakub Jelinek  <jakub@redhat.com>

	PR preprocessor/60436
	* line-map.c (linemap_line_start): If highest is above 0x60000000
	and we are still tracking columns or highest is above 0x70000000,
	force add_map.


	Jakub

Comments

Richard Biener Nov. 25, 2014, 9:24 a.m. UTC | #1
On Tue, Nov 25, 2014 at 12:22 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> As mentioned in the PR, when preprocessing very large files, if there are
> huge numbers of lines where no #line is emitted, we might not detect
> overflowinging into adhoc locations.
> Apparently in the add_map case we already handle that fine, by first
> stopping tracking columns and after another 256M lines give up on tracking
> locations, so this patch just makes sure we enter that path if
> going over those limits.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2014-11-24  Jakub Jelinek  <jakub@redhat.com>
>
>         PR preprocessor/60436
>         * line-map.c (linemap_line_start): If highest is above 0x60000000
>         and we are still tracking columns or highest is above 0x70000000,
>         force add_map.
>
> --- libcpp/line-map.c.jj        2014-11-12 08:06:57.000000000 +0100
> +++ libcpp/line-map.c   2014-11-24 12:14:52.691276169 +0100
> @@ -529,10 +529,10 @@ linemap_line_start (struct line_maps *se
>           && line_delta * ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map) > 1000)
>        || (max_column_hint >= (1U << ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map)))
>        || (max_column_hint <= 80
> -         && ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map) >= 10))
> -    {
> -      add_map = true;
> -    }
> +         && ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map) >= 10)
> +      || (highest > 0x60000000
> +         && (set->max_column_hint || highest > 0x70000000)))
> +    add_map = true;
>    else
>      max_column_hint = set->max_column_hint;
>    if (add_map)
> @@ -543,7 +543,7 @@ linemap_line_start (struct line_maps *se
>           /* If the column number is ridiculous or we've allocated a huge
>              number of source_locations, give up on column numbers. */
>           max_column_hint = 0;
> -         if (highest >0x70000000)
> +         if (highest > 0x70000000)
>             return 0;
>           column_bits = 0;
>         }
>
>         Jakub
diff mbox

Patch

--- libcpp/line-map.c.jj	2014-11-12 08:06:57.000000000 +0100
+++ libcpp/line-map.c	2014-11-24 12:14:52.691276169 +0100
@@ -529,10 +529,10 @@  linemap_line_start (struct line_maps *se
 	  && line_delta * ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map) > 1000)
       || (max_column_hint >= (1U << ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map)))
       || (max_column_hint <= 80
-	  && ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map) >= 10))
-    {
-      add_map = true;
-    }
+	  && ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map) >= 10)
+      || (highest > 0x60000000
+	  && (set->max_column_hint || highest > 0x70000000)))
+    add_map = true;
   else
     max_column_hint = set->max_column_hint;
   if (add_map)
@@ -543,7 +543,7 @@  linemap_line_start (struct line_maps *se
 	  /* If the column number is ridiculous or we've allocated a huge
 	     number of source_locations, give up on column numbers. */
 	  max_column_hint = 0;
-	  if (highest >0x70000000)
+	  if (highest > 0x70000000)
 	    return 0;
 	  column_bits = 0;
 	}