[PATCH] New lang hook
Nathan Sidwell
nathan@acm.org
Tue Nov 14 12:47:00 GMT 2017
This patch addresses c++/82836 & c++/82737. The root cause was a bad
assumption I made when moving the mangling alias machinery to its own
hash table.
I had thought that once we SET_DECL_ASSEMBLER_NAME, it never becomes
unset (or changed). That is false. There are paths in the compiler
that set it back to zero, and at least one path where we remangled
because of a bad assumption about the templatedness of a friend.
Previously, we placed mangling aliases in the global namespace mapping
an identifier (the mangled name) to the decl. Resetting the assembler
name didn't break this map -- but may have led to unneeded aliases, I guess.
Moving the alias machinery to its own hash-map allowed me to make
namespace hashes a simple hash, keyed by DECL_NAME (rather than a
hash-map from identifier->decl).
Finally converting the alias hash-map to a hash-table keyed by
DECL_ASSEMBLER_NAME shrunk that table too. But exposed this problem.
I did contemplate reverting that change, but tried this first, and it
seems good.
1) rename the args of COPY_DECL_ASSEMBLER_NAME from DECL1 & DECL2 to the
more semantic SRC_DECL and DST_DECL. Same for COPY_DECL_RTL. These
macros smell rather memcpy-like, but the args are the wrong way round,
so the more clues the better. (My comment in 82737 was misled by this.)
2) change SET_DECL_ASSEMBLER_NAME to a function call, similar to
DECL_ASSEMBLER_NAME.
3) have that call forward to a new lang hook,
override_decl_assembler_name, if it is changing the name.
(set_decl_assembler_name already having been taken.)
4) the new lang hook default simply stores the new name via
DECL_ASSEMBLER_NAME_RAW.
5) the C++ FE overrides this. If the current name is in the alias map
and maps to this decl, we take it out of the map. Then set the new name.
6) excitingly, mangle_decl can be called with a non-null
DECL_ASSEMBLER_NAME, so that function's use of SET_DECL_ASSEMBLER_NAME
works just fine.
booted on all languages.
ok?
nathan
--
Nathan Sidwell
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pr82836-2.diff
Type: text/x-patch
Size: 34077 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20171114/8acbbddd/attachment.bin>
More information about the Gcc-patches
mailing list