poly_int: get_binfo_at_offset
authorRichard Sandiford <richard.sandiford@linaro.org>
Thu, 21 Dec 2017 07:02:28 +0000 (07:02 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 21 Dec 2017 07:02:28 +0000 (07:02 +0000)
This patch changes the offset parameter to get_binfo_at_offset
from HOST_WIDE_INT to poly_int64.  This function probably doesn't
need to handle polynomial offsets in practice, but it's easy
to do and avoids forcing the caller to check first.

2017-12-21  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* tree.h (get_binfo_at_offset): Take the offset as a poly_int64
rather than a HOST_WIDE_INT.
* tree.c (get_binfo_at_offset): Likewise.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r255932

gcc/ChangeLog
gcc/tree.c
gcc/tree.h

index d206c340fb17697cf8eb908a3c749a66dc963a58..9aa16a381a990f120729bdff19ad54b2a4355c87 100644 (file)
@@ -1,3 +1,11 @@
+2017-12-21  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * tree.h (get_binfo_at_offset): Take the offset as a poly_int64
+       rather than a HOST_WIDE_INT.
+       * tree.c (get_binfo_at_offset): Likewise.
+
 2017-12-21  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 97c9f815039b1333e59e32a8b925fd49951b07a0..aa647de80141edc4ea3414787943e4ba00bd2816 100644 (file)
@@ -12351,7 +12351,7 @@ lookup_binfo_at_offset (tree binfo, tree type, HOST_WIDE_INT pos)
    found, return, otherwise return NULL_TREE.  */
 
 tree
-get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type)
+get_binfo_at_offset (tree binfo, poly_int64 offset, tree expected_type)
 {
   tree type = BINFO_TYPE (binfo);
 
@@ -12363,7 +12363,7 @@ get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type)
 
       if (types_same_for_odr (type, expected_type))
          return binfo;
-      if (offset < 0)
+      if (maybe_lt (offset, 0))
        return NULL_TREE;
 
       for (fld = TYPE_FIELDS (type); fld; fld = DECL_CHAIN (fld))
@@ -12373,7 +12373,7 @@ get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type)
 
          pos = int_bit_position (fld);
          size = tree_to_uhwi (DECL_SIZE (fld));
-         if (pos <= offset && (pos + size) > offset)
+         if (known_in_range_p (offset, pos, size))
            break;
        }
       if (!fld || TREE_CODE (TREE_TYPE (fld)) != RECORD_TYPE)
@@ -12381,7 +12381,7 @@ get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type)
 
       /* Offset 0 indicates the primary base, whose vtable contents are
         represented in the binfo for the derived class.  */
-      else if (offset != 0)
+      else if (maybe_ne (offset, 0))
        {
          tree found_binfo = NULL, base_binfo;
          /* Offsets in BINFO are in bytes relative to the whole structure
index e8a2470106e437c147f7ee89cf7e9dc07da7d276..aedd48d0e1841bbde0393da5d1e0bf9bde11228c 100644 (file)
@@ -4856,7 +4856,7 @@ extern void tree_set_block (tree, tree);
 extern location_t *block_nonartificial_location (tree);
 extern location_t tree_nonartificial_location (tree);
 extern tree block_ultimate_origin (const_tree);
-extern tree get_binfo_at_offset (tree, HOST_WIDE_INT, tree);
+extern tree get_binfo_at_offset (tree, poly_int64, tree);
 extern bool virtual_method_call_p (const_tree);
 extern tree obj_type_ref_class (const_tree ref);
 extern bool types_same_for_odr (const_tree type1, const_tree type2,