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)

Reply via email to