Commit 5486d913 by Richard Sandiford Committed by Richard Sandiford

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
parent eb0b164e
2015-11-07 Richard Sandiford <richard.sandiford@arm.com>
* builtins.h (c_getstr): Move to...
* fold-const.h (c_getstr): ...here.
* builtins.c (c_getstr): Move to...
* fold-const.c (c_getstr): ...here.
2015-11-07 Richard Sandiford <richard.sandiford@arm.com>
* builtins.def (BUILTIN_RINT, BUILTIN_RINTF, BUILTIN_RINTL): Use
ATTR_MATHFN_FPROUNDING rather than ATTR_MATHFN_FPROUNDING_ERRNO.
......@@ -616,27 +616,6 @@ c_strlen (tree src, int only_value)
return ssize_int (strlen (ptr + offset));
}
/* 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);
}
/* Return a constant integer corresponding to target reading
GET_MODE_BITSIZE (MODE) bits from string constant STR. */
......
......@@ -87,7 +87,6 @@ extern bool is_simple_builtin (tree);
extern bool is_inexpensive_builtin (tree);
extern bool readonly_data_expr (tree exp);
extern const char *c_getstr (tree);
extern bool init_target_chars (void);
extern unsigned HOST_WIDE_INT target_newline;
extern unsigned HOST_WIDE_INT target_percent;
......
......@@ -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);
}
......@@ -180,6 +180,7 @@ extern tree exact_inverse (tree, tree);
extern tree const_unop (enum tree_code, tree, tree);
extern tree const_binop (enum tree_code, tree, tree, tree);
extern bool negate_mathfn_p (enum built_in_function);
extern const char *c_getstr (tree);
/* Return OFF converted to a pointer offset type suitable as offset for
POINTER_PLUS_EXPR. Use location LOC for this conversion. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment