From: Iain Buclaw Date: Mon, 26 Jul 2021 15:31:40 +0000 (+0200) Subject: d: Use hasMonitor to determine whether to emit a __monitor field in D classes X-Git-Tag: upstream/12.2.0~6082 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bc5208f7357bfe8e466890a4c856a642cc16920f;p=platform%2Fupstream%2Fgcc.git 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. --- 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);