https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119214

            Bug ID: 119214
           Summary: debug volatile asm breaks assembling
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: cobol
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---

compiling

IDENTIFICATION DIVISION.
PROGRAM-ID. pass.
ENVIRONMENT DIVISION.
PROCEDURE DIVISION.
    STOP RUN.

with -O -ftracer results in

pass.cob: Assembler messages:
pass.cob:5: Error: symbol `_procret.65' is already defined

this is because the tracer pass duplicates a

  __asm__ __volatile__("_procret.65:");

stmt:

@@ -214,8 +425,14 @@
   __asm__ __volatile__("_para._implicit_paragraph_3..pass.0.65:");
   __gg__nop = 109;
   __gg__variables_to_init (&..variables_to_init_62, 0B);
+  __asm__ __volatile__("_procret.65:");
+  __gg__exit_address.13_83 = __gg__exit_address;
+  if (__gg__exit_address.13_83 == &<L18>)
+    goto <bb 15>; [17.43%]
+  else
+    goto <bb 16>; [82.57%]

-  <bb 14> [local count: 429281985]:
+  <bb 14> [local count: 214640993]:
 <L18>:
   __asm__ __volatile__("_procret.65:");
   __gg__exit_address.13_9 = __gg__exit_address;


this also shows the pattern

<L18>:
  __asm__ __volatile__("_procret.65:");
  __gg__exit_address.13_9 = __gg__exit_address;
  if (__gg__exit_address.13_9 == &<L18>)

where label addresses are used.  This will be a bit fragile since the
position of labels vs. other stmts isn't preserved.  Possibly the addresses
are just IDs, so maybe IDs should be used instead.

The volatile asms will confuse quite some optimization passes - at least for
this particular testcase they seem useless and for debugging only?

The label format needs to adhere to assembler restrictions otherwise,
use the ASM_GENERATE_INTERNAL_LABEL output macro for this.

Reply via email to