diff mbox

[C++] conversion operator names

Message ID d35c3bea-c749-1a9a-46e4-690558fb6f4a@acm.org
State New
Headers show

Commit Message

Nathan Sidwell June 30, 2017, 6:48 p.m. UTC
We used to give conversion operatos type-specific mangled names.  Now we 
just number them 'operator $N' for N in [1,...].  As such 
mangle_convop_name_for_type is misnamed and has no place in mangle.c

This patch moves that machinery to lex.c, which is a better place (best 
place?).  Other than renaming to make_conv_op_name, nothing else 
changes.  For. The. Moment.

nathan

Comments

Nathan Sidwell June 30, 2017, 6:53 p.m. UTC | #1
On 06/30/2017 02:48 PM, Nathan Sidwell wrote:
> We used to give conversion operatos type-specific mangled names.  Now we 
> just number them 'operator $N' for N in [1,...].  As such 
> mangle_convop_name_for_type is misnamed and has no place in mangle.c
> 
> This patch moves that machinery to lex.c, which is a better place (best 
> place?).  Other than renaming to make_conv_op_name, nothing else 
> changes.  For. The. Moment.

Oh, because this adds cp/lex.c to the gt list, a reconfigure at least is 
necessary.

nathan
Jason Merrill June 30, 2017, 7:11 p.m. UTC | #2
On Fri, Jun 30, 2017 at 2:48 PM, Nathan Sidwell <nathan@acm.org> wrote:
> We used to give conversion operatos type-specific mangled names.  Now we
> just number them 'operator $N' for N in [1,...].  As such
> mangle_convop_name_for_type is misnamed and has no place in mangle.c

Hmm, wouldn't actual mangling make more sense, so that it's consistent
between compilations?

Jason
Nathan Sidwell June 30, 2017, 7:53 p.m. UTC | #3
On 06/30/2017 03:11 PM, Jason Merrill wrote:
> On Fri, Jun 30, 2017 at 2:48 PM, Nathan Sidwell <nathan@acm.org> wrote:
>> We used to give conversion operatos type-specific mangled names.  Now we
>> just number them 'operator $N' for N in [1,...].  As such
>> mangle_convop_name_for_type is misnamed and has no place in mangle.c
> 
> Hmm, wouldn't actual mangling make more sense, so that it's consistent
> between compilations?

While that would work, I have a different and simpler plan in mind.

nathan
Jason Merrill June 30, 2017, 8:24 p.m. UTC | #4
On Fri, Jun 30, 2017 at 3:53 PM, Nathan Sidwell <nathan@acm.org> wrote:
> On 06/30/2017 03:11 PM, Jason Merrill wrote:
>>
>> On Fri, Jun 30, 2017 at 2:48 PM, Nathan Sidwell <nathan@acm.org> wrote:
>>>
>>> We used to give conversion operatos type-specific mangled names.  Now we
>>> just number them 'operator $N' for N in [1,...].  As such
>>> mangle_convop_name_for_type is misnamed and has no place in mangle.c
>>
>> Hmm, wouldn't actual mangling make more sense, so that it's consistent
>> between compilations?
>
> While that would work, I have a different and simpler plan in mind.

Suspense! :)

Jason
Andreas Schwab July 1, 2017, 9:40 p.m. UTC | #5
On Jun 30 2017, Nathan Sidwell <nathan@acm.org> wrote:

> 	* config-lang.in (gtfiles): Add cp/lex.c.
> 	* cp-tree.h (mangle_convop_name_for_type): Rename ...
> 	(make_conv_op_name): ... here.  Move to lex.
> 	* lambda.c (maybe_add_lambda_conv_op): Update.
> 	* parser.c (cp_parser_conversion_function_id): Update.
> 	* pt.c (tsubst_decl, tsubst_baselink, tsubst_copy,
> 	tsubst_copy_and_build): Update.
> 	* semantics.c (apply_deduced_return_type): Update.
> 	* mangle.c (conv_type_hasher, conv_type_names,
> 	mangle_conv_op_name_for_type): Move to ...
> 	* lex.c (conv_type_hasher, conv_type_names, make_convop_name):
> 	... here.  Rename.
>
> 	* libcp1plugin.cc (plugin_build_decl): Use make_conv_op_name.
> 	(plugin_build_dependent_expr): Likewise.

That breaks obj-c++.

spawn -ignore SIGHUP /opt/gcc/gcc-20170701/Build/gcc/testsuite/obj-c++/../../xg++ -B/opt/gcc/gcc-20170701/Build/gcc/testsuite/obj-c++/../../ /opt/gcc/gcc-20170701/gcc/testsuite/obj-c++.dg/basic.mm -mabi=lp64 -fno-diagnostics-show-caret -fdiagnostics-color=never -nostdinc++ -I/opt/gcc/gcc-20170701/Build/aarch64-suse-linux/libstdc++-v3/include/aarch64-suse-linux -I/opt/gcc/gcc-20170701/Build/aarch64-suse-linux/libstdc++-v3/include -I/opt/gcc/gcc-20170701/libstdc++-v3/libsupc++ -I/opt/gcc/gcc-20170701/libstdc++-v3/include/backward -I/opt/gcc/gcc-20170701/libstdc++-v3/testsuite/util -fmessage-length=0 -fgnu-runtime -ansi -pedantic-errors -Wno-long-long -I/opt/gcc/gcc-20170701/gcc/testsuite/../../libobjc -B/opt/gcc/gcc-20170701/Build/aarch64-suse-linux/./libstdc++-v3/src/.libs -L/opt/gcc/gcc-20170701/Build/aarch64-suse-linux/./libstdc++-v3/src/.libs -B/opt/gcc/gcc-20170701/Build/aarch64-suse-linux/./libstdc++-v3/src/.libs -L/opt/gcc/gcc-20170701/Build/aarch64-suse-linux/./libstdc++-v3/src/.libs -B/opt/gcc/gcc-20170701/Build/aarch64-suse-linux/./libobjc/.libs -L/opt/gcc/gcc-20170701/Build/aarch64-suse-linux/./libobjc/.libs -lobjc -lm -o ./basic.exe
In file included from /opt/gcc/gcc-20170701/Build/aarch64-suse-linux/libstdc++-v3/include/ios:44:0,
                 from /opt/gcc/gcc-20170701/Build/aarch64-suse-linux/libstdc++-v3/include/ostream:38,
                 from /opt/gcc/gcc-20170701/Build/aarch64-suse-linux/libstdc++-v3/include/iostream:39,
                 from /opt/gcc/gcc-20170701/gcc/testsuite/obj-c++.dg/basic.mm:6:
/opt/gcc/gcc-20170701/Build/aarch64-suse-linux/libstdc++-v3/include/bits/basic_ios.h:120:20: internal compiler error: Segmentation fault
0xdd6ad7 crash_signal
        ../../gcc/toplev.c:338
0x73077c hash_table_mod1(unsigned int, unsigned int)
        ../../gcc/hash-table.h:328
0x73077c hash_table<conv_type_hasher, xcallocator>::find_slot_with_hash(tree_node* const&, unsigned int, insert_option)
        ../../gcc/hash-table.h:884
0x73077c make_conv_op_name(tree_node*)
        ../../gcc/cp/lex.c:577
0x79f6f3 cp_parser_conversion_function_id
        ../../gcc/cp/parser.c:14084
0x79f6f3 cp_parser_unqualified_id
        ../../gcc/cp/parser.c:5836
0x79fb4f cp_parser_id_expression
        ../../gcc/cp/parser.c:5529
0x79fd23 cp_parser_parse_and_diagnose_invalid_type_name
        ../../gcc/cp/parser.c:3344
0x792703 cp_parser_member_declaration
        ../../gcc/cp/parser.c:23268
0x792dfb cp_parser_member_specification_opt
        ../../gcc/cp/parser.c:23117
0x792dfb cp_parser_class_specifier_1
        ../../gcc/cp/parser.c:22259
0x79547b cp_parser_class_specifier
        ../../gcc/cp/parser.c:22511
0x79547b cp_parser_type_specifier
        ../../gcc/cp/parser.c:16602
0x7a4b6f cp_parser_decl_specifier_seq
        ../../gcc/cp/parser.c:13504
0x7a9e23 cp_parser_single_declaration
        ../../gcc/cp/parser.c:26830
0x7aa1af cp_parser_template_declaration_after_parameters
        ../../gcc/cp/parser.c:26524
0x7aabef cp_parser_explicit_template_declaration
        ../../gcc/cp/parser.c:26759
0x7aabef cp_parser_template_declaration_after_export
        ../../gcc/cp/parser.c:26778
0x7b11af cp_parser_declaration
        ../../gcc/cp/parser.c:12623
0x7b14f7 cp_parser_declaration_seq_opt
        ../../gcc/cp/parser.c:12550

Andreas.
diff mbox

Patch

2017-06-30  Nathan Sidwell  <nathan@acm.org>

	* config-lang.in (gtfiles): Add cp/lex.c.
	* cp-tree.h (mangle_convop_name_for_type): Rename ...
	(make_conv_op_name): ... here.  Move to lex.
	* lambda.c (maybe_add_lambda_conv_op): Update.
	* parser.c (cp_parser_conversion_function_id): Update.
	* pt.c (tsubst_decl, tsubst_baselink, tsubst_copy,
	tsubst_copy_and_build): Update.
	* semantics.c (apply_deduced_return_type): Update.
	* mangle.c (conv_type_hasher, conv_type_names,
	mangle_conv_op_name_for_type): Move to ...
	* lex.c (conv_type_hasher, conv_type_names, make_convop_name):
	... here.  Rename.

	* libcp1plugin.cc (plugin_build_decl): Use make_conv_op_name.
	(plugin_build_dependent_expr): Likewise.

Index: gcc/cp/config-lang.in
===================================================================
--- gcc/cp/config-lang.in	(revision 249835)
+++ gcc/cp/config-lang.in	(working copy)
@@ -45,7 +45,7 @@  gtfiles="\
 \$(srcdir)/cp/except.c \
 \$(srcdir)/cp/friend.c \
 \$(srcdir)/cp/init.c \
-\$(srcdir)/cp/lambda.c \
+\$(srcdir)/cp/lambda.c \$(srcdir)/cp/lex.c \
 \$(srcdir)/cp/mangle.c \$(srcdir)/cp/method.c \
 \$(srcdir)/cp/name-lookup.c \
 \$(srcdir)/cp/parser.c \$(srcdir)/cp/pt.c \
Index: gcc/cp/cp-tree.h
===================================================================
--- gcc/cp/cp-tree.h	(revision 249843)
+++ gcc/cp/cp-tree.h	(working copy)
@@ -6326,6 +6326,7 @@  extern void yyungetc				(int, int);
 extern tree unqualified_name_lookup_error	(tree,
 						 location_t = UNKNOWN_LOCATION);
 extern tree unqualified_fn_lookup_error		(cp_expr);
+extern tree make_conv_op_name			(tree);
 extern tree build_lang_decl			(enum tree_code, tree, tree);
 extern tree build_lang_decl_loc			(location_t, enum tree_code, tree, tree);
 extern void retrofit_lang_decl			(tree);
@@ -7180,7 +7181,6 @@  extern tree mangle_vtbl_for_type		(tree)
 extern tree mangle_vtt_for_type			(tree);
 extern tree mangle_ctor_vtbl_for_type		(tree, tree);
 extern tree mangle_thunk			(tree, int, tree, tree, tree);
-extern tree mangle_conv_op_name_for_type	(tree);
 extern tree mangle_guard_variable		(tree);
 extern tree mangle_tls_init_fn			(tree);
 extern tree mangle_tls_wrapper_fn		(tree);
Index: gcc/cp/lambda.c
===================================================================
--- gcc/cp/lambda.c	(revision 249835)
+++ gcc/cp/lambda.c	(working copy)
@@ -1088,7 +1088,7 @@  maybe_add_lambda_conv_op (tree type)
   /* First build up the conversion op.  */
 
   tree rettype = build_pointer_type (stattype);
-  tree name = mangle_conv_op_name_for_type (rettype);
+  tree name = make_conv_op_name (rettype);
   tree thistype = cp_build_qualified_type (type, TYPE_QUAL_CONST);
   tree fntype = build_method_type_directly (thistype, rettype, void_list_node);
   tree convfn = build_lang_decl (FUNCTION_DECL, name, fntype);
Index: gcc/cp/lex.c
===================================================================
--- gcc/cp/lex.c	(revision 249835)
+++ gcc/cp/lex.c	(working copy)
@@ -531,6 +531,74 @@  unqualified_fn_lookup_error (cp_expr nam
   return unqualified_name_lookup_error (name, loc);
 }
 
+struct conv_type_hasher : ggc_ptr_hash<tree_node>
+{
+  static hashval_t hash (tree);
+  static bool equal (tree, tree);
+};
+
+/* This hash table maps TYPEs to the IDENTIFIER for a conversion
+   operator to TYPE.  The nodes are IDENTIFIERs whose TREE_TYPE is the
+   TYPE.  */
+
+static GTY (()) hash_table<conv_type_hasher> *conv_type_names;
+
+/* Hash a node (VAL1) in the table.  */
+
+hashval_t
+conv_type_hasher::hash (tree val)
+{
+  return (hashval_t) TYPE_UID (TREE_TYPE (val));
+}
+
+/* Compare VAL1 (a node in the table) with VAL2 (a TYPE).  */
+
+bool
+conv_type_hasher::equal (tree val1, tree val2)
+{
+  return TREE_TYPE (val1) == val2;
+}
+
+/* Return an identifier for a conversion operator to TYPE.  We can
+   get from the returned identifier to the type.  */
+
+tree
+make_conv_op_name (tree type)
+{
+  tree *slot;
+  tree identifier;
+
+  if (type == error_mark_node)
+    return error_mark_node;
+
+  if (conv_type_names == NULL)
+    conv_type_names = hash_table<conv_type_hasher>::create_ggc (31);
+
+  slot = conv_type_names->find_slot_with_hash (type,
+					       (hashval_t) TYPE_UID (type),
+					       INSERT);
+  identifier = *slot;
+  if (!identifier)
+    {
+      char buffer[64];
+
+       /* Create a unique name corresponding to TYPE.  */
+      sprintf (buffer, "operator %lu",
+	       (unsigned long) conv_type_names->elements ());
+      identifier = get_identifier (buffer);
+      *slot = identifier;
+
+      /* Hang TYPE off the identifier so it can be found easily later
+	 when performing conversions.  */
+      TREE_TYPE (identifier) = type;
+
+      /* Set the identifier kind so we know later it's a conversion.  */
+      set_identifier_kind (identifier, cik_conv_op);
+    }
+
+  return identifier;
+}
+
 /* Wrapper around build_lang_decl_loc(). Should gradually move to
    build_lang_decl_loc() and then rename build_lang_decl_loc() back to
    build_lang_decl().  */
@@ -799,3 +867,5 @@  in_main_input_context (void)
   else
     return filename_cmp (main_input_filename, LOCATION_FILE (input_location)) == 0;
 }
+
+#include "gt-cp-lex.h"
Index: gcc/cp/mangle.c
===================================================================
--- gcc/cp/mangle.c	(revision 249835)
+++ gcc/cp/mangle.c	(working copy)
@@ -4176,75 +4176,6 @@  mangle_thunk (tree fn_decl, const int th
   return result;
 }
 
-struct conv_type_hasher : ggc_ptr_hash<tree_node>
-{
-  static hashval_t hash (tree);
-  static bool equal (tree, tree);
-};
-
-/* This hash table maps TYPEs to the IDENTIFIER for a conversion
-   operator to TYPE.  The nodes are IDENTIFIERs whose TREE_TYPE is the
-   TYPE.  */
-
-static GTY (()) hash_table<conv_type_hasher> *conv_type_names;
-
-/* Hash a node (VAL1) in the table.  */
-
-hashval_t
-conv_type_hasher::hash (tree val)
-{
-  return (hashval_t) TYPE_UID (TREE_TYPE (val));
-}
-
-/* Compare VAL1 (a node in the table) with VAL2 (a TYPE).  */
-
-bool
-conv_type_hasher::equal (tree val1, tree val2)
-{
-  return TREE_TYPE (val1) == val2;
-}
-
-/* Return an identifier for the mangled unqualified name for a
-   conversion operator to TYPE.  This mangling is not specified by the
-   ABI spec; it is only used internally.  */
-
-tree
-mangle_conv_op_name_for_type (const tree type)
-{
-  tree *slot;
-  tree identifier;
-
-  if (type == error_mark_node)
-    return error_mark_node;
-
-  if (conv_type_names == NULL)
-    conv_type_names = hash_table<conv_type_hasher>::create_ggc (31);
-
-  slot = conv_type_names->find_slot_with_hash (type,
-					       (hashval_t) TYPE_UID (type),
-					       INSERT);
-  identifier = *slot;
-  if (!identifier)
-    {
-      char buffer[64];
-
-       /* Create a unique name corresponding to TYPE.  */
-      sprintf (buffer, "operator %lu",
-	       (unsigned long) conv_type_names->elements ());
-      identifier = get_identifier (buffer);
-      *slot = identifier;
-
-      /* Hang TYPE off the identifier so it can be found easily later
-	 when performing conversions.  */
-      TREE_TYPE (identifier) = type;
-
-      /* Set the identifier kind so we know later it's a conversion.  */
-      set_identifier_kind (identifier, cik_conv_op);
-    }
-
-  return identifier;
-}
-
 /* Handle ABI backwards compatibility for past bugs where we didn't call
    check_abi_tags in places where it's needed: call check_abi_tags and warn if
    it makes a difference.  If FOR_DECL is non-null, it's the declaration
Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c	(revision 249835)
+++ gcc/cp/parser.c	(working copy)
@@ -14067,7 +14067,7 @@  cp_parser_conversion_function_id (cp_par
   /* If the TYPE is invalid, indicate failure.  */
   if (type == error_mark_node)
     return error_mark_node;
-  return mangle_conv_op_name_for_type (type);
+  return make_conv_op_name (type);
 }
 
 /* Parse a conversion-type-id:
Index: gcc/cp/pt.c
===================================================================
--- gcc/cp/pt.c	(revision 249843)
+++ gcc/cp/pt.c	(working copy)
@@ -12385,7 +12385,7 @@  tsubst_decl (tree t, tree args, tsubst_f
 	if (member && DECL_CONV_FN_P (r))
 	  /* Type-conversion operator.  Reconstruct the name, in
 	     case it's the name of one of the template's parameters.  */
-	  DECL_NAME (r) = mangle_conv_op_name_for_type (TREE_TYPE (type));
+	  DECL_NAME (r) = make_conv_op_name (TREE_TYPE (type));
 
 	DECL_ARGUMENTS (r) = tsubst (DECL_ARGUMENTS (t), args,
 				     complain, t);
@@ -14242,7 +14242,7 @@  tsubst_baselink (tree baselink, tree obj
 
   tree name = OVL_NAME (fns);
   if (IDENTIFIER_CONV_OP_P (name))
-    name = mangle_conv_op_name_for_type (optype);
+    name = make_conv_op_name (optype);
 
   baselink = lookup_fnfields (qualifying_scope, name, /*protect=*/1);
   if (!baselink)
@@ -15032,7 +15032,7 @@  tsubst_copy (tree t, tree args, tsubst_f
       if (IDENTIFIER_CONV_OP_P (t))
 	{
 	  tree new_type = tsubst (TREE_TYPE (t), args, complain, in_decl);
-	  return mangle_conv_op_name_for_type (new_type);
+	  return make_conv_op_name (new_type);
 	}
       else
 	return t;
@@ -16665,7 +16665,7 @@  tsubst_copy_and_build (tree t,
 	if (IDENTIFIER_CONV_OP_P (t))
 	  {
 	    tree new_type = tsubst (TREE_TYPE (t), args, complain, in_decl);
-	    t = mangle_conv_op_name_for_type (new_type);
+	    t = make_conv_op_name (new_type);
 	  }
 
 	/* Look up the name.  */
Index: gcc/cp/semantics.c
===================================================================
--- gcc/cp/semantics.c	(revision 249843)
+++ gcc/cp/semantics.c	(working copy)
@@ -9399,7 +9399,7 @@  apply_deduced_return_type (tree fco, tre
     }
 
   if (DECL_CONV_FN_P (fco))
-    DECL_NAME (fco) = mangle_conv_op_name_for_type (return_type);
+    DECL_NAME (fco) = make_conv_op_name (return_type);
 
   TREE_TYPE (fco) = change_return_type (return_type, TREE_TYPE (fco));
 
Index: libcc1/libcp1plugin.cc
===================================================================
--- libcc1/libcp1plugin.cc	(revision 249835)
+++ libcc1/libcp1plugin.cc	(working copy)
@@ -1321,7 +1321,7 @@  plugin_build_decl (cc1_plugin::connectio
 	      opcode = ARRAY_REF;
 	      break;
 	    case CHARS2 ('c', 'v'): // operator <T> (conversion operator)
-	      identifier = mangle_conv_op_name_for_type (TREE_TYPE (sym_type));
+	      identifier = make_conv_op_name (TREE_TYPE (sym_type));
 	      break;
 	      // C++11-only:
 	    case CHARS2 ('l', 'i'): // operator "" <id>
@@ -2622,7 +2622,7 @@  plugin_build_dependent_expr (cc1_plugin:
 	  break;
 	case CHARS2 ('c', 'v'): // operator <T> (conversion operator)
 	  convop = true;
-	  identifier = mangle_conv_op_name_for_type (conv_type);
+	  identifier = make_conv_op_name (conv_type);
 	  break;
 	  // C++11-only:
 	case CHARS2 ('l', 'i'): // operator "" <id>