From ba3b6c5213ac0202ce5a3dd4057091f808873dfc Mon Sep 17 00:00:00 2001 From: Bob Dubner <rdubner@symas.com> Date: Tue, 9 Apr 2024 21:14:14 -0400 Subject: [PATCH] WIP: cblc_field_t is still static; more informative naming --- gcc/cobol/genapi.cc | 70 +++++++++++++++++++++++++++++++++----------- gcc/cobol/symbols.cc | 6 +++- 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc index c6a258d91f23..a1c50628116c 100644 --- a/gcc/cobol/genapi.cc +++ b/gcc/cobol/genapi.cc @@ -62,6 +62,8 @@ #include "valconv.h" #include "show_parse.h" +#define VS_REUSE vs_static + extern void print_gimple_nodes(const char *filename, tree root); // This structure is returned by the parser_performxxx() routines, and gets @@ -5113,11 +5115,6 @@ parser_exit(void) // variable on the stack. We need to make a copy of it to avoid the // error of returning a pointer to data on the stack. - // Create a buffer that grows in size, as needed, to accommodate the - // data that needs to be returned. - -#pragma warning "Fix me" - tree array_type = build_array_type_nelts(UCHAR, current_function->returning->data.capacity); tree retval = gg_define_variable(array_type, vs_static); @@ -5759,7 +5756,7 @@ parser_division(cbl_division_t division, tree array_type = build_array_type_nelts(UCHAR, new_var->data.capacity); tree data_decl_node = gg_define_variable( array_type, NULL, - vs_stack); + VS_REUSE); gg_assign( member(new_var->var_decl_node, "data"), gg_get_address_of(data_decl_node) ); @@ -14426,15 +14423,31 @@ psa_new_var_decl(cbl_field_t *new_var, const char *external_record_base) } else if( strlen(new_var->name) == 0 ) { - // This happens with some FldLiteralA variables. For example, the - // filename in a SELECT statement. - static size_t literal_count = 1; - sprintf(base_name, "%s_%zd", "_literal", literal_count++); + // This can happen. + static int empty_count = 1; + sprintf(base_name, + "_%s_%d", + cbl_field_type_str(new_var->type), + empty_count++); } - else if( new_var->attr & (temporary_e | intermediate_e) ) + else if( new_var->attr & intermediate_e ) { - static size_t temp_count = 1; - sprintf(base_name, "%s_%zd_%s", "_temporary_", temp_count++, new_var->name); + static int inter_count = 1; + sprintf(base_name, + "_%s_%s_%d", + "intermediate", + new_var->name, + inter_count++); + } + else if( new_var->attr & temporary_e + && !is_literal(new_var) ) + { + static int temp_count = 1; + sprintf(base_name, + "_%s_%s_%d", + "temporary", + new_var->name, + temp_count++); } else { @@ -14450,11 +14463,13 @@ psa_new_var_decl(cbl_field_t *new_var, const char *external_record_base) base_name, vs_external); } - else if( new_var->attr & (temporary_e | intermediate_e) ) + else if( new_var->attr & (temporary_e | intermediate_e) + && new_var->type != FldLiteralA + && new_var->type != FldLiteralN ) { new_var_decl = gg_define_variable( cblc_field_type_node, base_name, - vs_static); // vs_stack); + VS_REUSE); } else { @@ -14506,6 +14521,13 @@ parser_local_add(struct cbl_field_t *new_var ) void parser_symbol_add(struct cbl_field_t *new_var ) { + if(new_var->var_decl_node) + { + fprintf(stderr, "possible reuse\n"); + } + + + if( !(new_var->attr & initialized_e) ) { cbl_field_type_t incoming_type = new_var->type; @@ -14692,7 +14714,7 @@ parser_symbol_add(struct cbl_field_t *new_var ) // a runtime copy of a structure for the variable; instead, // var_decl_node becomes a boolean_type_node that is used directly. sprintf(ach, "_%sconditional_%d", new_var->name, counter++); - new_var->var_decl_node = gg_define_variable(BOOL, ach, vs_static); + new_var->var_decl_node = gg_define_variable(BOOL, ach, VS_REUSE); return; break; @@ -14994,7 +15016,21 @@ parser_symbol_add(struct cbl_field_t *new_var ) { // We need a unique name for the allocated data for this COBOL variable: char achDataName[256]; - sprintf(achDataName, "_%s_data_%lu", new_var->name, sv_data_name_counter++); + if( new_var->name[0] == '_' ) + { + // Avoid doubling up on leading underscore + sprintf(achDataName, + "%s_data_%lu", + new_var->name, + sv_data_name_counter++); + } + else + { + sprintf(achDataName, + "_%s_data_%lu", + new_var->name, + sv_data_name_counter++); + } tree array_type = build_array_type_nelts(UCHAR, bytes_to_allocate); new_var->data_decl_node = gg_define_variable( diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc index 928ee0961f9c..a418d056f6aa 100644 --- a/gcc/cobol/symbols.cc +++ b/gcc/cobol/symbols.cc @@ -3057,7 +3057,11 @@ new_literal_add( const char initial[], uint32_t len, enum cbl_field_attr_t attr } static size_t literal_count = 1; - sprintf(field->name, "%s_%zd", "_literal", literal_count++); + sprintf(field->name, + "%s%c_%zd", + "_literal", + field->type == FldLiteralA ? 'a' : 'n', + literal_count++); return parser_symbol_add2(field); } -- GitLab