aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2015-11-07 10:01:52 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2015-11-07 10:01:52 +0000
commit5486d91300d0540215978ecde30870e1a337910c (patch)
tree0745360532b642227c4b092f57f659a9b65ff873 /gcc/fold-const.c
parenteb0b164e5f7b8fff929e73fdd0a15a6d769ebc1c (diff)
downloadgcc-5486d91300d0540215978ecde30870e1a337910c.zip
gcc-5486d91300d0540215978ecde30870e1a337910c.tar.gz
gcc-5486d91300d0540215978ecde30870e1a337910c.tar.bz2
Move c_getstr to fold-const.c
Upcoming patches to fold-const-call.c want to use c_getstr, which is currently defined in builtins.c. The function doesn't really do anything related to built-ins, and I'd rather not make fold-const-call.c depend on builtins.c and builtins.c depend on fold-const-call.c, so this patch moves the function to fold-const.c instead. Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi. gcc/ * builtins.h (c_getstr): Move to... * fold-const.h (c_getstr): ...here. * builtins.c (c_getstr): Move to... * fold-const.c (c_getstr): ...here. From-SVN: r229919
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index fb613da..ae28445 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -14398,3 +14398,24 @@ fold_build_pointer_plus_hwi_loc (location_t loc, tree ptr, HOST_WIDE_INT off)
return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
ptr, size_int (off));
}
+
+/* Return a char pointer for a C string if it is a string constant
+ or sum of string constant and integer constant. */
+
+const char *
+c_getstr (tree src)
+{
+ tree offset_node;
+
+ src = string_constant (src, &offset_node);
+ if (src == 0)
+ return 0;
+
+ if (offset_node == 0)
+ return TREE_STRING_POINTER (src);
+ else if (!tree_fits_uhwi_p (offset_node)
+ || compare_tree_int (offset_node, TREE_STRING_LENGTH (src) - 1) > 0)
+ return 0;
+
+ return TREE_STRING_POINTER (src) + tree_to_uhwi (offset_node);
+}