return tok.kind == TOK_PPSTR || tok.kind == TOK_LSTR;
}
-static void append_global_init_byte (int64_s *values, int max_values, int *count, unsigned int value) {
+static void append_global_init_value (int64_s *values, int max_values, int *count, unsigned int value, int elem_size) {
+ unsigned int mask = 0xffU;
+
+ if (elem_size == (DATA_SHORT & 0x1f)) {
+ mask = 0xffffU;
+ }
+
if (*count < max_values) {
- zext64 (&values[*count], value & 0xffU);
+ zext64 (&values[*count], value & mask);
}
(*count)++;
}
+static int parsed_string_initializer_elem_size = DATA_CHAR & 0x1f;
+
+static void append_global_init_byte (int64_s *values, int max_values, int *count, unsigned int value) {
+ append_global_init_value (values, max_values, count, value, DATA_CHAR & 0x1f);
+}
+
static int parse_octal_escape_value (const char **ps) {
const char *s = *ps;
static void parse_string_initializer_values (int64_s *values, int max_values, int *count) {
+ int elem_size = DATA_CHAR & 0x1f;
+
while (is_string_token ()) {
const char *s;
s = tok.ident;
if (tok.kind == TOK_LSTR && *s == 'L') {
+
+ elem_size = DATA_SHORT & 0x1f;
s++;
+
}
quote = *s;
ch = (unsigned char) *s++;
}
- append_global_init_byte (values, max_values, count, ch);
+ append_global_init_value (values, max_values, count, ch, elem_size);
}
}
- append_global_init_byte (values, max_values, count, 0);
+ append_global_init_value (values, max_values, count, 0, elem_size);
+ parsed_string_initializer_elem_size = elem_size;
}
char label[64];
char skip_label[64];
+ int elem_size = DATA_CHAR & 0x1f;
int value_count = 0, i;
memset (label, 0, sizeof (label));
}
parse_string_initializer_values (values, MAX_AGG_FIELDS, &value_count);
+ elem_size = parsed_string_initializer_elem_size;
/*
* Dead statement parsing suppresses output by temporarily clearing
emit_global_data_label (label, 1);
for (i = 0; i < value_count; i++) {
- emit_global_scalar (values[i], DATA_CHAR & 0x1f);
+ emit_global_scalar (values[i], elem_size);
}
switch_section (SECTION_TEXT);
emit_global_data_label (label, 1);
for (i = 0; i < value_count; i++) {
- emit_global_scalar (values[i], DATA_CHAR & 0x1f);
+ emit_global_scalar (values[i], elem_size);
}
return xstrdup (label);