[PATCH 10/10] Compress short ranges into source_location
Jeff Law
law@redhat.com
Fri Oct 30 06:07:00 GMT 2015
On 10/23/2015 02:41 PM, David Malcolm wrote:
>
> gcc/ada/ChangeLog:
> * gcc-interface/trans.c (Sloc_to_locus): Add line_table param when
> calling linemap_position_for_line_and_column.
>
> gcc/ChangeLog:
> * input.c (dump_line_table_statistics): Dump stats on how many
> ranges were optimized vs how many needed ad-hoc table.
> (write_digit_row): Add "map" param; use its range_bits
> to calculate the per-character offset.
> (dump_location_info): Print the range and column bits for each
> ordinary map. Use the range bits to calculate the per-character
> offset. Pass the map as a new param to the various calls to
> write_digit_row. Eliminate uses of
> ORDINARY_MAP_NUMBER_OF_COLUMN_BITS.
> * toplev.c (general_init): Initialize line_table's
> default_range_bits.
> * tree.c (get_pure_location): New function.
> (set_block): Use the pure form of the location for the
> caret in the combined location.
> (set_source_range): Likewise.
>
> gcc/testsuite/ChangeLog:
> * gcc.dg/plugin/diagnostic_plugin_test_show_locus.c (get_loc): Add
> line_table param when calling
> linemap_position_for_line_and_column.
> * gcc.dg/plugin/diagnostic_plugin_test_tree_expression_range.c
> (emit_warning): Remove restriction that "loc" must be ad-hoc.
>
> libcpp/ChangeLog:
> * include/line-map.h (source_location): Update the descriptive
> comment to reflect the packing scheme for short ranges.
> (struct line_map_ordinary): Drop field "column_bits" in favor
> of field "m_column_and_range_bits"; add field "m_range_bits".
> (ORDINARY_MAP_NUMBER_OF_COLUMN_BITS): Delete.
> (struct line_maps): Add fields "default_range_bits",
> "num_optimized_ranges" and "num_unoptimized_ranges".
> (get_range_from_adhoc_loc): Delete prototype.
> (get_range_from_loc): Convert from an inline function to a
> prototype.
> (pure_location_p): New prototype.
> (SOURCE_LINE): Update for renaming of column_bits.
> (SOURCE_COLUMN): Likewise. Shift the column right by the map's
> range_bits.
> (LAST_SOURCE_LINE_LOCATION): Update for renaming of column_bits.
> (linemap_position_for_line_and_column): Add line_maps * params.
> * lex.c (_cpp_lex_direct): Don't attempt to record token ranges
> for UNKNOWN_LOCATION and BUILTINS_LOCATION.
> * line-map.c (LINE_MAP_MAX_COLUMN_NUMBER): Reduce from 1U << 17 to
> 1U << 9.
> (can_be_stored_compactly_p): New function.
> (get_combined_adhoc_loc): Implement bit-packing scheme for short
> ranges.
> (get_range_from_adhoc_loc): Make static.
> (get_range_from_loc): New function.
> (pure_location_p): New function.
> (linemap_add): Ensure that start_location has zero for the
> range_bits, unless we're past LINE_MAP_MAX_LOCATION_WITH_COLS.
> Initialize range_bits to zero. Assert that the start_location
> is "pure".
> (linemap_line_start): Assert that the
> column_and_range_bits >= range_bits.
> Update determinination of whether we need to start a new map
> using the effective column bits, without the range bits.
> Use the set's default_range_bits in new maps, apart from
> those with column_bits == 0, which should also have 0 range_bits.
> Increase the column bits for new maps by the range bits.
> When adding lines to an existing map, use set->highest_line
> directly rather than offsetting highest by SOURCE_COLUMN.
> Add assertions to sanity-check the return value.
> (linemap_position_for_column): Offset to_column by range_bits.
> Update set->hightest_location if necessary.
> (linemap_position_for_line_and_column): Add line_maps * param.
> Update the calculation to offset the column by range_bits, and
> conditionalize it on being <= LINE_MAP_MAX_LOCATION_WITH_COLS.
> Bound it by LINEMAPS_MACRO_LOWEST_LOCATION. Update
> set->highest_location if necessary.
> (linemap_position_for_loc_and_offset): Pass "set" to
> linemap_position_for_line_and_column.
> * location-example.txt: Regenerate, showing new representation.
"determinination"? :-)
> ---
> gcc/ada/gcc-interface/trans.c | 3 +-
> gcc/input.c | 28 ++-
> .../plugin/diagnostic_plugin_test_show_locus.c | 3 +-
> .../diagnostic_plugin_test_tree_expression_range.c | 8 +-
> gcc/toplev.c | 1 +
> gcc/tree.c | 25 ++-
> libcpp/include/line-map.h | 121 +++++++----
> libcpp/lex.c | 9 +-
> libcpp/line-map.c | 229 +++++++++++++++++++--
> libcpp/location-example.txt | 188 +++++++++--------
> 10 files changed, 450 insertions(+), 165 deletions(-)
>
> diff --git a/gcc/tree.c b/gcc/tree.c
> index a676352..4ec4a38 100644
> --- a/gcc/tree.c
> +++ b/gcc/tree.c
> @@ -13653,11 +13653,31 @@ nonnull_arg_p (const_tree arg)
> return false;
> }
>
> +static location_t
> +get_pure_location (location_t loc)
Function comment.
> diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h
> index 0ef29d9..1a2dab8 100644
> --- a/libcpp/include/line-map.h
> +++ b/libcpp/include/line-map.h
> @@ -821,8 +871,10 @@ extern source_location get_combined_adhoc_loc
(struct line_maps *,
> extern void *get_data_from_adhoc_loc (struct line_maps *, source_location);
> extern source_location get_location_from_adhoc_loc (struct line_maps *,
> source_location);
> -extern source_range get_range_from_adhoc_loc (struct line_maps *,
> - source_location);
> +
> +extern source_range
> +get_range_from_loc (line_maps *set,
> + source_location loc);
Nit. Should probably all be on one line.
diff --git a/libcpp/line-map.c b/libcpp/line-map.c
> index 6385fdf..fe8d784 100644
> --- a/libcpp/line-map.c
> +++ b/libcpp/line-map.c
> @@ -29,7 +29,7 @@ along with this program; see the file COPYING3. If not see
> /* Do not track column numbers higher than this one. As a result, the
> range of column_bits is [7, 18] (or 0 if column numbers are
> disabled). */
> -const unsigned int LINE_MAP_MAX_COLUMN_NUMBER = (1U << 17);
> +const unsigned int LINE_MAP_MAX_COLUMN_NUMBER = (1U << 9);
Comment needs updating, right?
> +/* Helper function for get_combined_adhoc_loc.
> + Can the given LOCUS + SRC_RANGE and DATA pointer be stored compactly
> + within a source_location, without needing to use an ad-hoc location. */
> +
> +static bool
> +can_be_stored_compactly_p (struct line_maps *set,
> + source_location locus,
> + source_range src_range,
> + void *data)
> +{
> + /* If there's an ad-hoc pointer, we can't store it directly in the
> + source_location, we need the lookaside. */
> + if (data)
> + return false;
> +
> + /* We only store ranges that begin at the locus and that are sufficientl
sufficiently
> +
> +#define DEBUG_PACKING 0
> +
> +#if DEBUG_PACKING
> + fprintf (stderr, "get_combined_adhoc_loc: %x %x %x\n",
> + locus, src_range.m_start, src_range.m_finish);
> +#endif
Shouldn't this stuff (DEBUG_PACKING) just go away?
With the nits above fixed, this is OK. Obviously there's prereqs that
need to be approved and committed together.
jeff
More information about the Gcc-patches
mailing list