+2015-05-14 Rohit Arul Raj <rohitrulraj@freescale.com>
+
+ * varasm.c (output_constant_pool_1): Pass down alignment from
+ constant pool entry's descriptor to output_constant_pool_2.
+ (output_object_block): Add comment prior to call to
+ output_constant_pool_1.
+
2015-05-14 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/65862
--- /dev/null
+/* { dg-do compile } */
+/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */
+/* { dg-options "-mcpu=8548 -mno-spe -mfloat-gprs=double -Os -fdata-sections -fpic -mrelocatable" } */
+
+#define NULL 0
+int func (int val);
+void *func2 (void *ptr);
+
+static const char *ifs;
+static char map[256];
+
+typedef struct {
+/* None of these fields are used, but removing any
+ of them makes the problem go away. */
+ char *data;
+ int length;
+ int maxlen;
+ int quote;
+} o_string;
+
+#define NULL_O_STRING {NULL,0,0,0}
+
+static int parse_stream (void *dest, void *ctx)
+{
+ int ch = func (0), m;
+
+ while (ch != -1) {
+ m = map[ch];
+ if (ch != '\n')
+ func2(dest);
+
+ ctx = func2 (ctx);
+ if (!func (0))
+ return 0;
+ if (m != ch) {
+ func2 ("htns");
+ break;
+ }
+ }
+ return -1;
+}
+
+static void mapset (const char *set, int code)
+{
+ const char *s;
+ for (s=set; *s; s++) map[(int)*s] = code;
+}
+
+static void update_ifs_map(void)
+{
+ /* char *ifs and char map[256] are both globals. */
+ ifs = func2 ("abc");
+ if (ifs == NULL) ifs="def";
+
+ func2 (map);
+ {
+ char subst[2] = {4, 0};
+ mapset (subst, 3);
+ }
+ mapset (";&|#", 1);
+}
+
+int parse_stream_outer (int flag)
+{
+ int blah;
+ o_string temp=NULL_O_STRING;
+ int rcode;
+
+ do {
+ update_ifs_map ();
+ func2 (&blah); /* a memory clobber works as well. */
+ rcode = parse_stream (&temp, NULL);
+ func2 ("aoeu");
+ if (func (0) != 0) {
+ func2 (NULL);
+ }
+ } while (rcode != -1);
+ return 0;
+}
+
+/* { dg-final { if ![file exists pr60158.s] { fail "pr60158.c (compile)"; return; } } } */
+
+/* { dg-final { set c_rel [llength [grep pr60158.s \\.data\\.rel\\.ro\\.local]] } } */
+/* { dg-final { set c_fix [llength [grep pr60158.s \\.fixup]] } } */
+/* { dg-final { if [string match $c_rel $c_fix] \{ } } */
+/* { dg-final { pass "pr60158.c (passed)" } } */
+/* { dg-final { \} else \{ } } */
+/* { dg-final { fail "pr60158.c (.fixup table entries not generated for .data.rel.ro.local section)" } } */
+/* { dg-final { \} } } */
/* Output the label. */
targetm.asm_out.internal_label (asm_out_file, "LC", desc->labelno);
- /* Output the data. */
- output_constant_pool_2 (desc->mode, x, align);
+ /* Output the data.
+ Pass actual alignment value while emitting string constant to asm code
+ as function 'output_constant_pool_1' explicitly passes the alignment as 1
+ assuming that the data is already aligned which prevents the generation
+ of fix-up table entries. */
+ output_constant_pool_2 (desc->mode, x, desc->align);
/* Make sure all constants in SECTION_MERGE and not SECTION_STRINGS
sections have proper size. */
if (CONSTANT_POOL_ADDRESS_P (symbol))
{
desc = SYMBOL_REF_CONSTANT (symbol);
+ /* Pass 1 for align as we have already laid out everything in the block.
+ So aligning shouldn't be necessary. */
output_constant_pool_1 (desc, 1);
offset += GET_MODE_SIZE (desc->mode);
}