OSDN Git Service

2005-01-25 Andrew Pinski <pinskia@physics.uc.edu>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jan 2005 19:21:30 +0000 (19:21 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Jan 2005 19:21:30 +0000 (19:21 +0000)
        * class.c (abort_fndecl_addr): New variable.
        (build_vtbl_initializer): If we have a pure virtual function
        share the abort function's address.
        Include gt-cp-class.h at the end.
        * config-lang.in (gtfiles): Add cp/class.c.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94225 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/config-lang.in

index b9056d4..52a0ee6 100644 (file)
@@ -1,3 +1,11 @@
+2005-01-25  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       * class.c (abort_fndecl_addr): New variable.
+       (build_vtbl_initializer): If we have a pure virtual function
+       share the abort function's address.
+       Include gt-cp-class.h at the end.
+       * config-lang.in (gtfiles): Add cp/class.c.
+
 2005-01-25  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        * cxx-pretty-print.c (pp_cxx_statement): Add prototype. Make static.
index 87e7b39..84db9e2 100644 (file)
@@ -7063,6 +7063,8 @@ dfs_accumulate_vtbl_inits (tree binfo,
   return inits;
 }
 
+static GTY(()) tree abort_fndecl_addr;
+
 /* Construct the initializer for BINFO's virtual function table.  BINFO
    is part of the hierarchy dominated by T.  If we're building a
    construction vtable, the ORIG_BINFO is the binfo we should use to
@@ -7212,16 +7214,24 @@ build_vtbl_initializer (tree binfo,
          /* You can't call an abstract virtual function; it's abstract.
             So, we replace these functions with __pure_virtual.  */
          if (DECL_PURE_VIRTUAL_P (fn_original))
-           fn = abort_fndecl;
-         else if (!integer_zerop (delta) || vcall_index)
            {
-             fn = make_thunk (fn, /*this_adjusting=*/1, delta, vcall_index);
-             if (!DECL_NAME (fn))
-               finish_thunk (fn);
+             fn = abort_fndecl;
+             if (abort_fndecl_addr == NULL)
+               abort_fndecl_addr = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn);
+             init = abort_fndecl_addr;
+           }
+         else
+           {
+             if (!integer_zerop (delta) || vcall_index)
+               {
+                 fn = make_thunk (fn, /*this_adjusting=*/1, delta, vcall_index);
+                 if (!DECL_NAME (fn))
+                   finish_thunk (fn);
+               }
+             /* Take the address of the function, considering it to be of an
+                appropriate generic type.  */
+             init = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn);
            }
-         /* Take the address of the function, considering it to be of an
-            appropriate generic type.  */
-         init = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn);
        }
 
       /* And add it to the chain of initializers.  */
@@ -7682,3 +7692,4 @@ cp_fold_obj_type_ref (tree ref, tree known_type)
   return build_address (fndecl);
 }
 
+#include "gt-cp-class.h"
index 563cfb4..7243f4d 100644 (file)
@@ -34,4 +34,4 @@ stagestuff="g++\$(exeext) g++-cross\$(exeext) cc1plus\$(exeext)"
 
 target_libs="target-libstdc++-v3 target-gperf"
 
-gtfiles="\$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-lex.c \$(srcdir)/c-pragma.c"
+gtfiles="\$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-lex.c \$(srcdir)/c-pragma.c \$(srcdir)/cp/class.c"