From 73baba1ae1b8f3618c2d3b674117b8a462e0ca76 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 2 Mar 2022 19:13:43 -0500 Subject: [PATCH] c++: New module mangling ABI This implements a new module mangling ABI as the original one has a few issues: a) it was not demangleable (oops) b) implemented a weak ownership model. This implements a strong ownership model, so that exported entities from named modules are mangled to include their module attachment. This gives more informative linker diagnostics and better module isolation. Weak ownership was hoped to allow backwards compatibility with non-modular code, but in practice was very brittle, and C++20 added new semantics for linkage declarations that cover the needed functionality. FAOD Clang is also moving to this ABI and documentation will be added to the Itanium ABI specification. gcc/cp/ * cp-tree.h (mangle_identifier): Replace with ... (mangle_module_component): ... this. * mangle.cc (dump_substitution_candidates): Adjust. (add_substitution): Likewise. (find_substitution): Likewise. (unmangled_name_p): Likewise. (mangle_module_substitution): Reimplement. (mangle_module_component): New. (write_module, maybe_write_module): Adjust. (write_name): Drop modules here. (write_unqualified): Do them here instead. (mangle_global_init): Adjust. * module.cc (module_state::mangle): Adjust. (mangle_module): Likewise. (get_originating_module): Adjust. gcc/testsuite/ * g++.dg/modules/fn-inline-1_b.C: Adjust. * g++.dg/modules/fn-inline-1_c.C: Adjust. * g++.dg/modules/imp-inline-1_a.C: Adjust. * g++.dg/modules/imp-inline-1_b.C: Adjust. * g++.dg/modules/init-2_a.C: Adjust. * g++.dg/modules/init-2_b.C: Adjust. * g++.dg/modules/init-2_c.C: Adjust. * g++.dg/modules/member-def-2_d.C: Adjust. * g++.dg/modules/mod-sym-1.C: Adjust. * g++.dg/modules/mod-sym-2.C: Adjust. * g++.dg/modules/mod-sym-3.C: Adjust. * g++.dg/modules/sym-subst-1.C: Adjust. * g++.dg/modules/sym-subst-2_b.C: Adjust. * g++.dg/modules/sym-subst-3_a.C: Adjust. * g++.dg/modules/sym-subst-3_b.C: Adjust. * g++.dg/modules/sym-subst-4.C: Adjust. * g++.dg/modules/sym-subst-5.C: Adjust. * g++.dg/modules/sym-subst-6.C: Adjust. * g++.dg/modules/tpl-spec-1_a.C: Adjust. * g++.dg/modules/tpl-spec-2_b.C: Adjust. * g++.dg/modules/tpl-spec-2_d.C: Adjust. * g++.dg/modules/tpl-spec-3_a.C: Adjust. * g++.dg/modules/virt-1_a.C: Adjust. * g++.dg/modules/virt-2_a.C: Adjust. * g++.dg/modules/virt-2_b.C: Adjust. * g++.dg/modules/virt-2_c.C: Adjust. * g++.dg/modules/vtt-1_a.C: Adjust. * g++.dg/modules/vtt-1_b.C: Adjust. --- gcc/cp/cp-tree.h | 8 +- gcc/cp/mangle.cc | 124 ++++++++++-------- gcc/cp/module.cc | 27 ++-- gcc/testsuite/g++.dg/modules/fn-inline-1_b.C | 6 +- gcc/testsuite/g++.dg/modules/fn-inline-1_c.C | 4 +- gcc/testsuite/g++.dg/modules/imp-inline-1_a.C | 4 +- gcc/testsuite/g++.dg/modules/imp-inline-1_b.C | 12 +- gcc/testsuite/g++.dg/modules/init-2_a.C | 2 +- gcc/testsuite/g++.dg/modules/init-2_b.C | 4 +- gcc/testsuite/g++.dg/modules/init-2_c.C | 4 +- gcc/testsuite/g++.dg/modules/member-def-2_d.C | 2 +- gcc/testsuite/g++.dg/modules/mod-sym-1.C | 13 +- gcc/testsuite/g++.dg/modules/mod-sym-2.C | 4 +- gcc/testsuite/g++.dg/modules/mod-sym-3.C | 8 +- gcc/testsuite/g++.dg/modules/sym-subst-1.C | 2 +- gcc/testsuite/g++.dg/modules/sym-subst-2_b.C | 4 +- gcc/testsuite/g++.dg/modules/sym-subst-3_a.C | 2 +- gcc/testsuite/g++.dg/modules/sym-subst-3_b.C | 2 +- gcc/testsuite/g++.dg/modules/sym-subst-4.C | 2 +- gcc/testsuite/g++.dg/modules/sym-subst-5.C | 2 +- gcc/testsuite/g++.dg/modules/sym-subst-6.C | 2 +- gcc/testsuite/g++.dg/modules/tpl-spec-1_a.C | 2 +- gcc/testsuite/g++.dg/modules/tpl-spec-2_b.C | 2 +- gcc/testsuite/g++.dg/modules/tpl-spec-2_d.C | 4 +- gcc/testsuite/g++.dg/modules/tpl-spec-3_a.C | 2 +- gcc/testsuite/g++.dg/modules/virt-1_a.C | 7 +- gcc/testsuite/g++.dg/modules/virt-2_a.C | 6 +- gcc/testsuite/g++.dg/modules/virt-2_b.C | 6 +- gcc/testsuite/g++.dg/modules/virt-2_c.C | 6 +- gcc/testsuite/g++.dg/modules/vtt-1_a.C | 6 +- gcc/testsuite/g++.dg/modules/vtt-1_b.C | 10 +- 31 files changed, 153 insertions(+), 136 deletions(-) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 80994e947933..cf08e16e1727 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2829,6 +2829,12 @@ struct GTY(()) lang_decl_base { /* The following apply to VAR, FUNCTION, TYPE, CONCEPT, & NAMESPACE decls. */ + // FIXME: Purview and Attachment are not the same thing, due to + // linkage-declarations. The modules code presumes they are the + // same. (For context, linkage-decl semantics was a very late + // change). We need a module_attachment_p flag, and this will allow + // some simplification of how we handle header unit entities. + // Hurrah! unsigned module_purview_p : 1; /* in module purview (not GMF) */ unsigned module_import_p : 1; /* from an import */ unsigned module_entity_p : 1; /* is in the entitity ary & @@ -8180,7 +8186,7 @@ extern char *get_mangled_vtable_map_var_name (tree); extern bool mangle_return_type_p (tree); extern tree mangle_decomp (tree, vec &); extern void mangle_module_substitution (int); -extern void mangle_identifier (char, tree); +extern int mangle_module_component (tree id, bool partition); extern tree mangle_module_global_init (int); /* in dump.cc */ diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc index a20f0e003291..6657ce4d9834 100644 --- a/gcc/cp/mangle.cc +++ b/gcc/cp/mangle.cc @@ -102,7 +102,8 @@ along with GCC; see the file COPYING3. If not see /* Things we only need one of. This module is not reentrant. */ struct GTY(()) globals { /* An array of the current substitution candidates, in the order - we've seen them. */ + we've seen them. Contains NULLS, which correspond to module + substitutions. */ vec *substitutions; /* The entity that is being mangled. */ @@ -318,20 +319,26 @@ dump_substitution_candidates (void) if (i > 0) fprintf (stderr, " "); - if (DECL_P (el)) + if (!el) + name = "module"; + else if (DECL_P (el)) name = IDENTIFIER_POINTER (DECL_NAME (el)); else if (TREE_CODE (el) == TREE_LIST) name = IDENTIFIER_POINTER (DECL_NAME (TREE_VALUE (el))); else if (TYPE_NAME (el)) name = TYPE_NAME_STRING (el); fprintf (stderr, " S%d_ = ", i - 1); - if (TYPE_P (el) && - (CP_TYPE_RESTRICT_P (el) - || CP_TYPE_VOLATILE_P (el) - || CP_TYPE_CONST_P (el))) - fprintf (stderr, "CV-"); - fprintf (stderr, "%s (%s at %p)\n", - name, get_tree_code_name (TREE_CODE (el)), (void *) el); + if (el) + { + if (TYPE_P (el) && + (CP_TYPE_RESTRICT_P (el) + || CP_TYPE_VOLATILE_P (el) + || CP_TYPE_CONST_P (el))) + fprintf (stderr, "CV-"); + fprintf (stderr, "%s (%s at %p)", + name, get_tree_code_name (TREE_CODE (el)), (void *) el); + } + fprintf (stderr, "\n"); } } @@ -443,11 +450,12 @@ add_substitution (tree node) tree candidate; FOR_EACH_VEC_SAFE_ELT (G.substitutions, i, candidate) - { - gcc_assert (!(DECL_P (node) && node == candidate)); - gcc_assert (!(TYPE_P (node) && TYPE_P (candidate) - && same_type_p (node, candidate))); - } + if (candidate) + { + gcc_assert (!(DECL_P (node) && node == candidate)); + gcc_assert (!(TYPE_P (node) && TYPE_P (candidate) + && same_type_p (node, candidate))); + } } /* Put the decl onto the varray of substitution candidates. */ @@ -669,20 +677,21 @@ find_substitution (tree node) tags = get_abi_tags (type); /* Now check the list of available substitutions for this mangling operation. */ - if (!abbr || tags) for (i = 0; i < size; ++i) - { - tree candidate = (*G.substitutions)[i]; - /* NODE is a matched to a candidate if it's the same decl node or - if it's the same type. */ - if (decl == candidate - || (TYPE_P (candidate) && type && TYPE_P (node) - && same_type_p (type, candidate)) - || NESTED_TEMPLATE_MATCH (node, candidate)) + if (!abbr || tags) + for (i = 0; i < size; ++i) + if (tree candidate = (*G.substitutions)[i]) { - write_substitution (i); - return 1; + /* NODE is a matched to a candidate if it's the same decl node or + if it's the same type. */ + if (decl == candidate + || (TYPE_P (candidate) && type && TYPE_P (node) + && same_type_p (type, candidate)) + || NESTED_TEMPLATE_MATCH (node, candidate)) + { + write_substitution (i); + return 1; + } } - } if (!abbr) /* No substitution found. */ @@ -735,6 +744,10 @@ unmangled_name_p (const tree decl) if (get_abi_tags (decl)) return false; + // Declarations attached to a named module are mangled + if (modules_p () && get_originating_module (decl, true) >= 0) + return false; + /* The names of non-static global variables aren't mangled. */ return true; } @@ -853,51 +866,49 @@ write_encoding (const tree decl) void mangle_module_substitution (int v) { - if (v < 10) - { - write_char ('_'); - write_char ('0' + v); - } - else - { - write_char ('W'); - write_unsigned_number (v - 10); - write_char ('_'); - } + write_substitution (v - 1); } -void -mangle_identifier (char c, tree id) +int +mangle_module_component (tree comp, bool partition_p) { - if (c) - write_char (c); - write_source_name (id); + write_char ('W'); + if (partition_p) + write_char ('P'); + write_source_name (comp); + + // Module substitutions use the same number-space as entity + // substitutions, but are orthogonal. + vec_safe_push (G.substitutions, NULL_TREE); + return G.substitutions->length (); } /* If the outermost non-namespace context (including DECL itself) is a module-linkage decl, mangle the module information. For module global initializers we need to include the partition part. - ::= W + E - :: - || _ ;; short backref - || W _ ;; long backref - || P ;; partition introducer + ::= + || + || + :: W [P] */ static void write_module (int m, bool include_partition) { G.mod = true; - - write_char ('W'); mangle_module (m, include_partition); - write_char ('E'); } static void maybe_write_module (tree decl) { + if (!DECL_NAMESPACE_SCOPE_P (decl)) + return; + + if (TREE_CODE (decl) == NAMESPACE_DECL && DECL_NAME (decl)) + return; + int m = get_originating_module (decl, true); if (m >= 0) write_module (m, false); @@ -965,9 +976,6 @@ write_name (tree decl, const int ignore_local_scope) decl = TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (decl))); } - if (modules_p ()) - maybe_write_module (decl); - context = decl_mangling_context (decl); gcc_assert (context != NULL_TREE); @@ -1356,10 +1364,10 @@ find_decomp_unqualified_name (tree decl, size_t *len) /* We don't need to handle thunks, vtables, or VTTs here. Those are mangled through special entry points. - ::= + ::= [] ::= - ::= - ::= + ::= [] + ::= [] ::= ::= L */ @@ -1385,6 +1393,9 @@ write_unqualified_name (tree decl) { MANGLE_TRACE_TREE ("unqualified-name", decl); + if (modules_p ()) + maybe_write_module (decl); + if (identifier_p (decl)) { write_unqualified_id (decl); @@ -3996,7 +4007,6 @@ mangle_module_global_init (int module) write_string ("_ZGI"); write_module (module, true); - write_char ('v'); return finish_mangling_get_identifier (); } diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 6e6b008b3a5c..ddaf9c292c18 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -13893,20 +13893,18 @@ void module_state::mangle (bool include_partition) { if (subst) - mangle_module_substitution (subst - 1); + mangle_module_substitution (subst); else { if (parent) parent->mangle (include_partition); - if (include_partition || !is_partition ()) + if (include_partition || !is_partition ()) { - char p = 0; - // Partitions are significant for global initializer functions - if (is_partition () && !parent->is_partition ()) - p = 'P'; + // Partitions are significant for global initializer + // functions + bool partition = is_partition () && !parent->is_partition (); + subst = mangle_module_component (name, partition); substs.safe_push (this); - subst = substs.length (); - mangle_identifier (p, name); } } } @@ -13916,6 +13914,8 @@ mangle_module (int mod, bool include_partition) { module_state *imp = (*modules)[mod]; + gcc_checking_assert (!imp->is_header ()); + if (!imp->name) /* Set when importing the primary module interface. */ imp = imp->parent; @@ -18391,14 +18391,15 @@ get_originating_module (tree decl, bool for_mangle) if (!DECL_LANG_SPECIFIC (not_tmpl)) return for_mangle ? -1 : 0; - if (for_mangle - && (DECL_MODULE_EXPORT_P (owner) || !DECL_MODULE_PURVIEW_P (not_tmpl))) + if (for_mangle && !DECL_MODULE_PURVIEW_P (not_tmpl)) return -1; - if (!DECL_MODULE_IMPORT_P (not_tmpl)) - return 0; + int mod = !DECL_MODULE_IMPORT_P (not_tmpl) ? 0 : get_importing_module (owner); - return get_importing_module (owner); + if (for_mangle && (*modules)[mod]->is_header ()) + return -1; + + return mod; } unsigned diff --git a/gcc/testsuite/g++.dg/modules/fn-inline-1_b.C b/gcc/testsuite/g++.dg/modules/fn-inline-1_b.C index 72de1a9a5144..4890a15d98e9 100644 --- a/gcc/testsuite/g++.dg/modules/fn-inline-1_b.C +++ b/gcc/testsuite/g++.dg/modules/fn-inline-1_b.C @@ -6,6 +6,6 @@ int Frob (int n, int a) return frob (n, a); } -// { dg-final { scan-assembler "_ZW3bobE4frobii:" } } -// { dg-final { scan-assembler ".weak(_definition)?\[\t ]*_?_ZW3bobE4frobii" } } -// { dg-final { scan-assembler "_Z4Frobii:" } } +// { dg-final { scan-assembler "_ZW3bob4frobii:" } } +// { dg-final { scan-assembler ".weak(_definition)?\[\t ]*_?_ZW3bob4frobii" } } +// { dg-final { scan-assembler "_ZW3bob4Frobii:" } } diff --git a/gcc/testsuite/g++.dg/modules/fn-inline-1_c.C b/gcc/testsuite/g++.dg/modules/fn-inline-1_c.C index 2b8bbdcd1af9..96afc8975678 100644 --- a/gcc/testsuite/g++.dg/modules/fn-inline-1_c.C +++ b/gcc/testsuite/g++.dg/modules/fn-inline-1_c.C @@ -12,5 +12,5 @@ int main () return 0; } -// { dg-final { scan-assembler "_Z4frobi:" } } -// { dg-final { scan-assembler ".weak(_definition)?\[\t ]*_?_Z4frobi" } } +// { dg-final { scan-assembler "_ZW3bob4frobi:" } } +// { dg-final { scan-assembler ".weak(_definition)?\[\t ]*_?_ZW3bob4frobi" } } diff --git a/gcc/testsuite/g++.dg/modules/imp-inline-1_a.C b/gcc/testsuite/g++.dg/modules/imp-inline-1_a.C index 56bbbdd0456b..de12b8e376c4 100644 --- a/gcc/testsuite/g++.dg/modules/imp-inline-1_a.C +++ b/gcc/testsuite/g++.dg/modules/imp-inline-1_a.C @@ -33,5 +33,5 @@ export inline auto GMF () } // { dg-final { scan-assembler-not {_ZN3Bob4frobEv:} } } -// { dg-final { scan-assembler-not {_ZN4Bill4frobEv:} } } -// { dg-final { scan-assembler {_ZN4Bill3dobEv:} } } +// { dg-final { scan-assembler-not {_ZNW3Foo4Bill4frobEv:} } } +// { dg-final { scan-assembler {_ZNW3Foo4Bill3dobEv:} } } diff --git a/gcc/testsuite/g++.dg/modules/imp-inline-1_b.C b/gcc/testsuite/g++.dg/modules/imp-inline-1_b.C index c127f7005a3a..c0d371a531d9 100644 --- a/gcc/testsuite/g++.dg/modules/imp-inline-1_b.C +++ b/gcc/testsuite/g++.dg/modules/imp-inline-1_b.C @@ -12,11 +12,11 @@ int main () } // { dg-final { scan-assembler {_ZN3Bob4frobEv:} } } -// { dg-final { scan-assembler {_ZN4Bill4frobEv:} } } -// { dg-final { scan-assembler-not {_ZN4Bill3dobEv:} } } -// { dg-final { scan-assembler {_Z3GMFv:} } } +// { dg-final { scan-assembler {_ZNW3Foo4Bill4frobEv:} } } +// { dg-final { scan-assembler-not {_ZNW3Foo4Bill3dobEv:} } } +// { dg-final { scan-assembler {_ZW3Foo3GMFv:} } } // { dg-final { scan-assembler {call[ \t]+_?_ZN3Bob4frobEv} { target i?86-*-* x86_64-*-* } } } -// { dg-final { scan-assembler {call[ \t]+_?_Z3GMFv} { target i?86-*-* x86_64-*-* } } } -// { dg-final { scan-assembler {call[ \t]+_?_ZN4Bill3dobEv} { target i?86-*-* x86_64-*-* } } } -// { dg-final { scan-assembler {call[ \t]+_?_ZN4Bill4frobEv} { target i?86-*-* x86_64-*-* } } } +// { dg-final { scan-assembler {call[ \t]+_?_ZW3Foo3GMFv} { target i?86-*-* x86_64-*-* } } } +// { dg-final { scan-assembler {call[ \t]+_?_ZNW3Foo4Bill3dobEv} { target i?86-*-* x86_64-*-* } } } +// { dg-final { scan-assembler {call[ \t]+_?_ZNW3Foo4Bill4frobEv} { target i?86-*-* x86_64-*-* } } } diff --git a/gcc/testsuite/g++.dg/modules/init-2_a.C b/gcc/testsuite/g++.dg/modules/init-2_a.C index 1e9093ef13d4..c0390a1b56e2 100644 --- a/gcc/testsuite/g++.dg/modules/init-2_a.C +++ b/gcc/testsuite/g++.dg/modules/init-2_a.C @@ -2,4 +2,4 @@ export module Foo; // { dg-module-cmi Foo } -// { dg-final { scan-assembler {_ZGIW3FooEv:} } } +// { dg-final { scan-assembler {_ZGIW3Foo:} } } diff --git a/gcc/testsuite/g++.dg/modules/init-2_b.C b/gcc/testsuite/g++.dg/modules/init-2_b.C index b9692ca862cb..912ee406931d 100644 --- a/gcc/testsuite/g++.dg/modules/init-2_b.C +++ b/gcc/testsuite/g++.dg/modules/init-2_b.C @@ -4,5 +4,5 @@ export module Bar; import Foo; -// { dg-final { scan-assembler {_?_ZGIW3BarEv:} } } -// { dg-final { scan-assembler {call[ \t]+_?_ZGIW3FooEv} { target i?86-*-* x86_64-*-* } } } +// { dg-final { scan-assembler {_?_ZGIW3Bar:} } } +// { dg-final { scan-assembler {call[ \t]+_?_ZGIW3Foo} { target i?86-*-* x86_64-*-* } } } diff --git a/gcc/testsuite/g++.dg/modules/init-2_c.C b/gcc/testsuite/g++.dg/modules/init-2_c.C index c1fa5d80cd46..4ca880df7718 100644 --- a/gcc/testsuite/g++.dg/modules/init-2_c.C +++ b/gcc/testsuite/g++.dg/modules/init-2_c.C @@ -4,5 +4,5 @@ import Foo; import Bar; // We know Bar imports Foo, so only call Bar's Global Init -// { dg-final { scan-assembler {call[ \t]+_?_ZGIW3BarEv} { target i?86-*-* x86_64-*-* } } } -// { dg-final { scan-assembler-not {call[ \t]+_?_ZGIW3FooEv} { target i?86-*-* x86_64-*-* } } } +// { dg-final { scan-assembler {call[ \t]+_?_ZGIW3Bar} { target i?86-*-* x86_64-*-* } } } +// { dg-final { scan-assembler-not {call[ \t]+_?_ZGIW3Foo} { target i?86-*-* x86_64-*-* } } } diff --git a/gcc/testsuite/g++.dg/modules/member-def-2_d.C b/gcc/testsuite/g++.dg/modules/member-def-2_d.C index c2b9c3e655b0..e096bd9daa9e 100644 --- a/gcc/testsuite/g++.dg/modules/member-def-2_d.C +++ b/gcc/testsuite/g++.dg/modules/member-def-2_d.C @@ -10,4 +10,4 @@ int main () // { dg-final { scan-lang-dump {Reading function definition '::frob@foo:1::member@foo:1'} module } } -// { dg-final { scan-assembler {_ZN4frob6memberEv:} } } +// { dg-final { scan-assembler {_ZNW3foo4frob6memberEv:} } } diff --git a/gcc/testsuite/g++.dg/modules/mod-sym-1.C b/gcc/testsuite/g++.dg/modules/mod-sym-1.C index b20710189d13..8f22d174cac6 100644 --- a/gcc/testsuite/g++.dg/modules/mod-sym-1.C +++ b/gcc/testsuite/g++.dg/modules/mod-sym-1.C @@ -24,11 +24,10 @@ namespace Inner export inline void Baz2 () { Foo2 (); Bink2 (); } } -// These fail until namespace hack is removed -// { dg-final { scan-assembler "_ZW7linkageE3Foov:" } } -// { dg-final { scan-assembler "_ZW7linkageE4Binkv:" } } -// { dg-final { scan-assembler "_ZW7linkageEN5Inner4Foo2Ev:" } } -// { dg-final { scan-assembler "_ZW7linkageEN5Inner5Bink2Ev:" } } -// { dg-final { scan-assembler "_Z3Bazv:" } } -// { dg-final { scan-assembler "_ZN5Inner4Baz2Ev:" } } +// { dg-final { scan-assembler "_ZW7linkage3Foov:" } } +// { dg-final { scan-assembler "_ZW7linkage4Binkv:" } } +// { dg-final { scan-assembler "_ZN5InnerW7linkage4Foo2Ev:" } } +// { dg-final { scan-assembler "_ZN5InnerW7linkage5Bink2Ev:" } } +// { dg-final { scan-assembler "_ZW7linkage3Bazv:" } } +// { dg-final { scan-assembler "_ZN5InnerW7linkage4Baz2Ev:" } } // { dg-final { scan-assembler "cfunc:" } } diff --git a/gcc/testsuite/g++.dg/modules/mod-sym-2.C b/gcc/testsuite/g++.dg/modules/mod-sym-2.C index ef0c3f03317a..99c9f1b565d0 100644 --- a/gcc/testsuite/g++.dg/modules/mod-sym-2.C +++ b/gcc/testsuite/g++.dg/modules/mod-sym-2.C @@ -19,5 +19,5 @@ namespace One { } // { dg-final { scan-assembler "_Z3Foov:" } } -// { dg-final { scan-assembler "_ZW5okely6dokelyEN3One3Two5Three4Foo2Ev:" } } -// { dg-final { scan-assembler "_ZN3One3Two5Three4Baz2Ev:" } } +// { dg-final { scan-assembler "_ZN3One3Two5ThreeW5okelyW6dokely4Foo2Ev:" } } +// { dg-final { scan-assembler "_ZN3One3Two5ThreeW5okelyW6dokely4Baz2Ev:" } } diff --git a/gcc/testsuite/g++.dg/modules/mod-sym-3.C b/gcc/testsuite/g++.dg/modules/mod-sym-3.C index 9481ad1e719c..d280f08b6977 100644 --- a/gcc/testsuite/g++.dg/modules/mod-sym-3.C +++ b/gcc/testsuite/g++.dg/modules/mod-sym-3.C @@ -20,7 +20,7 @@ namespace X inline void X::Foo () {} inline void X::Baz () {} -// { dg-final { scan-assembler "_ZW3bobEN1X3FooEv:" } } -// { dg-final { scan-assembler "_ZN1X3BazEv:" } } -// { dg-final { scan-assembler "_ZW3bobEN1X1Y4QuuxEv:" } } -// { dg-final { scan-assembler "_ZN1X1Y3BarEv:" } } +// { dg-final { scan-assembler "_ZN1XW3bob3FooEv:" } } +// { dg-final { scan-assembler "_ZN1XW3bob3BazEv:" } } +// { dg-final { scan-assembler "_ZN1X1YW3bob4QuuxEv:" } } +// { dg-final { scan-assembler "_ZN1X1YW3bob3BarEv:" } } diff --git a/gcc/testsuite/g++.dg/modules/sym-subst-1.C b/gcc/testsuite/g++.dg/modules/sym-subst-1.C index 96ee25c65b56..6f638624a615 100644 --- a/gcc/testsuite/g++.dg/modules/sym-subst-1.C +++ b/gcc/testsuite/g++.dg/modules/sym-subst-1.C @@ -10,4 +10,4 @@ void frob (mytype &) { } -// { dg-final { scan-assembler {_ZW3bob6stuart5kevinE4frobRW_2E6mytype:} } } +// { dg-final { scan-assembler {_ZW3bobW6stuartW5kevin4frobRS1_6mytype:} } } diff --git a/gcc/testsuite/g++.dg/modules/sym-subst-2_b.C b/gcc/testsuite/g++.dg/modules/sym-subst-2_b.C index fc3db0ac5f8a..261f14588bcd 100644 --- a/gcc/testsuite/g++.dg/modules/sym-subst-2_b.C +++ b/gcc/testsuite/g++.dg/modules/sym-subst-2_b.C @@ -14,5 +14,5 @@ void bar (mytype &m) foo (m); } -// { dg-final { scan-assembler {_ZW3bob5kevinE3barRW_1E6mytype:} } } -// { dg-final { scan-assembler {_ZW3bob6stuartE5innerIW_05kevinE6mytypeEvRT_:} } } +// { dg-final { scan-assembler {_ZW3bobW5kevin3barRS0_6mytype:} } } +// { dg-final { scan-assembler {_ZW3bobW6stuart5innerIS_W5kevin6mytypeEvRT_:} } } diff --git a/gcc/testsuite/g++.dg/modules/sym-subst-3_a.C b/gcc/testsuite/g++.dg/modules/sym-subst-3_a.C index bd958dc0dc3e..a18947a5410d 100644 --- a/gcc/testsuite/g++.dg/modules/sym-subst-3_a.C +++ b/gcc/testsuite/g++.dg/modules/sym-subst-3_a.C @@ -6,4 +6,4 @@ struct s; export s *S; -// { dg-final { scan-assembler {.globa?l[ \t]*_?S\n} } } +// { dg-final { scan-assembler {.globa?l[ \t]*_?_ZW1tW1s1S\n} } } diff --git a/gcc/testsuite/g++.dg/modules/sym-subst-3_b.C b/gcc/testsuite/g++.dg/modules/sym-subst-3_b.C index 9ae3f8f7816b..6caa0509b24c 100644 --- a/gcc/testsuite/g++.dg/modules/sym-subst-3_b.C +++ b/gcc/testsuite/g++.dg/modules/sym-subst-3_b.C @@ -4,4 +4,4 @@ export module t; import t.s; struct t; export void f (t*, decltype (S)){} -// { dg-final { scan-assembler {_Z1fPW1tE1tPW_01sE1s:} } } +// { dg-final { scan-assembler {_ZW1t1fPS_1tPS_W1s1s:} } } diff --git a/gcc/testsuite/g++.dg/modules/sym-subst-4.C b/gcc/testsuite/g++.dg/modules/sym-subst-4.C index d2266c407f4f..7faae00a8e2e 100644 --- a/gcc/testsuite/g++.dg/modules/sym-subst-4.C +++ b/gcc/testsuite/g++.dg/modules/sym-subst-4.C @@ -11,4 +11,4 @@ void frob (mytype &) { } -// { dg-final { scan-assembler {_ZW4zero4eins4zwei4drei4vier4funf5sechs6sieben4acht4neunE4frobRW_9E6mytype:} } } +// { dg-final { scan-assembler {_ZW4zeroW4einsW4zweiW4dreiW4vierW4funfW5sechsW6siebenW4achtW4neun4frobRS8_6mytype:} } } diff --git a/gcc/testsuite/g++.dg/modules/sym-subst-5.C b/gcc/testsuite/g++.dg/modules/sym-subst-5.C index 1e26e7594efe..9883c13940ac 100644 --- a/gcc/testsuite/g++.dg/modules/sym-subst-5.C +++ b/gcc/testsuite/g++.dg/modules/sym-subst-5.C @@ -11,4 +11,4 @@ void frob (mytype &) { } -// { dg-final { scan-assembler {_ZW4zero4eins4zwei4drei4vier4funf5sechs6sieben4acht4neun4zehnE4frobRWW0_E6mytype:} } } +// { dg-final { scan-assembler {_ZW4zeroW4einsW4zweiW4dreiW4vierW4funfW5sechsW6siebenW4achtW4neunW4zehn4frobRS9_6mytype:} } } diff --git a/gcc/testsuite/g++.dg/modules/sym-subst-6.C b/gcc/testsuite/g++.dg/modules/sym-subst-6.C index 0a9ac6d8f384..e68c8e070bb3 100644 --- a/gcc/testsuite/g++.dg/modules/sym-subst-6.C +++ b/gcc/testsuite/g++.dg/modules/sym-subst-6.C @@ -11,4 +11,4 @@ void frob (mytype &) { } -// { dg-final { scan-assembler {_ZW4zero4eins4zwei4drei4vier4funf5sechs6sieben4acht4neun4zehn3elfE4frobRWW1_E6mytype:} } } +// { dg-final { scan-assembler {_ZW4zeroW4einsW4zweiW4dreiW4vierW4funfW5sechsW6siebenW4achtW4neunW4zehnW3elf4frobRSA_6mytype:} } } diff --git a/gcc/testsuite/g++.dg/modules/tpl-spec-1_a.C b/gcc/testsuite/g++.dg/modules/tpl-spec-1_a.C index 3bfb6394d565..e7e6f97f8bef 100644 --- a/gcc/testsuite/g++.dg/modules/tpl-spec-1_a.C +++ b/gcc/testsuite/g++.dg/modules/tpl-spec-1_a.C @@ -19,4 +19,4 @@ template <> int foo (int y) // { dg-final { scan-lang-dump {Cluster members:\n \[0\]=specialization declaration '::foo'} module } } // { dg-final { scan-lang-dump {Pending specialization '::foo' entity:[0-9]* section:. keyed to '::foo'} module } } -// { dg-final { scan-assembler {_Z3fooIiEiT_:} } } +// { dg-final { scan-assembler {_ZW3TPL3fooIiEiT_:} } } diff --git a/gcc/testsuite/g++.dg/modules/tpl-spec-2_b.C b/gcc/testsuite/g++.dg/modules/tpl-spec-2_b.C index a8b40caf9121..b6bf7d7946fa 100644 --- a/gcc/testsuite/g++.dg/modules/tpl-spec-2_b.C +++ b/gcc/testsuite/g++.dg/modules/tpl-spec-2_b.C @@ -15,4 +15,4 @@ template <> int foo (int y) // { dg-final { scan-lang-dump {Cluster members:\n \[0\]=specialization declaration '::foo'} module } } // { dg-final { scan-lang-dump {Pending specialization '::foo' entity:[0-9]* section:. keyed to '::foo'} module } } -// { dg-final { scan-assembler {_Z3fooIiEiT_:} } } +// { dg-final { scan-assembler {_ZW3TPL3fooIiEiT_:} } } diff --git a/gcc/testsuite/g++.dg/modules/tpl-spec-2_d.C b/gcc/testsuite/g++.dg/modules/tpl-spec-2_d.C index f8aae310b31e..4c707ae290d4 100644 --- a/gcc/testsuite/g++.dg/modules/tpl-spec-2_d.C +++ b/gcc/testsuite/g++.dg/modules/tpl-spec-2_d.C @@ -23,5 +23,5 @@ int two () // { dg-final { scan-lang-dump {Reading 1 pending entities keyed to '::foo'} module } } // { dg-final { scan-lang-dump-not {Reading definition function_decl '::foo@TPL:.'} module } } -// { dg-final { scan-assembler-not {_Z3fooIiEiT_:} } } -// { dg-final { scan-assembler {_Z3fooIfEiT_:} } } +// { dg-final { scan-assembler-not {_ZW3TPL3fooIiEiT_:} } } +// { dg-final { scan-assembler {_ZW3TPL3fooIfEiT_:} } } diff --git a/gcc/testsuite/g++.dg/modules/tpl-spec-3_a.C b/gcc/testsuite/g++.dg/modules/tpl-spec-3_a.C index 1e677fc42dff..521c0091b2de 100644 --- a/gcc/testsuite/g++.dg/modules/tpl-spec-3_a.C +++ b/gcc/testsuite/g++.dg/modules/tpl-spec-3_a.C @@ -24,4 +24,4 @@ template <> void frob::store (int i_) // { dg-final { scan-lang-dump {Cluster members:\n \[0\]=specialization declaration '::frob::store'} module } } // { dg-final { scan-lang-dump {Pending specialization '::frob::store' entity:[0-9]* section:. keyed to '::frob'} module } } -// { dg-final { scan-assembler {_ZN4frob5storeIiEEvT_:} } } +// { dg-final { scan-assembler {_ZNW3TPL4frob5storeIiEEvT_:} } } diff --git a/gcc/testsuite/g++.dg/modules/virt-1_a.C b/gcc/testsuite/g++.dg/modules/virt-1_a.C index 7719a2877092..4081ff5969f6 100644 --- a/gcc/testsuite/g++.dg/modules/virt-1_a.C +++ b/gcc/testsuite/g++.dg/modules/virt-1_a.C @@ -20,6 +20,7 @@ export int Visit (Visitor *v) return v->Visit (); } -// { dg-final { scan-assembler {_ZTV7Visitor:} } } -// { dg-final { scan-assembler {_ZTI7Visitor:} } } -// { dg-final { scan-assembler {_ZTS7Visitor:} } } +// { dg-final { scan-assembler {_ZTVW3foo7Visitor:} } } +// { dg-final { scan-assembler {_ZTIW3foo7Visitor:} } } +// { dg-final { scan-assembler {_ZTSW3foo7Visitor:} } } +// { dg-final { scan-assembler {_ZW3foo5VisitPS_7Visitor:} } } diff --git a/gcc/testsuite/g++.dg/modules/virt-2_a.C b/gcc/testsuite/g++.dg/modules/virt-2_a.C index 9115cc19cc28..580552be5a0d 100644 --- a/gcc/testsuite/g++.dg/modules/virt-2_a.C +++ b/gcc/testsuite/g++.dg/modules/virt-2_a.C @@ -22,6 +22,6 @@ export int Visit (Visitor *v) } // Emit here -// { dg-final { scan-assembler {_ZTV7Visitor:} } } -// { dg-final { scan-assembler {_ZTI7Visitor:} } } -// { dg-final { scan-assembler {_ZTS7Visitor:} } } +// { dg-final { scan-assembler {_ZTVW3foo7Visitor:} } } +// { dg-final { scan-assembler {_ZTIW3foo7Visitor:} } } +// { dg-final { scan-assembler {_ZTSW3foo7Visitor:} } } diff --git a/gcc/testsuite/g++.dg/modules/virt-2_b.C b/gcc/testsuite/g++.dg/modules/virt-2_b.C index 543218956e97..e041f0721f9c 100644 --- a/gcc/testsuite/g++.dg/modules/virt-2_b.C +++ b/gcc/testsuite/g++.dg/modules/virt-2_b.C @@ -23,6 +23,6 @@ int main () // We do not emit Visitor vtable // but we do emit rtti here -// { dg-final { scan-assembler-not {_ZTV7Visitor:} } } -// { dg-final { scan-assembler {_ZTI7Visitor:} } } -// { dg-final { scan-assembler {_ZTS7Visitor:} } } +// { dg-final { scan-assembler-not {_ZTVW3foo7Visitor:} } } +// { dg-final { scan-assembler {_ZTIW3foo7Visitor:} } } +// { dg-final { scan-assembler {_ZTSW3foo7Visitor:} } } diff --git a/gcc/testsuite/g++.dg/modules/virt-2_c.C b/gcc/testsuite/g++.dg/modules/virt-2_c.C index 1ac7f994792d..7b3eeebe5089 100644 --- a/gcc/testsuite/g++.dg/modules/virt-2_c.C +++ b/gcc/testsuite/g++.dg/modules/virt-2_c.C @@ -11,6 +11,6 @@ int Foo () // We do emit Visitor vtable // andl also we do emit rtti here -// { dg-final { scan-assembler {_ZTV7Visitor:} } } -// { dg-final { scan-assembler {_ZTI7Visitor:} } } -// { dg-final { scan-assembler {_ZTS7Visitor:} } } +// { dg-final { scan-assembler {_ZTVW3foo7Visitor:} } } +// { dg-final { scan-assembler {_ZTIW3foo7Visitor:} } } +// { dg-final { scan-assembler {_ZTSW3foo7Visitor:} } } diff --git a/gcc/testsuite/g++.dg/modules/vtt-1_a.C b/gcc/testsuite/g++.dg/modules/vtt-1_a.C index 11a1f6fb161d..bef2c864525d 100644 --- a/gcc/testsuite/g++.dg/modules/vtt-1_a.C +++ b/gcc/testsuite/g++.dg/modules/vtt-1_a.C @@ -31,6 +31,6 @@ export void make_foo () derived d; } -// { dg-final {scan-assembler "_ZTV4base:" } } -// { dg-final {scan-assembler "_ZTV7derived:" } } -// { dg-final {scan-assembler "_ZTT7derived:" } } +// { dg-final {scan-assembler "_ZTVW3foo4base:" } } +// { dg-final {scan-assembler "_ZTVW3foo7derived:" } } +// { dg-final {scan-assembler "_ZTTW3foo7derived:" } } diff --git a/gcc/testsuite/g++.dg/modules/vtt-1_b.C b/gcc/testsuite/g++.dg/modules/vtt-1_b.C index 2f1b9659a569..87df9c272a87 100644 --- a/gcc/testsuite/g++.dg/modules/vtt-1_b.C +++ b/gcc/testsuite/g++.dg/modules/vtt-1_b.C @@ -21,8 +21,8 @@ export inline void make_bar () mine m; } -// { dg-final {scan-assembler-not "_ZTV4base:" } } -// { dg-final {scan-assembler-not "_ZTV7derived:" } } -// { dg-final {scan-assembler-not "_ZTT7derived:" } } -// { dg-final {scan-assembler "_ZTV4mine:" } } -// { dg-final {scan-assembler "_ZTT4mine:" } } +// { dg-final {scan-assembler-not "_ZTVW3foo4base:" } } +// { dg-final {scan-assembler-not "_ZTVW3foo7derived:" } } +// { dg-final {scan-assembler-not "_ZTTW3foo7derived:" } } +// { dg-final {scan-assembler "_ZTVW3bar4mine:" } } +// { dg-final {scan-assembler "_ZTTW3bar4mine:" } } -- 2.47.3