d: Fix SEGV in hash_table<odr_name_hasher, false, xcallocator>::find_slot_with_hash
authorIain Buclaw <ibuclaw@gdcproject.org>
Fri, 20 Mar 2020 16:26:29 +0000 (17:26 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Fri, 20 Mar 2020 16:26:29 +0000 (17:26 +0100)
commitb5446d0cc09e6a931065b98101d799711fd5b035
tree6079d101665fcbf8ab836872e1164e5f5b6ffa2e
parent1aa22b1916a493ac46453d96e0c78ca47bcaeda3
d: Fix SEGV in hash_table<odr_name_hasher, false, xcallocator>::find_slot_with_hash

This patch fixes LTO bug with the D front-end.  As DECL_ASSEMBLER_NAME
is set on the TYPE_DECL, so TYPE_CXX_ODR_P must also be set on the type.

The addition of merge_aggregate_types is not strictly needed now, but it
fixes a problem introduced in newer versions of the dmd front-end where
templated types could be sent more than once to the D code generator.

gcc/d/ChangeLog:

2020-03-20  Iain Buclaw  <ibuclaw@gdcproject.org>

PR lto/91027
* d-tree.h (struct GTY): Add daggregate field.
(IDENTIFIER_DAGGREGATE): Define.
(d_mangle_decl): Add declaration.
* decl.cc (mangle_decl): Remove static linkage, rename to...
(d_mangle_decl): ...this, update all callers.
* types.cc (merge_aggregate_types): New function.
(TypeVisitor::visit (TypeStruct *)): Call merge_aggregate_types, set
IDENTIFIER_DAGGREGATE and TYPE_CXX_ODR_P.
(TypeVisitor::visit (TypeClass *)): Likewise.
gcc/d/ChangeLog
gcc/d/d-tree.h
gcc/d/decl.cc
gcc/d/types.cc