]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2013-09-13 Jacek Caban <jacek@codeweavers.com>
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 13 Sep 2013 18:06:41 +0000 (18:06 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 13 Sep 2013 18:06:41 +0000 (18:06 +0000)
* 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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202573 138bc75d-0d04-0410-961f-82ee72b054a4

12 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-target.def
gcc/config.gcc
gcc/config/t-winnt [new file with mode: 0644]
gcc/config/winnt-c.c [new file with mode: 0644]
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/abi/main.C [new file with mode: 0644]

index add64c0853574c1eaf8056bd71659d03d420650d..6413fe37299f1017b00bf804118560d6d5983b85 100644 (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
index 4a93498299aa31723dc8b52d87ccd3138f4c1b3b..1fbfbf8da94b7edfdba7f06590030f35ddc84b27 100644 (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
index 80042df40e7700c1ca1982a29a44a8c703d3933f..925dbd14cc4a4a226c1833d80bfb7896d0fdeefc 100644 (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)
index c8a3a4e19d0b4f3fb0f989c0b1437bfaa1903247..605efc0e090eaf31fb7d8992f1cf452ed5132c9a 100644 (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"
diff --git a/gcc/config/t-winnt b/gcc/config/t-winnt
new file mode 100644 (file)
index 0000000..1751622
--- /dev/null
@@ -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)
diff --git a/gcc/config/winnt-c.c b/gcc/config/winnt-c.c
new file mode 100644 (file)
index 0000000..d52db62
--- /dev/null
@@ -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;
index ad47fef03140ae13721b4d32f33e13a9568fc3f2..a574f2a23ede9e946f25e7d2cd7cb30ee3eed502 100644 (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
index b4223aa5706358db5f57f8403e6d0dd1fa40fe92..f193676c382e32ba09eb5b63f84c5f0f6181a419 100644 (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))
index d15f53ce5ae000fffb2ea3d98f55c4bf531dbde7..a7ab95ad9e2e149b7e1dbb8a16f4632910b8c4f3 100644 (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
index b51d7b38800aa0de476970c53a0f3e29388730c2..fdc392556f36f1c7263529dc0eb600967dfb5693 100644 (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
index 797c3169a66b1993a889ec955174ff365c5d4558..179dfe279d355147334e95e279d4bd20afa2ddc4 100644 (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.
diff --git a/gcc/testsuite/g++.dg/abi/main.C b/gcc/testsuite/g++.dg/abi/main.C
new file mode 100644 (file)
index 0000000..4c5f1ea
--- /dev/null
@@ -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
+