aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Dubner <rdubner@symas.com>2025-03-13 21:03:46 -0400
committerRobert Dubner <rdubner@symas.com>2025-03-14 08:52:16 -0400
commitb673d7b593f63a526a85d56204f1217bc4fbf6a1 (patch)
tree59c16bd55afff3e9d20c47f2d8c20b08f1051850
parentddcb471e76a9960d644b9c69cab05944abdd1092 (diff)
downloadgcc-b673d7b593f63a526a85d56204f1217bc4fbf6a1.zip
gcc-b673d7b593f63a526a85d56204f1217bc4fbf6a1.tar.gz
gcc-b673d7b593f63a526a85d56204f1217bc4fbf6a1.tar.bz2
Prevent use of ASM_EXPR for optimized COBOL compilations [PR119214]
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
-rw-r--r--gcc/cobol/gengen.cc55
1 files changed, 30 insertions, 25 deletions
diff --git a/gcc/cobol/gengen.cc b/gcc/cobol/gengen.cc
index 4fc0a83..e433120 100644
--- a/gcc/cobol/gengen.cc
+++ b/gcc/cobol/gengen.cc
@@ -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);
+ }
}