From a0c8285b03a452fcdf39e4d3db8d7710123584b0 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Wed, 30 Jul 2003 19:27:17 +0200 Subject: [PATCH] re PR c/10320 (gcc 3.4 gets rid of static inline function that does not get inlined) * 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 --- gcc/ChangeLog | 19 +++++ gcc/c-common.c | 4 - gcc/c-common.h | 4 - gcc/c-opts.c | 5 +- gcc/config/i386/i386.c | 7 +- gcc/cp/ChangeLog | 9 ++ gcc/cp/class.c | 33 -------- gcc/cp/cp-lang.c | 3 - gcc/cp/cp-tree.h | 1 - gcc/cp/decl2.c | 30 ------- gcc/doc/invoke.texi | 13 +-- gcc/final.c | 3 - gcc/gcse.c | 18 ++-- gcc/output.h | 4 - gcc/testsuite/ChangeLog | 4 + gcc/testsuite/g++.dg/opt/vtgc1.C | 136 ------------------------------- gcc/tree-inline.c | 10 +-- gcc/varasm.c | 24 ------ 18 files changed, 56 insertions(+), 271 deletions(-) delete mode 100644 gcc/testsuite/g++.dg/opt/vtgc1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95babcd2dca..3f64081c405 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,22 @@ +Wed Jul 30 19:12:10 CEST 2003 Jan Hubicka + + * 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 * unwind-sjlj.c: Fix typo in file description. diff --git a/gcc/c-common.c b/gcc/c-common.c index 95494a966c9..8ee29b7a4ea 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -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. */ diff --git a/gcc/c-common.h b/gcc/c-common.h index 8e54b49e300..6590453f867 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -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. */ diff --git a/gcc/c-opts.c b/gcc/c-opts.c index 44ac8dc8eaa..85f9a0bf2e0 100644 --- a/gcc/c-opts.c +++ b/gcc/c-opts.c @@ -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; diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index e314ba53c2f..706ecc4ff59 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 309c3f4f6cf..8d22b749794 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +Wed Jul 30 19:12:48 CEST 2003 Jan Hubicka + + * 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 * parser.c (cp_lexer_new_main): Use c_common_no_more_pch instead diff --git a/gcc/cp/class.c b/gcc/cp/class.c index b447f7013ee..527eae4611c 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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) } -/* 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; } diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index adf670596d4..6de92102a9d 100644 --- a/gcc/cp/cp-lang.c +++ b/gcc/cp/cp-lang.c @@ -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 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 0ee47d9b9d9..a7bdc578e7d 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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. */ diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 896282c770d..f89258c867d 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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. */ diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index edd657d7599..f1cd6f0e7b3 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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. diff --git a/gcc/final.c b/gcc/final.c index a89520ba141..f43f9d92b6e 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -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; } diff --git a/gcc/gcse.c b/gcc/gcse.c index 9d15405b466..a8bb4533b8d 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -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. */ diff --git a/gcc/output.h b/gcc/output.h index fc674502765..a2b48e79dd0 100644 --- a/gcc/output.h +++ b/gcc/output.h @@ -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 */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ce13803348c..d20cc6e4b2b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +Wed Jul 30 19:13:34 CEST 2003 Jan Hubicka + + * vtgc1.c: Kill. + 2003-07-29 Zack Weinberg * 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 index 511d45b36e7..00000000000 --- a/gcc/testsuite/g++.dg/opt/vtgc1.C +++ /dev/null @@ -1,136 +0,0 @@ -// { dg-do compile } -// { dg-options "-fvtable-gc" } -// Origin: Hans-Peter Nilsson - -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" } } diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index bd45b15fe2b..dbf2543b093 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -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; diff --git a/gcc/varasm.c b/gcc/varasm.c index c9dae8954b7..63ba1bd800f 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -4657,30 +4657,6 @@ default_pe_asm_named_section (const char *name, unsigned int flags) } } -/* 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); -} - /* The lame default section selector. */ void -- 2.30.2