summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Schmidt <mschmidt@redhat.com>2012-01-17 12:05:33 +0100
committerMichal Schmidt <mschmidt@redhat.com>2012-01-17 12:34:53 +0100
commitb7f336383dc8ba58f720adb4c1d218348bf57e54 (patch)
tree525625511aacebb21dea18cf3156cd0c6c8c7dc5
parent2b7dec8661029fd531b3818ca5a5470fa038751c (diff)
log: make asserts cheaper
On my x86_64 this shrinks the size of .text by 53 KB (7 %).
-rw-r--r--src/log.c23
-rw-r--r--src/log.h7
-rw-r--r--src/macro.h8
3 files changed, 17 insertions, 21 deletions
diff --git a/src/log.c b/src/log.c
index 04e90eb20f..f65e8d1006 100644
--- a/src/log.c
+++ b/src/log.c
@@ -618,18 +618,13 @@ int log_meta(
return r;
}
-void log_assert(
- const char*file,
- int line,
- const char *func,
- const char *format, ...) {
-
+_noreturn_ static void log_assert(const char *text, const char *file, int line, const char *func, const char *format) {
static char buffer[LINE_MAX];
- va_list ap;
- va_start(ap, format);
- vsnprintf(buffer, sizeof(buffer), format, ap);
- va_end(ap);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+ snprintf(buffer, sizeof(buffer), format, text, file, line, func);
+#pragma GCC diagnostic pop
char_array_0(buffer);
log_abort_msg = buffer;
@@ -638,6 +633,14 @@ void log_assert(
abort();
}
+void log_assert_failed(const char *text, const char *file, int line, const char *func) {
+ log_assert(text, file, line, func, "Assertion '%s' failed at %s:%u, function %s(). Aborting.");
+}
+
+void log_assert_failed_unreachable(const char *text, const char *file, int line, const char *func) {
+ log_assert(text, file, line, func, "Code should not be reached '%s' at %s:%u, function %s(). Aborting.");
+}
+
int log_set_target_from_string(const char *e) {
LogTarget t;
diff --git a/src/log.h b/src/log.h
index 6ab07a5422..7028a13275 100644
--- a/src/log.h
+++ b/src/log.h
@@ -73,11 +73,8 @@ int log_meta(
const char *func,
const char *format, ...) _printf_attr_(5,6);
-_noreturn_ void log_assert(
- const char*file,
- int line,
- const char *func,
- const char *format, ...) _printf_attr_(4,5);
+_noreturn_ void log_assert_failed(const char *text, const char *file, int line, const char *func);
+_noreturn_ void log_assert_failed_unreachable(const char *text, const char *file, int line, const char *func);
/* This modifies the buffer passed! */
int log_dump_internal(
diff --git a/src/macro.h b/src/macro.h
index 3f30aa7892..58de001f26 100644
--- a/src/macro.h
+++ b/src/macro.h
@@ -91,9 +91,7 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) {
#define assert_se(expr) \
do { \
if (_unlikely_(!(expr))) \
- log_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \
- "Assertion '%s' failed at %s:%u, function %s(). Aborting.", \
- #expr , __FILE__, __LINE__, __PRETTY_FUNCTION__); \
+ log_assert_failed(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
} while (false) \
/* We override the glibc assert() here. */
@@ -106,9 +104,7 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) {
#define assert_not_reached(t) \
do { \
- log_assert(__FILE__, __LINE__, __PRETTY_FUNCTION__, \
- "Code should not be reached '%s' at %s:%u, function %s(). Aborting.", \
- t, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
+ log_assert_failed_unreachable(t, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
} while (false)
#define assert_cc(expr) \