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