On Thu, 20 Mar 2025, Richard Biener wrote:
> The following avoids early runtime initialization of cbl_field_t
> objects which, when using tree to represent the current _Float128
> data, segfaults as tree data like float128_type_node is not yet
> initialized. The solution is to move the global data to
> symbol_table_init which is the only user and it already has one
> such instance locally, the 'constants' array.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu.
>
> OK?
I've now pushed the first prerequesite patch for the larger
_Float -> tree change, but this one is still unreviewed (though
borderly obvious). Can somebody ack it? That way testing
of the real change will hopefully simplify.
Richard.
> * symbols.cc (empty_float, empty_comp5, empty_literal,
> empty_conditional, debug_registers, special_registers): Move
> global cbl_field_t typed data to ...
> (symbol_table_init): ... local scope here.
> ---
> gcc/cobol/symbols.cc | 173 +++++++++++++++++++++----------------------
> 1 file changed, 84 insertions(+), 89 deletions(-)
>
> diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc
> index 17583e002a1..b8d785f2531 100644
> --- a/gcc/cobol/symbols.cc
> +++ b/gcc/cobol/symbols.cc
> @@ -295,81 +295,12 @@ symbol_valid_udf_args( size_t function,
> std::list<cbl_refer_t> args ) {
>
> static const struct cbl_occurs_t nonarray = cbl_occurs_t();
>
> -static const struct cbl_field_t empty_float = {
> - 0, FldFloat, FldInvalid,
> - intermediate_e,
> - 0, 0, 0, nonarray, 0, "",
> - 0, cbl_field_t::linkage_t(),
> - {16, 16, 32, 0, NULL}, NULL };
> -
> -static const struct cbl_field_t empty_comp5 = {
> - 0, FldNumericBin5, FldInvalid,
> - signable_e | intermediate_e,
> - 0, 0, 0, nonarray, 0, "",
> - 0, cbl_field_t::linkage_t(),
> - {16, 16, MAX_FIXED_POINT_DIGITS, 0, NULL},
> NULL };
> -
> #if 0
> # define CONSTANT_E constant_e
> #else
> # define CONSTANT_E intermediate_e
> #endif
>
> -static struct cbl_field_t empty_literal = {
> - 0, FldInvalid, FldInvalid, CONSTANT_E,
> - 0, 0, 0, nonarray, 0, "",
> - 0, cbl_field_t::linkage_t(),
> - {}, NULL };
> -
> -static const struct cbl_field_t empty_conditional = {
> - 0, FldConditional, FldInvalid,
> intermediate_e,
> - 0, 0, 0, nonarray, 0, "",
> - 0, cbl_field_t::linkage_t(),
> - {}, NULL };
> -
> -
> -/**
> - * Debug register record
> - 01 DEBUG-ITEM.
> - 02 DEBUG-LINE PIC X(6).
> - 02 FILLER PIC X VALUE SPACE.
> - 02 DEBUG-NAME PIC X(30).
> - 02 FILLER PIC X VALUE SPACE.
> - 02 DEBUG-SUB-1 PIC S9999 SIGN IS LEADING SEPARATE CHARACTER.
> - 02 FILLER PIC X VALUE SPACE.
> - 02 DEBUG-SUB-2 PIC S9999 SIGN IS LEADING SEPARATE CHARACTER.
> - 02 FILLER PIC X VALUE SPACE.
> - 02 DEBUG-SUB-3 PIC S9999 SIGN IS LEADING SEPARATE CHARACTER.
> - 02 FILLER PIC X VALUE SPACE.
> - 02 DEBUG-CONTENTS PIC X(76).
> - **/
> -
> -static cbl_field_t debug_registers[] = {
> - { 0, FldGroup, FldInvalid, global_e, 0,0,1, nonarray, 0,
> - "DEBUG-ITEM", 0, {}, {132,132,0,0, NULL}, NULL },
> - { 0, FldAlphanumeric, FldInvalid, global_e, 0,0,2, nonarray, 0,
> - "DEBUG-LINE", 0, {}, {6,6,0,0, " "}, NULL },
> - { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> - "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> - { 0, FldAlphanumeric, FldInvalid, global_e, 0,0,2, nonarray, 0,
> - "DEBUG-NAME", 0, {}, {30,30,0,0, NULL}, NULL },
> - { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> - "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> - { 0, FldNumericDisplay, FldInvalid, signable_e | global_e | leading_e |
> separate_e, 0,0,2, nonarray, 0,
> - "DEBUG-SUB-1", 0, {}, {5,5,3,0, NULL}, NULL },
> - { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> - "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> - { 0, FldNumericDisplay, FldInvalid, signable_e | global_e | leading_e |
> separate_e, 0,0,2, nonarray, 0,
> - "DEBUG-SUB-2", 0, {}, {5,5,3,0, NULL}, NULL },
> - { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> - "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> - { 0, FldNumericDisplay, FldInvalid, signable_e | global_e | leading_e |
> separate_e, 0,0,2, nonarray, 0,
> - "DEBUG-SUB-3", 0, {}, {5,5,3,0, NULL}, NULL },
> - { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> - "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> - { 0, FldAlphanumeric, FldInvalid, signable_e | global_e, 0,0,2,
> nonarray, 0,
> - "DEBUG-CONTENTS", 0, {}, {76,76,0,0, NULL}, NULL },
> -};
>
> class group_size_t {
> size_t size;
> @@ -384,26 +315,6 @@ class group_size_t {
>
> enum { constq = constant_e | quoted_e };
>
> -static cbl_field_t special_registers[] = {
> - { 0, FldNumericDisplay, FldInvalid, 0, 0, 0, 0, nonarray, 0,
> "_FILE_STATUS",
> - 0, {}, {2,2,2,0, NULL}, NULL },
> - { 0, FldNumericBin5, FldInvalid, 0, 0, 0, 0, nonarray, 0, "UPSI-0",
> - 0, {}, {2,2,4,0, NULL}, NULL },
> - { 0, FldNumericBin5, FldInvalid, 0, 0, 0, 0, nonarray, 0, "RETURN-CODE",
> - 0, {}, {2,2,4,0, NULL}, NULL },
> - { 0, FldNumericBin5, FldInvalid, 0, 0, 0, 0, nonarray, 0,
> "LINAGE-COUNTER",
> - 0, {}, {2,2,4,0, NULL}, NULL },
> - { 0, FldLiteralA, FldInvalid, 0, 0, 0, 0, nonarray, 0, "_dev_stdin",
> - 0, {}, {0,0,0,0, "/dev/stdin"}, NULL },
> - { 0, FldLiteralA, FldInvalid, constq, 0, 0, 0, nonarray, 0,
> "_dev_stdout",
> - 0, {}, {0,0,0,0, "/dev/stdout"}, NULL },
> - { 0, FldLiteralA, FldInvalid, constq, 0, 0, 0, nonarray, 0,
> "_dev_stderr",
> - 0, {}, {0,0,0,0, "/dev/stderr"}, NULL },
> - { 0, FldLiteralA, FldInvalid, constq, 0, 0, 0, nonarray, 0, "_dev_null",
> - 0, {}, {0,0,0,0, "/dev/null"}, NULL },
> -
> -};
> -
> static symbol_elem_t
> elementize( cbl_field_t& field ) {
> symbol_elem_t sym (SymField);
> @@ -2375,6 +2286,49 @@ symbol_table_init(void) {
>
> assert(table.nelem < table.capacity);
>
> + /**
> + * Debug register record
> + 01 DEBUG-ITEM.
> + 02 DEBUG-LINE PIC X(6).
> + 02 FILLER PIC X VALUE SPACE.
> + 02 DEBUG-NAME PIC X(30).
> + 02 FILLER PIC X VALUE SPACE.
> + 02 DEBUG-SUB-1 PIC S9999 SIGN IS LEADING SEPARATE CHARACTER.
> + 02 FILLER PIC X VALUE SPACE.
> + 02 DEBUG-SUB-2 PIC S9999 SIGN IS LEADING SEPARATE CHARACTER.
> + 02 FILLER PIC X VALUE SPACE.
> + 02 DEBUG-SUB-3 PIC S9999 SIGN IS LEADING SEPARATE CHARACTER.
> + 02 FILLER PIC X VALUE SPACE.
> + 02 DEBUG-CONTENTS PIC X(76).
> + **/
> +
> + static cbl_field_t debug_registers[] = {
> + { 0, FldGroup, FldInvalid, global_e, 0,0,1, nonarray, 0,
> + "DEBUG-ITEM", 0, {}, {132,132,0,0, NULL}, NULL },
> + { 0, FldAlphanumeric, FldInvalid, global_e, 0,0,2, nonarray, 0,
> + "DEBUG-LINE", 0, {}, {6,6,0,0, " "}, NULL },
> + { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> + "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> + { 0, FldAlphanumeric, FldInvalid, global_e, 0,0,2, nonarray, 0,
> + "DEBUG-NAME", 0, {}, {30,30,0,0, NULL}, NULL },
> + { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> + "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> + { 0, FldNumericDisplay, FldInvalid, signable_e | global_e | leading_e |
> separate_e, 0,0,2, nonarray, 0,
> + "DEBUG-SUB-1", 0, {}, {5,5,3,0, NULL}, NULL },
> + { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> + "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> + { 0, FldNumericDisplay, FldInvalid, signable_e | global_e | leading_e |
> separate_e, 0,0,2, nonarray, 0,
> + "DEBUG-SUB-2", 0, {}, {5,5,3,0, NULL}, NULL },
> + { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> + "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> + { 0, FldNumericDisplay, FldInvalid, signable_e | global_e | leading_e |
> separate_e, 0,0,2, nonarray, 0,
> + "DEBUG-SUB-3", 0, {}, {5,5,3,0, NULL}, NULL },
> + { 0, FldAlphanumeric, FldInvalid, 0, 0,0,2, nonarray, 0,
> + "FILLER", 0, {}, {1,1,0,0, " "}, NULL },
> + { 0, FldAlphanumeric, FldInvalid, signable_e | global_e, 0,0,2,
> nonarray, 0,
> + "DEBUG-CONTENTS", 0, {}, {76,76,0,0, NULL}, NULL },
> +};
> +
> // debug registers
> assert(table.nelem + COUNT_OF(debug_registers) < table.capacity);
>
> @@ -2391,6 +2345,25 @@ symbol_table_init(void) {
> assert(table.nelem < table.capacity);
> std::for_each(debug_start+1, p, parent_elem_set(debug_start -
> table.elems));
>
> + static cbl_field_t special_registers[] = {
> + { 0, FldNumericDisplay, FldInvalid, 0, 0, 0, 0, nonarray, 0,
> "_FILE_STATUS",
> + 0, {}, {2,2,2,0, NULL}, NULL },
> + { 0, FldNumericBin5, FldInvalid, 0, 0, 0, 0, nonarray, 0, "UPSI-0",
> + 0, {}, {2,2,4,0, NULL}, NULL },
> + { 0, FldNumericBin5, FldInvalid, 0, 0, 0, 0, nonarray, 0, "RETURN-CODE",
> + 0, {}, {2,2,4,0, NULL}, NULL },
> + { 0, FldNumericBin5, FldInvalid, 0, 0, 0, 0, nonarray, 0,
> "LINAGE-COUNTER",
> + 0, {}, {2,2,4,0, NULL}, NULL },
> + { 0, FldLiteralA, FldInvalid, 0, 0, 0, 0, nonarray, 0, "_dev_stdin",
> + 0, {}, {0,0,0,0, "/dev/stdin"}, NULL },
> + { 0, FldLiteralA, FldInvalid, constq, 0, 0, 0, nonarray, 0,
> "_dev_stdout",
> + 0, {}, {0,0,0,0, "/dev/stdout"}, NULL },
> + { 0, FldLiteralA, FldInvalid, constq, 0, 0, 0, nonarray, 0,
> "_dev_stderr",
> + 0, {}, {0,0,0,0, "/dev/stderr"}, NULL },
> + { 0, FldLiteralA, FldInvalid, constq, 0, 0, 0, nonarray, 0, "_dev_null",
> + 0, {}, {0,0,0,0, "/dev/null"}, NULL },
> + };
> +
> // special registers
> assert(table.nelem + COUNT_OF(special_registers) < table.capacity);
>
> @@ -3265,6 +3238,28 @@ new_temporary_impl( enum cbl_field_type_t type )
> intermediate_e, 0, 0, 0, nonarray, 0, "",
> 0, cbl_field_t::linkage_t(),
> {}, NULL };
> + static const struct cbl_field_t empty_float = {
> + 0, FldFloat, FldInvalid,
> + intermediate_e,
> + 0, 0, 0, nonarray, 0, "",
> + 0, cbl_field_t::linkage_t(),
> + {16, 16, 32, 0, NULL}, NULL };
> + static const struct cbl_field_t empty_comp5 = {
> + 0, FldNumericBin5, FldInvalid,
> + signable_e | intermediate_e,
> + 0, 0, 0, nonarray, 0, "",
> + 0, cbl_field_t::linkage_t(),
> + {16, 16, MAX_FIXED_POINT_DIGITS, 0, NULL},
> NULL };
> + static const struct cbl_field_t empty_conditional = {
> + 0, FldConditional, FldInvalid,
> intermediate_e,
> + 0, 0, 0, nonarray, 0, "",
> + 0, cbl_field_t::linkage_t(),
> + {}, NULL };
> + static struct cbl_field_t empty_literal = {
> + 0, FldInvalid, FldInvalid, CONSTANT_E,
> + 0, 0, 0, nonarray, 0, "",
> + 0, cbl_field_t::linkage_t(),
> + {}, NULL };
> struct cbl_field_t *f = new cbl_field_t;
> f->type = type;
>
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)