]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Prevent use of ASM_EXPR for optimized COBOL compilations [PR119214]
authorRobert Dubner <rdubner@symas.com>
Fri, 14 Mar 2025 01:03:46 +0000 (21:03 -0400)
committerRobert Dubner <rdubner@symas.com>
Fri, 14 Mar 2025 12:52:16 +0000 (08:52 -0400)
The creation of assembler labels using ASM_EXPR causes name collisions in the
assembly language because some optimizations repeat code, and those labels
can get repeated. Use of "if( !optimize )" prevents (at least) that problem when
it cropped up with "-O -ftrace"

gcc/cobol:

PR cobol/119214
* gengen.cc: applies if( !optimize ) test

gcc/cobol/gengen.cc

index 4fc0a830c1ed4118a657f7345da666464122b6ce..e4331204d0ad0205381a757f94f1bca9976fb3af 100644 (file)
@@ -3429,30 +3429,35 @@ gg_trans_unit_var_decl(const char *var_name)
 void
 gg_insert_into_assembler(const char *format, ...)
   {
-  // This routine inserts text directly into the assembly language stream.
-
-  // Note that if for some reason your text has to have a '%' character, it
-  // needs to be doubled in the GENERIC tag.  And that means if it is in the
-  // 'format' variable, it needs to be quadrupled.
+  // Temporarily defeat all ASM_EXPR for optimized code per PR119214
+  // The correct solution using LABEL_DECL is forthcoming
+  if( !optimize )
+    {
+    // This routine inserts text directly into the assembly language stream.
+
+    // Note that if for some reason your text has to have a '%' character, it
+    // needs to be doubled in the GENERIC tag.  And that means if it is in the
+    // 'format' variable, it needs to be quadrupled.
+
+    // Create the string to be inserted:
+    char ach[256];
+    va_list ap;
+    va_start(ap, format);
+    vsnprintf(ach, sizeof(ach), format, ap);
+    va_end(ap);
+
+    // Create the required generic tag
+    tree asm_expr = build5_loc( location_from_lineno(),
+                            ASM_EXPR,
+                            VOID,
+                            build_string(strlen(ach), ach),
+                            NULL_TREE,
+                            NULL_TREE,
+                            NULL_TREE,
+                            NULL_TREE);
+    //SET_EXPR_LOCATION (asm_expr, UNKNOWN_LOCATION);
 
-  // Create the string to be inserted:
-  char ach[256];
-  va_list ap;
-  va_start(ap, format);
-  vsnprintf(ach, sizeof(ach), format, ap);
-  va_end(ap);
-
-  // Create the required generic tag
-  tree asm_expr = build5_loc( location_from_lineno(),
-                          ASM_EXPR,
-                          VOID,
-                          build_string(strlen(ach), ach),
-                          NULL_TREE,
-                          NULL_TREE,
-                          NULL_TREE,
-                          NULL_TREE);
-  //SET_EXPR_LOCATION (asm_expr, UNKNOWN_LOCATION);
-
-  // And insert it as a statement
-  gg_append_statement(asm_expr);
+    // And insert it as a statement
+    gg_append_statement(asm_expr);
+    }
   }