This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++] Fix endianness of character argument packs
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: jason at redhat dot com
- Date: Thu, 30 Jan 2014 18:14:31 +0000
- Subject: [C++] Fix endianness of character argument packs
- Authentication-results: sourceware.org; auth=none
The patch for PR 58708 fixed wide strings being passed as argument packs
but it relied on the host and target having the same endianness.
The patch below uses double_int::from_buffer to handle the case
of differing endiannesses.
Tested on mips64-linux-gnu and mipsisa64-sde-elf (with both endiannesses
in the latter case). It fixes the pr58708.C failures for big endian.
OK to install?
Thanks,
Richard
gcc/cp/
PR c++/58708
* parser.c (make_string_pack): Use double_int::from_buffer.
Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c 2014-01-29 21:49:13.875748266 +0000
+++ gcc/cp/parser.c 2014-01-29 21:49:20.869759475 +0000
@@ -3808,7 +3808,8 @@ make_string_pack (tree value)
{
tree charvec;
tree argpack = make_node (NONTYPE_ARGUMENT_PACK);
- const char *str = TREE_STRING_POINTER (value);
+ const unsigned char *str
+ = (const unsigned char *) TREE_STRING_POINTER (value);
int sz = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (value))));
int len = TREE_STRING_LENGTH (value) / sz - 1;
tree argvec = make_tree_vec (2);
@@ -3821,23 +3822,10 @@ make_string_pack (tree value)
/* Fill in CHARVEC with all of the parameters. */
charvec = make_tree_vec (len);
- if (sz == 1)
- {
- for (int i = 0; i < len; ++i)
- TREE_VEC_ELT (charvec, i) = build_int_cst (str_char_type_node, str[i]);
- }
- else if (sz == 2)
- {
- const uint16_t *num = (const uint16_t *)str;
- for (int i = 0; i < len; ++i)
- TREE_VEC_ELT (charvec, i) = build_int_cst (str_char_type_node, num[i]);
- }
- else if (sz == 4)
- {
- const uint32_t *num = (const uint32_t *)str;
- for (int i = 0; i < len; ++i)
- TREE_VEC_ELT (charvec, i) = build_int_cst (str_char_type_node, num[i]);
- }
+ for (int i = 0; i < len; ++i)
+ TREE_VEC_ELT (charvec, i)
+ = double_int_to_tree (str_char_type_node,
+ double_int::from_buffer (str + i * sz, sz));
/* Build the argument packs. */
SET_ARGUMENT_PACK_ARGS (argpack, charvec);