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?

        * 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;
 
-- 
2.43.0

Reply via email to