Improve liblog's fatal logging.

This makes LOG_ALWAYS_FATAL and LOG_ALWAYS_FATAL_IF as good as regular
assert(3).

Change-Id: I0666684d30cae7baf23c64b33d35c1e43f81acf0
diff --git a/liblog/logd_write.c b/liblog/logd_write.c
index 94722d3..48531d5 100644
--- a/liblog/logd_write.c
+++ b/liblog/logd_write.c
@@ -407,9 +407,15 @@
             strcpy(buf, "Unspecified assertion failed");
     }
 
+#if __BIONIC__
+    // Ensure debuggerd gets to see what went wrong by keeping the C library in the loop.
+    extern __noreturn void __android_fatal(const char* tag, const char* format, ...) __printflike(2, 3);
+    __android_fatal(tag ? tag : "", "%s", buf);
+#else
     __android_log_write(ANDROID_LOG_FATAL, tag, buf);
-
     __builtin_trap(); /* trap so we have a chance to debug the situation */
+#endif
+    /* NOTREACHED */
 }
 
 int __android_log_bwrite(int32_t tag, const void *payload, size_t len)
diff --git a/liblog/logd_write_kern.c b/liblog/logd_write_kern.c
index c29c28f..8c707ad 100644
--- a/liblog/logd_write_kern.c
+++ b/liblog/logd_write_kern.c
@@ -272,9 +272,15 @@
             strcpy(buf, "Unspecified assertion failed");
     }
 
+#if __BIONIC__
+    // Ensure debuggerd gets to see what went wrong by keeping the C library in the loop.
+    extern __noreturn void __android_fatal(const char* tag, const char* format, ...) __printflike(2, 3);
+    __android_fatal(tag ? tag : "", "%s", buf);
+#else
     __android_log_write(ANDROID_LOG_FATAL, tag, buf);
-
     __builtin_trap(); /* trap so we have a chance to debug the situation */
+#endif
+    /* NOTREACHED */
 }
 
 int __android_log_bwrite(int32_t tag, const void *payload, size_t len)