From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
To: linux-sparse@vger.kernel.org
Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Subject: [PATCH 03/12] builtin: make eval_sync_compare_and_swap() more generic
Date: Sun, 18 Oct 2020 00:56:24 +0200 [thread overview]
Message-ID: <20201017225633.53274-4-luc.vanoostenryck@gmail.com> (raw)
In-Reply-To: <20201017225633.53274-1-luc.vanoostenryck@gmail.com>
Most __sync_* or __atomic_* builtin functions have one or
more arguments having its real type determined by the first
argument: either the same type (a pointer to an integral type)
or the type of the object it points to.
Currently, only __sync_{bool,val}_compare_and_swap() are handled
but lots of very similar variants would be needed for the others.
So, make it a generic function, able to handle all these builtins.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
builtin.c | 47 +++++++++++++++++++++++++++++++----------------
1 file changed, 31 insertions(+), 16 deletions(-)
diff --git a/builtin.c b/builtin.c
index 0d4cb12cca22..880dd54f647e 100644
--- a/builtin.c
+++ b/builtin.c
@@ -31,6 +31,14 @@
#include "compat/bswap.h"
#include <stdarg.h>
+#define dyntype incomplete_ctype
+static bool is_dynamic_type(struct symbol *t)
+{
+ if (t->type == SYM_NODE)
+ t = t->ctype.base_type;
+ return t == &dyntype;
+}
+
static int evaluate_to_int_const_expr(struct expression *expr)
{
expr->ctype = &int_ctype;
@@ -362,29 +370,32 @@ static struct symbol_op overflow_p_op = {
};
-static int eval_sync_compare_and_swap(struct expression *expr)
+static int eval_atomic_common(struct expression *expr)
{
+ struct symbol *fntype = expr->fn->ctype->ctype.base_type;
struct symbol_list *types = NULL;
struct symbol *ctype = NULL;
+ struct symbol *t;
struct expression *arg;
int n = 0;
- /* the first arg is a pointer type; we'd already verified that */
+ // The number of arguments have already be verified.
+ // The first arg must be a pointer type to an integral type.
+ PREPARE_PTR_LIST(fntype->arguments, t);
FOR_EACH_PTR(expr->args, arg) {
- struct symbol *t = arg->ctype;
+ struct symbol *ptrtype = NULL;
- if (!t)
- return 0;
-
- // 2nd & 3rd args must be a basic integer type or a pointer
- // 1st arg must be a pointer to such a type.
if (++n == 1) {
+ t = arg->ctype;
+ if (!t)
+ return 0;
if (t->type == SYM_NODE)
t = t->ctype.base_type;
if (!t)
return 0;
if (t->type != SYM_PTR)
goto err;
+ ptrtype = t;
t = t->ctype.base_type;
if (!t)
return 0;
@@ -395,11 +406,14 @@ static int eval_sync_compare_and_swap(struct expression *expr)
if (t->type != SYM_PTR && t->ctype.base_type != &int_type)
goto err;
ctype = t;
- add_ptr_list(&types, arg->ctype);
- } else {
- add_ptr_list(&types, ctype);
+ t = ptrtype;
+ } else if (is_dynamic_type(t)) {
+ t = ctype;
}
+ add_ptr_list(&types, t);
+ NEXT_PTR_LIST(t);
} END_FOR_EACH_PTR(arg);
+ FINISH_PTR_LIST(t);
if (!expr->ctype) // __sync_val_compare_and_swap()
expr->ctype = ctype;
@@ -412,9 +426,9 @@ err:
return 0;
}
-static struct symbol_op sync_compare_and_swap_op = {
- .args = args_triadic,
- .evaluate = eval_sync_compare_and_swap,
+static struct symbol_op atomic_op = {
+ .args = args_prototype,
+ .evaluate = eval_atomic_common,
};
@@ -464,6 +478,7 @@ static void declare_builtins(int stream, const struct builtin_fn tbl[])
static const struct builtin_fn builtins_common[] = {
#define size_t_ctype &size_t_alias
#define va_list_ctype &ptr_ctype
+#define vol_ptr &volatile_ptr_ctype
{ "__builtin_choose_expr", NULL, 1, .op = &choose_op },
{ "__builtin_constant_p", NULL, 1, .op = &constant_p_op },
{ "__builtin_expect", &long_ctype, 0, { &long_ctype ,&long_ctype }, .op = &expect_op },
@@ -614,7 +629,7 @@ static const struct builtin_fn builtins_common[] = {
{ "__sync_add_and_fetch", &int_ctype, 1, { &ptr_ctype }},
{ "__sync_and_and_fetch", &int_ctype, 1, { &ptr_ctype }},
- { "__sync_bool_compare_and_swap", &bool_ctype, 1, { &ptr_ctype }, .op = &sync_compare_and_swap_op},
+ { "__sync_bool_compare_and_swap", &bool_ctype, 1, { vol_ptr, &dyntype, &dyntype }, .op = &atomic_op},
{ "__sync_fetch_and_add", &int_ctype, 1, { &ptr_ctype }},
{ "__sync_fetch_and_and", &int_ctype, 1, { &ptr_ctype }},
{ "__sync_fetch_and_nand", &int_ctype, 1, { &ptr_ctype }},
@@ -627,7 +642,7 @@ static const struct builtin_fn builtins_common[] = {
{ "__sync_or_and_fetch", &int_ctype, 1, { &ptr_ctype }},
{ "__sync_sub_and_fetch", &int_ctype, 1, { &ptr_ctype }},
{ "__sync_synchronize", &void_ctype, 0 },
- { "__sync_val_compare_and_swap", NULL, 1, { &ptr_ctype }, .op = &sync_compare_and_swap_op },
+ { "__sync_val_compare_and_swap", NULL, 1, { vol_ptr, &dyntype, &dyntype }, .op = &atomic_op },
{ "__sync_xor_and_fetch", &int_ctype, 1, { &ptr_ctype }},
{ }
--
2.28.0
next prev parent reply other threads:[~2020-10-17 22:56 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-17 22:56 [PATCH 00/12] fix and complete the evaluation of atomic builtins Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 01/12] builtin: add generic .args method Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 02/12] builtin: add builtin type for volatile void * Luc Van Oostenryck
2020-10-17 22:56 ` Luc Van Oostenryck [this message]
2020-10-18 21:31 ` [PATCH 03/12] builtin: make eval_sync_compare_and_swap() more generic Ramsay Jones
2020-10-19 4:59 ` Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 04/12] builtin: evaluate __sync_*_fetch*() Luc Van Oostenryck
2020-10-18 23:59 ` Ramsay Jones
2020-10-19 4:44 ` Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 05/12] builtin: fix evaluation of __sync_lock_release Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 06/12] builtin: __sync_synchronize() too is variadic Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 07/12] builtin: add predefines for __ATOMIC_RELAXED & friends Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 08/12] builtin: add support for __atomic_add_fetch(), Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 09/12] builtin: add support for others generic atomic builtins Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 10/12] builtin: add builtin type: [volatile] pointer to bool Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 11/12] builtin: add support for __atomic_clear() Luc Van Oostenryck
2020-10-17 22:56 ` [PATCH 12/12] builtin: add support for remaining atomic builtins Luc Van Oostenryck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201017225633.53274-4-luc.vanoostenryck@gmail.com \
--to=luc.vanoostenryck@gmail.com \
--cc=linux-sparse@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).