re PR c/10320 (gcc 3.4 gets rid of static inline function that does not get inlined)
authorJan Hubicka <jh@suse.cz>
Wed, 30 Jul 2003 17:27:17 +0000 (19:27 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 30 Jul 2003 17:27:17 +0000 (17:27 +0000)
* gcse.c (insert_store): Ignore fake edges.

* c-common.c (flag_vtable_gc): Kill.
* c-common.g (flag_vtable_gc): Kill.
* c-opts (c_common_handle_option): Kill.
* c.opt (fvtable-gc): Kill.
* final.c (final_scan_insn): Do not call assemble_vtable_entry.
* output.h (assemble_vtable_entry, assemble_vtable_inherit): Kill.
* varasm.c (assemble_vtable_entry, assemble_vtable_inherit): Kill.

* invoke.texi (-ftable-gc): Kill documentation.

PR C/10320
* tree-inline.c (inlinable_function_p): Don't set DECL_UNINLINABLE
just because function body is missing.

* i386.c (pic_symbolic_operand): Properly detect RIP relative unspecs.

* class.c (build_vtable_entry_ref): Kill.
(build_vtbl_ref_1): Do not call build_vtable_entry_ref.
(build_vfn_ref): Do not call build_vtable_entry_ref.
* cp-lang.c (LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE): Kill.
* cp-tree.h (prepare_assemble_variable): Kill.
* cp-decl.c (prepare_assemble_variable): Kill.

From-SVN: r69964

18 files changed:
gcc/ChangeLog
gcc/c-common.c
gcc/c-common.h
gcc/c-opts.c
gcc/config/i386/i386.c
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-lang.c
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/doc/invoke.texi
gcc/final.c
gcc/gcse.c
gcc/output.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/vtgc1.C [deleted file]
gcc/tree-inline.c
gcc/varasm.c

index 95babcd2dca12046a2e0410a291617c4c4996217..3f64081c405935d3641027f512aceb6a815a05d8 100644 (file)
@@ -1,3 +1,22 @@
+Wed Jul 30 19:12:10 CEST 2003  Jan Hubicka  <jh@suse.cz>
+
+       * gcse.c (insert_store): Ignore fake edges.
+
+       * c-common.c (flag_vtable_gc): Kill.
+       * c-common.g (flag_vtable_gc): Kill.
+       * c-opts (c_common_handle_option): Kill.
+       * c.opt (fvtable-gc): Kill.
+       * final.c (final_scan_insn): Do not call assemble_vtable_entry.
+       * output.h (assemble_vtable_entry, assemble_vtable_inherit): Kill.
+       * varasm.c (assemble_vtable_entry, assemble_vtable_inherit): Kill.
+
+       * invoke.texi (-ftable-gc): Kill documentation.
+
+       * tree-inline.c (inlinable_function_p): Don't set DECL_UNINLINABLE
+       just because function body is missing.
+
+       * i386.c (pic_symbolic_operand): Properly detect RIP relative unspecs.
+
 2003-07-30  Ranjit Mathew  <rmathew@hotmail.com>
 
        * unwind-sjlj.c: Fix typo in file description.
index 95494a966c90aa148db6c3bb837f59dea3a25641..8ee29b7a4eab56710a23571a5fe43bd4af8dd7ae 100644 (file)
@@ -569,10 +569,6 @@ int flag_weak = 1;
 
 int flag_use_cxa_atexit = DEFAULT_USE_CXA_ATEXIT;
 
-/* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc.  */
-
-int flag_vtable_gc;
-
 /* Nonzero means make the default pedwarns warnings instead of errors.
    The value of this flag is ignored if -pedantic is specified.  */
 
index 8e54b49e300622bf9d48cfce9ef1f4b50c4913d0..6590453f86715276c961457a0ac236f3e1517040 100644 (file)
@@ -743,10 +743,6 @@ extern int flag_weak;
 
 extern int flag_use_cxa_atexit;
 
-/* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc.  */
-
-extern int flag_vtable_gc;
-
 /* Nonzero means make the default pedwarns warnings instead of errors.
    The value of this flag is ignored if -pedantic is specified.  */
 
index 44ac8dc8eaaaa32dd1971f861432b408d45f9fdd..85f9a0bf2e079c1970e1749fd0e53aec7d1f8a88 100644 (file)
@@ -675,6 +675,7 @@ c_common_handle_option (size_t scode, const char *arg, int value)
     case OPT_fthis_is_variable:
     case OPT_fvtable_thunks:
     case OPT_fxref:
+    case OPT_fvtable_gc:
       warning ("switch \"%s\" is no longer supported", option->opt_text);
       break;
 
@@ -896,10 +897,6 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       max_tinst_depth = value;
       break;
 
-    case OPT_fvtable_gc:
-      flag_vtable_gc = value;
-      break;
-
     case OPT_fuse_cxa_atexit:
       flag_use_cxa_atexit = value;
       break;
index e314ba53c2f559faf86f84b17b1ec1d1f498815e..706ecc4ff590193192306ac07b1049b2bcb36c2d 100644 (file)
@@ -3410,7 +3410,12 @@ pic_symbolic_operand (register rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
   op = XEXP (op, 0);
   if (TARGET_64BIT)
     {
-      if (GET_CODE (XEXP (op, 0)) == UNSPEC)
+      if (GET_CODE (op) == UNSPEC
+         && XINT (op, 1) == UNSPEC_GOTPCREL)
+       return 1;
+      if (GET_CODE (op) == PLUS
+         && XINT (XEXP (op, 0), 1) == UNSPEC_GOTPCREL
+         && GET_CODE (XEXP (op, 0)) == UNSPEC)
        return 1;
     }
   else
index 309c3f4f6cf57291c85dd65fd7be2384619b571c..8d22b7497948e3cd57c5751ffb9c2c570eae08a7 100644 (file)
@@ -1,3 +1,12 @@
+Wed Jul 30 19:12:48 CEST 2003  Jan Hubicka  <jh@suse.cz>
+
+       * class.c (build_vtable_entry_ref): Kill.
+       (build_vtbl_ref_1): Do not call build_vtable_entry_ref.
+       (build_vfn_ref): Do not call build_vtable_entry_ref.
+       * cp-lang.c (LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE): Kill.
+       * cp-tree.h (prepare_assemble_variable): Kill.
+       * cp-decl.c (prepare_assemble_variable): Kill.
+
 2003-07-29  Geoffrey Keating  <geoffk@apple.com>
 
        * parser.c (cp_lexer_new_main): Use c_common_no_more_pch instead
index b447f7013ee067775604499deba53f8580d280ed..527eae4611cf8299129202e585f1ae68efd4bdfb 100644 (file)
@@ -131,7 +131,6 @@ static void add_implicitly_declared_members (tree, int, int, int);
 static tree fixed_type_or_null (tree, int *, int *);
 static tree resolve_address_of_overloaded_function (tree, tree, int,
                                                          int, int, tree);
-static tree build_vtable_entry_ref (tree, tree, tree);
 static tree build_vtbl_ref_1 (tree, tree);
 static tree build_vtbl_initializer (tree, tree, tree, tree, int *);
 static int count_fields (tree);
@@ -421,32 +420,6 @@ convert_to_base_statically (tree expr, tree base)
 }
 
 \f
-/* Virtual function things.  */
-
-static tree
-build_vtable_entry_ref (tree array_ref, tree instance, tree idx)
-{
-  tree i, i2, vtable, first_fn, basetype;
-
-  basetype = non_reference (TREE_TYPE (instance));
-
-  vtable = get_vtbl_decl_for_binfo (TYPE_BINFO (basetype));
-  first_fn = TYPE_BINFO_VTABLE (basetype);
-
-  i = fold (build_array_ref (first_fn, idx));
-  i = fold (build_c_cast (ptrdiff_type_node,
-                         build_unary_op (ADDR_EXPR, i, 0)));
-  i2 = fold (build_array_ref (vtable, build_int_2 (0,0)));
-  i2 = fold (build_c_cast (ptrdiff_type_node,
-                          build_unary_op (ADDR_EXPR, i2, 0)));
-  i = fold (cp_build_binary_op (MINUS_EXPR, i, i2));
-
-  if (TREE_CODE (i) != INTEGER_CST)
-    abort ();
-
-  return build (VTABLE_REF, TREE_TYPE (array_ref), array_ref, vtable, i);
-}
-
 /* Given an object INSTANCE, return an expression which yields the
    vtable element corresponding to INDEX.  There are many special
    cases for INSTANCE which we take care of here, mainly to avoid
@@ -490,9 +463,6 @@ build_vtbl_ref (tree instance, tree idx)
 {
   tree aref = build_vtbl_ref_1 (instance, idx);
 
-  if (flag_vtable_gc)
-    aref = build_vtable_entry_ref (aref, instance, idx);
-
   return aref;
 }
 
@@ -510,9 +480,6 @@ build_vfn_ref (tree instance, tree idx)
     aref = build1 (NOP_EXPR, TREE_TYPE (aref),
                   build_unary_op (ADDR_EXPR, aref, /*noconvert=*/1));
 
-  if (flag_vtable_gc)
-    aref = build_vtable_entry_ref (aref, instance, idx);
-
   return aref;
 }
 
index adf670596d4510c26e5ac5ff6bc957f26b59eb55..6de92102a9db754268b66478c534990d1ac70453 100644 (file)
@@ -153,9 +153,6 @@ static bool cp_var_mod_type_p (tree);
 #undef LANG_HOOKS_EXPR_SIZE
 #define LANG_HOOKS_EXPR_SIZE cp_expr_size
 
-#undef LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE 
-#define LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE prepare_assemble_variable
-
 #undef LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION
 #define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION expand_body
 #undef LANG_HOOKS_CALLGRAPH_LOWER_FUNCTION
index 0ee47d9b9d93d7e1915ad288ec149e1d2d1e48e1..a7bdc578e7dace6accc3a34cf786e480420c8001 100644 (file)
@@ -3826,7 +3826,6 @@ extern tree build_artificial_parm (tree, tree);
 extern tree get_guard (tree);
 extern tree get_guard_cond (tree);
 extern tree set_guard (tree);
-extern void prepare_assemble_variable (tree);
 extern void lower_function (tree);
 
 /* XXX Not i18n clean.  */
index 896282c770d2bbb92bb58514abebe33245b77123..f89258c867d82317a2c163518f8e9f4b350736b0 100644 (file)
@@ -1626,36 +1626,6 @@ import_export_class (tree ctype)
       CLASSTYPE_INTERFACE_ONLY (ctype) = (import_export < 0);
     }
 }
-    
-/* We need to describe to the assembler the relationship between
-   a vtable and the vtable of the parent class.  */
-
-void
-prepare_assemble_variable (tree vars)
-{
-  tree parent;
-  rtx child_rtx, parent_rtx;
-
-  if (!flag_vtable_gc || TREE_CODE (vars) != VAR_DECL
-      || !DECL_VTABLE_OR_VTT_P (vars))
-    return;
-
-  child_rtx = XEXP (DECL_RTL (vars), 0);         /* strip the mem ref  */
-
-  parent = binfo_for_vtable (vars);
-
-  if (parent == TYPE_BINFO (DECL_CONTEXT (vars)))
-    parent_rtx = const0_rtx;
-  else if (parent)
-    {
-      parent = get_vtbl_decl_for_binfo (TYPE_BINFO (BINFO_TYPE (parent)));
-      parent_rtx = XEXP (DECL_RTL (parent), 0);  /* strip the mem ref  */
-    }
-  else
-    abort ();
-
-  assemble_vtable_inherit (child_rtx, parent_rtx);
-}
 
 /* If necessary, write out the vtables for the dynamic class CTYPE.
    Returns true if any vtables were emitted.  */
index edd657d759913b204be3ff0505ecf16f2b3dd340..f1cd6f0e7b353169f0313b23f5f008c23da6af87 100644 (file)
@@ -183,7 +183,7 @@ in the following sections.
 -fno-nonansi-builtins  -fno-operator-names @gol
 -fno-optional-diags  -fpermissive @gol
 -frepo  -fno-rtti  -fstats  -ftemplate-depth-@var{n} @gol
--fuse-cxa-atexit  -fvtable-gc  -fno-weak  -nostdinc++ @gol
+-fuse-cxa-atexit  -fno-weak  -nostdinc++ @gol
 -fno-default-inline  -Wabi  -Wctor-dtor-privacy @gol
 -Wnon-virtual-dtor  -Wreorder @gol
 -Weffc++  -Wno-deprecated @gol
@@ -1456,17 +1456,6 @@ This option is required for fully standards-compliant handling of static
 destructors, but will only work if your C library supports
 @code{__cxa_atexit}.
 
-@item -fvtable-gc
-@opindex fvtable-gc
-Emit special relocations for vtables and virtual function references
-so that the linker can identify unused virtual functions and zero out
-vtable slots that refer to them.  This is most useful with
-@option{-ffunction-sections} and @option{-Wl,--gc-sections}, in order to
-also discard the functions themselves.
-
-This optimization requires GNU as and GNU ld.  Not all systems support
-this option.  @option{-Wl,--gc-sections} is ignored without @option{-static}.
-
 @item -fno-weak
 @opindex fno-weak
 Do not use weak symbol support, even if it is provided by the linker.
index a89520ba14140709cef0d3283308ff81250074db..f43f9d92b6e186c6ec57f8773fd33c09f518bd71 100644 (file)
@@ -2486,9 +2486,6 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED,
 
        /* Emit information for vtable gc.  */
        note = find_reg_note (insn, REG_VTABLE_REF, NULL_RTX);
-       if (note)
-         assemble_vtable_entry (XEXP (XEXP (note, 0), 0),
-                                INTVAL (XEXP (XEXP (note, 0), 1)));
 
        current_output_insn = debug_insn = 0;
       }
index 9d15405b4666a3abd64b28338484dd1981f7550d..a8bb4533b8d5c1d079dab3c7224eb26e36b80c32 100644 (file)
@@ -7495,6 +7495,9 @@ insert_store (struct ls_expr * expr, edge e)
   if (expr->reaching_reg == NULL_RTX)
     return 0;
 
+  if (e->flags & EDGE_FAKE)
+    return 0;
+
   reg = expr->reaching_reg;
   insn = gen_move_insn (copy_rtx (expr->pattern), reg);
 
@@ -7503,13 +7506,14 @@ insert_store (struct ls_expr * expr, edge e)
      edges so we don't try to insert it on the other edges.  */
   bb = e->dest;
   for (tmp = e->dest->pred; tmp ; tmp = tmp->pred_next)
-    {
-      int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
-      if (index == EDGE_INDEX_NO_EDGE)
-       abort ();
-      if (! TEST_BIT (pre_insert_map[index], expr->index))
-       break;
-    }
+    if (!tmp->flags & EDGE_FAKE)
+      {
+       int index = EDGE_INDEX (edge_list, tmp->src, tmp->dest);
+       if (index == EDGE_INDEX_NO_EDGE)
+         abort ();
+       if (! TEST_BIT (pre_insert_map[index], expr->index))
+         break;
+      }
 
   /* If tmp is NULL, we found an insertion on every edge, blank the
      insertion vector for these edges, and insert at the start of the BB.  */
index fc674502765c3d3735c1e382dced6890076f1a91..a2b48e79dd0b8604dec454815ea6840cfb86d1a5 100644 (file)
@@ -508,10 +508,6 @@ extern void default_file_start (void);
 extern void file_end_indicate_exec_stack (void);
 extern bool default_valid_pointer_mode (enum machine_mode);
 
-/* Emit data for vtable gc for GNU binutils.  */
-extern void assemble_vtable_entry (rtx, HOST_WIDE_INT);
-extern void assemble_vtable_inherit (rtx, rtx);
-
 extern int default_address_cost (rtx);
 
 #endif /* ! GCC_OUTPUT_H */
index ce13803348cecaf7f4e2bfc6d168389e76e8c079..d20cc6e4b2b478f906ff071f91b16209f8ab5f7e 100644 (file)
@@ -1,3 +1,7 @@
+Wed Jul 30 19:13:34 CEST 2003  Jan Hubicka  <jh@suse.cz>
+
+       * vtgc1.c: Kill.
+
 2003-07-29  Zack Weinberg  <zack@codesourcery.com>
 
        * gcc.dg/struct-in-proto-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/opt/vtgc1.C b/gcc/testsuite/g++.dg/opt/vtgc1.C
deleted file mode 100644 (file)
index 511d45b..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-// { dg-do compile }
-// { dg-options "-fvtable-gc" }
-// Origin: Hans-Peter Nilsson <hp@bitrange.com>
-
-class Base0
-{
-public:
-  Base0(); virtual ~Base0();
-  virtual void f1();
-  virtual void f2();
-private:
-  int a_value;
-};
-
-class Base1 : public Base0
-{
-public:
-  Base1(); virtual ~Base1();
-  virtual void f1(), f2();
-  virtual void f3();
-};
-
-class Base2 : public Base1
-{
-public:
-  Base2(); virtual ~Base2();
-  virtual void f1(), f2();
-  virtual void f4();
-};
-
-class VbasedA : virtual public Base2
-{
-public:
-  VbasedA(); virtual ~VbasedA();
-  virtual void f1(), f2(), f3();
-  virtual void f6();
-};
-
-class Side0
-{
-public:
-  Side0(); virtual ~Side0();
-  virtual void x1();
-  virtual void xx();
-private:
-  int ryan;
-};
-
-class Multisv0 : public Side0, virtual public Base2
-{
-public:
-  Multisv0(); virtual ~Multisv0();
-  virtual void f1(), f2();
-  virtual void f3();
-  virtual void f6();
-  virtual void xx();
-};
-
-class Multivs1 : public Base2, virtual public Side0
-{
-public:
-  Multivs1(); virtual ~Multivs1(); virtual void f1(); virtual void fx2();
-  virtual void fx4(), fx5();
-  virtual void f6();
-  virtual void xx();
-};
-
-class Multiss2 : public Base2, public Side0
-{
-public:
-  Multiss2(); virtual ~Multiss2(); virtual void f1(); virtual void fx2();
-  virtual void fx4();
-  virtual void f6();
-  virtual void xx();
-};
-
-class Multivv3 : virtual public Base2, virtual public Side0
-{
-public:
-  Multivv3(); virtual ~Multivv3(); virtual void f1(); virtual void fx2();
-  virtual void fx4(), fx5();
-  virtual void f6();
-  virtual void xx();
-};
-
-Base0::Base0() {}
-Base0::~Base0() {}
-Base1::Base1() {}
-Base1::~Base1() {}
-Base2::Base2() {}
-Base2::~Base2() {}
-VbasedA::VbasedA() {}
-VbasedA::~VbasedA() {}
-Multisv0::Multisv0() {}
-Multisv0::~Multisv0() {}
-Multivs1::Multivs1() {}
-Multivs1::~Multivs1() {}
-Multiss2::Multiss2() {}
-Multiss2::~Multiss2() {}
-Multivv3::Multivv3() {}
-Multivv3::~Multivv3() {}
-Side0::Side0() {}
-Side0::~Side0() {}
-
-extern void x (VbasedA *);
-extern void x2 (Multisv0 *);
-extern void x3 (Multivs1 *);
-extern void x4 (Multiss2 *);
-extern void x5 (Multivv3 *);
-void y () { VbasedA ii; x(&ii);}
-void y2 () { Multisv0 ii; x2(&ii);}
-void y3 () { Multivs1 ii; x3(&ii);}
-void y4 () { Multiss2 ii; x4(&ii);}
-void y5 () { Multivv3 ii; x5(&ii);}
-void x (VbasedA *ii) { ii->f2();}
-void x2 (Multisv0 *ii) { ii->f2();}
-void x3 (Multivs1 *ii) { ii->f2();}
-void x4 (Multiss2 *ii) { ii->f2();}
-void x5 (Multivv3 *ii) { ii->f2();}
-
-// Use .* because of ia64's convention of marking symbols with "#", which
-// makes it through the c++filt.
-
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*vtable for Multivv3.*0" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*VTT for Multivv3.*0" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*vtable for Multiss2.*vtable for Base2" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*vtable for Multivs1.*vtable for Base2" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*VTT for Multivs1.*vtable for Base2" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*vtable for Multisv0.*vtable for Side0" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*VTT for Multisv0.*vtable for Side0" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*vtable for Side0.*0" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*vtable for VbasedA.*0" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*VTT for VbasedA.*0" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*vtable for Base2.*vtable for Base1" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*vtable for Base1.*vtable for Base0" } }
-// { dg-final { scan-assembler-dem "\.vtable_inherit\[ \t\]*vtable for Base0.*0" } }
index bd45b15fe2bcaf6952308ac9da9d4a88546d2f05..dbf2543b093ebabb9a10500d544cde1d19e0d74c 100644 (file)
@@ -948,6 +948,11 @@ inlinable_function_p (tree fn, inline_data *id, int nolimit)
      in C++ it may result in template instantiation.)  */
   inlinable = !(*lang_hooks.tree_inlining.cannot_inline_tree_fn) (&fn);
 
+  /* If we don't have the function body available, we can't inline
+     it.  */
+  if (! DECL_SAVED_TREE (fn))
+    return 0;
+
   /* We may be here either because fn is declared inline or because
      we use -finline-functions.  For the second case, we are more
      restrictive.  */
@@ -1027,11 +1032,6 @@ inlinable_function_p (tree fn, inline_data *id, int nolimit)
        }
     }
 
-  /* If we don't have the function body available, we can't inline
-     it.  */
-  if (! DECL_SAVED_TREE (fn))
-    inlinable = 0;
-
   /* Check again, language hooks may have modified it.  */
   if (! inlinable || DECL_UNINLINABLE (fn))
     return 0;
index c9dae8954b742f61821803a376445ec356fd6e37..63ba1bd800f7f187637384ea5359b6e26a0c99f2 100644 (file)
@@ -4657,30 +4657,6 @@ default_pe_asm_named_section (const char *name, unsigned int flags)
     }
 }
 \f
-/* Used for vtable gc in GNU binutils.  Record that the pointer at OFFSET
-   from SYMBOL is used in all classes derived from SYMBOL.  */
-
-void
-assemble_vtable_entry (rtx symbol, HOST_WIDE_INT offset)
-{
-  fputs ("\t.vtable_entry ", asm_out_file);
-  output_addr_const (asm_out_file, symbol);
-  fprintf (asm_out_file, ", " HOST_WIDE_INT_PRINT_DEC "\n", offset);
-}
-
-/* Used for vtable gc in GNU binutils.  Record the class hierarchy by noting
-   that the vtable symbol CHILD is derived from the vtable symbol PARENT.  */
-
-void
-assemble_vtable_inherit (rtx child, rtx parent)
-{
-  fputs ("\t.vtable_inherit ", asm_out_file);
-  output_addr_const (asm_out_file, child);
-  fputs (", ", asm_out_file);
-  output_addr_const (asm_out_file, parent);
-  fputc ('\n', asm_out_file);
-}
-\f
 /* The lame default section selector.  */
 
 void