d: Remove handling of deleting GC allocated classes.
authorIain Buclaw <ibuclaw@gdcproject.org>
Sun, 20 Feb 2022 23:06:16 +0000 (00:06 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Sun, 20 Feb 2022 23:12:01 +0000 (00:12 +0100)
Now that the `delete' keyword has been removed from the front-end, only
compiler-generated uses of DeleteExp reach the code generator via the
auto-destruction of `scope class' variables.

The run-time library helpers that previously were used to delete GC
class objects can now be removed from the compiler.

gcc/d/ChangeLog:

* expr.cc (ExprVisitor::visit (DeleteExp *)): Remove handling of
deleting GC allocated classes.
* runtime.def (DELCLASS): Remove.
(DELINTERFACE): Remove.

gcc/d/expr.cc
gcc/d/runtime.def

index d5e4df7..2a7fb69 100644 (file)
@@ -1438,28 +1438,16 @@ public:
       {
        /* For class object references, if there is a destructor for that class,
           the destructor is called for the object instance.  */
-       libcall_fn libcall;
+       gcc_assert (e->e1->op == EXP::variable);
 
-       if (e->e1->op == EXP::variable)
-         {
-           VarDeclaration *v = e->e1->isVarExp ()->var->isVarDeclaration ();
-           if (v && v->onstack)
-             {
-               libcall = tb1->isClassHandle ()->isInterfaceDeclaration ()
-                 ? LIBCALL_CALLINTERFACEFINALIZER : LIBCALL_CALLFINALIZER;
+       VarDeclaration *v = e->e1->isVarExp ()->var->isVarDeclaration ();
+       gcc_assert (v && v->onstack);
 
-               this->result_ = build_libcall (libcall, Type::tvoid, 1, t1);
-               return;
-             }
-         }
+       libcall_fn libcall = tb1->isClassHandle ()->isInterfaceDeclaration ()
+         ? LIBCALL_CALLINTERFACEFINALIZER : LIBCALL_CALLFINALIZER;
 
-       /* Otherwise, the garbage collector is called to immediately free the
-          memory allocated for the class instance.  */
-       libcall = tb1->isClassHandle ()->isInterfaceDeclaration ()
-         ? LIBCALL_DELINTERFACE : LIBCALL_DELCLASS;
-
-       t1 = build_address (t1);
        this->result_ = build_libcall (libcall, Type::tvoid, 1, t1);
+       return;
       }
     else
       {
index acb610f..534f866 100644 (file)
@@ -63,11 +63,7 @@ DEF_D_RUNTIME (ARRAYBOUNDS_INDEXP, "_d_arraybounds_indexp", RT(VOID),
 DEF_D_RUNTIME (NEWCLASS, "_d_newclass", RT(OBJECT), P1(CONST_CLASSINFO), 0)
 DEF_D_RUNTIME (NEWTHROW, "_d_newThrowable", RT(OBJECT), P1(CONST_CLASSINFO), 0)
 
-/* Used when calling delete on a class or interface.  */
-DEF_D_RUNTIME (DELCLASS, "_d_delclass", RT(VOID), P1(VOIDPTR), 0)
-DEF_D_RUNTIME (DELINTERFACE, "_d_delinterface", RT(VOID), P1(VOIDPTR), 0)
-
-/* Same as deleting a class, but used for stack-allocated classes.  */
+/* Used when calling delete on a stack-allocated class or interface.  */
 DEF_D_RUNTIME (CALLFINALIZER, "_d_callfinalizer", RT(VOID), P1(VOIDPTR), 0)
 DEF_D_RUNTIME (CALLINTERFACEFINALIZER, "_d_callinterfacefinalizer", RT(VOID),
               P1(VOIDPTR), 0)