diff --git a/gcc/cobol/failures/nc250/analyze b/gcc/cobol/failures/nc250/analyze deleted file mode 100755 index 2dfb0aebb12f77692f4d10ad389dbe22f669e336..0000000000000000000000000000000000000000 --- a/gcc/cobol/failures/nc250/analyze +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/python3 - -import sys -import os - -def extract_name(instring:str): - left = instring.find("#") + 2 - right = instring.find("_analyze") - return instring[left:right] - -def extract_summary_name(instring:str): - left = instring.find("#") + 1 - right = instring.rindex("_") - return instring[left:right] - -def sort_sortit(p): - return p[1] - -def main(): - sfile:str = None - if len(sys.argv) == 1: - # There were no parameters. See if there is one, and only one, - # .s assembler file: - fcount:int = 0 - sfile:str = None - files:list = os.listdir() - for file in files: - if file[-2:] == ".s": - fcount += 1; - sfile = file - if fcount > 1: - sys.exit("There are more than one .s files; specify one") - elif len(sys.argv) == 2: - sfile:str = sys.argv[1] - if not sfile: - sys.exit("{} must have one parameter, the file name".format(sys.argv[0])) - - all_lines:list = open(sfile).read().split('\n') - - lines:list = [] - total_lines:int = 0 - known_lines:int = 0 - for line in all_lines: - sline:str = line.strip() - if len(sline) == 0: - continue - if not (line.strip()[0] in ('.', '#', '_') - or line.strip()[-1] == ':'): - total_lines += 1 - if (line.strip()[0] in ('.', '#', '_') - and line.find("_analyze_enter") == -1 - and line.find("_analyze_exit") == -1): - continue - if sline[-1] == ':': - continue - lines.append(sline) - - starts:dict = {} - ends:dict = {} - - # First pass creates the entries for _analyze_enter and _analyze_exit - for nline in range(len(lines)): - line = lines[nline] - if line.find("_analyze_enter") > -1: - starts[extract_name(line)] = nline - if line.find("_analyze_exit") > -1: - ends.update({extract_name(line) : nline}) - - # Create the details - details:dict = {} - for key in starts: - if key in ends: - ender = key + "_analyze_exit" - nlevel = 0 - ncount = 0 - nleft = starts[key] - nright = ends[key] - for nline in range(nright-1, nleft, -1): - line = lines[nline] - if line.find(ender) > -1: - continue - if line.find("_analyze_exit") > -1: - nlevel += 1; - continue - if line.find("_analyze_enter") > -1: - nlevel -= 1; - if nlevel == 0: - ncount += 1; - known_lines += 1; - details.update({key : ncount}) - - # create the summary - summary:dict = {} - for key in details: - summary_key = extract_summary_name(key) - if summary_key in summary: - newval = summary[summary_key] + details[key] - summary.update({summary_key : newval}) - else: - summary.update({summary_key : details[key]}) - - # build a list of tuples: - sortit:list = [] - for key in summary: - sortit.append( (key, summary[key]) ) - - # sort that list: - sortit = sorted(sortit, key=sort_sortit) - - for pair in sortit: - print( "{0: <32} {1: >6}".format(pair[0], pair[1]) ) - - print("lines of assembler {0:>6}".format(total_lines)) - print("lines accounted for {0:>6}".format(known_lines)) - print("lines remaining {0:>6}".format(total_lines-known_lines)) - -main() - diff --git a/gcc/cobol/genutil.cc b/gcc/cobol/genutil.cc index 271bb6c45777803c0565d9d419e935e2ba57e9a8..38b3ef5be05cf082edf44cbdb95c6e4f1c352e39 100644 --- a/gcc/cobol/genutil.cc +++ b/gcc/cobol/genutil.cc @@ -1810,7 +1810,6 @@ refer_fill_subscripts(cbl_refer_t &refer) if( !refer.nsubscript ) { // There are no subscripts - gg_assign(member(refer.refer_decl_node, "all_flags"), integer_zero_node); return retval; } // Figure we have three subscripts, so nsubscript is 3 @@ -1982,7 +1981,9 @@ refer_fill_subscripts(cbl_refer_t &refer) } parent = parent_of(parent); } - gg_assign(member(refer.refer_decl_node, "all_flags"), all_flags); + gg_assign(member(refer.refer_decl_node, "flags"), + gg_bitwise_or(member(refer.refer_decl_node, "flags"), + gg_cast(INT, all_flags))); // gg_printf(" returning %d\n", retval, NULL_TREE); return retval; // This is one if a subscript is beyond depending on } @@ -2443,25 +2444,19 @@ refer_fill_internal(cbl_refer_t &refer, refer_type_t refer_type) counter++); 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))); + // 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 && refer.field->type == FldLiteralA ) { gg_assign(member(refer.refer_decl_node, "field"), gg_cast(cblc_field_p_type_node, gg_get_address_of(pseudo_alpha))); - if(refer.all) - { - gg_assign(member(refer.refer_decl_node, "move_all"), - refer.all ? integer_one_node : integer_zero_node); - } - if(refer.addr_of) - { - gg_assign(member(refer.refer_decl_node, "address_of"), - refer.addr_of ? integer_one_node : integer_zero_node); - } + int flags = (refer.all ? REFER_T_MOVE_ALL : 0) + + (refer.addr_of ? REFER_T_ADDRESS_OF : 0); + gg_assign(member(refer.refer_decl_node, "flags"), + build_int_cst_type(INT, flags)); char *litstring = get_literal_string(refer.field); gg_assign(member(refer.refer_decl_node, "qual_data"), gg_cast(UCHAR_P, gg_string_literal(litstring))); @@ -2473,16 +2468,10 @@ refer_fill_internal(cbl_refer_t &refer, refer_type_t refer_type) gg_assign(member(refer.refer_decl_node, "field"), gg_cast(cblc_field_p_type_node, gg_get_address_of(refer.field->var_decl_node))); - if(refer.all) - { - gg_assign(member(refer.refer_decl_node, "move_all"), - refer.all ? integer_one_node : integer_zero_node); - } - if(refer.addr_of) - { - gg_assign(member(refer.refer_decl_node, "address_of"), - refer.addr_of ? integer_one_node : integer_zero_node); - } + int flags = (refer.all ? REFER_T_MOVE_ALL : 0) + + (refer.addr_of ? REFER_T_ADDRESS_OF : 0); + gg_assign(member(refer.refer_decl_node, "flags"), + build_int_cst_type(INT, flags)); if( refer.field->var_decl_node // On the first call to parser_initialize on it can be null && refer.field->type != FldLiteralN) @@ -2516,7 +2505,7 @@ refer_fill_internal(cbl_refer_t &refer, refer_type_t refer_type) } // modify qual_data and qual_size, if necessary, because of refmod - refer_fill_refmod(refer); + refer_fill_refmod(refer); refer_fill_depends(refer, refer_type); } @@ -2530,6 +2519,8 @@ refer_fill_internal(cbl_refer_t &refer, refer_type_t refer_type) gg_cast(UCHAR_P, null_pointer_node)); gg_assign(member(refer.refer_decl_node,"qual_size"), size_t_zero_node); + gg_assign(member(refer.refer_decl_node, "flags"), + integer_zero_node); } return retval; } diff --git a/gcc/cobol/libgcobol.h b/gcc/cobol/libgcobol.h index 6545c91e66ae05d1a458f3ac3bdb784347ec1cf2..6227e802f245690dcd9c79c8d2525f0cad45617e 100644 --- a/gcc/cobol/libgcobol.h +++ b/gcc/cobol/libgcobol.h @@ -115,15 +115,20 @@ struct cblc_subscript_t unsigned int type; // When type is FldLiteralN, field is a pointer to __int128 }; +#define REFER_T_ALL_FLAGS_MASK 0x0FF // We allow for seven subscripts +#define REFER_T_MOVE_ALL 0x100 // This is the move_all flag +#define REFER_T_ADDRESS_OF 0x200 // This is the address_of flag + typedef struct cblc_refer_t { // This structure must match the code in structs.cc cblc_field_t *field; // When flags::VAR_DECL_INT128 is on, this is a pointer to an __int128 unsigned char *qual_data; // As qualified by subscripts or refmods size_t qual_size; // As qualified by refmods or depending_on - int all_flags; // These indicate ALL subscripts - int move_all; - int address_of; + int flags; // combines all_flags, move_all, and address_of +// int all_flags; // These indicate ALL subscripts +// int move_all; +// int address_of; int dummy; // Fill out to a multiple of eight bytes } cblc_refer_t; diff --git a/gcc/cobol/structs.cc b/gcc/cobol/structs.cc index d21d32365b8fdebf50678291afbd012339c9cab2..433b6ccf4c69e6adc14767e27e5dc8acfeb24d04 100644 --- a/gcc/cobol/structs.cc +++ b/gcc/cobol/structs.cc @@ -333,13 +333,14 @@ create_cblc_refer_t() tree retval = NULL_TREE; retval = gg_get_filelevel_struct_type_decl( "cblc_refer_t", - 7, + 5, cblc_field_p_type_node, "field" , UCHAR_P, "qual_data" , SIZE_T, "qual_size" , - INT, "all_flags", - INT, "move_all", - INT, "address_of", + INT, "flags", + // INT, "all_flags", + // INT, "move_all", + // INT, "address_of", INT, "dummy"); retval = TREE_TYPE(retval); return retval; diff --git a/gcc/cobol/symbols.h b/gcc/cobol/symbols.h index 83383a348ef46b3f1416a8e50fa8b635747832f2..c4acbfae0e637d88ff589fcaf50b485f303f7ec4 100644 --- a/gcc/cobol/symbols.h +++ b/gcc/cobol/symbols.h @@ -735,16 +735,6 @@ struct cbl_span_t { } }; -// These flags are set in the cblc_refer_t flags byte. REFER_IS_EMPTY is used -// in the very common case when there are no subscripts and no refmods in an -// attempt to speed up processing. The MOVE_ALL and ADDR_OF flags -// are used when translating bool all and bool addr_of to the run-time -// structures. -#define REFER_IS_EMPTY 0x0001 // It's important that this be 0x0001 -#define MOVE_ALL_FLAG 0x0002 -#define ADDR_OF_FLAG 0x0004 -#define VAR_DECL_INT128 0x0008 // indicates the cblc_refer_t::field points to an INT128 literal - #define RELOP_START 0 enum relop_t { lt_op = RELOP_START, diff --git a/libgcobol/intrinsic.cc b/libgcobol/intrinsic.cc index 6f2fd9b53540815b3b4011f5bbeb17303f587d31..d35b3659a77047af937769b9c9c24a7533a0d877 100644 --- a/libgcobol/intrinsic.cc +++ b/libgcobol/intrinsic.cc @@ -273,7 +273,7 @@ build_refer_state_for_all( refer_state_for_all &state, cblc_refer_t *refer) { memset(&state, 0, sizeof(refer_state_for_all) ); - if( refer->all_flags ) + if( refer->flags & REFER_T_ALL_FLAGS_MASK ) { // At this point, refer points to the very first element of // an array specification that includes at least one ALL subscript. At @@ -303,7 +303,7 @@ build_refer_state_for_all( refer_state_for_all &state, // We are sitting on an occurs clause: - if( current_bit & refer->all_flags ) + if( current_bit & refer->flags ) { // It is an ALL subscript: state.nflags += 1; @@ -1698,8 +1698,8 @@ __gg__max(cblc_field_t *dest, size_t ncount, cblc_refer_t inputs[]) best_location = input->qual_data; best_length = input->qual_size; best_attr = input->field->attr; - best_move_all = inputs[i].move_all; - best_address_of = inputs[i].address_of; + best_move_all = !!(inputs[i].flags & REFER_T_MOVE_ALL); + best_address_of = !!(inputs[i].flags & REFER_T_ADDRESS_OF); } else { @@ -1707,8 +1707,8 @@ __gg__max(cblc_field_t *dest, size_t ncount, cblc_refer_t inputs[]) unsigned char *candidate_location = input->qual_data; size_t candidate_length = input->qual_size; int candidate_attr = input->field->attr; - bool candidate_move_all = inputs[i].move_all; - bool candidate_address_of = inputs[i].address_of; + bool candidate_move_all = !!(inputs[i].flags & REFER_T_MOVE_ALL); + bool candidate_address_of = !!(inputs[i].flags & REFER_T_ADDRESS_OF); int compare_result = __gg__compare_2( candidate_field, @@ -1946,8 +1946,8 @@ __gg__min(cblc_field_t *dest, size_t ncount, cblc_refer_t inputs[]) best_location = input->qual_data; best_length = input->qual_size; best_attr = input->field->attr; - best_move_all = inputs[i].move_all; - best_address_of = inputs[i].address_of; + best_move_all = !!(inputs[i].flags & REFER_T_MOVE_ALL); + best_address_of = !!(inputs[i].flags & REFER_T_ADDRESS_OF); } else { @@ -1955,8 +1955,8 @@ __gg__min(cblc_field_t *dest, size_t ncount, cblc_refer_t inputs[]) unsigned char *candidate_location = input->qual_data; size_t candidate_length = input->qual_size; int candidate_attr = input->field->attr; - bool candidate_move_all = inputs[i].move_all; - bool candidate_address_of = inputs[i].address_of; + bool candidate_move_all = !!(inputs[i].flags & REFER_T_MOVE_ALL); + bool candidate_address_of = !!(inputs[i].flags & REFER_T_ADDRESS_OF); int compare_result = __gg__compare_2( candidate_field, @@ -2761,8 +2761,8 @@ __gg__ord_min(cblc_field_t *dest, size_t ninputs, cblc_refer_t inputs[]) best_location = input->qual_data; best_length = input->qual_size; best_attr = input->field->attr; - best_move_all = inputs[i].move_all; - best_address_of = inputs[i].address_of; + best_move_all = !!(inputs[i].flags & REFER_T_MOVE_ALL); + best_address_of = !!(inputs[i].flags & REFER_T_ADDRESS_OF); } else { @@ -2771,8 +2771,8 @@ __gg__ord_min(cblc_field_t *dest, size_t ninputs, cblc_refer_t inputs[]) candidate_location = input->qual_data; candidate_length = input->qual_size; candidate_attr = input->field->attr; - candidate_move_all = inputs[i].move_all; - candidate_address_of = inputs[i].address_of; + candidate_move_all = !!(inputs[i].flags & REFER_T_MOVE_ALL); + candidate_address_of = !!(inputs[i].flags & REFER_T_ADDRESS_OF); int compare_result = __gg__compare_2( @@ -2856,8 +2856,8 @@ __gg__ord_max(cblc_field_t *dest, size_t ninputs, cblc_refer_t inputs[]) best_location = input->qual_data; best_length = input->qual_size; best_attr = input->field->attr; - best_move_all = inputs[i].move_all; - best_address_of = inputs[i].address_of; + best_move_all = !!(inputs[i].flags & REFER_T_MOVE_ALL); + best_address_of = !!(inputs[i].flags & REFER_T_ADDRESS_OF); } else { @@ -2866,8 +2866,8 @@ __gg__ord_max(cblc_field_t *dest, size_t ninputs, cblc_refer_t inputs[]) candidate_location = input->qual_data; candidate_length = input->qual_size; candidate_attr = input->field->attr; - candidate_move_all = inputs[i].move_all; - candidate_address_of = inputs[i].address_of; + candidate_move_all = !!(inputs[i].flags & REFER_T_MOVE_ALL); + candidate_address_of = !!(inputs[i].flags & REFER_T_ADDRESS_OF); int compare_result = __gg__compare_2( diff --git a/libgcobol/libgcobol.cc b/libgcobol/libgcobol.cc index e94e796c6b4a7cf6be0e704dd15e463729bd09f4..2d49468f287c1fc339bf2d5a0260086b4a96da2c 100644 --- a/libgcobol/libgcobol.cc +++ b/libgcobol/libgcobol.cc @@ -2823,7 +2823,7 @@ format_for_display_local(char **dest, size_t *dest_size, cblc_refer_t *var) var->field, var->qual_data, var->qual_size, - var->address_of); + var->flags & REFER_T_ADDRESS_OF); } else { @@ -3747,14 +3747,14 @@ __gg__compare( struct cblc_refer_t *left_ref, left_ref->qual_data, left_ref->qual_size, left_ref->field->attr, - left_ref->move_all, - left_ref->address_of, + !!(left_ref->flags & REFER_T_MOVE_ALL), + !!(left_ref->flags & REFER_T_ADDRESS_OF), right_ref->field, right_ref->qual_data, right_ref->qual_size, right_ref->field->attr, - right_ref->move_all, - right_ref->address_of, + !!(right_ref->flags & REFER_T_MOVE_ALL), + !!(right_ref->flags & REFER_T_ADDRESS_OF), second_time_through); return retval; } @@ -4594,7 +4594,7 @@ __gg__move( struct cblc_refer_t *dest, // This is a little bold, but non-alphabetics will never // have the rjust_e or MOVE_ALL bits on, so it's safe // enough. - alpha_to_alpha_move(dest, source, source->move_all); + alpha_to_alpha_move(dest, source, !!(source->flags & REFER_T_MOVE_ALL)); break; default: @@ -4609,14 +4609,14 @@ __gg__move( struct cblc_refer_t *dest, switch( source_type ) { case FldGroup: - alpha_to_alpha_move(dest, source, source->move_all); + alpha_to_alpha_move(dest, source, !!(source->flags & REFER_T_MOVE_ALL)); break; case FldAlphanumeric: case FldNumericEdited: case FldAlphaEdited: // This is an ordinary alpha-to-alpha move: - alpha_to_alpha_move(dest, source, source->move_all); + alpha_to_alpha_move(dest, source, !!(source->flags & REFER_T_MOVE_ALL)); break; case FldNumericDisplay: @@ -5082,7 +5082,7 @@ __gg__move( struct cblc_refer_t *dest, source->field, (unsigned char *)source->qual_data, source->qual_size, - source->address_of); + source->flags && REFER_T_ADDRESS_OF); display_string_length = strlen(display_string); } __gg__string_to_alpha_edited( (char *)dest->qual_data, @@ -6768,7 +6768,7 @@ __gg__display( cblc_refer_t *var, var->field, var->qual_data, var->qual_size, - var->address_of ); + !!(var->flags & REFER_T_ADDRESS_OF) ); // } // else // { @@ -8115,7 +8115,7 @@ __gg__set_pointer( cblc_refer_t *target, cblc_refer_t *source) { void *source_address; - if( source->address_of ) + if( source->flags & REFER_T_ADDRESS_OF ) { // This is SET <something> TO ADDRESS OF SOURCE source_address = source->qual_data; @@ -8134,7 +8134,7 @@ __gg__set_pointer( cblc_refer_t *target, } } - if( target->address_of ) + if( target->flags & REFER_T_ADDRESS_OF ) { // This is SET ADDRESS OF target TO .... // We know it has to be an unqualified LINKAGE level 01 or level 77 @@ -8426,7 +8426,7 @@ __gg__literaln_alpha_compare(char *left_side, false, (char *)right->qual_data, right->qual_size, - right->move_all ); + !!(right->flags & REFER_T_MOVE_ALL) ); return retval; }