From a01fc54920d7d722eb9efc29156fe4a823d21265 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Wed, 27 Jul 2016 17:21:20 +0000 Subject: [PATCH] Move make_location from tree.h/c to input.h/c For some reason I added make_location and some related functions to tree.h/c, rather than to input.h/c. Move them there, so we can use them without requiring tree, and add some selftest coverage. gcc/ChangeLog: * input.c (get_pure_location): Move here from tree.c. (make_location): Likewise. Add header comment. (selftest::test_accessing_ordinary_linemaps): Verify pure_location_p, make_location, get_location_from_adhoc_loc and get_range_from_loc. * input.h (get_pure_location): Move declaration here from tree.h. (get_finish): Likewise for inline function. (make_location): Likewise for declaration. * tree.c (get_pure_location): Move to input.c. (make_location): Likewise. * tree.h (get_pure_location): Move declaration to tree.h. (get_finish): Likewise for inline function. (make_location): Likewise for declaration. libcpp/ChangeLog: * include/line-map.h (source_location): Fix line numbers in comment. From-SVN: r238792 --- gcc/ChangeLog | 16 +++++++++++ gcc/input.c | 60 +++++++++++++++++++++++++++++++++++++++ gcc/input.h | 13 +++++++++ gcc/tree.c | 36 ----------------------- gcc/tree.h | 13 --------- libcpp/ChangeLog | 5 ++++ libcpp/include/line-map.h | 4 +-- 7 files changed, 96 insertions(+), 51 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0caa798e4f5..9e359bc1e69 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2016-07-27 David Malcolm + + * input.c (get_pure_location): Move here from tree.c. + (make_location): Likewise. Add header comment. + (selftest::test_accessing_ordinary_linemaps): Verify + pure_location_p, make_location, get_location_from_adhoc_loc and + get_range_from_loc. + * input.h (get_pure_location): Move declaration here from tree.h. + (get_finish): Likewise for inline function. + (make_location): Likewise for declaration. + * tree.c (get_pure_location): Move to input.c. + (make_location): Likewise. + * tree.h (get_pure_location): Move declaration to tree.h. + (get_finish): Likewise for inline function. + (make_location): Likewise for declaration. + 2016-07-27 Prathamesh Kulkarni PR middle-end/71078 diff --git a/gcc/input.c b/gcc/input.c index 47845d00070..f91a702d47b 100644 --- a/gcc/input.c +++ b/gcc/input.c @@ -801,6 +801,56 @@ expansion_point_location (source_location location) LRK_MACRO_EXPANSION_POINT, NULL); } +/* Given location LOC, strip away any packed range information + or ad-hoc information. */ + +location_t +get_pure_location (location_t loc) +{ + if (IS_ADHOC_LOC (loc)) + loc + = line_table->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus; + + if (loc >= LINEMAPS_MACRO_LOWEST_LOCATION (line_table)) + return loc; + + if (loc < RESERVED_LOCATION_COUNT) + return loc; + + const line_map *map = linemap_lookup (line_table, loc); + const line_map_ordinary *ordmap = linemap_check_ordinary (map); + + return loc & ~((1 << ordmap->m_range_bits) - 1); +} + +/* Construct a location with caret at CARET, ranging from START to + finish e.g. + + 11111111112 + 12345678901234567890 + 522 + 523 return foo + bar; + ~~~~^~~~~ + 524 + + The location's caret is at the "+", line 523 column 15, but starts + earlier, at the "f" of "foo" at column 11. The finish is at the "r" + of "bar" at column 19. */ + +location_t +make_location (location_t caret, location_t start, location_t finish) +{ + location_t pure_loc = get_pure_location (caret); + source_range src_range; + src_range.m_start = start; + src_range.m_finish = finish; + location_t combined_loc = COMBINE_LOCATION_DATA (line_table, + pure_loc, + src_range, + NULL); + return combined_loc; +} + #define ONE_K 1024 #define ONE_M (ONE_K * ONE_K) @@ -1335,6 +1385,16 @@ test_accessing_ordinary_linemaps (const line_table_case &case_) assert_loceq ("bar.c", 1, 150, loc_f); ASSERT_FALSE (is_location_from_builtin_token (loc_a)); + ASSERT_TRUE (pure_location_p (line_table, loc_a)); + + /* Verify using make_location to build a range, and extracting data + back from it. */ + location_t range_c_b_d = make_location (loc_c, loc_b, loc_d); + ASSERT_FALSE (pure_location_p (line_table, range_c_b_d)); + ASSERT_EQ (loc_c, get_location_from_adhoc_loc (line_table, range_c_b_d)); + source_range src_range = get_range_from_loc (line_table, range_c_b_d); + ASSERT_EQ (loc_b, src_range.m_start); + ASSERT_EQ (loc_d, src_range.m_finish); } /* Verify various properties of UNKNOWN_LOCATION. */ diff --git a/gcc/input.h b/gcc/input.h index ae4fecfe11c..d51f950bcc9 100644 --- a/gcc/input.h +++ b/gcc/input.h @@ -76,6 +76,19 @@ extern location_t input_location; #define from_macro_expansion_at(LOC) \ ((linemap_location_from_macro_expansion_p (line_table, LOC))) +extern location_t get_pure_location (location_t loc); + +/* Get the endpoint of any range encoded within location LOC. */ + +static inline location_t +get_finish (location_t loc) +{ + return get_range_from_loc (line_table, loc).m_finish; +} + +extern location_t make_location (location_t caret, + location_t start, location_t finish); + void dump_line_table_statistics (void); void dump_location_info (FILE *stream); diff --git a/gcc/tree.c b/gcc/tree.c index 661d385d43c..11d3b51e312 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -14112,28 +14112,6 @@ nonnull_arg_p (const_tree arg) return false; } -/* Given location LOC, strip away any packed range information - or ad-hoc information. */ - -location_t -get_pure_location (location_t loc) -{ - if (IS_ADHOC_LOC (loc)) - loc - = line_table->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus; - - if (loc >= LINEMAPS_MACRO_LOWEST_LOCATION (line_table)) - return loc; - - if (loc < RESERVED_LOCATION_COUNT) - return loc; - - const line_map *map = linemap_lookup (line_table, loc); - const line_map_ordinary *ordmap = linemap_check_ordinary (map); - - return loc & ~((1 << ordmap->m_range_bits) - 1); -} - /* Combine LOC and BLOCK to a combined adhoc loc, retaining any range information. */ @@ -14169,20 +14147,6 @@ set_source_range (tree expr, source_range src_range) return adhoc; } -location_t -make_location (location_t caret, location_t start, location_t finish) -{ - location_t pure_loc = get_pure_location (caret); - source_range src_range; - src_range.m_start = start; - src_range.m_finish = finish; - location_t combined_loc = COMBINE_LOCATION_DATA (line_table, - pure_loc, - src_range, - NULL); - return combined_loc; -} - /* Return the name of combined function FN, for debugging purposes. */ const char * diff --git a/gcc/tree.h b/gcc/tree.h index e2ffabfe173..14c8f7a59f4 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -5425,16 +5425,6 @@ type_with_alias_set_p (const_tree t) return false; } -extern location_t get_pure_location (location_t loc); - -/* Get the endpoint of any range encoded within location LOC. */ - -static inline location_t -get_finish (location_t loc) -{ - return get_range_from_loc (line_table, loc).m_finish; -} - extern location_t set_block (location_t loc, tree block); extern void gt_ggc_mx (tree &); @@ -5457,9 +5447,6 @@ get_decl_source_range (tree decl) return get_range_from_loc (line_table, loc); } -extern location_t -make_location (location_t caret, location_t start, location_t finish); - /* Return true if it makes sense to promote/demote from_type to to_type. */ inline bool desired_pro_or_demotion_p (const_tree to_type, const_tree from_type) diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 168e08c15cf..0cdd75d956a 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,8 @@ +2016-07-27 David Malcolm + + * include/line-map.h (source_location): Fix line numbers in + comment. + 2016-07-11 David Malcolm * include/line-map.h (LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES): diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h index 43576761e63..443086a0b70 100644 --- a/libcpp/include/line-map.h +++ b/libcpp/include/line-map.h @@ -227,10 +227,10 @@ typedef unsigned int linenum_type; 11111111112 12345678901234567890 - 521 + 522 523 return foo + bar; ~~~~^~~~~ - 523 + 524 The location's caret is at the "+", line 523 column 15, but starts earlier, at the "f" of "foo" at column 11. The finish is at the "r" -- 2.30.2