All this started with belated MMIX regression patrol in observance of
the holidays, looking at gcc.dg/Wstringop-overflow-27.c as a
regression for target mmix. That's because of a single message not
matched, where there is "note: destination object 'vla::22'" instead
of the expected "note: destination object 'vla'" due to
r11-5523-geafe8ee7af13c3 in which the message format and the match
changed.
That ::22 is because some identifiers that are SSA_NAME-versions and
other clones are "privatized" by ASM_FORMAT_PRIVATE_NAME and its
companion macro by default, ASM_PN_FORMAT; see the patch. I found
that these "private names" were "unprivatized" for the purpose of
warnings and error messages *in code that only handles the default
format*, "%s.%lu".
I went ahead and wrote and tested a patch-set to hookize that
unprivatizing code, but found that it would only affect errors and
warnings; dumps still had the "target format". While having bad
thoughts about being hit by yet another structural testism because of
the choice of outputting yet another target-specific format instead of
a canonical "versioned" format, I realized it *already was handling a
canonical format*: only the default "%s.%lu" is properly handled.
To wit, targets are better off with the default "%s.%lu" and adjusting
it (if needed, including not allowing "." or "$"), *at time of
assembly code output*. IOW, outputs, both references and definitions,
pass a single label-output target code point: ASM_OUTPUT_LABELREF,
which is that time of output. Some older testsuite adjustments need
to be unadjusted, but is another rabbit-hole, so I've kept that change
separate. Other tests checking dumps, now started to pass for the
first time, some 20+.
* config/mmix/mmix.cc (mmix_asm_output_labelref): Replace '.'
with '::'.
* config/mmix/mmix.h (ASM_PN_FORMAT): Define to actual default.
if (*name == '@')
is_extern = 0;
+ size_t ndots = 0;
+ for (const char *s = name; *s != 0; s++)
+ if (*s == '.')
+ ndots++;
+
+ /* Replace all '.' with '::'. We don't want a '.' as part of an identifier
+ as that'd be incompatible with mmixal. We also don't want to do things
+ like overriding the default "%s.%lu" by '#define ASM_PN_FORMAT "%s::%lu"'
+ as that format will show up in warnings and error messages. The default
+ won't show up in warnings and errors, as there are mechanisms in place to
+ strip that (but that only handles the default format). FIXME: Make sure
+ no ":" is seen in the object file; we don't really want that mmixal
+ feature visible there. */
+ if (ndots > 0)
+ {
+ char *colonized_name = XALLOCAVEC (char, strlen (name) + 1 + ndots);
+
+ char *cs = colonized_name;
+ const char *s = name;
+ for (; *s != 0; s++)
+ {
+ if (*s == '.')
+ *cs++ = ':';
+ *cs++ = *s;
+ }
+ *cs = 0;
+ name = colonized_name;
+ }
+
asm_fprintf (stream, "%s%U%s",
is_extern && TARGET_TOPLEVEL_SYMBOLS ? ":" : "",
name);
#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \
sprintf (LABEL, "*%s:%ld", PREFIX, (long)(NUM))
-/* Insert "::"; these are rarer than internal labels. FIXME: Make sure no
- ":" is seen in the object file; we don't really want that mmixal
- feature visible there. We don't want the default, which uses a dot;
- that'd be incompatible with mmixal. */
-#define ASM_PN_FORMAT "%s::%lu"
+/* Override the default, which looks at NO_DOT_IN_LABEL and NO_DOLLAR_IN_LABEL.
+ We want the real default "%s.%lu" in dumps and compiler messages, but the
+ actual assembly code format is adjusted to the effect of "%s::%lu". See
+ mmix_asm_output_labelref. */
+#define ASM_PN_FORMAT "%s.%lu"
#define ASM_OUTPUT_DEF(STREAM, NAME, VALUE) \
mmix_asm_output_def (STREAM, NAME, VALUE)