2021-06-07  Bill Schmidt  <wschm...@linux.ibm.com>

gcc/
        * config/rs6000/rs6000-gen-builtins.c (write_fntype): New
        callback function.
        (write_fntype_init): New stub function.
        (write_init_bif_table): Likewise.
        (write_init_ovld_table): New function.
        (write_init_file): Implement.
---
 gcc/config/rs6000/rs6000-gen-builtins.c | 163 ++++++++++++++++++++++++
 1 file changed, 163 insertions(+)

diff --git a/gcc/config/rs6000/rs6000-gen-builtins.c 
b/gcc/config/rs6000/rs6000-gen-builtins.c
index 6f393ee46d3..2240dfc030f 100644
--- a/gcc/config/rs6000/rs6000-gen-builtins.c
+++ b/gcc/config/rs6000/rs6000-gen-builtins.c
@@ -2202,6 +2202,18 @@ write_extern_fntype (char *str)
   fprintf (header_file, "extern GTY(()) tree %s;\n", str);
 }
 
+void
+write_fntype (char *str)
+{
+  fprintf (init_file, "tree %s;\n", str);
+}
+
+/* Write an initializer for a function type identified by STR.  */
+void
+write_fntype_init (char *str)
+{
+}
+
 /* Write everything to the header file (rs6000-builtins.h).  */
 static int
 write_header_file (void)
@@ -2222,10 +2234,161 @@ write_header_file (void)
   return 1;
 }
 
+/* Write code to initialize the built-in function table.  */
+static void
+write_init_bif_table (void)
+{
+}
+
+/* Write code to initialize the overload table.  */
+static void
+write_init_ovld_table (void)
+{
+  fprintf (init_file, "  int base = RS6000_OVLD_NONE;\n\n");
+
+  for (int i = 0; i <= curr_ovld; i++)
+    {
+      fprintf (init_file,
+              "  rs6000_instance_info[RS6000_INST_%s].fntype"
+              "\n    = %s;\n",
+              ovlds[i].ovld_id_name, ovlds[i].fndecl);
+
+      if (i == 0 || ovlds[i].stanza != ovlds[i-1].stanza)
+       {
+         ovld_stanza *stanza = &ovld_stanzas[ovlds[i].stanza];
+         fprintf (init_file, "\n");
+
+         /* Check whether we have a "tf" token in this string, representing
+            a float128_type_node.  It's possible that float128_type_node is
+            undefined (occurs for -maltivec -mno-vsx, for example), so we
+            must guard against that.  */
+         int tf_found = strstr (ovlds[i].fndecl, "tf") != NULL;
+
+         /* Similarly, look for decimal float tokens.  */
+         int dfp_found = (strstr (ovlds[i].fndecl, "dd") != NULL
+                          || strstr (ovlds[i].fndecl, "td") != NULL
+                          || strstr (ovlds[i].fndecl, "sd") != NULL);
+
+         /* The fndecl for an overload is arbitrarily the first one
+            for the overload.  We sort out the real types when
+            processing the overload in the gcc front end.  */
+         fprintf (init_file,
+                  "  if (new_builtins_are_live)\n");
+         fprintf (init_file, "    {\n");
+
+         if (tf_found)
+           {
+             fprintf (init_file, "      if (float128_type_node)\n");
+             fprintf (init_file, "        {\n");
+           }
+         else if (dfp_found)
+           {
+             fprintf (init_file, "      if (dfloat64_type_node)\n");
+             fprintf (init_file, "        {\n");
+           }
+
+         fprintf (init_file,
+                  "      rs6000_builtin_decls_x[(int)RS6000_OVLD_%s] = t\n",
+                  stanza->stanza_id);
+         fprintf (init_file,
+                  "        = add_builtin_function (\"%s\",\n",
+                  stanza->intern_name);
+         fprintf (init_file,
+                  "                                %s,\n",
+                  ovlds[i].fndecl);
+         fprintf (init_file,
+                  "                                (int)RS6000_OVLD_%s,"
+                  " BUILT_IN_MD,\n",
+                  stanza->stanza_id);
+         fprintf (init_file,
+                  "                                NULL, NULL_TREE);\n");
+
+         if (tf_found || dfp_found)
+           fprintf (init_file, "        }\n");
+
+         fprintf (init_file, "    }\n\n");
+
+         fprintf (init_file,
+                  "  rs6000_overload_info[RS6000_OVLD_%s - base]"
+                  ".first_instance\n",
+                  stanza->stanza_id);
+         fprintf (init_file,
+                  "    = &rs6000_instance_info[RS6000_INST_%s];\n\n",
+                  ovlds[i].ovld_id_name);
+       }
+    }
+}
+
 /* Write everything to the initialization file (rs6000-builtins.c).  */
 static int
 write_init_file (void)
 {
+  write_autogenerated_header (init_file);
+
+  fprintf (init_file, "#include \"config.h\"\n");
+  fprintf (init_file, "#include \"system.h\"\n");
+  fprintf (init_file, "#include \"coretypes.h\"\n");
+  fprintf (init_file, "#include \"backend.h\"\n");
+  fprintf (init_file, "#include \"rtl.h\"\n");
+  fprintf (init_file, "#include \"tree.h\"\n");
+  fprintf (init_file, "#include \"langhooks.h\"\n");
+  fprintf (init_file, "#include \"insn-codes.h\"\n");
+  fprintf (init_file, "#include \"rs6000-builtins.h\"\n");
+  fprintf (init_file, "\n");
+
+  fprintf (init_file, "int new_builtins_are_live = 0;\n\n");
+
+  fprintf (init_file, "tree rs6000_builtin_decls_x[RS6000_OVLD_MAX];\n\n");
+
+  rbt_inorder_callback (&fntype_rbt, fntype_rbt.rbt_root, write_fntype);
+  fprintf (init_file, "\n");
+
+  fprintf (init_file, "void\n");
+  fprintf (init_file, "rs6000_autoinit_builtins ()\n");
+  fprintf (init_file, "{\n");
+  fprintf (init_file, "  tree t;\n");
+  rbt_inorder_callback (&fntype_rbt, fntype_rbt.rbt_root, write_fntype_init);
+  fprintf (init_file, "\n");
+
+  fprintf (init_file,
+          "  rs6000_builtin_decls_x[RS6000_BIF_NONE] = NULL_TREE;\n");
+  fprintf (init_file,
+          "  rs6000_builtin_decls_x[RS6000_BIF_MAX] = NULL_TREE;\n");
+  fprintf (init_file,
+          "  rs6000_builtin_decls_x[RS6000_OVLD_NONE] = NULL_TREE;\n\n");
+
+  write_init_bif_table ();
+  write_init_ovld_table ();
+
+  fprintf (init_file, "}\n\n");
+
+  fprintf (init_file,
+          "void gt_ggc_mx (bifdata *bd)\n");
+  fprintf (init_file,
+          "{\n  gt_ggc_mx (bd->fntype);\n}\n\n");
+  fprintf (init_file,
+          "void gt_pch_nx (bifdata *bd)\n");
+  fprintf (init_file,
+          "{\n  gt_pch_nx (bd->fntype);\n}\n\n");
+  fprintf (init_file,
+          "void gt_pch_nx (bifdata *bd, gt_pointer_operator op, "
+          "void *cookie)\n");
+  fprintf (init_file,
+          "{\n  op(&(bd->fntype), cookie);\n}\n\n");
+  fprintf (init_file,
+          "void gt_ggc_mx (ovlddata *od)\n");
+  fprintf (init_file,
+          "{\n  gt_ggc_mx (od->fntype);\n}\n\n");
+  fprintf (init_file,
+          "void gt_pch_nx (ovlddata *od)\n");
+  fprintf (init_file,
+          "{\n  gt_pch_nx (od->fntype);\n}\n\n");
+  fprintf (init_file,
+          "void gt_pch_nx (ovlddata *od, gt_pointer_operator op, "
+          "void *cookie)\n");
+  fprintf (init_file,
+          "{\n  op(&(od->fntype), cookie);\n}\n");
+
   return 1;
 }
 
-- 
2.27.0

Reply via email to