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 <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)