diff options
author | David Malcolm <dmalcolm@redhat.com> | 2016-07-27 17:21:20 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2016-07-27 17:21:20 +0000 |
commit | a01fc54920d7d722eb9efc29156fe4a823d21265 (patch) | |
tree | e95187d29ed6854ea7491bfd9df3af7b2456d81d /gcc/input.c | |
parent | 182f2f648a9bb55a4be594e4b9e6531fdea1a464 (diff) | |
download | gcc-a01fc54920d7d722eb9efc29156fe4a823d21265.zip gcc-a01fc54920d7d722eb9efc29156fe4a823d21265.tar.gz gcc-a01fc54920d7d722eb9efc29156fe4a823d21265.tar.bz2 |
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
Diffstat (limited to 'gcc/input.c')
-rw-r--r-- | gcc/input.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/gcc/input.c b/gcc/input.c index 47845d00..f91a702 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. */ |