OSDN Git Service

Back-merged from trunk
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 10 Nov 2013 11:52:54 +0000 (11:52 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 10 Nov 2013 11:52:54 +0000 (11:52 +0000)
* config/i386/cygming-crtbegin.c (__gcc_register_frame):
Increment load-count on use of LIBGCC_SONAME DLL.
(hmod_libgcc): New static variable to hold handle of
LIBGCC_SONAME DLL.
(__gcc_deregister_frame): Decrement load-count of
LIBGCC_SONAME DLL.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@204637 138bc75d-0d04-0410-961f-82ee72b054a4

libgcc/ChangeLog
libgcc/config/i386/cygming-crtbegin.c

index dc4fa73..53f3238 100644 (file)
@@ -1,3 +1,13 @@
+2013-11-10  Kai Tietz  <ktietz@redhat.com>
+
+       Back-merged from trunk
+       * config/i386/cygming-crtbegin.c (__gcc_register_frame):
+       Increment load-count on use of LIBGCC_SONAME DLL.
+       (hmod_libgcc): New static variable to hold handle of
+       LIBGCC_SONAME DLL.
+       (__gcc_deregister_frame): Decrement load-count of
+       LIBGCC_SONAME DLL.
+
 2013-11-07  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/32/sfp-machine.c (FP_HANDLE_EXCEPTIONS): Handle
index b589841..322b617 100644 (file)
@@ -1,5 +1,5 @@
 /* crtbegin object for windows32 targets.
-   Copyright (C) 2007, 2009, 2010, 2011  Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009-2011, 2013  Free Software Foundation, Inc.
 
    Contributed by Danny Smith <dannysmith@users.sourceforge.net>
 
@@ -69,6 +69,9 @@ static EH_FRAME_SECTION_CONST char __EH_FRAME_BEGIN__[]
   = { };
 
 static struct object obj;
+
+/* Handle of libgcc's DLL reference.  */
+HANDLE hmod_libgcc;
 #endif
 
 #if TARGET_USE_JCR_SECTION
@@ -93,9 +96,14 @@ __gcc_register_frame (void)
 
   void (*register_frame_fn) (const void *, struct object *);
   HANDLE h = GetModuleHandle (LIBGCC_SONAME);
+
   if (h)
-    register_frame_fn = (void (*) (const void *, struct object *))
-                       GetProcAddress (h, "__register_frame_info");
+    {
+      /* Increasing the load-count of LIBGCC_SONAME DLL.  */
+      hmod_libgcc = LoadLibrary (LIBGCC_SONAME);
+      register_frame_fn = (void (*) (const void *, struct object *))
+                         GetProcAddress (h, "__register_frame_info");
+    }
   else 
     register_frame_fn = __register_frame_info;
   if (register_frame_fn)
@@ -132,5 +140,7 @@ __gcc_deregister_frame (void)
     deregister_frame_fn = __deregister_frame_info;
   if (deregister_frame_fn)
      deregister_frame_fn (__EH_FRAME_BEGIN__);
+  if (hmod_libgcc)
+    FreeLibrary (hmod_libgcc);
 #endif
 }