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