From: Robert Dubner <[email protected]>
Date: Thu, 16 Jul 2026 16:23:37 -0400
Subject: [PATCH] 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.
---
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 d50d369b549..6f147907444 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 56dbf066145..da0ca7448ea 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 8be304cb5f2..68d9e091bae 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 ,
--
2.34.1