From a6464b984eb2c8e7a963cb68dd064bcdd9073229 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Sun, 5 Jan 2014 23:15:48 +0000 Subject: [PATCH] Don't add __monitor field for extern(C++) classes. --- gcc/d/ChangeLog | 3 +++ gcc/d/d-ctype.cc | 39 ++++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog index b28544261..e0e4c5315 100644 --- a/gcc/d/ChangeLog +++ b/gcc/d/ChangeLog @@ -1,5 +1,8 @@ 2014-01-06 Iain Buclaw + * d-ctype.cc(TypeClass::toCtype): Don't add __monitor field for + extern(C++) classes. + * d-builtins.c(d_gcc_magic_module): Remove tdata. * d-codegen.cc(build_interface_binfo): Likewise. * d-ctype.cc(TypeEnum::toCtype): Likewise. diff --git a/gcc/d/d-ctype.cc b/gcc/d/d-ctype.cc index 7a26fc4fc..c0dcba20d 100644 --- a/gcc/d/d-ctype.cc +++ b/gcc/d/d-ctype.cc @@ -622,12 +622,13 @@ TypeClass::toCtype (void) // Add the virtual table pointer tree decl = build_decl (UNKNOWN_LOCATION, FIELD_DECL, get_identifier ("__vptr"), d_vtbl_ptr_type_node); - agg_layout.addField (decl, 0); // %% target stuff.. + agg_layout.addField (decl, 0); if (inherited) { vfield = copy_node (decl); - DECL_ARTIFICIAL (decl) = DECL_IGNORED_P (decl) = 1; + DECL_ARTIFICIAL (decl) = 1; + DECL_IGNORED_P (decl) = 1; } else { @@ -637,29 +638,33 @@ TypeClass::toCtype (void) TYPE_VFIELD (rec_type) = vfield; TREE_ADDRESSABLE (rec_type) = 1; - if (!sym->isInterfaceDeclaration()) + if (sym->isInterfaceDeclaration()) { - tree obj_rec_type = TREE_TYPE (build_object_type()->toCtype()); - DECL_FCONTEXT (vfield) = obj_rec_type; + ClassDeclaration *p = sym; - // Add the monitor - decl = build_decl (UNKNOWN_LOCATION, FIELD_DECL, - get_identifier ("__monitor"), ptr_type_node); - DECL_FCONTEXT (decl) = obj_rec_type; - DECL_ARTIFICIAL (decl) = DECL_IGNORED_P (decl) = inherited; - agg_layout.addField (decl, Target::ptrsize); + while (p->baseclasses->dim) + p = (*p->baseclasses)[0]->base; - // Add the fields of each base class - agg_layout.go(); + DECL_FCONTEXT (vfield) = TREE_TYPE (p->type->toCtype()); } else { - ClassDeclaration *p = sym; + tree obj_type = TREE_TYPE (build_object_type()->toCtype()); + DECL_FCONTEXT (vfield) = obj_type; - while (p->baseclasses->dim) - p = (*p->baseclasses)[0]->base; + if (!sym->cpp) + { + // Add the monitor + decl = build_decl (UNKNOWN_LOCATION, FIELD_DECL, + get_identifier ("__monitor"), ptr_type_node); + DECL_FCONTEXT (decl) = obj_type; + DECL_ARTIFICIAL (decl) = inherited; + DECL_IGNORED_P (decl) = inherited; + agg_layout.addField (decl, Target::ptrsize); + } - DECL_FCONTEXT (vfield) = TREE_TYPE (p->type->toCtype()); + // Add the fields of each base class + agg_layout.go(); } agg_layout.finish (sym->userAttributes);