diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc index 83fcb5db0f51b907f162b4bd14c7f3c36f01f736..3b4d2c7d43875d24d5a1feea6db5acfda680a22e 100644 --- a/gcc/cobol/genapi.cc +++ b/gcc/cobol/genapi.cc @@ -1214,7 +1214,10 @@ initialize_variable_internal( cbl_refer_t refer, : 0; flag_bits |= (refer.nsubscript << NSUBSCRIPT_SHIFT) & NSUBSCRIPT_MASK; flag_bits |= just_once ? JUST_ONCE_BIT : 0 ; -// if( is_redefined || flag_bits || !refer_is_clean(refer) ) + + suppress_dest_depends = false; // Set this to false so that refer_is_clean is valid + //fprintf(stderr, "refer_is_clean %2.2d %s %d 0x%lx\n", refer.field->level, refer.field->name, refer_is_clean(refer), refer.field->attr); + if( !refer_is_clean(refer) ) { refer_fill_dest(refer); gg_call(VOID, @@ -1223,16 +1226,18 @@ initialize_variable_internal( cbl_refer_t refer, gg_get_address_of(refer.refer_decl_node), build_int_cst_type(INT, flag_bits) ); } -// else -// { -// // We have a clean refer with no mods, so we can send just the pointer to -// // the field -// refer_fill_dest(refer); -// gg_call(VOID, -// "__gg__initialize_variable_clean", -// 1, -// gg_get_address_of(refer.field->var_decl_node)); -// } + else + { + // We have a clean refer with no mods, so we can send just the pointer to + // the field + refer_fill_dest(refer); + gg_call(VOID, + "__gg__initialize_variable_clean", + 2, + gg_get_address_of(refer.field->var_decl_node), + build_int_cst_type(INT, flag_bits) ); + } + suppress_dest_depends = true; TRACE1 { diff --git a/gcc/cobol/genutil.cc b/gcc/cobol/genutil.cc index 6a4b3b7c524d7cf1dc80a46e7beb22c8de4d6d6f..46cad81ce76aa1fed12f858c7333adacc68b4c14 100644 --- a/gcc/cobol/genutil.cc +++ b/gcc/cobol/genutil.cc @@ -2701,6 +2701,17 @@ bool refer_is_clean(cbl_refer_t &refer) { // By "clean", I mean that it has no remods or subscripts or other modifications + + // if( refer.field + // && (refer.field->attr & (temporary_e | intermediate_e)) ) + // { + // } + // else + // { + // cbl_field_t *odo = symbol_find_odo(refer.field); + // fprintf(stderr, " odo is %p\n", odo); + // } + return !refer.all && !refer.addr_of && !refer.nsubscript diff --git a/libgcobol/libgcobol.cc b/libgcobol/libgcobol.cc index 91ae85d37159d6d03e7793d403804d6f2c171bb7..606b970618ac25120460525402461221ab0cc707 100644 --- a/libgcobol/libgcobol.cc +++ b/libgcobol/libgcobol.cc @@ -4396,11 +4396,11 @@ __gg__initialize_variable(cblc_refer_t *var_ref, extern "C" void -__gg__initialize_variable_clean(cblc_field_t *var) +__gg__initialize_variable_clean(cblc_field_t *var, int flag_bits) { init_var_both( var, var->data, - 0); + flag_bits); } static void