From dc0970ff2a3841f075b04a64c1cbb7549b6328bd Mon Sep 17 00:00:00 2001
From: Bob Dubner <rdubner@symas.com>
Date: Sat, 6 Apr 2024 22:43:22 -0400
Subject: [PATCH] WIP: put cblc_refer_t on stack.  Fix cblc_file_t creation
 problem.

Jim changed cblc_file_t, but didn't change the structs.cc creation code.

A couple of UAT tests fail because of putting cblc_refer_type_node on the stack.
---
 gcc/cobol/gcobolio.h |  3 ++-
 gcc/cobol/genapi.cc  | 10 +++++++++-
 gcc/cobol/genutil.cc | 11 ++++++++---
 gcc/cobol/structs.cc | 17 +++++++++++------
 4 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/gcc/cobol/gcobolio.h b/gcc/cobol/gcobolio.h
index 2bf4a4505a62..5113f73f4027 100644
--- a/gcc/cobol/gcobolio.h
+++ b/gcc/cobol/gcobolio.h
@@ -115,7 +115,8 @@ typedef struct cblc_file_t
     int                  flags;            // cblc_file_flags_t
     int                  recent_char;      // This is the most recent char sent to the file
     int                  recent_key;
-    cblc_file_prior_op_t prior_op;
+    cblc_file_prior_op_t prior_op;         // run-time type is INT
+    int                  dummy;
     } cblc_file_t;
 
 #endif
diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc
index 9820433fe034..372315b3cc8a 100644
--- a/gcc/cobol/genapi.cc
+++ b/gcc/cobol/genapi.cc
@@ -13396,13 +13396,21 @@ mh_source_is_group( cbl_refer_t &destref,
     {
     // We are moving a group to a something.  The rule here is just move as
     // many bytes as you can, and if you need to fill with spaces
-    refer_fill_dest(destref);
     refer_fill_source(sourceref);
     refer_fill_dest(destref);
     tree tdest   = member(destref.refer_decl_node,   "qual_data");
     tree tsource = member(sourceref.refer_decl_node, "qual_data");
     tree dbytes  = member(destref.refer_decl_node,   "qual_size");
     tree sbytes  = member(sourceref.refer_decl_node, "qual_size");
+
+    // gg_printf("mh_source_is_group(): %p/%ld -> %p/%ld (%s)\n",
+              // tsource,
+              // sbytes,
+              // tdest,
+              // dbytes,
+              // tsource,
+              // NULL_TREE);
+
     IF( sbytes, ge_op, dbytes )
       {
       // There are too many source bytes
diff --git a/gcc/cobol/genutil.cc b/gcc/cobol/genutil.cc
index 46efbc1b88b6..6addc849fb0c 100644
--- a/gcc/cobol/genutil.cc
+++ b/gcc/cobol/genutil.cc
@@ -2431,12 +2431,17 @@ refer_fill_internal(cbl_refer_t &refer, refer_type_t refer_type)
           refer.field ? refer.field->name : "noname",
           counter++);
 
-  // if( strcasestr(ach, "zeros") )
+  // if( refer.refer_decl_node )
     // {
-    // fprintf(stderr, "zeros\n");
+    // fprintf(stderr, "refer_fill_internal(): refer_decl_node should be NULL\n");
+    // assert(refer.refer_decl_node == NULL);
     // }
 
-  refer.refer_decl_node = gg_define_variable(cblc_refer_type_node, ach, vs_static);
+//  refer.refer_decl_node = gg_define_variable(cblc_refer_type_node, ach, vs_static);
+  refer.refer_decl_node = gg_define_variable(cblc_refer_type_node, ach, vs_stack);
+  gg_memset(gg_get_address_of(refer.refer_decl_node),
+            integer_zero_node,
+            build_int_cst_type(SIZE_T, sizeof(cblc_refer_t)));
   if( refer.field )
     {
     gg_assign(member(refer.refer_decl_node, "field"),
diff --git a/gcc/cobol/structs.cc b/gcc/cobol/structs.cc
index 3f1148dfc5b3..d21d32365b8f 100644
--- a/gcc/cobol/structs.cc
+++ b/gcc/cobol/structs.cc
@@ -248,10 +248,10 @@ typedef struct cblc_file_t
     char                *name;             // This is the name of the structure; might be the name of an environment variable
     char                *filename;         // The name of the file to be opened
     FILE                *file_pointer;     // The FILE *pointer
-    cblc_field_t        *default_record;   // This is needed by EXTFH at file_open time
+    cblc_field_t        *default_record;   // The record_area
     size_t               record_area_min;  // The size of the smallest 01 record in the FD
     size_t               record_area_max;  // The size of the largest  01 record in the FD
-    cblc_field_t        *keys;             // For relative and indexed files.  The first is the primary key. Null-terminated.
+    cblc_field_t       **keys;             // For relative and indexed files.  The first is the primary key. Null-terminated.
     int                 *key_numbers;      // One per key -- each key has a number. This table is key_number + 1
     int                 *uniques;          // One per key
     cblc_field_t        *password;         //
@@ -260,24 +260,27 @@ typedef struct cblc_file_t
     cblc_field_t        *vsam_status;      //
     cblc_field_t        *record_length;    //
     supplemental_t      *supplemental;     //
+    void                *implementation;   // reserved for any implementation
     size_t               reserve;          // From I-O section RESERVE clause
-    long                 prior_read_location;   // Needed for DELETE in RELATIVE files in SEQUENTIAL access mode
+    long                 prior_read_location;   // Location of immediately preceding successful read
     cbl_file_org_t       org;              // from ORGANIZATION clause
     cbl_file_access_t    access;           // from ACCESS MODE clause
     int                  mode_char;        // 'r', 'w', '+', or 'a' from FILE OPEN statement
     int                  errnum;           // most recent errno; can't reuse "errno" as the name
-    int                  io_status;        // See 2014 standard, section 9.1.12
+    file_status_t        io_status;        // See 2014 standard, section 9.1.12
     int                  padding;          // Actually a char
     int                  delimiter;        // ends a record; defaults to '\n'.
     int                  flags;            // cblc_file_flags_t
     int                  recent_char;      // This is the most recent char sent to the file
     int                  recent_key;
+    cblc_file_prior_op_t prior_op;
+    int                  dummy             // We need an even number of INT
     } cblc_file_t;
     */
 
     tree retval = NULL_TREE;
     retval = gg_get_filelevel_struct_type_decl( "cblc_file_t",
-                                            27,
+                                            30,
                                             CHAR_P,    "name",
                                             CHAR_P,    "filename",
                                             FILE_P,    "file_pointer",
@@ -305,7 +308,9 @@ typedef struct cblc_file_t
                                             INT,       "delimiter",
                                             INT,       "flags",
                                             INT,       "recent_char",
-                                            INT,       "recent_key");
+                                            INT,       "recent_key",
+                                            INT,       "prior_op",
+                                            INT,       "dummy");
     retval = TREE_TYPE(retval);
     return retval;
     }
-- 
GitLab