am b63e4e88: am 5f32207a: Wrap ARM abort() to improve stack trace.

Merge commit 'b63e4e88b0d13afa431864190b3515a549c16d85'

* commit 'b63e4e88b0d13afa431864190b3515a549c16d85':
  Wrap ARM abort() to improve stack trace.
This commit is contained in:
Andy McFadden 2009-10-16 07:38:41 -07:00 committed by Android Git Automerger
commit 9c46315800

View File

@ -39,8 +39,13 @@
#define debug_log(format, ...) \
__libc_android_log_print(ANDROID_LOG_DEBUG, "libc-abort", (format), ##__VA_ARGS__ )
#ifdef __arm__
void
__libc_android_abort(void)
#else
void
abort(void)
#endif
{
struct atexit *p = __atexit;
static int cleanup_called = 0;
@ -97,3 +102,29 @@ abort(void)
(void)kill(getpid(), SIGABRT);
_exit(1);
}
#ifdef __arm__
/*
* abort() does not return, which gcc interprets to mean that it doesn't
* need to preserve any of the callee-save registers. Unfortunately this
* includes the link register, so if LR is used there is no way to determine
* which function called abort().
*
* We work around this by inserting a trivial stub that doesn't alter
* any of the "interesting" registers and thus doesn't need to save them.
* We can't just call __libc_android_abort from C because gcc uses "bl"
* without first saving LR, so we use an asm statement. This also has
* the side-effect of replacing abort() with __libc_android_abort() in
* the stack trace.
*
* Ideally __libc_android_abort would be static, but I haven't figured out
* how to tell gcc to call a static function from an asm statement.
*/
void
abort(void)
{
asm ("b __libc_android_abort");
_exit(1); /* suppress gcc noreturn warnings */
}
#endif