summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2023-11-09 14:34:21 -0500
committerTavian Barnes <tavianator@tavianator.com>2023-11-09 15:35:40 -0500
commitc745df94a182b8a569cb833ecfbe8da33bf01f98 (patch)
treed64642a509a2dd641bb851ec7c338e0558263ee7
parent0a5091a9005b485fccad689a4cbf081802860a5a (diff)
downloadbfs-c745df94a182b8a569cb833ecfbe8da33bf01f98.tar.xz
config: New attr_noinline and attr_cold macros
-rw-r--r--src/alloc.c1
-rw-r--r--src/config.h18
-rw-r--r--src/diag.h15
-rw-r--r--src/ioq.c2
4 files changed, 36 insertions, 0 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 0b978ba..3b9972f 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -107,6 +107,7 @@ void arena_init(struct arena *arena, size_t align, size_t size) {
}
/** Allocate a new slab. */
+attr_cold
static int slab_alloc(struct arena *arena) {
void **slabs = realloc(arena->slabs, sizeof_array(void *, arena->nslabs + 1));
if (!slabs) {
diff --git a/src/config.h b/src/config.h
index 3100cec..b95abaa 100644
--- a/src/config.h
+++ b/src/config.h
@@ -185,6 +185,24 @@
#endif
/**
+ * Hint to avoid inlining a function.
+ */
+#if __has_attribute(noinline)
+# define attr_noinline __attribute__((noinline))
+#else
+# define attr_noinline
+#endif
+
+/**
+ * Hint that a function is unlikely to be called.
+ */
+#if __has_attribute(cold)
+# define attr_cold attr_noinline __attribute__((cold))
+#else
+# define attr_cold attr_noinline
+#endif
+
+/**
* Adds compiler warnings for bad printf()-style function calls, if supported.
*/
#if __has_attribute(format)
diff --git a/src/diag.h b/src/diag.h
index 8c7ed57..870264e 100644
--- a/src/diag.h
+++ b/src/diag.h
@@ -44,6 +44,7 @@ struct bfs_loc {
/**
* Print a message to standard error and abort.
*/
+attr_cold
attr_format(2, 3)
noreturn void bfs_abortf(const struct bfs_loc *loc, const char *format, ...);
@@ -116,11 +117,13 @@ const char *debug_flag_name(enum debug_flags flag);
/**
* Like perror(), but decorated like bfs_error().
*/
+attr_cold
void bfs_perror(const struct bfs_ctx *ctx, const char *str);
/**
* Shorthand for printing error messages.
*/
+attr_cold
attr_format(2, 3)
void bfs_error(const struct bfs_ctx *ctx, const char *format, ...);
@@ -129,6 +132,7 @@ void bfs_error(const struct bfs_ctx *ctx, const char *format, ...);
*
* @return Whether a warning was printed.
*/
+attr_cold
attr_format(2, 3)
bool bfs_warning(const struct bfs_ctx *ctx, const char *format, ...);
@@ -137,60 +141,71 @@ bool bfs_warning(const struct bfs_ctx *ctx, const char *format, ...);
*
* @return Whether a debug message was printed.
*/
+attr_cold
attr_format(3, 4)
bool bfs_debug(const struct bfs_ctx *ctx, enum debug_flags flag, const char *format, ...);
/**
* bfs_error() variant that takes a va_list.
*/
+attr_cold
attr_format(2, 0)
void bfs_verror(const struct bfs_ctx *ctx, const char *format, va_list args);
/**
* bfs_warning() variant that takes a va_list.
*/
+attr_cold
attr_format(2, 0)
bool bfs_vwarning(const struct bfs_ctx *ctx, const char *format, va_list args);
/**
* bfs_debug() variant that takes a va_list.
*/
+attr_cold
attr_format(3, 0)
bool bfs_vdebug(const struct bfs_ctx *ctx, enum debug_flags flag, const char *format, va_list args);
/**
* Print the error message prefix.
*/
+attr_cold
void bfs_error_prefix(const struct bfs_ctx *ctx);
/**
* Print the warning message prefix.
*/
+attr_cold
bool bfs_warning_prefix(const struct bfs_ctx *ctx);
/**
* Print the debug message prefix.
*/
+attr_cold
bool bfs_debug_prefix(const struct bfs_ctx *ctx, enum debug_flags flag);
/**
* Highlight parts of the command line in an error message.
*/
+attr_cold
void bfs_argv_error(const struct bfs_ctx *ctx, const bool args[]);
/**
* Highlight parts of an expression in an error message.
*/
+attr_cold
void bfs_expr_error(const struct bfs_ctx *ctx, const struct bfs_expr *expr);
/**
* Highlight parts of the command line in a warning message.
*/
+attr_cold
bool bfs_argv_warning(const struct bfs_ctx *ctx, const bool args[]);
/**
* Highlight parts of an expression in a warning message.
*/
+attr_cold
bool bfs_expr_warning(const struct bfs_ctx *ctx, const struct bfs_expr *expr);
#endif // BFS_DIAG_H
diff --git a/src/ioq.c b/src/ioq.c
index 244b2cc..ef89fa8 100644
--- a/src/ioq.c
+++ b/src/ioq.c
@@ -269,6 +269,7 @@ static struct ioq_monitor *ioq_slot_monitor(struct ioqq *ioqq, ioq_slot *slot) {
}
/** Atomically wait for a slot to change. */
+attr_noinline
static uintptr_t ioq_slot_wait(struct ioqq *ioqq, ioq_slot *slot, uintptr_t value) {
struct ioq_monitor *monitor = ioq_slot_monitor(ioqq, slot);
mutex_lock(&monitor->mutex);
@@ -298,6 +299,7 @@ done:
}
/** Wake up any threads waiting on a slot. */
+attr_noinline
static void ioq_slot_wake(struct ioqq *ioqq, ioq_slot *slot) {
struct ioq_monitor *monitor = ioq_slot_monitor(ioqq, slot);