This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Hello,
PR c++/14808 is specific to PE-COFF targets and is due to the way
linkonce sections are handled by the BFD backend (in bfd/coffcode.h) for
as and ld.
Fo PE-COFF targets, only one symbol in a linkonce section has comdat
status. That symbol has the same name as the "section symbol" (eg, as
implemented by GNU binutils, a linkonce section named .text$_Z3foo is
expected to contain the symbol _Z3foo which is treated as comdat). This
causes problems in cp/method.c(use_thunk) when we put both an inline
virtual symbol and the thunk to it in the same linkonce section.
The following patch fixes by introducing a new macro that decides if it
is safe to use a local alias for a virtual thunk. By default, this macro
is true iff the target supports aliases. Cygwin and mingw32 override
this so that one_only symbols do not use local aliases.
In addition to fixing this PR, the patch also fixes 54 g++ testsuite
failures (all execution tests for code involving either MI or covariant
thunks). So a new testcase is probably not necessary. A diff of g++ sum
logs is attached.
A simpler patch would just avoid local aliases for _all_ virtual
functions, dependent on a target macro. In the absence of any
performance data, I would be happy with that too.
Danny
ChangeLog
* defaults.h (TARGET_USE_LOCAL_THUNK_ALIAS_P): New macro. Default
to 1 if ASM_OUTPUT_DEF is defined.
* doc/tm.texi (TARGET_USE_LOCAL_THUNK_ALIAS_P): Document.
* config/i386/cygming.h (TARGET_USE_LOCAL_THUNK_ALIAS_P): Define.
Set to non-zero iff not a one_only decl.
cp/ChangeLog
* method.c (use_thunk): Test TARGET_USE_LOCAL_THUNK_ALIAS_P rather than
ASM_OUTPUT_DEF.
Index: defaults.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/defaults.h,v
retrieving revision 1.132
diff -c -3 -p -r1.132 defaults.h
*** defaults.h 15 Mar 2004 18:51:53 -0000 1.132
--- defaults.h 7 Apr 2004 19:50:31 -0000
*************** do { fputs (integer_asm_op (POINTER_SIZE
*** 484,489 ****
--- 484,499 ----
#define TARGET_VTABLE_DATA_ENTRY_DISTANCE 1
#endif
+ /* Decide whether it is safe to use a local alias for a virtual function
+ when constructing thunks. */
+ #ifndef TARGET_USE_LOCAL_THUNK_ALIAS_P
+ #ifdef ASM_OUTPUT_DEF
+ #define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) 1
+ #else
+ #define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) 0
+ #endif
+ #endif
+
/* Select a format to encode pointers in exception handling data. We
prefer those that result in fewer dynamic relocations. Assume no
special support here and encode direct references. */
Index: doc/tm.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/tm.texi,v
retrieving revision 1.316
diff -c -3 -p -r1.316 tm.texi
*** doc/tm.texi 24 Mar 2004 00:13:30 -0000 1.316
--- doc/tm.texi 7 Apr 2004 19:51:00 -0000
*************** The parameter @var{path} is the include
*** 9207,9209 ****
--- 9207,9217 ----
systems, this is used for Framework includes, which have semantics
that are different from @option{-I}.
@end deftypefn
+
+ @deftypefn {Target Hook} bool TARGET_USE_LOCAL_THUNK_ALIAS_P (tree @var{fndecl})
+ This target hook returns @code{true} if it is safe to use a local alias
+ for a virtual function @var{fndecl} when constructing thunks,
+ @code{false} otherwise. By default, the hook returns @code{true} for all
+ functions, if a target supports aliases (ie. defines
+ @code{ASM_OUTPUT_DEF}), @code{false} otherwise,
+ @end deftypefn
Index: config/i386/cygming.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/i386/cygming.h,v
retrieving revision 1.13
diff -c -3 -p -r1.13 cygming.h
*** config/i386/cygming.h 31 Jan 2004 08:02:54 -0000 1.13
--- config/i386/cygming.h 7 Apr 2004 19:51:02 -0000
*************** extern int i386_pe_dllimport_name_p (con
*** 382,387 ****
--- 382,392 ----
ASM_OUTPUT_DEF (STREAM, alias, IDENTIFIER_POINTER (TARGET)); \
} while (0)
+ /* Decide whether it is safe to use a local alias for a virtual function
+ when constructing thunks. */
+ #undef TARGET_USE_LOCAL_THUNK_ALIAS_P
+ #define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) (!DECL_ONE_ONLY (DECL))
+
#undef TREE
#ifndef BUFSIZ
Index: cp/method.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/method.c,v
retrieving revision 1.279
diff -c -3 -p -r1.279 method.c
*** cp/method.c 12 Mar 2004 17:09:01 -0000 1.279
--- cp/method.c 7 Apr 2004 19:51:03 -0000
*************** use_thunk (tree thunk_fndecl, bool emit_
*** 363,373 ****
if (!emit_p)
return;
! #ifdef ASM_OUTPUT_DEF
! alias = make_alias_for_thunk (function);
! #else
! alias = function;
! #endif
fixed_offset = THUNK_FIXED_OFFSET (thunk_fndecl);
virtual_offset = THUNK_VIRTUAL_OFFSET (thunk_fndecl);
--- 363,372 ----
if (!emit_p)
return;
! if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function))
! alias = make_alias_for_thunk (function);
! else
! alias = function;
fixed_offset = THUNK_FIXED_OFFSET (thunk_fndecl);
virtual_offset = THUNK_VIRTUAL_OFFSET (thunk_fndecl);
*************** use_thunk (tree thunk_fndecl, bool emit_
*** 401,408 ****
push_to_top_level ();
! #ifdef ASM_OUTPUT_DEF
! if (targetm.have_named_sections)
{
resolve_unique_section (function, 0, flag_function_sections);
--- 400,407 ----
push_to_top_level ();
! if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function)
! && targetm.have_named_sections)
{
resolve_unique_section (function, 0, flag_function_sections);
*************** use_thunk (tree thunk_fndecl, bool emit_
*** 414,420 ****
DECL_SECTION_NAME (thunk_fndecl) = DECL_SECTION_NAME (function);
}
}
- #endif
/* The back-end expects DECL_INITIAL to contain a BLOCK, so we
create one. */
--- 413,418 ----
Attachment:
g++.sum.diff
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |