diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-07-26 17:31:40 +0200 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2021-07-30 12:51:35 +0200 |
commit | bc5208f7357bfe8e466890a4c856a642cc16920f (patch) | |
tree | cbc6f17418d942a80ef54a35acb212c4c9e6b263 | |
parent | b2abe4e1aded1409964b870899d18dfdb6384821 (diff) | |
download | gcc-bc5208f7357bfe8e466890a4c856a642cc16920f.zip gcc-bc5208f7357bfe8e466890a4c856a642cc16920f.tar.gz gcc-bc5208f7357bfe8e466890a4c856a642cc16920f.tar.bz2 |
d: Use hasMonitor to determine whether to emit a __monitor field in D classes
This helper introduced by the front-end is a better gate, and allows the
front-end to change rules for what gets a monitor in the future.
gcc/d/ChangeLog:
* types.cc (layout_aggregate_type): Call hasMonitor.
* typeinfo.cc (TypeInfoVisitor::layout_base): Likewise.
(layout_cpp_typeinfo): Likewise. Don't emit vtable unless
have_typeinfo_p.
-rw-r--r-- | gcc/d/typeinfo.cc | 21 | ||||
-rw-r--r-- | gcc/d/types.cc | 2 |
2 files changed, 15 insertions, 8 deletions
diff --git a/gcc/d/typeinfo.cc b/gcc/d/typeinfo.cc index a1f0543..c9126f4 100644 --- a/gcc/d/typeinfo.cc +++ b/gcc/d/typeinfo.cc @@ -423,7 +423,8 @@ class TypeInfoVisitor : public Visitor else this->layout_field (null_pointer_node); - this->layout_field (null_pointer_node); + if (cd->hasMonitor ()) + this->layout_field (null_pointer_node); } /* Write out the interfaces field of class CD. @@ -1457,9 +1458,17 @@ layout_cpp_typeinfo (ClassDeclaration *cd) /* Use the vtable of __cpp_type_info_ptr, the EH personality routine expects this, as it uses .classinfo identity comparison to test for C++ catch handlers. */ - tree vptr = get_vtable_decl (ClassDeclaration::cpp_type_info_ptr); - CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, build_address (vptr)); - CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, null_pointer_node); + ClassDeclaration *cppti = ClassDeclaration::cpp_type_info_ptr; + if (have_typeinfo_p (cppti)) + { + tree vptr = get_vtable_decl (cppti); + CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, build_address (vptr)); + } + else + CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, null_pointer_node); + + if (cppti->hasMonitor ()) + CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, null_pointer_node); /* Let C++ do the RTTI generation, and just reference the symbol as extern, knowing the underlying type is not required. */ @@ -1471,9 +1480,7 @@ layout_cpp_typeinfo (ClassDeclaration *cd) /* Build the initializer and emit. */ DECL_INITIAL (decl) = build_struct_literal (TREE_TYPE (decl), init); - DECL_EXTERNAL (decl) = 0; - d_pushdecl (decl); - rest_of_decl_compilation (decl, 1, 0); + d_finish_decl (decl); } /* Get the VAR_DECL of the __cpp_type_info_ptr for DECL. If this does not yet diff --git a/gcc/d/types.cc b/gcc/d/types.cc index ba2d6d4..8e67461 100644 --- a/gcc/d/types.cc +++ b/gcc/d/types.cc @@ -469,7 +469,7 @@ layout_aggregate_type (AggregateDeclaration *decl, tree type, insert_aggregate_field (type, field, 0); } - if (!id && !cd->isCPPclass ()) + if (!id && cd->hasMonitor ()) { tree field = create_field_decl (ptr_type_node, "__monitor", 1, inherited_p); |