* [PATCH v2 0/7] restricted pointers
@ 2017-11-08 21:06 Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 1/7] remove never-used MOD_TYPEDEF Luc Van Oostenryck
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: Luc Van Oostenryck @ 2017-11-08 21:06 UTC (permalink / raw)
To: linux-sparse; +Cc: Luc Van Oostenryck
The goal of this series is to prepare for a real support
for C99's 'restrict' type qualifier.
As preliminary steps this series also contains a
cleanup of the #define MOD_XYZ and as bonus it teaches
sparse about C11's '_Atomic' as type *qualifier*
Change since v1:
- remove patches related to error vs. warnings which
have already been integrated.
- improve commit messages
This series is available for review & testing at:
git://github.com/lucvoo/sparse.git restricted-pointers-v2
Luc Van Oostenryck (7):
remove never-used MOD_TYPEDEF
MOD_ACCESSED is not a type modifier ...
reorganize the definition of the modifiers
remove redundancy in MOD_STORAGE
define MOD_QUALIFIER for (MOD_CONST | MOD_VOLATILE)
associate MOD_RESTRICT with restrict-qualified variables
add support for C11's _Atomic as type qualifier
evaluate.c | 2 +-
expand.c | 2 +-
gdbhelpers | 12 +++---
ident-list.h | 2 +-
parse.c | 31 ++++++++++++---
show-parse.c | 4 +-
symbol.c | 4 +-
symbol.h | 80 ++++++++++++++++++-------------------
validation/c11-atomic.c | 93 ++++++++++++++++++++++++++++++++++++++++++++
validation/optim/restrict.c | 73 ++++++++++++++++++++++++++++++++++
validation/reload-aliasing.c | 41 +++++++++++++++++++
validation/restrict.c | 93 ++++++++++++++++++++++++++++++++++++++++++++
validation/typeof-mods.c | 28 +++++++++++++
13 files changed, 406 insertions(+), 59 deletions(-)
create mode 100644 validation/c11-atomic.c
create mode 100644 validation/optim/restrict.c
create mode 100644 validation/reload-aliasing.c
create mode 100644 validation/restrict.c
--
2.14.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/7] remove never-used MOD_TYPEDEF
2017-11-08 21:06 [PATCH v2 0/7] restricted pointers Luc Van Oostenryck
@ 2017-11-08 21:06 ` Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 2/7] MOD_ACCESSED is not a type modifier Luc Van Oostenryck
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Luc Van Oostenryck @ 2017-11-08 21:06 UTC (permalink / raw)
To: linux-sparse; +Cc: Luc Van Oostenryck
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
gdbhelpers | 3 ---
show-parse.c | 1 -
symbol.h | 2 --
3 files changed, 6 deletions(-)
diff --git a/gdbhelpers b/gdbhelpers
index 86347863a..87ab5b8e9 100644
--- a/gdbhelpers
+++ b/gdbhelpers
@@ -128,9 +128,6 @@ define gdb_show_ctype
if ($arg0->modifiers & MOD_LONGLONGLONG)
printf "MOD_LONGLONGLONG "
end
- if ($arg0->modifiers & MOD_TYPEDEF)
- printf "MOD_TYPEDEF "
- end
if ($arg0->modifiers & MOD_INLINE)
printf "MOD_INLINE "
end
diff --git a/show-parse.c b/show-parse.c
index d365d737f..2adeae961 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -132,7 +132,6 @@ const char *modifier_string(unsigned long mod)
{MOD_LONG, "[long]"},
{MOD_LONGLONG, "[long long]"},
{MOD_LONGLONGLONG, "[long long long]"},
- {MOD_TYPEDEF, "[typedef]"},
{MOD_TLS, "[tls]"},
{MOD_INLINE, "inline"},
{MOD_ADDRESSABLE, "[addressable]"},
diff --git a/symbol.h b/symbol.h
index 327449611..2c57d56e7 100644
--- a/symbol.h
+++ b/symbol.h
@@ -216,8 +216,6 @@ struct symbol {
#define MOD_LONGLONGLONG 0x1000
#define MOD_PURE 0x2000
-#define MOD_TYPEDEF 0x10000
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/7] MOD_ACCESSED is not a type modifier ...
2017-11-08 21:06 [PATCH v2 0/7] restricted pointers Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 1/7] remove never-used MOD_TYPEDEF Luc Van Oostenryck
@ 2017-11-08 21:06 ` Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 3/7] reorganize the definition of the modifiers Luc Van Oostenryck
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Luc Van Oostenryck @ 2017-11-08 21:06 UTC (permalink / raw)
To: linux-sparse; +Cc: Luc Van Oostenryck
but is used to track which inline functions are
effectively used. So better remove it from the MOD_...
and implement the same functionality via a flag
in struct symbol.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
gdbhelpers | 3 ---
parse.c | 2 +-
show-parse.c | 1 -
symbol.c | 4 ++--
symbol.h | 4 ++--
5 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/gdbhelpers b/gdbhelpers
index 87ab5b8e9..3d1148a87 100644
--- a/gdbhelpers
+++ b/gdbhelpers
@@ -140,9 +140,6 @@ define gdb_show_ctype
if ($arg0->modifiers & MOD_NODEREF)
printf "MOD_NODEREF "
end
- if ($arg0->modifiers & MOD_ACCESSED)
- printf "MOD_ACCESSED "
- end
if ($arg0->modifiers & MOD_TOPLEVEL)
printf "MOD_TOPLEVEL "
end
diff --git a/parse.c b/parse.c
index 214547904..b7917ca05 100644
--- a/parse.c
+++ b/parse.c
@@ -2184,7 +2184,7 @@ static struct statement *start_function(struct symbol *sym)
start_function_scope();
ret = alloc_symbol(sym->pos, SYM_NODE);
ret->ctype = sym->ctype.base_type->ctype;
- ret->ctype.modifiers &= ~(MOD_STORAGE | MOD_CONST | MOD_VOLATILE | MOD_TLS | MOD_INLINE | MOD_ADDRESSABLE | MOD_NOCAST | MOD_NODEREF | MOD_ACCESSED | MOD_TOPLEVEL);
+ ret->ctype.modifiers &= ~(MOD_STORAGE | MOD_CONST | MOD_VOLATILE | MOD_TLS | MOD_INLINE | MOD_ADDRESSABLE | MOD_NOCAST | MOD_NODEREF | MOD_TOPLEVEL);
ret->ctype.modifiers |= (MOD_AUTO | MOD_REGISTER);
bind_symbol(ret, &return_ident, NS_ITERATOR);
stmt->ret = ret;
diff --git a/show-parse.c b/show-parse.c
index 2adeae961..3364aec5e 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -137,7 +137,6 @@ const char *modifier_string(unsigned long mod)
{MOD_ADDRESSABLE, "[addressable]"},
{MOD_NOCAST, "[nocast]"},
{MOD_NODEREF, "[noderef]"},
- {MOD_ACCESSED, "[accessed]"},
{MOD_TOPLEVEL, "[toplevel]"},
{MOD_ASSIGNED, "[assigned]"},
{MOD_TYPE, "[type]"},
diff --git a/symbol.c b/symbol.c
index 08c85f40e..2e7fcf16e 100644
--- a/symbol.c
+++ b/symbol.c
@@ -48,9 +48,9 @@ struct symbol_list *translation_unit_used_list = NULL;
void access_symbol(struct symbol *sym)
{
if (sym->ctype.modifiers & MOD_INLINE) {
- if (!(sym->ctype.modifiers & MOD_ACCESSED)) {
+ if (!sym->accessed) {
add_symbol(&translation_unit_used_list, sym);
- sym->ctype.modifiers |= MOD_ACCESSED;
+ sym->accessed = 1;
}
}
}
diff --git a/symbol.h b/symbol.h
index 2c57d56e7..e8a596ba2 100644
--- a/symbol.h
+++ b/symbol.h
@@ -173,6 +173,7 @@ struct symbol {
string:1,
designated_init:1,
forced_arg:1,
+ accessed:1,
transparent_union:1;
struct expression *array_size;
struct ctype ctype;
@@ -222,7 +223,6 @@ struct symbol {
#define MOD_NOCAST 0x100000
#define MOD_NODEREF 0x200000
-#define MOD_ACCESSED 0x400000
#define MOD_TOPLEVEL 0x800000 // scoping..
#define MOD_ASSIGNED 0x2000000
@@ -242,7 +242,7 @@ struct symbol {
#define MOD_SPECIFIER (MOD_CHAR | MOD_SHORT | MOD_LONG_ALL | MOD_SIGNEDNESS)
#define MOD_SIZE (MOD_CHAR | MOD_SHORT | MOD_LONG_ALL)
#define MOD_IGNORE (MOD_TOPLEVEL | MOD_STORAGE | MOD_ADDRESSABLE | \
- MOD_ASSIGNED | MOD_USERTYPE | MOD_ACCESSED | MOD_EXPLICITLY_SIGNED)
+ MOD_ASSIGNED | MOD_USERTYPE | MOD_EXPLICITLY_SIGNED)
#define MOD_PTRINHERIT (MOD_VOLATILE | MOD_CONST | MOD_NODEREF | MOD_NORETURN | MOD_NOCAST)
/* modifiers preserved by typeof() operator */
#define MOD_TYPEOF (MOD_VOLATILE | MOD_CONST | MOD_NOCAST | MOD_SPECIFIER)
--
2.14.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/7] reorganize the definition of the modifiers
2017-11-08 21:06 [PATCH v2 0/7] restricted pointers Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 1/7] remove never-used MOD_TYPEDEF Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 2/7] MOD_ACCESSED is not a type modifier Luc Van Oostenryck
@ 2017-11-08 21:06 ` Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 4/7] remove redundancy in MOD_STORAGE Luc Van Oostenryck
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Luc Van Oostenryck @ 2017-11-08 21:06 UTC (permalink / raw)
To: linux-sparse; +Cc: Luc Van Oostenryck
Now they are grouped a bit more logically.
Note: MOD_ASSIGNED & MOD_ADDRESSABLE are not type modifiers
but properties of the symbol. As such they should be
moved to struct symbol. However, as they should be
correctly propagated to the symbol components if any,
better to leave them as is.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
symbol.h | 65 ++++++++++++++++++++++++++++++++--------------------------------
1 file changed, 32 insertions(+), 33 deletions(-)
diff --git a/symbol.h b/symbol.h
index e8a596ba2..fdecbc548 100644
--- a/symbol.h
+++ b/symbol.h
@@ -200,39 +200,38 @@ struct symbol {
};
/* Modifiers */
-#define MOD_AUTO 0x0001
-#define MOD_REGISTER 0x0002
-#define MOD_STATIC 0x0004
-#define MOD_EXTERN 0x0008
-
-#define MOD_CONST 0x0010
-#define MOD_VOLATILE 0x0020
-#define MOD_SIGNED 0x0040
-#define MOD_UNSIGNED 0x0080
-
-#define MOD_CHAR 0x0100
-#define MOD_SHORT 0x0200
-#define MOD_LONG 0x0400
-#define MOD_LONGLONG 0x0800
-#define MOD_LONGLONGLONG 0x1000
-#define MOD_PURE 0x2000
-
-#define MOD_TLS 0x20000
-#define MOD_INLINE 0x40000
-#define MOD_ADDRESSABLE 0x80000
-
-#define MOD_NOCAST 0x100000
-#define MOD_NODEREF 0x200000
-#define MOD_TOPLEVEL 0x800000 // scoping..
-
-#define MOD_ASSIGNED 0x2000000
-#define MOD_TYPE 0x4000000
-#define MOD_SAFE 0x8000000 // non-null/non-trapping pointer
-
-#define MOD_USERTYPE 0x10000000
-#define MOD_NORETURN 0x20000000
-#define MOD_EXPLICITLY_SIGNED 0x40000000
-#define MOD_BITWISE 0x80000000
+#define MOD_AUTO 0x00000001
+#define MOD_REGISTER 0x00000002
+#define MOD_STATIC 0x00000004
+#define MOD_EXTERN 0x00000008
+#define MOD_TOPLEVEL 0x00000010 // scoping..
+#define MOD_TLS 0x00000020
+#define MOD_INLINE 0x00000040
+
+#define MOD_ASSIGNED 0x00000080
+#define MOD_ADDRESSABLE 0x00000100
+
+#define MOD_CONST 0x00000200
+#define MOD_VOLATILE 0x00000400
+
+#define MOD_SIGNED 0x00002000
+#define MOD_UNSIGNED 0x00004000
+#define MOD_EXPLICITLY_SIGNED 0x00008000
+
+#define MOD_TYPE 0x00010000
+#define MOD_USERTYPE 0x00020000
+#define MOD_CHAR 0x00040000
+#define MOD_SHORT 0x00080000
+#define MOD_LONG 0x00100000
+#define MOD_LONGLONG 0x00200000
+#define MOD_LONGLONGLONG 0x00400000
+
+#define MOD_SAFE 0x00800000 // non-null/non-trapping pointer
+#define MOD_PURE 0x01000000
+#define MOD_BITWISE 0x02000000
+#define MOD_NOCAST 0x04000000
+#define MOD_NODEREF 0x08000000
+#define MOD_NORETURN 0x10000000
#define MOD_NONLOCAL (MOD_EXTERN | MOD_TOPLEVEL)
--
2.14.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 4/7] remove redundancy in MOD_STORAGE
2017-11-08 21:06 [PATCH v2 0/7] restricted pointers Luc Van Oostenryck
` (2 preceding siblings ...)
2017-11-08 21:06 ` [PATCH v2 3/7] reorganize the definition of the modifiers Luc Van Oostenryck
@ 2017-11-08 21:06 ` Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 5/7] define MOD_QUALIFIER for (MOD_CONST | MOD_VOLATILE) Luc Van Oostenryck
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Luc Van Oostenryck @ 2017-11-08 21:06 UTC (permalink / raw)
To: linux-sparse; +Cc: Luc Van Oostenryck
MOD_TOPLEVEL & MOD_INLINE are already include in MOD_STORAGE
so there is no need to repeat them in MOD_IGNORE & elsewhere
where MOD_STORAGE is used.
Change this by removing the redundant MOD_TOPLEVEL & MOD_INLINE.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
parse.c | 2 +-
symbol.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/parse.c b/parse.c
index b7917ca05..e7e112847 100644
--- a/parse.c
+++ b/parse.c
@@ -2184,7 +2184,7 @@ static struct statement *start_function(struct symbol *sym)
start_function_scope();
ret = alloc_symbol(sym->pos, SYM_NODE);
ret->ctype = sym->ctype.base_type->ctype;
- ret->ctype.modifiers &= ~(MOD_STORAGE | MOD_CONST | MOD_VOLATILE | MOD_TLS | MOD_INLINE | MOD_ADDRESSABLE | MOD_NOCAST | MOD_NODEREF | MOD_TOPLEVEL);
+ ret->ctype.modifiers &= ~(MOD_STORAGE | MOD_CONST | MOD_VOLATILE | MOD_TLS | MOD_ADDRESSABLE | MOD_NOCAST | MOD_NODEREF);
ret->ctype.modifiers |= (MOD_AUTO | MOD_REGISTER);
bind_symbol(ret, &return_ident, NS_ITERATOR);
stmt->ret = ret;
diff --git a/symbol.h b/symbol.h
index fdecbc548..d33afc97d 100644
--- a/symbol.h
+++ b/symbol.h
@@ -240,7 +240,7 @@ struct symbol {
#define MOD_LONG_ALL (MOD_LONG | MOD_LONGLONG | MOD_LONGLONGLONG)
#define MOD_SPECIFIER (MOD_CHAR | MOD_SHORT | MOD_LONG_ALL | MOD_SIGNEDNESS)
#define MOD_SIZE (MOD_CHAR | MOD_SHORT | MOD_LONG_ALL)
-#define MOD_IGNORE (MOD_TOPLEVEL | MOD_STORAGE | MOD_ADDRESSABLE | \
+#define MOD_IGNORE (MOD_STORAGE | MOD_ADDRESSABLE | \
MOD_ASSIGNED | MOD_USERTYPE | MOD_EXPLICITLY_SIGNED)
#define MOD_PTRINHERIT (MOD_VOLATILE | MOD_CONST | MOD_NODEREF | MOD_NORETURN | MOD_NOCAST)
/* modifiers preserved by typeof() operator */
--
2.14.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 5/7] define MOD_QUALIFIER for (MOD_CONST | MOD_VOLATILE)
2017-11-08 21:06 [PATCH v2 0/7] restricted pointers Luc Van Oostenryck
` (3 preceding siblings ...)
2017-11-08 21:06 ` [PATCH v2 4/7] remove redundancy in MOD_STORAGE Luc Van Oostenryck
@ 2017-11-08 21:06 ` Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 6/7] associate MOD_RESTRICT with restrict-qualified variables Luc Van Oostenryck
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Luc Van Oostenryck @ 2017-11-08 21:06 UTC (permalink / raw)
To: linux-sparse; +Cc: Luc Van Oostenryck
This is slightly shorter (and thus may avoid long lines) and
facilitate the introduction of MOD_RETRICT in a later patch.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
evaluate.c | 2 +-
expand.c | 2 +-
parse.c | 2 +-
symbol.h | 5 +++--
4 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/evaluate.c b/evaluate.c
index cf3cf244d..cfe53f747 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -627,7 +627,7 @@ static struct symbol *evaluate_ptr_add(struct expression *expr, struct symbol *i
static void examine_fn_arguments(struct symbol *fn);
-#define MOD_IGN (MOD_VOLATILE | MOD_CONST | MOD_PURE)
+#define MOD_IGN (MOD_QUALIFIER | MOD_PURE)
const char *type_difference(struct ctype *c1, struct ctype *c2,
unsigned long mod1, unsigned long mod2)
diff --git a/expand.c b/expand.c
index 5f908c971..60986b3ff 100644
--- a/expand.c
+++ b/expand.c
@@ -478,7 +478,7 @@ static int expand_comma(struct expression *expr)
return cost;
}
-#define MOD_IGN (MOD_VOLATILE | MOD_CONST)
+#define MOD_IGN (MOD_QUALIFIER)
static int compare_types(int op, struct symbol *left, struct symbol *right)
{
diff --git a/parse.c b/parse.c
index e7e112847..c6dccfbd8 100644
--- a/parse.c
+++ b/parse.c
@@ -2184,7 +2184,7 @@ static struct statement *start_function(struct symbol *sym)
start_function_scope();
ret = alloc_symbol(sym->pos, SYM_NODE);
ret->ctype = sym->ctype.base_type->ctype;
- ret->ctype.modifiers &= ~(MOD_STORAGE | MOD_CONST | MOD_VOLATILE | MOD_TLS | MOD_ADDRESSABLE | MOD_NOCAST | MOD_NODEREF);
+ ret->ctype.modifiers &= ~(MOD_STORAGE | MOD_QUALIFIER | MOD_TLS | MOD_ADDRESSABLE | MOD_NOCAST | MOD_NODEREF);
ret->ctype.modifiers |= (MOD_AUTO | MOD_REGISTER);
bind_symbol(ret, &return_ident, NS_ITERATOR);
stmt->ret = ret;
diff --git a/symbol.h b/symbol.h
index d33afc97d..994a11a7f 100644
--- a/symbol.h
+++ b/symbol.h
@@ -242,9 +242,10 @@ struct symbol {
#define MOD_SIZE (MOD_CHAR | MOD_SHORT | MOD_LONG_ALL)
#define MOD_IGNORE (MOD_STORAGE | MOD_ADDRESSABLE | \
MOD_ASSIGNED | MOD_USERTYPE | MOD_EXPLICITLY_SIGNED)
-#define MOD_PTRINHERIT (MOD_VOLATILE | MOD_CONST | MOD_NODEREF | MOD_NORETURN | MOD_NOCAST)
+#define MOD_QUALIFIER (MOD_CONST | MOD_VOLATILE)
+#define MOD_PTRINHERIT (MOD_QUALIFIER | MOD_NODEREF | MOD_NORETURN | MOD_NOCAST)
/* modifiers preserved by typeof() operator */
-#define MOD_TYPEOF (MOD_VOLATILE | MOD_CONST | MOD_NOCAST | MOD_SPECIFIER)
+#define MOD_TYPEOF (MOD_QUALIFIER | MOD_NOCAST | MOD_SPECIFIER)
/* Current parsing/evaluation function */
--
2.14.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 6/7] associate MOD_RESTRICT with restrict-qualified variables
2017-11-08 21:06 [PATCH v2 0/7] restricted pointers Luc Van Oostenryck
` (4 preceding siblings ...)
2017-11-08 21:06 ` [PATCH v2 5/7] define MOD_QUALIFIER for (MOD_CONST | MOD_VOLATILE) Luc Van Oostenryck
@ 2017-11-08 21:06 ` Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 7/7] add support for C11's _Atomic as type qualifier Luc Van Oostenryck
2017-11-09 18:55 ` [PATCH v2 0/7] restricted pointers Christopher Li
7 siblings, 0 replies; 9+ messages in thread
From: Luc Van Oostenryck @ 2017-11-08 21:06 UTC (permalink / raw)
To: linux-sparse; +Cc: Luc Van Oostenryck
Note: there is still no semantic associated with 'restrict'
but this is a preparatory step.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
gdbhelpers | 3 ++
parse.c | 16 +++++---
show-parse.c | 1 +
symbol.h | 3 +-
validation/optim/restrict.c | 73 ++++++++++++++++++++++++++++++++++
validation/reload-aliasing.c | 41 +++++++++++++++++++
validation/restrict.c | 93 ++++++++++++++++++++++++++++++++++++++++++++
validation/typeof-mods.c | 14 +++++++
8 files changed, 238 insertions(+), 6 deletions(-)
create mode 100644 validation/optim/restrict.c
create mode 100644 validation/reload-aliasing.c
create mode 100644 validation/restrict.c
diff --git a/gdbhelpers b/gdbhelpers
index 3d1148a87..f6399d3bc 100644
--- a/gdbhelpers
+++ b/gdbhelpers
@@ -107,6 +107,9 @@ define gdb_show_ctype
if ($arg0->modifiers & MOD_VOLATILE)
printf "MOD_VOLATILE "
end
+ if ($arg0->modifiers & MOD_RESTRICT)
+ printf "MOD_RESTRICT "
+ end
if ($arg0->modifiers & MOD_SIGNED)
printf "MOD_SIGNED "
end
diff --git a/parse.c b/parse.c
index c6dccfbd8..e6b40fc3f 100644
--- a/parse.c
+++ b/parse.c
@@ -58,6 +58,7 @@ static declarator_t
typedef_specifier, inline_specifier, auto_specifier,
register_specifier, static_specifier, extern_specifier,
thread_specifier, const_qualifier, volatile_qualifier;
+static declarator_t restrict_qualifier;
static struct token *parse_if_statement(struct token *token, struct statement *stmt);
static struct token *parse_return_statement(struct token *token, struct statement *stmt);
@@ -174,6 +175,7 @@ static struct symbol_op volatile_op = {
static struct symbol_op restrict_op = {
.type = KW_QUALIFIER,
+ .declarator = restrict_qualifier,
};
static struct symbol_op typeof_op = {
@@ -422,6 +424,9 @@ static struct init_keyword {
{ "volatile", NS_TYPEDEF, .op = &volatile_op },
{ "__volatile", NS_TYPEDEF, .op = &volatile_op },
{ "__volatile__", NS_TYPEDEF, .op = &volatile_op },
+ { "restrict", NS_TYPEDEF, .op = &restrict_op},
+ { "__restrict", NS_TYPEDEF, .op = &restrict_op},
+ { "__restrict__", NS_TYPEDEF, .op = &restrict_op},
/* Typedef.. */
{ "typedef", NS_TYPEDEF, .op = &typedef_op },
@@ -467,11 +472,6 @@ static struct init_keyword {
{ "_Alignas", NS_TYPEDEF, .op = &alignas_op },
- /* Ignored for now.. */
- { "restrict", NS_TYPEDEF, .op = &restrict_op},
- { "__restrict", NS_TYPEDEF, .op = &restrict_op},
- { "__restrict__", NS_TYPEDEF, .op = &restrict_op},
-
/* Static assertion */
{ "_Static_assert", NS_KEYWORD, .op = &static_assert_op },
@@ -1467,6 +1467,12 @@ static struct token *volatile_qualifier(struct token *next, struct decl_state *c
return next;
}
+static struct token *restrict_qualifier(struct token *next, struct decl_state *ctx)
+{
+ apply_qualifier(&next->pos, &ctx->ctype, MOD_RESTRICT);
+ return next;
+}
+
static void apply_ctype(struct position pos, struct ctype *thistype, struct ctype *ctype)
{
unsigned long mod = thistype->modifiers;
diff --git a/show-parse.c b/show-parse.c
index 3364aec5e..825db6921 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -125,6 +125,7 @@ const char *modifier_string(unsigned long mod)
{MOD_EXTERN, "extern"},
{MOD_CONST, "const"},
{MOD_VOLATILE, "volatile"},
+ {MOD_RESTRICT, "restrict"},
{MOD_SIGNED, "[signed]"},
{MOD_UNSIGNED, "[unsigned]"},
{MOD_CHAR, "[char]"},
diff --git a/symbol.h b/symbol.h
index 994a11a7f..1e7eefd74 100644
--- a/symbol.h
+++ b/symbol.h
@@ -213,6 +213,7 @@ struct symbol {
#define MOD_CONST 0x00000200
#define MOD_VOLATILE 0x00000400
+#define MOD_RESTRICT 0x00000800
#define MOD_SIGNED 0x00002000
#define MOD_UNSIGNED 0x00004000
@@ -242,7 +243,7 @@ struct symbol {
#define MOD_SIZE (MOD_CHAR | MOD_SHORT | MOD_LONG_ALL)
#define MOD_IGNORE (MOD_STORAGE | MOD_ADDRESSABLE | \
MOD_ASSIGNED | MOD_USERTYPE | MOD_EXPLICITLY_SIGNED)
-#define MOD_QUALIFIER (MOD_CONST | MOD_VOLATILE)
+#define MOD_QUALIFIER (MOD_CONST | MOD_VOLATILE | MOD_RESTRICT)
#define MOD_PTRINHERIT (MOD_QUALIFIER | MOD_NODEREF | MOD_NORETURN | MOD_NOCAST)
/* modifiers preserved by typeof() operator */
#define MOD_TYPEOF (MOD_QUALIFIER | MOD_NOCAST | MOD_SPECIFIER)
diff --git a/validation/optim/restrict.c b/validation/optim/restrict.c
new file mode 100644
index 000000000..de6289e2b
--- /dev/null
+++ b/validation/optim/restrict.c
@@ -0,0 +1,73 @@
+extern int g, h;
+
+void f00u(int *s)
+{
+ g = *s;
+ h = *s;
+}
+
+void f00r(int *restrict s)
+{
+ g = *s;
+ h = *s;
+}
+
+
+void f01u(int *a, int *b, int *s)
+{
+ *a = *s;
+ *b = *s;
+}
+
+void f01r(int *restrict a, int *restrict b, int *restrict s)
+{
+ *a = *s;
+ *b = *s;
+}
+
+/*
+ * check-name: optim/restrict
+ * check-command: test-linearize -Wno-decl $file
+ * check-known-to-fail
+ *
+ * check-output-start
+f00u:
+.L0:
+ <entry-point>
+ load.32 %r2 <- 0[%arg1]
+ store.32 %r2 -> 0[g]
+ load.32 %r4 <- 0[%arg1]
+ store.32 %r4 -> 0[h]
+ ret
+
+
+f00r:
+.L2:
+ <entry-point>
+ load.32 %r6 <- 0[%arg1]
+ store.32 %r6 -> 0[g]
+ store.32 %r6 -> 0[h]
+ ret
+
+
+f01u:
+.L4:
+ <entry-point>
+ load.32 %r10 <- 0[%arg3]
+ store.32 %r10 -> 0[%arg1]
+ load.32 %r13 <- 0[%arg3]
+ store.32 %r13 -> 0[%arg2]
+ ret
+
+
+f01r:
+.L6:
+ <entry-point>
+ load.32 %r16 <- 0[%arg3]
+ store.32 %r16 -> 0[%arg1]
+ store.32 %r16 -> 0[%arg2]
+ ret
+
+
+ * check-output-end
+ */
diff --git a/validation/reload-aliasing.c b/validation/reload-aliasing.c
new file mode 100644
index 000000000..3aad317bd
--- /dev/null
+++ b/validation/reload-aliasing.c
@@ -0,0 +1,41 @@
+extern int g, h;
+
+void f00(int *s)
+{
+ g = *s;
+ h = *s;
+}
+
+void f01(int *a, int *b, int *s)
+{
+ *a = *s;
+ *b = *s;
+}
+
+/*
+ * check-name: reload-aliasing.c
+ * check-command: test-linearize -Wno-decl $file
+ *
+ * check-output-start
+f00:
+.L0:
+ <entry-point>
+ load.32 %r2 <- 0[%arg1]
+ store.32 %r2 -> 0[g]
+ load.32 %r4 <- 0[%arg1]
+ store.32 %r4 -> 0[h]
+ ret
+
+
+f01:
+.L2:
+ <entry-point>
+ load.32 %r6 <- 0[%arg3]
+ store.32 %r6 -> 0[%arg1]
+ load.32 %r9 <- 0[%arg3]
+ store.32 %r9 -> 0[%arg2]
+ ret
+
+
+ * check-output-end
+ */
diff --git a/validation/restrict.c b/validation/restrict.c
new file mode 100644
index 000000000..f431f6d0f
--- /dev/null
+++ b/validation/restrict.c
@@ -0,0 +1,93 @@
+void f00(void *restrict dst);
+void f01(void *restrict *dst);
+void f02(void *restrict *dst);
+void f03(void *restrict *dst);
+
+void *restrict rp;
+void * up;
+
+void f00(void *dst) { } /* check-should-pass */
+void f01(typeof(&rp) dst) { } /* check-should-pass */
+void f02(void **dst) { } /* check-should-fail */
+void f03(typeof(&up) dst) { } /* check-should-fail */
+
+void foo(void)
+{
+ rp = up; /* check-should-pass */
+ up = rp; /* check-should-pass */
+}
+
+void ref(void)
+{
+ void *const qp;
+ void * up;
+ extern void *const *pqp;
+ extern void **pup;
+
+ pqp = &qp; /* check-should-pass */
+ pqp = &up; /* check-should-pass */
+ pqp = pup;
+
+ pup = &up; /* check-should-pass */
+
+ pup = &qp; /* check-should-fail */
+ pup = pqp; /* check-should-fail */
+}
+
+void bar(void)
+{
+ extern void *restrict *prp;
+ extern void **pup;
+
+ prp = &rp; /* check-should-pass */
+ prp = &up; /* check-should-pass */
+ prp = pup;
+
+ pup = &up; /* check-should-pass */
+
+ pup = &rp; /* check-should-fail */
+ pup = prp; /* check-should-fail */
+}
+
+void baz(void)
+{
+ extern typeof(&rp) prp;
+ extern typeof(&up) pup;
+
+ prp = &rp; /* check-should-pass */
+ prp = &up; /* check-should-pass */
+ prp = pup;
+
+ pup = &up; /* check-should-pass */
+
+ pup = &rp; /* check-should-fail */
+ pup = prp; /* check-should-fail */
+}
+
+/*
+ * check-name: restrict qualifier
+ * check-command: sparse -Wno-decl $file;
+ *
+ * check-error-start
+restrict.c:11:6: error: symbol 'f02' redeclared with different type (originally declared at restrict.c:3) - incompatible argument 1 (different modifiers)
+restrict.c:12:6: error: symbol 'f03' redeclared with different type (originally declared at restrict.c:4) - incompatible argument 1 (different modifiers)
+restrict.c:33:13: warning: incorrect type in assignment (different modifiers)
+restrict.c:33:13: expected void **extern [assigned] pup
+restrict.c:33:13: got void *const *<noident>
+restrict.c:34:13: warning: incorrect type in assignment (different modifiers)
+restrict.c:34:13: expected void **extern [assigned] pup
+restrict.c:34:13: got void *const *extern [assigned] pqp
+restrict.c:48:13: warning: incorrect type in assignment (different modifiers)
+restrict.c:48:13: expected void **extern [assigned] pup
+restrict.c:48:13: got void *restrict *<noident>
+restrict.c:49:13: warning: incorrect type in assignment (different modifiers)
+restrict.c:49:13: expected void **extern [assigned] pup
+restrict.c:49:13: got void *restrict *extern [assigned] prp
+restrict.c:63:13: warning: incorrect type in assignment (different modifiers)
+restrict.c:63:13: expected void **extern [assigned] pup
+restrict.c:63:13: got void *restrict *<noident>
+restrict.c:64:13: warning: incorrect type in assignment (different modifiers)
+restrict.c:64:13: expected void **extern [assigned] pup
+restrict.c:64:13: got void *restrict *extern [assigned] prp
+ * check-error-end
+ */
diff --git a/validation/typeof-mods.c b/validation/typeof-mods.c
index 9822e96f6..878a111a2 100644
--- a/validation/typeof-mods.c
+++ b/validation/typeof-mods.c
@@ -43,6 +43,20 @@ static void test_volatile(void)
obj = *ptr;
}
+static void test_restrict(void)
+{
+ int *restrict obj, *restrict *ptr;
+ typeof(obj) var = obj;
+ typeof(ptr) ptr2 = ptr;
+ typeof(*ptr) var2 = obj;
+ typeof(*ptr) *ptr3 = ptr;
+ typeof(obj) *ptr4 = ptr;
+ obj = obj;
+ ptr = ptr;
+ ptr = &obj;
+ obj = *ptr;
+}
+
static void test_bitwise(void)
{
typedef int __bitwise type_t;
--
2.14.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 7/7] add support for C11's _Atomic as type qualifier
2017-11-08 21:06 [PATCH v2 0/7] restricted pointers Luc Van Oostenryck
` (5 preceding siblings ...)
2017-11-08 21:06 ` [PATCH v2 6/7] associate MOD_RESTRICT with restrict-qualified variables Luc Van Oostenryck
@ 2017-11-08 21:06 ` Luc Van Oostenryck
2017-11-09 18:55 ` [PATCH v2 0/7] restricted pointers Christopher Li
7 siblings, 0 replies; 9+ messages in thread
From: Luc Van Oostenryck @ 2017-11-08 21:06 UTC (permalink / raw)
To: linux-sparse; +Cc: Luc Van Oostenryck
This only add the parsing and checks as a type qualifier;
there is no operational semantic associated with it.
Note: this only support _Atomic as *type qualifier*, not
as a *type specifier* (partly because there an
ambiguity on how to parse '_Atomic' when followed
by an open parenthesis (can be valid as qualifier
and as specifier)).
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
gdbhelpers | 3 ++
ident-list.h | 2 +-
parse.c | 13 +++++++
show-parse.c | 1 +
symbol.h | 3 +-
validation/c11-atomic.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++
validation/typeof-mods.c | 14 ++++++++
7 files changed, 127 insertions(+), 2 deletions(-)
create mode 100644 validation/c11-atomic.c
diff --git a/gdbhelpers b/gdbhelpers
index f6399d3bc..2fe9336dd 100644
--- a/gdbhelpers
+++ b/gdbhelpers
@@ -110,6 +110,9 @@ define gdb_show_ctype
if ($arg0->modifiers & MOD_RESTRICT)
printf "MOD_RESTRICT "
end
+ if ($arg0->modifiers & MOD_ATOMIC)
+ printf "MOD_ATOMIC "
+ end
if ($arg0->modifiers & MOD_SIGNED)
printf "MOD_SIGNED "
end
diff --git a/ident-list.h b/ident-list.h
index 130875741..2f1fecb48 100644
--- a/ident-list.h
+++ b/ident-list.h
@@ -37,7 +37,7 @@ IDENT_RESERVED(_Imaginary);
/* C11 keywords */
IDENT(_Alignas);
IDENT_RESERVED(_Alignof);
-IDENT_RESERVED(_Atomic);
+IDENT(_Atomic);
IDENT_RESERVED(_Generic);
IDENT(_Noreturn);
IDENT_RESERVED(_Static_assert);
diff --git a/parse.c b/parse.c
index e6b40fc3f..ab2e17daf 100644
--- a/parse.c
+++ b/parse.c
@@ -59,6 +59,7 @@ static declarator_t
register_specifier, static_specifier, extern_specifier,
thread_specifier, const_qualifier, volatile_qualifier;
static declarator_t restrict_qualifier;
+static declarator_t atomic_qualifier;
static struct token *parse_if_statement(struct token *token, struct statement *stmt);
static struct token *parse_return_statement(struct token *token, struct statement *stmt);
@@ -178,6 +179,11 @@ static struct symbol_op restrict_op = {
.declarator = restrict_qualifier,
};
+static struct symbol_op atomic_op = {
+ .type = KW_QUALIFIER,
+ .declarator = atomic_qualifier,
+};
+
static struct symbol_op typeof_op = {
.type = KW_SPECIFIER,
.declarator = typeof_specifier,
@@ -427,6 +433,7 @@ static struct init_keyword {
{ "restrict", NS_TYPEDEF, .op = &restrict_op},
{ "__restrict", NS_TYPEDEF, .op = &restrict_op},
{ "__restrict__", NS_TYPEDEF, .op = &restrict_op},
+ { "_Atomic", NS_TYPEDEF, .op = &atomic_op},
/* Typedef.. */
{ "typedef", NS_TYPEDEF, .op = &typedef_op },
@@ -1473,6 +1480,12 @@ static struct token *restrict_qualifier(struct token *next, struct decl_state *c
return next;
}
+static struct token *atomic_qualifier(struct token *next, struct decl_state *ctx)
+{
+ apply_qualifier(&next->pos, &ctx->ctype, MOD_ATOMIC);
+ return next;
+}
+
static void apply_ctype(struct position pos, struct ctype *thistype, struct ctype *ctype)
{
unsigned long mod = thistype->modifiers;
diff --git a/show-parse.c b/show-parse.c
index 825db6921..a4ce6f68d 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -126,6 +126,7 @@ const char *modifier_string(unsigned long mod)
{MOD_CONST, "const"},
{MOD_VOLATILE, "volatile"},
{MOD_RESTRICT, "restrict"},
+ {MOD_ATOMIC, "[atomic]"},
{MOD_SIGNED, "[signed]"},
{MOD_UNSIGNED, "[unsigned]"},
{MOD_CHAR, "[char]"},
diff --git a/symbol.h b/symbol.h
index 1e7eefd74..bf69d44c6 100644
--- a/symbol.h
+++ b/symbol.h
@@ -214,6 +214,7 @@ struct symbol {
#define MOD_CONST 0x00000200
#define MOD_VOLATILE 0x00000400
#define MOD_RESTRICT 0x00000800
+#define MOD_ATOMIC 0x00001000
#define MOD_SIGNED 0x00002000
#define MOD_UNSIGNED 0x00004000
@@ -243,7 +244,7 @@ struct symbol {
#define MOD_SIZE (MOD_CHAR | MOD_SHORT | MOD_LONG_ALL)
#define MOD_IGNORE (MOD_STORAGE | MOD_ADDRESSABLE | \
MOD_ASSIGNED | MOD_USERTYPE | MOD_EXPLICITLY_SIGNED)
-#define MOD_QUALIFIER (MOD_CONST | MOD_VOLATILE | MOD_RESTRICT)
+#define MOD_QUALIFIER (MOD_CONST | MOD_VOLATILE | MOD_RESTRICT | MOD_ATOMIC)
#define MOD_PTRINHERIT (MOD_QUALIFIER | MOD_NODEREF | MOD_NORETURN | MOD_NOCAST)
/* modifiers preserved by typeof() operator */
#define MOD_TYPEOF (MOD_QUALIFIER | MOD_NOCAST | MOD_SPECIFIER)
diff --git a/validation/c11-atomic.c b/validation/c11-atomic.c
new file mode 100644
index 000000000..bea3dab8f
--- /dev/null
+++ b/validation/c11-atomic.c
@@ -0,0 +1,93 @@
+void f00(int _Atomic dst);
+void f01(int _Atomic *dst);
+void f02(int _Atomic *dst);
+void f03(int _Atomic *dst);
+
+int _Atomic qo;
+int uo;
+
+void f00(int dst) { } /* check-should-pass */
+void f01(typeof(&qo) dst) { } /* check-should-pass */
+void f02(int *dst) { } /* check-should-fail */
+void f03(typeof(&uo) dst) { } /* check-should-fail */
+
+void foo(void)
+{
+ qo = uo; /* check-should-pass */
+ uo = qo; /* check-should-pass */
+}
+
+void ref(void)
+{
+ const int qo;
+ int uo;
+ extern const int *pqo;
+ extern int *puo;
+
+ pqo = &qo; /* check-should-pass */
+ pqo = &uo; /* check-should-pass */
+ pqo = puo;
+
+ puo = &uo; /* check-should-pass */
+
+ puo = &qo; /* check-should-fail */
+ puo = pqo; /* check-should-fail */
+}
+
+void bar(void)
+{
+ extern int _Atomic *pqo;
+ extern int *puo;
+
+ pqo = &qo; /* check-should-pass */
+ pqo = &uo; /* check-should-pass */
+ pqo = puo;
+
+ puo = &uo; /* check-should-pass */
+
+ puo = &qo; /* check-should-fail */
+ puo = pqo; /* check-should-fail */
+}
+
+void baz(void)
+{
+ extern typeof(&qo) pqo;
+ extern typeof(&uo) puo;
+
+ pqo = &qo; /* check-should-pass */
+ pqo = &uo; /* check-should-pass */
+ pqo = puo;
+
+ puo = &uo; /* check-should-pass */
+
+ puo = &qo; /* check-should-fail */
+ puo = pqo; /* check-should-fail */
+}
+
+/*
+ * check-name: C11 _Atomic type qualifier
+ * check-command: sparse -Wno-decl $file;
+ *
+ * check-error-start
+c11-atomic.c:11:6: error: symbol 'f02' redeclared with different type (originally declared at c11-atomic.c:3) - incompatible argument 1 (different modifiers)
+c11-atomic.c:12:6: error: symbol 'f03' redeclared with different type (originally declared at c11-atomic.c:4) - incompatible argument 1 (different modifiers)
+c11-atomic.c:33:13: warning: incorrect type in assignment (different modifiers)
+c11-atomic.c:33:13: expected int *extern [assigned] puo
+c11-atomic.c:33:13: got int const *<noident>
+c11-atomic.c:34:13: warning: incorrect type in assignment (different modifiers)
+c11-atomic.c:34:13: expected int *extern [assigned] puo
+c11-atomic.c:34:13: got int const *extern [assigned] pqo
+c11-atomic.c:48:13: warning: incorrect type in assignment (different modifiers)
+c11-atomic.c:48:13: expected int *extern [assigned] puo
+c11-atomic.c:48:13: got int [atomic] *<noident>
+c11-atomic.c:49:13: warning: incorrect type in assignment (different modifiers)
+c11-atomic.c:49:13: expected int *extern [assigned] puo
+c11-atomic.c:49:13: got int [atomic] *extern [assigned] pqo
+c11-atomic.c:63:13: warning: incorrect type in assignment (different modifiers)
+c11-atomic.c:63:13: expected int *extern [assigned] puo
+c11-atomic.c:63:13: got int [atomic] *<noident>
+c11-atomic.c:64:13: warning: incorrect type in assignment (different modifiers)
+c11-atomic.c:64:13: expected int *extern [assigned] puo
+c11-atomic.c:64:13: got int [atomic] *extern [assigned] pqo
+ * check-error-end
+ */
diff --git a/validation/typeof-mods.c b/validation/typeof-mods.c
index 878a111a2..aa880f373 100644
--- a/validation/typeof-mods.c
+++ b/validation/typeof-mods.c
@@ -57,6 +57,20 @@ static void test_restrict(void)
obj = *ptr;
}
+static void test_atomic(void)
+{
+ int _Atomic obj, *ptr;
+ typeof(obj) var = obj;
+ typeof(ptr) ptr2 = ptr;
+ typeof(*ptr) var2 = obj;
+ typeof(*ptr) *ptr3 = ptr;
+ typeof(obj) *ptr4 = ptr;
+ obj = obj;
+ ptr = ptr;
+ ptr = &obj;
+ obj = *ptr;
+}
+
static void test_bitwise(void)
{
typedef int __bitwise type_t;
--
2.14.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/7] restricted pointers
2017-11-08 21:06 [PATCH v2 0/7] restricted pointers Luc Van Oostenryck
` (6 preceding siblings ...)
2017-11-08 21:06 ` [PATCH v2 7/7] add support for C11's _Atomic as type qualifier Luc Van Oostenryck
@ 2017-11-09 18:55 ` Christopher Li
7 siblings, 0 replies; 9+ messages in thread
From: Christopher Li @ 2017-11-09 18:55 UTC (permalink / raw)
To: Luc Van Oostenryck; +Cc: Linux-Sparse
On Thu, Nov 9, 2017 at 5:06 AM, Luc Van Oostenryck
<luc.vanoostenryck@gmail.com> wrote:
> The goal of this series is to prepare for a real support
> for C99's 'restrict' type qualifier.
> As preliminary steps this series also contains a
> cleanup of the #define MOD_XYZ and as bonus it teaches
> sparse about C11's '_Atomic' as type *qualifier*
>
> Change since v1:
> - remove patches related to error vs. warnings which
> have already been integrated.
> - improve commit messages
>
> This series is available for review & testing at:
> git://github.com/lucvoo/sparse.git restricted-pointers-v2
Thanks for the series.
I very briefly go over the series. Nothing particularly bad stand out.
I don't have the chance to do the normal process of apply each
patch individually. Will go back to it at more detail
level after catch up with the backlogs.
Chris
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2017-11-09 18:55 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-08 21:06 [PATCH v2 0/7] restricted pointers Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 1/7] remove never-used MOD_TYPEDEF Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 2/7] MOD_ACCESSED is not a type modifier Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 3/7] reorganize the definition of the modifiers Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 4/7] remove redundancy in MOD_STORAGE Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 5/7] define MOD_QUALIFIER for (MOD_CONST | MOD_VOLATILE) Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 6/7] associate MOD_RESTRICT with restrict-qualified variables Luc Van Oostenryck
2017-11-08 21:06 ` [PATCH v2 7/7] add support for C11's _Atomic as type qualifier Luc Van Oostenryck
2017-11-09 18:55 ` [PATCH v2 0/7] restricted pointers Christopher Li
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).