diff -rc2 2.95.2/gcc/cp/decl.c 2.95.2-netscape/gcc/cp/decl.c
*** 2.95.2/gcc/cp/decl.c        Sun Aug  8 17:28:33 1999
--- 2.95.2-netscape/gcc/cp/decl.c       Tue Feb  6 11:16:55 2001
***************
*** 8104,8107 ****
--- 8104,8108 ----
          && TREE_PUBLIC (current_function_decl))
        {
+ #if 0
          /* Rather than try to get this right with inlining, we suppress
             inlining of such functions.  */
***************
*** 8138,8141 ****
--- 8139,8145 ----
                }
            }
+ #else
+         comdat_linkage (decl);
+ #endif
        }
  
***************
*** 9069,9072 ****
--- 9073,9082 ----
        if (declarator && context && current_lang_name != lang_name_c)
        DECL_ASSEMBLER_NAME (decl) = build_static_name (context, declarator);
+       else if (declarator
+              && current_function_decl
+              && ! RIDBIT_SETP (RID_EXTERN, specbits)
+              && current_lang_name != lang_name_c)
+       DECL_ASSEMBLER_NAME (decl) =
+         build_static_name (current_function_decl, declarator);
      }
  
diff -rc2 2.95.2/gcc/cp/decl2.c 2.95.2-netscape/gcc/cp/decl2.c
*** 2.95.2/gcc/cp/decl2.c       Thu Aug 19 16:29:45 1999
--- 2.95.2-netscape/gcc/cp/decl2.c      Tue Feb 13 23:08:34 2001
***************
*** 2658,2661 ****
--- 2658,2702 ----
  }
  
+ static void
+ maybe_chop_pure_virtuals (vtbl_object)
+     tree vtbl_object;
+ {
+   tree vtbl_object_size = DECL_SIZE (vtbl_object);
+   tree vtbl_type = TREE_TYPE (vtbl_object);
+   tree vtbl_type_size = TYPE_SIZE (vtbl_type);
+   tree vtbl_initial = DECL_INITIAL (vtbl_object);
+   tree vtbl_constructor_elts = CONSTRUCTOR_ELTS (vtbl_initial);
+   /* vtbl_constructor_elts now points to a tree_list node.  The first
+      element of that list is a nop_expr whose value is zero.  The next
+      element is an addr_expr whose first operand is the function_decl
+      node of the constructor for the class.  After than, we have more
+      addr_expr nodes whose first operands are the function_decl nodes
+      for the various function members of the class.  */
+   tree class_constructor_func_elt = TREE_CHAIN (vtbl_constructor_elts);
+   tree behind;
+   tree ahead;
+ 
+   for (behind = class_constructor_func_elt; behind; behind = ahead)
+     {
+       tree addr_expr;
+       tree addr_expr_operand;
+ 
+       ahead = TREE_CHAIN (behind);
+       if (ahead == NULL)
+       break;
+       addr_expr = TREE_VALUE (ahead);
+       addr_expr_operand = TREE_OPERAND (addr_expr, 0);
+ 
+       if (!DECL_LANG_SPECIFIC (addr_expr_operand))
+       return;
+       if (!DECL_ABSTRACT_VIRTUAL_P (addr_expr_operand))
+       return;
+     }
+   /* Congrats!  All non-constructor functions are pure virtual.  */
+   TREE_CHAIN (class_constructor_func_elt) = NULL;
+   TREE_INT_CST_LOW (vtbl_object_size) =
+     TREE_INT_CST_LOW (vtbl_type_size) = POINTER_SIZE * 2;
+ }
+ 
  static int
  finish_vtable_vardecl (t, data)
***************
*** 2708,2711 ****
--- 2749,2754 ----
        if (flag_weak)
        comdat_linkage (vars);
+ 
+       maybe_chop_pure_virtuals (vars);
  
        rest_of_decl_compilation (vars, NULL_PTR, 1, 1);