diff mbox

[committed] Move make_location from tree.h/c to input.h/c

Message ID 1469641908-35726-1-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm July 27, 2016, 5:51 p.m. UTC
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.

Bootstrapped&regrtested on x86_64-pc-linux-gnu.

Committed to trunk as r238792.

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.
---
 gcc/input.c               | 60 +++++++++++++++++++++++++++++++++++++++++++++++
 gcc/input.h               | 13 ++++++++++
 gcc/tree.c                | 36 ----------------------------
 gcc/tree.h                | 13 ----------
 libcpp/include/line-map.h |  4 ++--
 5 files changed, 75 insertions(+), 51 deletions(-)
diff mbox

Patch

diff --git a/gcc/input.c b/gcc/input.c
index 5033824..a7aced2 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)
 
@@ -1603,6 +1653,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 b61cf19..24d9115 100644
--- a/gcc/input.h
+++ b/gcc/input.h
@@ -77,6 +77,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 661d385..11d3b51 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 e2ffabf..14c8f7a 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/include/line-map.h b/libcpp/include/line-map.h
index da7a5fa..3a3a424 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"