c-target.def: New hook

2013-09-13  Jacek Caban  <jacek@codeweavers.com>

	* c-target.def: New hook
    
    gcc/ChangeLog:

2013-09-13  Jacek Caban  <jacek@codeweavers.com>

	* config.gcc: Use new winnt-c.c target hooks
	* config/t-winnt: New file
	* config/winnt-c.c: New file
	* doc/tm.texi.in: Document new hook
	* doc/tm.texi: Regenerated
    
    gcc/cp/Changelog:

2013-09-13  Jacek Caban  <jacek@codeweavers.com>

	* decl.c: Use new cxx_implicit_extern_c hook
    
    gcc/testsuite/ChangeLog:

2013-09-13  Jacek Caban  <jacek@codeweavers.com>

	* g++.dg/abi/main.C: Added implicit C linkage tests

From-SVN: r202573
This commit is contained in:
Jacek Caban 2013-09-13 18:06:41 +00:00 committed by Kai Tietz
parent a1e51df97b
commit 88b0e79e45
12 changed files with 129 additions and 2 deletions

View file

@ -1,3 +1,11 @@
2013-09-13 Jacek Caban <jacek@codeweavers.com>
* config.gcc: Use new winnt-c.c target hooks
* config/t-winnt: New file
* config/winnt-c.c: New file
* doc/tm.texi.in: Document new hook
* doc/tm.texi: Regenerated
2013-09-13 Jan Hubicka <jh@suse.cz>
PR middle-end/58094

View file

@ -1,3 +1,7 @@
2013-09-13 Jacek Caban <jacek@codeweavers.com>
* c-target.def: New hook
2013-09-09 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/43452

View file

@ -102,5 +102,15 @@ DEFHOOK
than just the compiler.",
const char *, (void),
hook_constcharptr_void_null)
DEFHOOK
(cxx_implicit_extern_c,
"Define this hook to add target-specific C++ implicit extern C functions.\
If this function returns true for the name of a file-scope function, that\
function implicitly gets extern \"C\" linkage rather than whatever language\
linkage the declaration would normally have. An example of such function\
is WinMain on Win32 targets.",
bool, (const char*),
NULL)
HOOK_VECTOR_END (C90_EMPTY_HACK)

View file

@ -1526,6 +1526,9 @@ x86_64-*-cygwin*)
i[34567]86-*-mingw* | x86_64-*-mingw*)
tm_file="${tm_file} i386/unix.h i386/bsd.h i386/gas.h dbxcoff.h i386/cygming.h"
xm_file=i386/xm-mingw32.h
c_target_objs="${c_target_objs} winnt-c.o"
cxx_target_objs="${cxx_target_objs} winnt-c.o"
target_has_targetcm="yes"
case ${target} in
x86_64-*-* | *-w64-*)
need_64bit_isa=yes
@ -1565,7 +1568,7 @@ i[34567]86-*-mingw* | x86_64-*-mingw*)
;;
esac
tm_file="${tm_file} i386/mingw-stdint.h"
tmake_file="${tmake_file} i386/t-cygming t-slibgcc"
tmake_file="${tmake_file} t-winnt i386/t-cygming t-slibgcc"
case ${target} in
x86_64-w64-*)
tmake_file="${tmake_file} i386/t-mingw-w64"

22
gcc/config/t-winnt Normal file
View file

@ -0,0 +1,22 @@
# Copyright (C) 2013 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GCC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
winnt-c.o: config/winnt-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(C_TARGET_H) $(C_TARGET_DEF_H)
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \
$< $(OUTPUT_OPTION)

39
gcc/config/winnt-c.c Normal file
View file

@ -0,0 +1,39 @@
/* Default C-family target hooks initializer.
Copyright (C) 2013
Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "c-family/c-target.h"
#include "c-family/c-target-def.h"
static bool
winnt_implicit_extern_c (const char *ident)
{
return !strcmp(ident, "wmain")
|| !strcmp(ident, "DllMain")
|| !strcmp(ident, "WinMain")
|| !strcmp(ident, "wWinMain");
}
#undef TARGET_CXX_IMPLICIT_EXTERN_C
#define TARGET_CXX_IMPLICIT_EXTERN_C winnt_implicit_extern_c
struct gcc_targetcm targetcm = TARGETCM_INITIALIZER;

View file

@ -1,3 +1,7 @@
2013-09-13 Jacek Caban <jacek@codeweavers.com>
* decl.c: Use new cxx_implicit_extern_c hook
2013-09-12 Brooks Moses <bmoses@google.com>
PR driver/42955

View file

@ -44,6 +44,7 @@ along with GCC; see the file COPYING3. If not see
#include "c-family/c-common.h"
#include "c-family/c-objc.h"
#include "c-family/c-pragma.h"
#include "c-family/c-target.h"
#include "diagnostic.h"
#include "intl.h"
#include "debug.h"
@ -7457,7 +7458,9 @@ grokfndecl (tree ctype,
|| (IDENTIFIER_LENGTH (declarator) > 10
&& IDENTIFIER_POINTER (declarator)[0] == '_'
&& IDENTIFIER_POINTER (declarator)[1] == '_'
&& strncmp (IDENTIFIER_POINTER (declarator)+2, "builtin_", 8) == 0))
&& strncmp (IDENTIFIER_POINTER (declarator)+2, "builtin_", 8) == 0)
|| (targetcm.cxx_implicit_extern_c
&& targetcm.cxx_implicit_extern_c(IDENTIFIER_POINTER (declarator))))
&& current_lang_name == lang_name_cplusplus
&& ctype == NULL_TREE
&& DECL_FILE_SCOPE_P (decl))

View file

@ -10651,6 +10651,10 @@ Define this hook to return the name of a header file to be included at the start
This hook can be used together with a header provided by the system C library to implement ISO C requirements for certain macros to be predefined that describe properties of the whole implementation rather than just the compiler.
@end deftypefn
@deftypefn {C Target Hook} bool TARGET_CXX_IMPLICIT_EXTERN_C (const char*@var{})
Define this hook to add target-specific C++ implicit extern C functions. If this function returns true for the name of a file-scope function, that function implicitly gets extern "C" linkage rather than whatever language linkage the declaration would normally have. An example of such function is WinMain on Win32 targets.
@end deftypefn
@defmac NO_IMPLICIT_EXTERN_C
Define this macro if the system header files support C++ as well as C@.
This macro inhibits the usual method of using system header files in

View file

@ -7985,6 +7985,8 @@ files @code{__STDC__} will always expand to 1.
@hook TARGET_C_PREINCLUDE
@hook TARGET_CXX_IMPLICIT_EXTERN_C
@defmac NO_IMPLICIT_EXTERN_C
Define this macro if the system header files support C++ as well as C@.
This macro inhibits the usual method of using system header files in

View file

@ -1,3 +1,7 @@
2013-09-13 Jacek Caban <jacek@codeweavers.com>
* g++.dg/abi/main.C: Added implicit C linkage tests
2013-09-13 Kai Tietz <ktietz@redhat.com>
gcc.target/i386/pr57848.c: New file.

View file

@ -0,0 +1,24 @@
/* { dg-do compile } */
/* Check if entry points get implicit C linkage. If they don't, compiler will
* error on incompatible declarations */
int main();
extern "C" int main();
#ifdef __MINGW32__
int wmain();
extern "C" int wmain();
int DllMain();
extern "C" int DllMain();
int WinMain();
extern "C" int WinMain();
int wWinMain();
extern "C" int wWinMain();
#endif