diff options
author | Andy McFadden <fadden@android.com> | 2009-10-16 07:28:34 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2009-10-16 07:28:34 -0700 |
commit | b63e4e88b0d13afa431864190b3515a549c16d85 (patch) | |
tree | 849f6641a5662202d4b9b596663c981fda5ea541 /libc/unistd | |
parent | 73981476a389847e8537cca37503c43e107fadc9 (diff) | |
parent | 5f32207a3db0bea3ca1c7f4b2b563c11b895f276 (diff) | |
download | bionic-b63e4e88b0d13afa431864190b3515a549c16d85.zip bionic-b63e4e88b0d13afa431864190b3515a549c16d85.tar.gz bionic-b63e4e88b0d13afa431864190b3515a549c16d85.tar.bz2 |
am 5f32207a: Wrap ARM abort() to improve stack trace.
Merge commit '5f32207a3db0bea3ca1c7f4b2b563c11b895f276' into eclair-mr2-plus-aosp
* commit '5f32207a3db0bea3ca1c7f4b2b563c11b895f276':
Wrap ARM abort() to improve stack trace.
Diffstat (limited to 'libc/unistd')
-rw-r--r-- | libc/unistd/abort.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/libc/unistd/abort.c b/libc/unistd/abort.c index f323941..3e3aab0 100644 --- a/libc/unistd/abort.c +++ b/libc/unistd/abort.c @@ -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 + |