diff options
author | Mark Mitchell <mark@codesourcery.com> | 2000-11-16 22:36:20 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2000-11-16 22:36:20 +0000 |
commit | 43048a06fa87c1bb7e0b8340c764be76f0ddf0f0 (patch) | |
tree | 91a584fec94b4e6aa879640e169518621ffd13e2 /gcc/cp/mangle.c | |
parent | 35d9f39deafd46d5fcac80fb71691334c6d788f9 (diff) | |
download | gcc-43048a06fa87c1bb7e0b8340c764be76f0ddf0f0.zip gcc-43048a06fa87c1bb7e0b8340c764be76f0ddf0f0.tar.gz gcc-43048a06fa87c1bb7e0b8340c764be76f0ddf0f0.tar.bz2 |
mangle.c (write_special_name_constructor): Don't generate assembler junk when confronted with an old-style constructor.
* mangle.c (write_special_name_constructor): Don't generate
assembler junk when confronted with an old-style constructor.
(write_special_name_destructor): Likewise.
(mangle_decl_string): Do it here instead.
From-SVN: r37508
Diffstat (limited to 'gcc/cp/mangle.c')
-rw-r--r-- | gcc/cp/mangle.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index da04480..5c45a91 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -1077,12 +1077,16 @@ static void write_special_name_constructor (ctor) tree ctor; { - if (DECL_COMPLETE_CONSTRUCTOR_P (ctor)) + if (DECL_COMPLETE_CONSTRUCTOR_P (ctor) + /* Even though we don't ever emit a definition of the + old-style destructor, we still have to consider entities + (like static variables) nested inside it. */ + || DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (ctor)) write_string ("C1"); else if (DECL_BASE_CONSTRUCTOR_P (ctor)) write_string ("C2"); else - write_string ("C*INTERNAL*"); + my_friendly_abort (20001115); } /* Handle destructor productions of non-terminal <special-name>. @@ -1102,13 +1106,16 @@ write_special_name_destructor (dtor) { if (DECL_DELETING_DESTRUCTOR_P (dtor)) write_string ("D0"); - else if (DECL_COMPLETE_DESTRUCTOR_P (dtor)) + else if (DECL_COMPLETE_DESTRUCTOR_P (dtor) + /* Even though we don't ever emit a definition of the + old-style destructor, we still have to consider entities + (like static variables) nested inside it. */ + || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (dtor)) write_string ("D1"); else if (DECL_BASE_DESTRUCTOR_P (dtor)) write_string ("D2"); else - /* Old-ABI destructor. */ - write_string ("D*INTERNAL*"); + my_friendly_abort (20001115); } /* Return the discriminator for ENTITY appearing inside @@ -2002,7 +2009,16 @@ mangle_decl_string (decl) if (TREE_CODE (decl) == TYPE_DECL) write_type (TREE_TYPE (decl)); else - write_mangled_name (decl); + { + write_mangled_name (decl); + if (DECL_LANG_SPECIFIC (decl) + && (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (decl) + || DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl))) + /* We need a distinct mangled name for these entities, but + we should never actually output it. So, we append some + characters the assembler won't like. */ + write_string (" *INTERNAL* "); + } result = finish_mangling (); if (DEBUG_MANGLE) |