https://gcc.gnu.org/g:8a5e08f24b9f28dd240344a4c637efb06be024da

commit r17-2475-g8a5e08f24b9f28dd240344a4c637efb06be024da
Author: Robert Dubner <[email protected]>
Date:   Thu Jul 16 16:23:37 2026 -0400

    cobol: Repair mh_identical MOVEs involving DEBUG registers [PR126277]
    
    The mh_identical MOVE routine was flummoxed by the DEBUG-XXX registers that
    are children of DEBUG-ITEM.  These changes repair that problem.
    
            PR cobol/126277
    
    gcc/cobol/ChangeLog:
    
            * move.cc (mh_identical): Handle externals that have parents.
            (mh_binary_to_packed): Eliminate trailing whitespace.
            * symbols.cc (symbol_table_init): Correct attributes of 
DEBUG-CONTENTS.
    
    libgcobol/ChangeLog:
    
            * constants.cc (struct cblc_field_t): Adjust initialization of
            DEBUG-ITEM fields.

Diff:
---
 gcc/cobol/move.cc      | 20 ++++++++++++++++++--
 gcc/cobol/symbols.cc   |  2 +-
 libgcobol/constants.cc | 40 ++++++++++++++++++++++++++--------------
 3 files changed, 45 insertions(+), 17 deletions(-)

diff --git a/gcc/cobol/move.cc b/gcc/cobol/move.cc
index d50d369b5497..6f1479074442 100644
--- a/gcc/cobol/move.cc
+++ b/gcc/cobol/move.cc
@@ -177,8 +177,24 @@ mh_identical(const cbl_refer_t &destref,
       &&  destref.field->codeset.encoding == sourceref.field->codeset.encoding
       )
     {
+    // These next tests were added because of the DEBUG- registers, which are
+    // global external, and most of which have a parent.  It turns out that
+    // get_location gets flummoxed by that, so we divert it here to the library
+    if(   sourceref.field->parent
+       && sourceref.field->data_decl_node
+       && DECL_EXTERNAL(sourceref.field->data_decl_node) )
+      {
+      return false;
+      }
+    if(   destref.field->parent
+       && destref.field->data_decl_node
+       && DECL_EXTERNAL(destref.field->data_decl_node) )
+      {
+      return false;
+      }
+
     // The source and destination are identical in type and the
-    // Source doesn't have a depending_on clause
+    // source doesn't have a depending_on clause
     SHOW_PARSE1
       {
       SHOW_PARSE_INDENT
@@ -1684,7 +1700,7 @@ mh_binary_to_packed(const cbl_refer_t &destref,
       }
 
     // We are now ready to convert the binary to the packed byte string.
-    
+
     int ndigits;
     if( !(destref.field->attr & packed_no_sign_e) )
       {
diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc
index 56dbf066145c..da0ca7448ea5 100644
--- a/gcc/cobol/symbols.cc
+++ b/gcc/cobol/symbols.cc
@@ -2479,7 +2479,7 @@ symbol_table_init(void) {
       {5,5,4,0, NULL},     2, "DEBUG-SUB-3", cp1252 },
     { FldAlphanumeric, register_e | filler_e,
       {1,1,0,0, " "},      2, "FILLER", cp1252 },
-    { FldAlphanumeric, signable_e | register_e,
+    { FldAlphanumeric, register_e,
       {76,76,0,0, NULL},   2, "DEBUG-CONTENTS", cp1252 },
   };
 
diff --git a/libgcobol/constants.cc b/libgcobol/constants.cc
index 8be304cb5f27..68d9e091bae0 100644
--- a/libgcobol/constants.cc
+++ b/libgcobol/constants.cc
@@ -422,13 +422,13 @@ struct cblc_field_t __ggsr__argi = {
         02 DEBUG-CONTENTS PIC X(76).
 */
 
-unsigned char __gg__debug_item_data[132] = 
+unsigned char __gg__data_debug_item[132] =
                                  "                                      "
                                  "+0000 +0000 +0000 "
                                  "                                      "
                                  "                                     ";
 struct cblc_field_t __ggsr__debug_item = {
-  .data           = __gg__debug_item_data ,
+  .data           = __gg__data_debug_item ,
   .capacity       = 132 ,
   .allocated      = 132 ,
   .offset         = 0 ,
@@ -450,8 +450,9 @@ struct cblc_field_t __ggsr__debug_item = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_line = __gg__data_debug_item;
 struct cblc_field_t __ggsr__debug_line = {
-  .data           = __gg__debug_item_data + 0 ,
+  .data           = __gg__data_debug_line ,
   .capacity       = 6 ,
   .allocated      = 6 ,
   .offset         = 0 ,
@@ -470,8 +471,10 @@ struct cblc_field_t __ggsr__debug_line = {
   .alphabet       = 0 ,
   };
 
+
+unsigned char *__gg__data_debug_filler_1 = &__gg__data_debug_item[6];
 struct cblc_field_t __ggsr__debug_filler_1 = {
-  .data           = __gg__debug_item_data + 6 ,
+  .data           = __gg__data_debug_item ,
   .capacity       = 1 ,
   .allocated      = 1 ,
   .offset         = 6 ,
@@ -490,8 +493,9 @@ struct cblc_field_t __ggsr__debug_filler_1 = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_name = &__gg__data_debug_item[7];
 struct cblc_field_t __ggsr__debug_name = {
-  .data           = __gg__debug_item_data + 7 ,
+  .data           = __gg__data_debug_name ,
   .capacity       = 30 ,
   .allocated      = 30 ,
   .offset         = 7 ,
@@ -510,8 +514,9 @@ struct cblc_field_t __ggsr__debug_name = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_filler_2 = &__gg__data_debug_item[37];
 struct cblc_field_t __ggsr__debug_filler_2 = {
-  .data           = __gg__debug_item_data + 37 ,
+  .data           = __gg__data_debug_filler_2 ,
   .capacity       = 1 ,
   .allocated      = 1 ,
   .offset         = 37 ,
@@ -530,8 +535,9 @@ struct cblc_field_t __ggsr__debug_filler_2 = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_sub_1 = &__gg__data_debug_item[38];
 struct cblc_field_t __ggsr__debug_sub_1 = {
-  .data           = __gg__debug_item_data + 38 ,
+  .data           = __gg__data_debug_sub_1 ,
   .capacity       = 5 ,
   .allocated      = 5 ,
   .offset         = 38 ,
@@ -550,8 +556,9 @@ struct cblc_field_t __ggsr__debug_sub_1 = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_filler_3 = &__gg__data_debug_item[43];
 struct cblc_field_t __ggsr__debug_filler_3 = {
-  .data           = __gg__debug_item_data + 43,
+  .data           = __gg__data_debug_filler_3 ,
   .capacity       =  1,
   .allocated      =  1,
   .offset         =  43,
@@ -570,8 +577,9 @@ struct cblc_field_t __ggsr__debug_filler_3 = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_sub_2 = &__gg__data_debug_item[44];
 struct cblc_field_t __ggsr__debug_sub_2 = {
-  .data           = __gg__debug_item_data + 44 ,
+  .data           = __gg__data_debug_sub_2 ,
   .capacity       = 5 ,
   .allocated      = 5 ,
   .offset         = 44 ,
@@ -590,8 +598,9 @@ struct cblc_field_t __ggsr__debug_sub_2 = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_filler_4 = &__gg__data_debug_item[49];
 struct cblc_field_t __ggsr__debug_filler_4 = {
-  .data           = __gg__debug_item_data +  49,
+  .data           = __gg__data_debug_filler_4 ,
   .capacity       =  1,
   .allocated      =  1,
   .offset         =  49,
@@ -610,8 +619,9 @@ struct cblc_field_t __ggsr__debug_filler_4 = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_sub_3 = &__gg__data_debug_item[50];
 struct cblc_field_t __ggsr__debug_sub_3 = {
-  .data           = __gg__debug_item_data + 50 ,
+  .data           = __gg__data_debug_sub_3 ,
   .capacity       = 5 ,
   .allocated      = 5 ,
   .offset         = 50 ,
@@ -630,8 +640,9 @@ struct cblc_field_t __ggsr__debug_sub_3 = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_filler_5 = &__gg__data_debug_item[55];
 struct cblc_field_t __ggsr__debug_filler_5 = {
-  .data           = __gg__debug_item_data + 55,
+  .data           = __gg__data_debug_filler_5 ,
   .capacity       =  1,
   .allocated      =  1,
   .offset         =  55,
@@ -650,8 +661,9 @@ struct cblc_field_t __ggsr__debug_filler_5 = {
   .alphabet       = 0 ,
   };
 
+unsigned char *__gg__data_debug_contents = &__gg__data_debug_item[56];
 struct cblc_field_t __ggsr__debug_contents = {
-  .data           = __gg__debug_item_data + 56 ,
+  .data           = __gg__data_debug_contents ,
   .capacity       = 76 ,
   .allocated      = 76 ,
   .offset         = 56 ,
@@ -661,7 +673,7 @@ struct cblc_field_t __ggsr__debug_contents = {
   .parent         = &__ggsr__debug_item ,
   .occurs_lower   = 0 ,
   .occurs_upper   = 0 ,
-  .attr           = signable_e | register_e | leading_e | separate_e ,
+  .attr           = register_e ,
   .type           = FldAlphanumeric ,
   .level          = 05 ,
   .digits         = 0 ,

Reply via email to