summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2015-01-16 16:19:37 +0000
committerCorinna Vinschen <corinna@vinschen.de>2015-01-16 16:19:37 +0000
commita62dbcd6e03ff182e7d36ea60d953f447db72d62 (patch)
tree1f400f2d1a8e0b1858a18dde247222c8c09fe827
parentad45d512debb05dd8a323c0024adc6222810964c (diff)
downloadcygnal-a62dbcd6e03ff182e7d36ea60d953f447db72d62.tar.gz
cygnal-a62dbcd6e03ff182e7d36ea60d953f447db72d62.tar.bz2
cygnal-a62dbcd6e03ff182e7d36ea60d953f447db72d62.zip
* gendef: Export _sigbe on 64 bit as well.
* malloc_wrapper.cc (free): In malloc_printf, call caller_return_address instead of __builtin_return_address. (malloc): Ditto. (realloc): Ditto. (calloc): Ditto. * miscfuncs.cc (__caller_return_address): New function. * miscfuncs.h (caller_return_address): New macro calling __caller_return_address. (__caller_return_address): Add prototype.
-rw-r--r--winsup/cygwin/ChangeLog14
-rwxr-xr-xwinsup/cygwin/gendef5
-rw-r--r--winsup/cygwin/malloc_wrapper.cc13
-rw-r--r--winsup/cygwin/miscfuncs.cc15
-rw-r--r--winsup/cygwin/miscfuncs.h6
5 files changed, 44 insertions, 9 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d1372ee45..a57dfba50 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,17 @@
+2015-01-16 Marco Atzeri <marco.atzeri@gmail.com>
+ Corinna Vinschen <corinna@vinschen.de>
+
+ * gendef: Export _sigbe on 64 bit as well.
+ * malloc_wrapper.cc (free): In malloc_printf, call caller_return_address
+ instead of __builtin_return_address.
+ (malloc): Ditto.
+ (realloc): Ditto.
+ (calloc): Ditto.
+ * miscfuncs.cc (__caller_return_address): New function.
+ * miscfuncs.h (caller_return_address): New macro calling
+ __caller_return_address.
+ (__caller_return_address): Add prototype.
+
2015-01-14 Corinna Vinschen <corinna@vinschen.de>
* uinfo.cc (fetch_windows_home): Disable fetching from homeDrive or
diff --git a/winsup/cygwin/gendef b/winsup/cygwin/gendef
index a1c549fc5..4ea7f544b 100755
--- a/winsup/cygwin/gendef
+++ b/winsup/cygwin/gendef
@@ -1,6 +1,6 @@
#!/usr/bin/perl
-# Copyright 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011, 2012, 2013, 2014
-# Red Hat, Inc.
+# Copyright 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011, 2012, 2013, 2014,
+# 2015 Red Hat, Inc.
#
# This file is part of Cygwin.
#
@@ -164,6 +164,7 @@ _sigfe: # stack is aligned on entry!
jmp *%rax # and jmp to it
.seh_endproc
+ .global _sigbe
.seh_proc _sigbe
_sigbe: # return here after cygwin syscall
# stack is aligned on entry!
diff --git a/winsup/cygwin/malloc_wrapper.cc b/winsup/cygwin/malloc_wrapper.cc
index 68c851440..43b8144b2 100644
--- a/winsup/cygwin/malloc_wrapper.cc
+++ b/winsup/cygwin/malloc_wrapper.cc
@@ -1,7 +1,7 @@
/* malloc_wrapper.cc
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
- 2007, 2008, 2009, 2013 Red Hat, Inc.
+ 2007, 2008, 2009, 2013, 2015 Red Hat, Inc.
This file is part of Cygwin.
@@ -38,7 +38,7 @@ static bool internal_malloc_determined;
extern "C" void
free (void *p)
{
- malloc_printf ("(%p), called by %p", p, __builtin_return_address (0));
+ malloc_printf ("(%p), called by %p", p, caller_return_address ());
if (!use_internal)
user_data->free (p);
else
@@ -61,7 +61,8 @@ malloc (size_t size)
res = dlmalloc (size);
__malloc_unlock ();
}
- malloc_printf ("(%ld) = %p, called by %p", size, res, __builtin_return_address (0));
+ malloc_printf ("(%ld) = %p, called by %p", size, res,
+ caller_return_address ());
return res;
}
@@ -77,7 +78,8 @@ realloc (void *p, size_t size)
res = dlrealloc (p, size);
__malloc_unlock ();
}
- malloc_printf ("(%p, %ld) = %p, called by %p", p, size, res, __builtin_return_address (0));
+ malloc_printf ("(%p, %ld) = %p, called by %p", p, size, res,
+ caller_return_address ());
return res;
}
@@ -104,7 +106,8 @@ calloc (size_t nmemb, size_t size)
res = dlcalloc (nmemb, size);
__malloc_unlock ();
}
- malloc_printf ("(%ld, %ld) = %p, called by %p", nmemb, size, res, __builtin_return_address (0));
+ malloc_printf ("(%ld, %ld) = %p, called by %p", nmemb, size, res,
+ caller_return_address ());
return res;
}
diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc
index e6ea5cc2d..7f324b946 100644
--- a/winsup/cygwin/miscfuncs.cc
+++ b/winsup/cygwin/miscfuncs.cc
@@ -1,7 +1,7 @@
/* miscfuncs.cc: misc funcs that don't belong anywhere else
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
- 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Red Hat, Inc.
+ 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
This file is part of Cygwin.
@@ -534,6 +534,19 @@ __import_address (void *imp)
return NULL;
}
+/* Helper function to generate the correct caller address. For external
+ calls, the return address on the stack is _sigbe. In that case the
+ actual caller return address is on the cygtls stack. Use this function
+ via the macro caller_return_address. */
+extern "C" void _sigbe ();
+
+void *
+__caller_return_address (void *builtin_ret_addr)
+{
+ return builtin_ret_addr == &_sigbe
+ ? (void *) _my_tls.retaddr () : builtin_ret_addr;
+}
+
/* CygwinCreateThread.
Replacement function for CreateThread. What we do here is to remove
diff --git a/winsup/cygwin/miscfuncs.h b/winsup/cygwin/miscfuncs.h
index c53a520c7..c9248f6f7 100644
--- a/winsup/cygwin/miscfuncs.h
+++ b/winsup/cygwin/miscfuncs.h
@@ -1,7 +1,7 @@
/* miscfuncs.h: main Cygwin header file.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
- 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Red Hat, Inc.
+ 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
This file is part of Cygwin.
@@ -46,6 +46,10 @@ extern "C" void yield ();
#define import_address(x) __import_address ((void *)(x))
void * __reg1 __import_address (void *);
+
+#define caller_return_address() \
+ __caller_return_address (__builtin_return_address (0))
+void * __reg1 __caller_return_address (void *);
void backslashify (const char *, char *, bool);
void slashify (const char *, char *, bool);