diff options
| author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-16 22:36:20 +0000 |
|---|---|---|
| committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-16 22:36:20 +0000 |
| commit | 5b52da0ea6c4d04a79890ab93dbde84085b54561 (patch) | |
| tree | 91a584fec94b4e6aa879640e169518621ffd13e2 /gcc/cp/mangle.c | |
| parent | 223413eb58ed9caed93247b2e9818d01f7c4f2f1 (diff) | |
| download | ppe42-gcc-5b52da0ea6c4d04a79890ab93dbde84085b54561.tar.gz ppe42-gcc-5b52da0ea6c4d04a79890ab93dbde84085b54561.zip | |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37508 138bc75d-0d04-0410-961f-82ee72b054a4
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 da044804740..5c45a9137f1 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) |

