* 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.
This commit is contained in:
Corinna Vinschen 2015-01-16 16:19:37 +00:00
parent ad45d512de
commit a62dbcd6e0
5 changed files with 44 additions and 9 deletions

View File

@ -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> 2015-01-14 Corinna Vinschen <corinna@vinschen.de>
* uinfo.cc (fetch_windows_home): Disable fetching from homeDrive or * uinfo.cc (fetch_windows_home): Disable fetching from homeDrive or

View File

@ -1,6 +1,6 @@
#!/usr/bin/perl #!/usr/bin/perl
# Copyright 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011, 2012, 2013, 2014 # Copyright 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011, 2012, 2013, 2014,
# Red Hat, Inc. # 2015 Red Hat, Inc.
# #
# This file is part of Cygwin. # This file is part of Cygwin.
# #
@ -164,6 +164,7 @@ _sigfe: # stack is aligned on entry!
jmp *%rax # and jmp to it jmp *%rax # and jmp to it
.seh_endproc .seh_endproc
.global _sigbe
.seh_proc _sigbe .seh_proc _sigbe
_sigbe: # return here after cygwin syscall _sigbe: # return here after cygwin syscall
# stack is aligned on entry! # stack is aligned on entry!

View File

@ -1,7 +1,7 @@
/* malloc_wrapper.cc /* malloc_wrapper.cc
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 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. This file is part of Cygwin.
@ -38,7 +38,7 @@ static bool internal_malloc_determined;
extern "C" void extern "C" void
free (void *p) 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) if (!use_internal)
user_data->free (p); user_data->free (p);
else else
@ -61,7 +61,8 @@ malloc (size_t size)
res = dlmalloc (size); res = dlmalloc (size);
__malloc_unlock (); __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; return res;
} }
@ -77,7 +78,8 @@ realloc (void *p, size_t size)
res = dlrealloc (p, size); res = dlrealloc (p, size);
__malloc_unlock (); __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; return res;
} }
@ -104,7 +106,8 @@ calloc (size_t nmemb, size_t size)
res = dlcalloc (nmemb, size); res = dlcalloc (nmemb, size);
__malloc_unlock (); __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; return res;
} }

View File

@ -1,7 +1,7 @@
/* miscfuncs.cc: misc funcs that don't belong anywhere else /* miscfuncs.cc: misc funcs that don't belong anywhere else
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 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. This file is part of Cygwin.
@ -534,6 +534,19 @@ __import_address (void *imp)
return NULL; 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. /* CygwinCreateThread.
Replacement function for CreateThread. What we do here is to remove Replacement function for CreateThread. What we do here is to remove

View File

@ -1,7 +1,7 @@
/* miscfuncs.h: main Cygwin header file. /* miscfuncs.h: main Cygwin header file.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 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. This file is part of Cygwin.
@ -46,6 +46,10 @@ extern "C" void yield ();
#define import_address(x) __import_address ((void *)(x)) #define import_address(x) __import_address ((void *)(x))
void * __reg1 __import_address (void *); 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 backslashify (const char *, char *, bool);
void slashify (const char *, char *, bool); void slashify (const char *, char *, bool);