Log signal info at time of receipt
When a fatal signal is received, we now write a message to the log
that looks like this:
F/libc ( 1540): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1)
This is useful for debugging fatal signals that turn out not to be
fatal. This also changes the signal reset from SIG_IGN to SIG_DFL,
so that future non-fatal fatal signals are fatal.
The code that blocked SIGUSR1 to avoid being interrupted by the GC
has been removed.
Also, fix minor issues in format_buffer().
Bug 5035703
Change-Id: I8940af47297b5dcf3cf33537e3483ca5334ed565
diff --git a/linker/linker_format.c b/linker/linker_format.c
index 4d00bd9..0c68a0b 100644
--- a/linker/linker_format.c
+++ b/linker/linker_format.c
@@ -427,18 +427,20 @@
static void
out_vformat(Out *o, const char *format, va_list args)
{
- int nn = 0, mm;
- int padZero = 0;
- int padLeft = 0;
- char sign = '\0';
- int width = -1;
- int prec = -1;
- size_t bytelen = sizeof(int);
- const char* str;
- int slen;
- char buffer[32]; /* temporary buffer used to format numbers */
+ int nn = 0;
for (;;) {
+ int mm;
+ int padZero = 0;
+ int padLeft = 0;
+ char sign = '\0';
+ int width = -1;
+ int prec = -1;
+ size_t bytelen = sizeof(int);
+ const char* str;
+ int slen;
+ char buffer[32]; /* temporary buffer used to format numbers */
+
char c;
/* first, find all characters that are not 0 or '%' */
@@ -525,9 +527,6 @@
bytelen = sizeof(ptrdiff_t);
c = format[nn++];
break;
- case 'p':
- bytelen = sizeof(void*);
- c = format[nn++];
default:
;
}
@@ -543,7 +542,7 @@
buffer[1] = '\0';
str = buffer;
} else if (c == 'p') {
- uint64_t value = (uint64_t)(ptrdiff_t) va_arg(args, void*);
+ uint64_t value = (uintptr_t) va_arg(args, void*);
buffer[0] = '0';
buffer[1] = 'x';
format_hex(buffer + 2, sizeof buffer-2, value, 0);
@@ -684,7 +683,7 @@
utest_expect("-8123", "%d", -8123);
utest_expect("16", "%hd", 0x7fff0010);
utest_expect("16", "%hhd", 0x7fffff10);
- utest_expect("68719476736", "%lld", 0x1000000000);
+ utest_expect("68719476736", "%lld", 0x1000000000LL);
utest_expect("70000", "%ld", 70000);
utest_expect("0xb0001234", "%p", (void*)0xb0001234);
utest_expect("12ab", "%x", 0x12ab);
@@ -697,6 +696,9 @@
utest_expect("1234 ", "%-8d", 1234);
utest_expect("abcdef ", "%-11s", "abcdef");
utest_expect("something:1234", "%s:%d", "something", 1234);
+ utest_expect("005:5:05", "%03d:%d:%02d", 5, 5, 5);
+ utest_expect("5,0x0", "%d,%p", 5, NULL);
+ utest_expect("68719476736,6,7,8", "%lld,%d,%d,%d", 0x1000000000LL, 6, 7, 8);
return gFails != 0;
}