summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/alloc.c2
-rw-r--r--src/alloc.h19
-rw-r--r--src/bar.c2
-rw-r--r--src/color.c4
-rw-r--r--src/color.h4
-rw-r--r--src/diag.c5
-rw-r--r--src/diag.h42
-rw-r--r--src/dstring.h18
-rw-r--r--src/eval.c2
-rw-r--r--src/exec.c2
-rw-r--r--src/fsade.c8
-rw-r--r--src/ioq.c4
-rw-r--r--src/mtab.c2
-rw-r--r--src/opt.c12
-rw-r--r--src/parse.c14
-rw-r--r--src/prelude.h132
-rw-r--r--src/printf.c6
-rw-r--r--src/sighook.c3
-rw-r--r--src/trie.c18
-rw-r--r--src/xspawn.c5
20 files changed, 125 insertions, 179 deletions
diff --git a/src/alloc.c b/src/alloc.c
index ebaff38..d7a70e9 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -176,7 +176,7 @@ void arena_init(struct arena *arena, size_t align, size_t size) {
}
/** Allocate a new slab. */
-attr(cold)
+_cold
static int slab_alloc(struct arena *arena) {
// Make the initial allocation size ~4K
size_t size = 4096;
diff --git a/src/alloc.h b/src/alloc.h
index 095134a..6b863f2 100644
--- a/src/alloc.h
+++ b/src/alloc.h
@@ -115,7 +115,8 @@ static inline size_t flex_size(size_t align, size_t min, size_t offset, size_t s
* @return
* The allocated memory, or NULL on failure.
*/
-attr(malloc(free, 1), aligned_alloc(1, 2))
+_malloc(free, 1)
+_aligned_alloc(1, 2)
void *alloc(size_t align, size_t size);
/**
@@ -128,7 +129,8 @@ void *alloc(size_t align, size_t size);
* @return
* The allocated memory, or NULL on failure.
*/
-attr(malloc(free, 1), aligned_alloc(1, 2))
+_malloc(free, 1)
+_aligned_alloc(1, 2)
void *zalloc(size_t align, size_t size);
/** Allocate memory for the given type. */
@@ -169,7 +171,8 @@ void *zalloc(size_t align, size_t size);
* @return
* The reallocated memory, or NULL on failure.
*/
-attr(nodiscard, aligned_alloc(2, 4))
+_aligned_alloc(2, 4)
+_nodiscard
void *xrealloc(void *ptr, size_t align, size_t old_size, size_t new_size);
/** Reallocate memory for an array. */
@@ -195,7 +198,7 @@ void *xrealloc(void *ptr, size_t align, size_t old_size, size_t new_size);
* for (count + 1) elements. On failure, errno will be non-zero, and
* ptr will returned unchanged.
*/
-attr(nodiscard)
+_nodiscard
void *reserve(void *ptr, size_t align, size_t size, size_t count);
/**
@@ -253,7 +256,7 @@ void arena_free(struct arena *arena, void *ptr);
/**
* Allocate an object out of the arena.
*/
-attr(malloc(arena_free, 2))
+_malloc(arena_free, 2)
void *arena_alloc(struct arena *arena);
/**
@@ -335,7 +338,7 @@ void varena_free(struct varena *varena, void *ptr, size_t count);
* @return
* The allocated struct, or NULL on failure.
*/
-attr(malloc(varena_free, 2))
+_malloc(varena_free, 2)
void *varena_alloc(struct varena *varena, size_t count);
/**
@@ -352,7 +355,7 @@ void *varena_alloc(struct varena *varena, size_t count);
* @return
* The resized struct, or NULL on failure.
*/
-attr(nodiscard)
+_nodiscard
void *varena_realloc(struct varena *varena, void *ptr, size_t old_count, size_t new_count);
/**
@@ -367,7 +370,7 @@ void *varena_realloc(struct varena *varena, void *ptr, size_t old_count, size_t
* @return
* The resized struct, or NULL on failure.
*/
-attr(nodiscard)
+_nodiscard
void *varena_grow(struct varena *varena, void *ptr, size_t *count);
/**
diff --git a/src/bar.c b/src/bar.c
index be77694..64706a8 100644
--- a/src/bar.c
+++ b/src/bar.c
@@ -122,7 +122,7 @@ static void bfs_bar_sigexit(int sig, siginfo_t *info, void *arg) {
}
/** printf() to the status bar with a single write(). */
-attr(printf(2, 3))
+_printf(2, 3)
static int bfs_bar_printf(struct bfs_bar *bar, const char *format, ...) {
va_list args;
va_start(args, format);
diff --git a/src/color.c b/src/color.c
index 13a4e08..052de69 100644
--- a/src/color.c
+++ b/src/color.c
@@ -1119,7 +1119,7 @@ static int print_link_target(CFILE *cfile, const struct BFTW *ftwbuf) {
}
/** Format some colored output to the buffer. */
-attr(printf(2, 3))
+_printf(2, 3)
static int cbuff(CFILE *cfile, const char *format, ...);
/** Dump a parsed expression tree, for debugging. */
@@ -1188,7 +1188,7 @@ static int print_expr(CFILE *cfile, const struct bfs_expr *expr, bool verbose, i
return 0;
}
-attr(printf(2, 0))
+_printf(2, 0)
static int cvbuff(CFILE *cfile, const char *format, va_list args) {
const struct colors *colors = cfile->colors;
diff --git a/src/color.h b/src/color.h
index 8582eb3..6847e3b 100644
--- a/src/color.h
+++ b/src/color.h
@@ -100,13 +100,13 @@ int cfclose(CFILE *cfile);
* @return
* 0 on success, -1 on failure.
*/
-attr(printf(2, 3))
+_printf(2, 3)
int cfprintf(CFILE *cfile, const char *format, ...);
/**
* cfprintf() variant that takes a va_list.
*/
-attr(printf(2, 0))
+_printf(2, 0)
int cvfprintf(CFILE *cfile, const char *format, va_list args);
/**
diff --git a/src/diag.c b/src/diag.c
index ccafd98..6ae088c 100644
--- a/src/diag.c
+++ b/src/diag.c
@@ -15,7 +15,7 @@
#include <stdlib.h>
/** bfs_diagf() implementation. */
-attr(printf(2, 0))
+_printf(2, 0)
static void bfs_vdiagf(const struct bfs_loc *loc, const char *format, va_list args) {
fprintf(stderr, "%s: %s@%s:%d: ", xgetprogname(), loc->func, loc->file, loc->line);
vfprintf(stderr, format, args);
@@ -29,7 +29,8 @@ void bfs_diagf(const struct bfs_loc *loc, const char *format, ...) {
va_end(args);
}
-noreturn void bfs_abortf(const struct bfs_loc *loc, const char *format, ...) {
+_noreturn
+void bfs_abortf(const struct bfs_loc *loc, const char *format, ...) {
va_list args;
va_start(args, format);
bfs_vdiagf(loc, format, args);
diff --git a/src/diag.h b/src/diag.h
index da22f3a..d70bd43 100644
--- a/src/diag.h
+++ b/src/diag.h
@@ -47,7 +47,7 @@ struct bfs_loc {
*
* bfs: func@src/file.c:0: Message
*/
-attr(printf(2, 3))
+_printf(2, 3)
void bfs_diagf(const struct bfs_loc *loc, const char *format, ...);
/**
@@ -67,8 +67,10 @@ void bfs_diagf(const struct bfs_loc *loc, const char *format, ...);
/**
* Print a message to standard error and abort.
*/
-attr(cold, printf(2, 3))
-noreturn void bfs_abortf(const struct bfs_loc *loc, const char *format, ...);
+_cold
+_printf(2, 3)
+_noreturn
+void bfs_abortf(const struct bfs_loc *loc, const char *format, ...);
/**
* Unconditional abort with a message.
@@ -166,13 +168,14 @@ const char *debug_flag_name(enum debug_flags flag);
/**
* Like perror(), but decorated like bfs_error().
*/
-attr(cold)
+_cold
void bfs_perror(const struct bfs_ctx *ctx, const char *str);
/**
* Shorthand for printing error messages.
*/
-attr(cold, printf(2, 3))
+_cold
+_printf(2, 3)
void bfs_error(const struct bfs_ctx *ctx, const char *format, ...);
/**
@@ -180,7 +183,8 @@ void bfs_error(const struct bfs_ctx *ctx, const char *format, ...);
*
* @return Whether a warning was printed.
*/
-attr(cold, printf(2, 3))
+_cold
+_printf(2, 3)
bool bfs_warning(const struct bfs_ctx *ctx, const char *format, ...);
/**
@@ -188,67 +192,71 @@ bool bfs_warning(const struct bfs_ctx *ctx, const char *format, ...);
*
* @return Whether a debug message was printed.
*/
-attr(cold, printf(3, 4))
+_cold
+_printf(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, printf(2, 0))
+_cold
+_printf(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, printf(2, 0))
+_cold
+_printf(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, printf(3, 0))
+_cold
+_printf(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)
+_cold
void bfs_error_prefix(const struct bfs_ctx *ctx);
/**
* Print the warning message prefix.
*/
-attr(cold)
+_cold
bool bfs_warning_prefix(const struct bfs_ctx *ctx);
/**
* Print the debug message prefix.
*/
-attr(cold)
+_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)
+_cold
void bfs_argv_error(const struct bfs_ctx *ctx, const bool args[]);
/**
* Highlight parts of an expression in an error message.
*/
-attr(cold)
+_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)
+_cold
bool bfs_argv_warning(const struct bfs_ctx *ctx, const bool args[]);
/**
* Highlight parts of an expression in a warning message.
*/
-attr(cold)
+_cold
bool bfs_expr_warning(const struct bfs_ctx *ctx, const struct bfs_expr *expr);
#endif // BFS_DIAG_H
diff --git a/src/dstring.h b/src/dstring.h
index 14e1d3e..46d5edb 100644
--- a/src/dstring.h
+++ b/src/dstring.h
@@ -41,7 +41,7 @@ void dstrfree(dchar *dstr);
* @param cap
* The initial capacity of the string.
*/
-attr(malloc(dstrfree, 1))
+_malloc(dstrfree, 1)
dchar *dstralloc(size_t cap);
/**
@@ -50,7 +50,7 @@ dchar *dstralloc(size_t cap);
* @param str
* The NUL-terminated string to copy.
*/
-attr(malloc(dstrfree, 1))
+_malloc(dstrfree, 1)
dchar *dstrdup(const char *str);
/**
@@ -61,7 +61,7 @@ dchar *dstrdup(const char *str);
* @param n
* The maximum number of characters to copy from str.
*/
-attr(malloc(dstrfree, 1))
+_malloc(dstrfree, 1)
dchar *dstrndup(const char *str, size_t n);
/**
@@ -70,7 +70,7 @@ dchar *dstrndup(const char *str, size_t n);
* @param dstr
* The dynamic string to copy.
*/
-attr(malloc(dstrfree, 1))
+_malloc(dstrfree, 1)
dchar *dstrddup(const dchar *dstr);
/**
@@ -81,7 +81,7 @@ dchar *dstrddup(const dchar *dstr);
* @param len
* The length of the string, which may include internal NUL bytes.
*/
-attr(malloc(dstrfree, 1))
+_malloc(dstrfree, 1)
dchar *dstrxdup(const char *str, size_t len);
/**
@@ -243,7 +243,7 @@ int dstrxcpy(dchar **dest, const char *str, size_t len);
* @return
* The created string, or NULL on failure.
*/
-attr(printf(1, 2))
+_printf(1, 2)
dchar *dstrprintf(const char *format, ...);
/**
@@ -256,7 +256,7 @@ dchar *dstrprintf(const char *format, ...);
* @return
* The created string, or NULL on failure.
*/
-attr(printf(1, 0))
+_printf(1, 0)
dchar *dstrvprintf(const char *format, va_list args);
/**
@@ -271,7 +271,7 @@ dchar *dstrvprintf(const char *format, va_list args);
* @return
* 0 on success, -1 on failure.
*/
-attr(printf(2, 3))
+_printf(2, 3)
int dstrcatf(dchar **str, const char *format, ...);
/**
@@ -286,7 +286,7 @@ int dstrcatf(dchar **str, const char *format, ...);
* @return
* 0 on success, -1 on failure.
*/
-attr(printf(2, 0))
+_printf(2, 0)
int dstrvcatf(dchar **str, const char *format, va_list args);
/**
diff --git a/src/eval.c b/src/eval.c
index 0b5992e..2c88669 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -60,7 +60,7 @@ struct bfs_eval {
/**
* Print an error message.
*/
-attr(printf(2, 3))
+_printf(2, 3)
static void eval_error(struct bfs_eval *state, const char *format, ...) {
// By POSIX, any errors should be accompanied by a non-zero exit status
*state->ret = EXIT_FAILURE;
diff --git a/src/exec.c b/src/exec.c
index 2faa731..05c4189 100644
--- a/src/exec.c
+++ b/src/exec.c
@@ -22,7 +22,7 @@
#include <unistd.h>
/** Print some debugging info. */
-attr(printf(2, 3))
+_printf(2, 3)
static void bfs_exec_debug(const struct bfs_exec *execbuf, const char *format, ...) {
const struct bfs_ctx *ctx = execbuf->ctx;
diff --git a/src/fsade.c b/src/fsade.c
index 7310141..11dcd9b 100644
--- a/src/fsade.c
+++ b/src/fsade.c
@@ -36,7 +36,7 @@
* Many of the APIs used here don't have *at() variants, but we can try to
* emulate something similar if /proc/self/fd is available.
*/
-attr(maybe_unused)
+_maybe_unused
static const char *fake_at(const struct BFTW *ftwbuf) {
static atomic int proc_works = -1;
@@ -70,7 +70,7 @@ fail:
return ftwbuf->path;
}
-attr(maybe_unused)
+_maybe_unused
static void free_fake_at(const struct BFTW *ftwbuf, const char *path) {
if (path != ftwbuf->path) {
dstrfree((dchar *)path);
@@ -80,7 +80,7 @@ static void free_fake_at(const struct BFTW *ftwbuf, const char *path) {
/**
* Check if an error was caused by the absence of support or data for a feature.
*/
-attr(maybe_unused)
+_maybe_unused
static bool is_absence_error(int error) {
// If the OS doesn't support the feature, it's obviously not enabled for
// any files
@@ -160,7 +160,7 @@ static int bfs_acl_entry(acl_t acl, int which, acl_entry_t *entry) {
}
/** Unified interface for acl_get_tag_type(). */
-attr(maybe_unused)
+_maybe_unused
static int bfs_acl_tag_type(acl_entry_t entry, acl_tag_t *tag) {
#if BFS_HAS_ACL_GET_TAG_TYPE
return acl_get_tag_type(entry, tag);
diff --git a/src/ioq.c b/src/ioq.c
index 6bb1ceb..50898c6 100644
--- a/src/ioq.c
+++ b/src/ioq.c
@@ -263,7 +263,7 @@ static struct ioq_monitor *ioq_slot_monitor(struct ioqq *ioqq, ioq_slot *slot) {
}
/** Atomically wait for a slot to change. */
-attr(noinline)
+_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);
@@ -293,7 +293,7 @@ done:
}
/** Wake up any threads waiting on a slot. */
-attr(noinline)
+_noinline
static void ioq_slot_wake(struct ioqq *ioqq, ioq_slot *slot) {
struct ioq_monitor *monitor = ioq_slot_monitor(ioqq, slot);
diff --git a/src/mtab.c b/src/mtab.c
index 0377fea..dbe17cc 100644
--- a/src/mtab.c
+++ b/src/mtab.c
@@ -65,7 +65,7 @@ struct bfs_mtab {
/**
* Add an entry to the mount table.
*/
-attr(maybe_unused)
+_maybe_unused
static int bfs_mtab_add(struct bfs_mtab *mtab, const char *path, const char *type) {
size_t path_size = strlen(path) + 1;
size_t type_size = strlen(type) + 1;
diff --git a/src/opt.c b/src/opt.c
index d81b7d8..ccd76c8 100644
--- a/src/opt.c
+++ b/src/opt.c
@@ -370,7 +370,7 @@ struct bfs_opt {
};
/** Log an optimization. */
-attr(printf(2, 3))
+_printf(2, 3)
static bool opt_debug(struct bfs_opt *opt, const char *format, ...) {
if (bfs_debug_prefix(opt->ctx, DEBUG_OPT)) {
for (int i = 0; i < opt->depth; ++i) {
@@ -388,7 +388,7 @@ static bool opt_debug(struct bfs_opt *opt, const char *format, ...) {
}
/** Log a recursive call. */
-attr(printf(2, 3))
+_printf(2, 3)
static bool opt_enter(struct bfs_opt *opt, const char *format, ...) {
int depth = opt->depth;
if (depth > 0) {
@@ -408,7 +408,7 @@ static bool opt_enter(struct bfs_opt *opt, const char *format, ...) {
}
/** Log a recursive return. */
-attr(printf(2, 3))
+_printf(2, 3)
static bool opt_leave(struct bfs_opt *opt, const char *format, ...) {
bool debug = false;
int depth = opt->depth;
@@ -432,7 +432,7 @@ static bool opt_leave(struct bfs_opt *opt, const char *format, ...) {
}
/** Log a shallow visit. */
-attr(printf(2, 3))
+_printf(2, 3)
static bool opt_visit(struct bfs_opt *opt, const char *format, ...) {
int depth = opt->depth;
if (depth > 0) {
@@ -452,7 +452,7 @@ static bool opt_visit(struct bfs_opt *opt, const char *format, ...) {
}
/** Log the deletion of an expression. */
-attr(printf(2, 3))
+_printf(2, 3)
static bool opt_delete(struct bfs_opt *opt, const char *format, ...) {
int depth = opt->depth;
@@ -614,7 +614,7 @@ static bool is_const(const struct bfs_expr *expr) {
}
/** Warn about an expression. */
-attr(printf(3, 4))
+_printf(3, 4)
static void opt_warning(const struct bfs_opt *opt, const struct bfs_expr *expr, const char *format, ...) {
if (!opt->warn) {
return;
diff --git a/src/parse.c b/src/parse.c
index c225778..02a795d 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -165,7 +165,7 @@ static void highlight_args(const struct bfs_ctx *ctx, char **argv, size_t argc,
/**
* Print an error message during parsing.
*/
-attr(printf(2, 3))
+_printf(2, 3)
static void parse_error(const struct bfs_parser *parser, const char *format, ...) {
const struct bfs_ctx *ctx = parser->ctx;
@@ -183,7 +183,7 @@ static void parse_error(const struct bfs_parser *parser, const char *format, ...
/**
* Print an error about some command line arguments.
*/
-attr(printf(4, 5))
+_printf(4, 5)
static void parse_argv_error(const struct bfs_parser *parser, char **argv, size_t argc, const char *format, ...) {
const struct bfs_ctx *ctx = parser->ctx;
@@ -201,7 +201,7 @@ static void parse_argv_error(const struct bfs_parser *parser, char **argv, size_
/**
* Print an error about conflicting command line arguments.
*/
-attr(printf(6, 7))
+_printf(6, 7)
static void parse_conflict_error(const struct bfs_parser *parser, char **argv1, size_t argc1, char **argv2, size_t argc2, const char *format, ...) {
const struct bfs_ctx *ctx = parser->ctx;
@@ -220,7 +220,7 @@ static void parse_conflict_error(const struct bfs_parser *parser, char **argv1,
/**
* Print an error about an expression.
*/
-attr(printf(3, 4))
+_printf(3, 4)
static void parse_expr_error(const struct bfs_parser *parser, const struct bfs_expr *expr, const char *format, ...) {
const struct bfs_ctx *ctx = parser->ctx;
@@ -235,7 +235,7 @@ static void parse_expr_error(const struct bfs_parser *parser, const struct bfs_e
/**
* Print a warning message during parsing.
*/
-attr(printf(2, 3))
+_printf(2, 3)
static bool parse_warning(const struct bfs_parser *parser, const char *format, ...) {
const struct bfs_ctx *ctx = parser->ctx;
@@ -256,7 +256,7 @@ static bool parse_warning(const struct bfs_parser *parser, const char *format, .
/**
* Print a warning about conflicting command line arguments.
*/
-attr(printf(6, 7))
+_printf(6, 7)
static bool parse_conflict_warning(const struct bfs_parser *parser, char **argv1, size_t argc1, char **argv2, size_t argc2, const char *format, ...) {
const struct bfs_ctx *ctx = parser->ctx;
@@ -278,7 +278,7 @@ static bool parse_conflict_warning(const struct bfs_parser *parser, char **argv1
/**
* Print a warning about an expression.
*/
-attr(printf(3, 4))
+_printf(3, 4)
static bool parse_expr_warning(const struct bfs_parser *parser, const struct bfs_expr *expr, const char *format, ...) {
const struct bfs_ctx *ctx = parser->ctx;
diff --git a/src/prelude.h b/src/prelude.h
index 34ce803..24de309 100644
--- a/src/prelude.h
+++ b/src/prelude.h
@@ -22,7 +22,6 @@
#if __STDC_VERSION__ < C23
# include <stdalign.h>
# include <stdbool.h>
-# include <stdnoreturn.h>
#endif
// bfs packaging configuration
@@ -184,54 +183,63 @@ extern const char bfs_ldlibs[];
* Silence warnings about unused declarations.
*/
#if __has_attribute(unused)
-# define attr_maybe_unused __attribute__((unused))
+# define _maybe_unused __attribute__((unused))
#else
-# define attr_maybe_unused
+# define _maybe_unused
#endif
/**
* Warn if a value is unused.
*/
#if __has_attribute(warn_unused_result)
-# define attr_nodiscard __attribute__((warn_unused_result))
+# define _nodiscard __attribute__((warn_unused_result))
#else
-# define attr_nodiscard
+# define _nodiscard
#endif
/**
* Hint to avoid inlining a function.
*/
#if __has_attribute(noinline)
-# define attr_noinline __attribute__((noinline))
+# define _noinline __attribute__((noinline))
#else
-# define attr_noinline
+# define _noinline
+#endif
+
+/**
+ * Marks a non-returning function.
+ */
+#if __STDC_VERSION__ >= C23
+# define _noreturn [[noreturn]]
+#else
+# define _noreturn _Noreturn
#endif
/**
* Hint that a function is unlikely to be called.
*/
#if __has_attribute(cold)
-# define attr_cold attr_noinline __attribute__((cold))
+# define _cold _noinline __attribute__((cold))
#else
-# define attr_cold attr_noinline
+# define _cold _noinline
#endif
/**
* Adds compiler warnings for bad printf()-style function calls, if supported.
*/
#if __has_attribute(format)
-# define attr_printf(fmt, args) __attribute__((format(printf, fmt, args)))
+# define _printf(fmt, args) __attribute__((format(printf, fmt, args)))
#else
-# define attr_printf(fmt, args)
+# define _printf(fmt, args)
#endif
/**
* Annotates functions that potentially modify and return format strings.
*/
#if __has_attribute(format_arg)
-# define attr_format_arg(arg) __attribute__((format_arg(arg)))
+# define _format_arg(arg) __attribute__((format_arg(arg)))
#else
-# define attr_format_arg(args)
+# define _format_arg(arg)
#endif
/**
@@ -239,38 +247,36 @@ extern const char bfs_ldlibs[];
*/
#if __has_attribute(malloc)
# if __GNUC__ >= 11 && !__OPTIMIZE__ // malloc(deallocator) disables inlining on GCC
-# define attr_malloc(...) attr_nodiscard __attribute__((malloc(__VA_ARGS__)))
+# define _malloc(...) _nodiscard __attribute__((malloc(__VA_ARGS__)))
# else
-# define attr_malloc(...) attr_nodiscard __attribute__((malloc))
+# define _malloc(...) _nodiscard __attribute__((malloc))
# endif
#else
-# define attr_malloc(...) attr_nodiscard
+# define _malloc(...) _nodiscard
#endif
/**
* Specifies that a function returns allocations with a given alignment.
*/
#if __has_attribute(alloc_align)
-# define attr_alloc_align(param) __attribute__((alloc_align(param)))
+# define _alloc_align(param) __attribute__((alloc_align(param)))
#else
-# define attr_alloc_align(param)
+# define _alloc_align(param)
#endif
/**
* Specifies that a function returns allocations with a given size.
*/
#if __has_attribute(alloc_size)
-# define attr_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
+# define _alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
#else
-# define attr_alloc_size(...)
+# define _alloc_size(...)
#endif
/**
- * Shorthand for attr_alloc_align() and attr_alloc_size().
+ * Shorthand for _alloc_align() and _alloc_size().
*/
-#define attr_aligned_alloc(align, ...) \
- attr_alloc_align(align) \
- attr_alloc_size(__VA_ARGS__)
+#define _aligned_alloc(align, ...) _alloc_align(align) _alloc_size(__VA_ARGS__)
/**
* Check if function multiversioning via GNU indirect functions (ifunc) is supported.
@@ -285,83 +291,9 @@ extern const char bfs_ldlibs[];
* Apply the target_clones attribute, if available.
*/
#if BFS_USE_TARGET_CLONES
-# define attr_target_clones(...) __attribute__((target_clones(__VA_ARGS__)))
+# define _target_clones(...) __attribute__((target_clones(__VA_ARGS__)))
#else
-# define attr_target_clones(...)
+# define _target_clones(...)
#endif
-/**
- * Shorthand for multiple attributes at once. attr(a, b(c), d) is equivalent to
- *
- * attr_a
- * attr_b(c)
- * attr_d
- */
-#define attr(...) \
- attr__(attr_##__VA_ARGS__, none, none, none, none, none, none, none, none, none, )
-
-/**
- * attr() helper. For exposition, pretend we support only 2 args, instead of 9.
- * There are a few cases:
- *
- * attr()
- * => attr__(attr_, none, none)
- * => attr_ =>
- * attr_none =>
- * attr_too_many_none() =>
- *
- * attr(a)
- * => attr__(attr_a, none, none)
- * => attr_a => __attribute__((a))
- * attr_none =>
- * attr_too_many_none() =>
- *
- * attr(a, b(c))
- * => attr__(attr_a, b(c), none, none)
- * => attr_a => __attribute__((a))
- * attr_b(c) => __attribute__((b(c)))
- * attr_too_many_none(none) =>
- *
- * attr(a, b(c), d)
- * => attr__(attr_a, b(c), d, none, none)
- * => attr_a => __attribute__((a))
- * attr_b(c) => __attribute__((b(c)))
- * attr_too_many_d(none, none) => error
- *
- * Some attribute names are the same as standard library functions, e.g. printf.
- * Standard libraries are permitted to define these functions as macros, like
- *
- * #define printf(...) __builtin_printf(__VA_ARGS__)
- *
- * The token paste in
- *
- * #define attr(...) attr__(attr_##__VA_ARGS__, none, none)
- *
- * is necessary to prevent macro expansion before evaluating attr__().
- * Otherwise, we could get
- *
- * attr(printf(1, 2))
- * => attr__(__builtin_printf(1, 2), none, none)
- * => attr____builtin_printf(1, 2)
- * => error
- */
-#define attr__(a1, a2, a3, a4, a5, a6, a7, a8, a9, none, ...) \
- a1 \
- attr_##a2 \
- attr_##a3 \
- attr_##a4 \
- attr_##a5 \
- attr_##a6 \
- attr_##a7 \
- attr_##a8 \
- attr_##a9 \
- attr_too_many_##none(__VA_ARGS__)
-
-// Ignore `attr_none` from expanding 1-9 argument attr(a1, a2, ...)
-#define attr_none
-// Ignore `attr_` from expanding 0-argument attr()
-#define attr_
-// Only trigger an error on more than 9 arguments
-#define attr_too_many_none(...)
-
#endif // BFS_PRELUDE_H
diff --git a/src/printf.c b/src/printf.c
index 6b07c54..d09d1ec 100644
--- a/src/printf.c
+++ b/src/printf.c
@@ -89,7 +89,7 @@ static bool should_color(CFILE *cfile, const struct bfs_fmt *fmt) {
(void)ret
/** Return a dynamic format string. */
-attr(format_arg(2))
+_format_arg(2)
static const char *dyn_fmt(const char *str, const char *fake) {
bfs_assert(strcmp(str + strlen(str) - strlen(fake) + 1, fake + 1) == 0,
"Mismatched format specifiers: '%s' vs. '%s'", str, fake);
@@ -97,7 +97,7 @@ static const char *dyn_fmt(const char *str, const char *fake) {
}
/** Wrapper for fprintf(). */
-attr(printf(3, 4))
+_printf(3, 4)
static int bfs_fprintf(CFILE *cfile, const struct bfs_fmt *fmt, const char *fake, ...) {
va_list args;
va_start(args, fake);
@@ -560,7 +560,7 @@ static int bfs_printf_Y(CFILE *cfile, const struct bfs_fmt *fmt, const struct BF
}
/** %Z: SELinux context */
-attr(maybe_unused)
+_maybe_unused
static int bfs_printf_Z(CFILE *cfile, const struct bfs_fmt *fmt, const struct BFTW *ftwbuf) {
char *con = bfs_getfilecon(ftwbuf);
if (!con) {
diff --git a/src/sighook.c b/src/sighook.c
index ea58a0c..1b3bc43 100644
--- a/src/sighook.c
+++ b/src/sighook.c
@@ -366,7 +366,8 @@ static bool is_fatal(int sig) {
}
/** Reraise a fatal signal. */
-static noreturn void reraise(int sig) {
+_noreturn
+static void reraise(int sig) {
// Restore the default signal action
if (signal(sig, SIG_DFL) == SIG_ERR) {
goto fail;
diff --git a/src/trie.c b/src/trie.c
index cc5db09..e1c9f26 100644
--- a/src/trie.c
+++ b/src/trie.c
@@ -93,9 +93,9 @@
bfs_static_assert(CHAR_WIDTH == 8);
#if __i386__ || __x86_64__
-# define trie_clones attr(target_clones("popcnt", "default"))
+# define _trie_clones _target_clones("popcnt", "default")
#else
-# define trie_clones
+# define _trie_clones
#endif
/** Number of bits for the sparse array bitmap, aka the range of a nibble. */
@@ -190,7 +190,7 @@ static unsigned char trie_key_nibble(const void *key, size_t offset) {
* that case, the first mismatch between the key and the representative will be
* the depth at which to make a new branch to insert the key.
*/
-trie_clones
+_trie_clones
static struct trie_leaf *trie_representative(const struct trie *trie, const void *key, size_t length) {
uintptr_t ptr = trie->root;
if (!ptr) {
@@ -221,7 +221,7 @@ struct trie_leaf *trie_find_str(const struct trie *trie, const char *key) {
return trie_find_mem(trie, key, strlen(key) + 1);
}
-trie_clones
+_trie_clones
static struct trie_leaf *trie_find_mem_impl(const struct trie *trie, const void *key, size_t length) {
struct trie_leaf *rep = trie_representative(trie, key, length);
if (rep && rep->length == length && memcmp(rep->key, key, length) == 0) {
@@ -235,7 +235,7 @@ struct trie_leaf *trie_find_mem(const struct trie *trie, const void *key, size_t
return trie_find_mem_impl(trie, key, length);
}
-trie_clones
+_trie_clones
static struct trie_leaf *trie_find_postfix_impl(const struct trie *trie, const char *key) {
size_t length = strlen(key);
struct trie_leaf *rep = trie_representative(trie, key, length + 1);
@@ -280,7 +280,7 @@ static bool trie_check_prefix(struct trie_leaf *leaf, size_t skip, const char *k
}
}
-trie_clones
+_trie_clones
static struct trie_leaf *trie_find_prefix_impl(const struct trie *trie, const char *key) {
uintptr_t ptr = trie->root;
if (!ptr) {
@@ -438,7 +438,7 @@ static size_t trie_mismatch(const struct trie_leaf *rep, const void *key, size_t
* | Z
* +--->...
*/
-trie_clones
+_trie_clones
static struct trie_leaf *trie_node_insert(struct trie *trie, uintptr_t *ptr, struct trie_leaf *leaf, unsigned char nibble) {
struct trie_node *node = trie_decode_node(*ptr);
unsigned int size = count_ones(node->bitmap);
@@ -561,7 +561,7 @@ struct trie_leaf *trie_insert_str(struct trie *trie, const char *key) {
return trie_insert_mem(trie, key, strlen(key) + 1);
}
-trie_clones
+_trie_clones
static struct trie_leaf *trie_insert_mem_impl(struct trie *trie, const void *key, size_t length) {
struct trie_leaf *rep = trie_representative(trie, key, length);
size_t mismatch = trie_mismatch(rep, key, length);
@@ -663,7 +663,7 @@ static int trie_collapse_node(struct trie *trie, uintptr_t *parent, struct trie_
return 0;
}
-trie_clones
+_trie_clones
static void trie_remove_impl(struct trie *trie, struct trie_leaf *leaf) {
uintptr_t *child = &trie->root;
uintptr_t *parent = NULL;
diff --git a/src/xspawn.c b/src/xspawn.c
index 8e6a727..30c9c40 100644
--- a/src/xspawn.c
+++ b/src/xspawn.c
@@ -103,7 +103,7 @@ int bfs_spawn_destroy(struct bfs_spawn *ctx) {
#if _POSIX_SPAWN > 0
/** Set some posix_spawnattr flags. */
-attr(maybe_unused)
+_maybe_unused
static int bfs_spawn_addflags(struct bfs_spawn *ctx, short flags) {
short prev;
errno = posix_spawnattr_getflags(&ctx->attr, &prev);
@@ -519,7 +519,8 @@ static bool bfs_use_posix_spawn(const struct bfs_resolver *res, const struct bfs
#endif // _POSIX_SPAWN > 0
/** Actually exec() the new process. */
-static noreturn void bfs_spawn_exec(struct bfs_resolver *res, const struct bfs_spawn *ctx, char **argv, char **envp, int pipefd[2]) {
+_noreturn
+static void bfs_spawn_exec(struct bfs_resolver *res, const struct bfs_spawn *ctx, char **argv, char **envp, int pipefd[2]) {
xclose(pipefd[0]);
for_slist (const struct bfs_spawn_action, action, ctx) {