* [PATCH 0/6] dump macros definitions
@ 2017-04-04 21:49 Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 1/6] define ident_list Luc Van Oostenryck
` (6 more replies)
0 siblings, 7 replies; 11+ messages in thread
From: Luc Van Oostenryck @ 2017-04-04 21:49 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
The goal of this series is to add support for GCC's -dD.
This implementation is quite straightforward:
- record all macro's name
- dump the tokens corresponding to each macros
without argument expansion.
This series is available at:
git://github.com/lucvoo/sparse.git dump-macros
based on commit:
14964df5373292af78b29529d4fc7e1a26b67a97 (sparse-next @ 2017-03-31)
up to commit:
9a01ec7d42d6013ead12cb111b1a1879d0c856ab
Luc Van Oostenryck (6):
define ident_list
teach sparse how to dump macro definitions
teach sparse how to handle -dD flag
let -dD report macro defintions
let -dD report #undef too
fix -dD for never-defined #undef
lib.c | 21 ++++++++++
lib.h | 9 +++++
pre-process.c | 61 ++++++++++++++++++++++++++++-
validation/empty-file | 0
validation/preprocessor/dump-macros-empty.c | 7 ++++
validation/preprocessor/dump-macros-multi.c | 7 ++++
validation/preprocessor/dump-macros.c | 23 +++++++++++
7 files changed, 126 insertions(+), 2 deletions(-)
create mode 100644 validation/empty-file
create mode 100644 validation/preprocessor/dump-macros-empty.c
create mode 100644 validation/preprocessor/dump-macros-multi.c
create mode 100644 validation/preprocessor/dump-macros.c
-- Luc Van Oostenryck
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/6] define ident_list
2017-04-04 21:49 [PATCH 0/6] dump macros definitions Luc Van Oostenryck
@ 2017-04-04 21:49 ` Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 2/6] teach sparse how to dump macro definitions Luc Van Oostenryck
` (5 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Luc Van Oostenryck @ 2017-04-04 21:49 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
lib.h | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/lib.h b/lib.h
index 134e56040..19b5cb0b3 100644
--- a/lib.h
+++ b/lib.h
@@ -75,6 +75,7 @@ DECLARE_PTR_LIST(basic_block_list, struct basic_block);
DECLARE_PTR_LIST(instruction_list, struct instruction);
DECLARE_PTR_LIST(multijmp_list, struct multijmp);
DECLARE_PTR_LIST(pseudo_list, struct pseudo);
+DECLARE_PTR_LIST(ident_list, struct ident);
DECLARE_PTR_LIST(string_list, char);
typedef struct pseudo *pseudo_t;
@@ -244,6 +245,11 @@ static inline void add_expression(struct expression_list **list, struct expressi
add_ptr_list(list, expr);
}
+static inline void add_ident(struct ident_list **list, struct ident *ident)
+{
+ add_ptr_list(list, ident);
+}
+
#define hashval(x) ((unsigned long)(x))
#endif
--
2.12.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/6] teach sparse how to dump macro definitions
2017-04-04 21:49 [PATCH 0/6] dump macros definitions Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 1/6] define ident_list Luc Van Oostenryck
@ 2017-04-04 21:49 ` Luc Van Oostenryck
2017-06-01 6:56 ` Christopher Li
2017-04-04 21:49 ` [PATCH 3/6] teach sparse how to handle -dD flag Luc Van Oostenryck
` (4 subsequent siblings)
6 siblings, 1 reply; 11+ messages in thread
From: Luc Van Oostenryck @ 2017-04-04 21:49 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
lib.h | 1 +
pre-process.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 56 insertions(+)
diff --git a/lib.h b/lib.h
index 19b5cb0b3..f2df4aa1d 100644
--- a/lib.h
+++ b/lib.h
@@ -141,6 +141,7 @@ extern int arch_m64;
extern void declare_builtin_functions(void);
extern void create_builtin_stream(void);
+extern void dump_macro_definitions(void);
extern struct symbol_list *sparse_initialize(int argc, char **argv, struct string_list **files);
extern struct symbol_list *__sparse(char *filename);
extern struct symbol_list *sparse_keep_tokens(char *filename);
diff --git a/pre-process.c b/pre-process.c
index 7c57ba1cd..74414dfeb 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -44,6 +44,7 @@
#include "expression.h"
#include "scope.h"
+static struct ident_list *macros; // only needed for -dD
static int false_nesting = 0;
static int counter_macro = 0; // __COUNTER__ expansion
@@ -1351,6 +1352,7 @@ static int do_handle_define(struct stream *stream, struct token **line, struct t
if (!sym || sym->scope != file_scope) {
sym = alloc_symbol(left->pos, SYM_NODE);
bind_symbol(sym, name, NS_MACRO);
+ add_ident(¯os, name);
ret = 0;
}
@@ -2010,3 +2012,56 @@ struct token * preprocess(struct token *token)
return token;
}
+
+static void dump_macro(struct symbol *sym)
+{
+ int nargs = sym->arglist ? sym->arglist->count.normal : 0;
+ struct token *args[nargs];
+ struct token *token;
+
+ printf("#define %s", show_ident(sym->ident));
+ token = sym->arglist;
+ if (token) {
+ const char *sep = "";
+ int narg = 0;
+ putchar('(');
+ for (; !eof_token(token); token = token->next) {
+ if (token_type(token) == TOKEN_ARG_COUNT)
+ continue;
+ printf("%s%s", sep, show_token(token));
+ args[narg++] = token;
+ sep = ", ";
+ }
+ putchar(')');
+ }
+ putchar(' ');
+
+ token = sym->expansion;
+ while (!eof_token(token)) {
+ struct token *next = token->next;
+ switch (token_type(token)) {
+ case TOKEN_UNTAINT:
+ break;
+ case TOKEN_MACRO_ARGUMENT:
+ token = args[token->argnum];
+ /* fall-through */
+ default:
+ printf("%s", show_token(token));
+ if (next->pos.whitespace)
+ putchar(' ');
+ }
+ token = next;
+ }
+ putchar('\n');
+}
+
+void dump_macro_definitions(void)
+{
+ struct ident *name;
+
+ FOR_EACH_PTR(macros, name) {
+ struct symbol *sym = lookup_macro(name);
+ if (sym)
+ dump_macro(sym);
+ } END_FOR_EACH_PTR(name);
+}
--
2.12.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/6] teach sparse how to handle -dD flag
2017-04-04 21:49 [PATCH 0/6] dump macros definitions Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 1/6] define ident_list Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 2/6] teach sparse how to dump macro definitions Luc Van Oostenryck
@ 2017-04-04 21:49 ` Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 4/6] let -dD report macro defintions Luc Van Oostenryck
` (3 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Luc Van Oostenryck @ 2017-04-04 21:49 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
lib.c | 16 ++++++++++++++++
lib.h | 2 ++
2 files changed, 18 insertions(+)
diff --git a/lib.c b/lib.c
index 272d2c88a..991ead9bd 100644
--- a/lib.c
+++ b/lib.c
@@ -250,6 +250,8 @@ int Wvla = 1;
int dbg_entry = 0;
int dbg_dead = 0;
+int dump_macro_defs = 0;
+
int preprocess_only;
static enum { STANDARD_C89,
@@ -567,6 +569,19 @@ static char **handle_switch_v(char *arg, char **next)
return next;
}
+static struct warning dumps[] = {
+ { "D", &dump_macro_defs},
+};
+
+static char **handle_switch_d(char *arg, char **next)
+{
+ char ** ret = handle_onoff_switch(arg, next, dumps, ARRAY_SIZE(dumps));
+ if (ret)
+ return ret;
+
+ return next;
+}
+
static void handle_onoff_switch_finalize(const struct warning warnings[], int n)
{
@@ -800,6 +815,7 @@ static char **handle_switch(char *arg, char **next)
switch (*arg) {
case 'a': return handle_switch_a(arg, next);
case 'D': return handle_switch_D(arg, next);
+ case 'd': return handle_switch_d(arg, next);
case 'E': return handle_switch_E(arg, next);
case 'f': return handle_switch_f(arg, next);
case 'g': return handle_switch_g(arg, next);
diff --git a/lib.h b/lib.h
index f2df4aa1d..1b21de0c2 100644
--- a/lib.h
+++ b/lib.h
@@ -137,6 +137,8 @@ extern int Wvla;
extern int dbg_entry;
extern int dbg_dead;
+extern int dump_macro_defs;
+
extern int arch_m64;
extern void declare_builtin_functions(void);
--
2.12.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/6] let -dD report macro defintions
2017-04-04 21:49 [PATCH 0/6] dump macros definitions Luc Van Oostenryck
` (2 preceding siblings ...)
2017-04-04 21:49 ` [PATCH 3/6] teach sparse how to handle -dD flag Luc Van Oostenryck
@ 2017-04-04 21:49 ` Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 5/6] let -dD report #undef too Luc Van Oostenryck
` (2 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Luc Van Oostenryck @ 2017-04-04 21:49 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
lib.c | 5 +++++
validation/empty-file | 0
validation/preprocessor/dump-macros-empty.c | 7 +++++++
validation/preprocessor/dump-macros-multi.c | 7 +++++++
validation/preprocessor/dump-macros.c | 18 ++++++++++++++++++
5 files changed, 37 insertions(+)
create mode 100644 validation/empty-file
create mode 100644 validation/preprocessor/dump-macros-empty.c
create mode 100644 validation/preprocessor/dump-macros-multi.c
create mode 100644 validation/preprocessor/dump-macros.c
diff --git a/lib.c b/lib.c
index 991ead9bd..700681c01 100644
--- a/lib.c
+++ b/lib.c
@@ -1075,9 +1075,14 @@ void create_builtin_stream(void)
static struct symbol_list *sparse_tokenstream(struct token *token)
{
+ int builtin = token && !token->pos.stream;
+
// Preprocess the stream
token = preprocess(token);
+ if (dump_macro_defs && !builtin)
+ dump_macro_definitions();
+
if (preprocess_only) {
while (!eof_token(token)) {
int prec = 1;
diff --git a/validation/empty-file b/validation/empty-file
new file mode 100644
index 000000000..e69de29bb
diff --git a/validation/preprocessor/dump-macros-empty.c b/validation/preprocessor/dump-macros-empty.c
new file mode 100644
index 000000000..672c66c71
--- /dev/null
+++ b/validation/preprocessor/dump-macros-empty.c
@@ -0,0 +1,7 @@
+/*
+ * check-name: dump-macros with empty file
+ * check-command: sparse -E -dD empty-file
+ *
+ * check-output-ignore
+check-output-pattern-1-times: #define __CHECKER__ 1
+ */
diff --git a/validation/preprocessor/dump-macros-multi.c b/validation/preprocessor/dump-macros-multi.c
new file mode 100644
index 000000000..2f6e8d04f
--- /dev/null
+++ b/validation/preprocessor/dump-macros-multi.c
@@ -0,0 +1,7 @@
+/*
+ * check-name: dump-macros with multiple files
+ * check-command: sparse -E -dD empty-file $file
+ *
+ * check-output-ignore
+check-output-pattern-2-times: #define __CHECKER__ 1
+ */
diff --git a/validation/preprocessor/dump-macros.c b/validation/preprocessor/dump-macros.c
new file mode 100644
index 000000000..79f3de6a2
--- /dev/null
+++ b/validation/preprocessor/dump-macros.c
@@ -0,0 +1,18 @@
+#define ABC abc
+#undef ABC
+
+#define DEF def
+#undef DEF
+#define DEF xyz
+
+#define NYDEF ydef
+/*
+ * check-name: dump-macros
+ * check-command: sparse -E -dD -DIJK=ijk -UNDEF -UNYDEF $file
+ *
+ * check-output-ignore
+check-output-pattern-1-times: #define __CHECKER__ 1
+check-output-contains: #define IJK ijk
+check-output-contains: #define DEF xyz
+check-output-contains: #define NYDEF ydef
+ */
--
2.12.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 5/6] let -dD report #undef too
2017-04-04 21:49 [PATCH 0/6] dump macros definitions Luc Van Oostenryck
` (3 preceding siblings ...)
2017-04-04 21:49 ` [PATCH 4/6] let -dD report macro defintions Luc Van Oostenryck
@ 2017-04-04 21:49 ` Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 6/6] fix -dD for never-defined #undef Luc Van Oostenryck
2017-04-06 8:05 ` [PATCH 0/6] dump macros definitions Christopher Li
6 siblings, 0 replies; 11+ messages in thread
From: Luc Van Oostenryck @ 2017-04-04 21:49 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
pre-process.c | 3 +++
validation/preprocessor/dump-macros.c | 1 +
2 files changed, 4 insertions(+)
diff --git a/pre-process.c b/pre-process.c
index 74414dfeb..63df3f71c 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -1406,6 +1406,7 @@ static int do_handle_undef(struct stream *stream, struct token **line, struct to
if (!sym || sym->scope != file_scope) {
sym = alloc_symbol(left->pos, SYM_NODE);
bind_symbol(sym, left->ident, NS_MACRO);
+ add_ident(¯os, left->ident);
}
sym->namespace = NS_UNDEF;
@@ -2063,5 +2064,7 @@ void dump_macro_definitions(void)
struct symbol *sym = lookup_macro(name);
if (sym)
dump_macro(sym);
+ else
+ printf("#undef %s\n", show_ident(name));
} END_FOR_EACH_PTR(name);
}
diff --git a/validation/preprocessor/dump-macros.c b/validation/preprocessor/dump-macros.c
index 79f3de6a2..5508233aa 100644
--- a/validation/preprocessor/dump-macros.c
+++ b/validation/preprocessor/dump-macros.c
@@ -15,4 +15,5 @@ check-output-pattern-1-times: #define __CHECKER__ 1
check-output-contains: #define IJK ijk
check-output-contains: #define DEF xyz
check-output-contains: #define NYDEF ydef
+check-output-contains: #undef ABC
*/
--
2.12.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 6/6] fix -dD for never-defined #undef
2017-04-04 21:49 [PATCH 0/6] dump macros definitions Luc Van Oostenryck
` (4 preceding siblings ...)
2017-04-04 21:49 ` [PATCH 5/6] let -dD report #undef too Luc Van Oostenryck
@ 2017-04-04 21:49 ` Luc Van Oostenryck
2017-04-06 8:05 ` [PATCH 0/6] dump macros definitions Christopher Li
6 siblings, 0 replies; 11+ messages in thread
From: Luc Van Oostenryck @ 2017-04-04 21:49 UTC (permalink / raw)
To: linux-sparse; +Cc: Christopher Li, Luc Van Oostenryck
Note: to support this, we have to create a symbol where
it wasn't needed before.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
---
pre-process.c | 3 +--
validation/preprocessor/dump-macros.c | 6 +++++-
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/pre-process.c b/pre-process.c
index 63df3f71c..5067b59b2 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -1400,8 +1400,7 @@ static int do_handle_undef(struct stream *stream, struct token **line, struct to
return 1;
if (attr == sym->attr && sym->namespace == NS_UNDEF)
return 1;
- } else if (attr <= SYM_ATTR_NORMAL)
- return 1;
+ }
if (!sym || sym->scope != file_scope) {
sym = alloc_symbol(left->pos, SYM_NODE);
diff --git a/validation/preprocessor/dump-macros.c b/validation/preprocessor/dump-macros.c
index 5508233aa..a10325171 100644
--- a/validation/preprocessor/dump-macros.c
+++ b/validation/preprocessor/dump-macros.c
@@ -6,9 +6,11 @@
#define DEF xyz
#define NYDEF ydef
+
+#undef NDEF2
/*
* check-name: dump-macros
- * check-command: sparse -E -dD -DIJK=ijk -UNDEF -UNYDEF $file
+ * check-command: sparse -E -dD -DIJK=ijk -UNDEF1 -UNYDEF $file
*
* check-output-ignore
check-output-pattern-1-times: #define __CHECKER__ 1
@@ -16,4 +18,6 @@ check-output-contains: #define IJK ijk
check-output-contains: #define DEF xyz
check-output-contains: #define NYDEF ydef
check-output-contains: #undef ABC
+check-output-contains: #undef NDEF1
+check-output-contains: #undef NDEF2
*/
--
2.12.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 0/6] dump macros definitions
2017-04-04 21:49 [PATCH 0/6] dump macros definitions Luc Van Oostenryck
` (5 preceding siblings ...)
2017-04-04 21:49 ` [PATCH 6/6] fix -dD for never-defined #undef Luc Van Oostenryck
@ 2017-04-06 8:05 ` Christopher Li
2017-04-06 11:51 ` Luc Van Oostenryck
6 siblings, 1 reply; 11+ messages in thread
From: Christopher Li @ 2017-04-06 8:05 UTC (permalink / raw)
To: Luc Van Oostenryck; +Cc: Linux-Sparse
On Tue, Apr 4, 2017 at 2:49 PM, Luc Van Oostenryck
<luc.vanoostenryck@gmail.com> wrote:
> The goal of this series is to add support for GCC's -dD.
>
> This implementation is quite straightforward:
> - record all macro's name
> - dump the tokens corresponding to each macros
> without argument expansion.
>
> This series is available at:
> git://github.com/lucvoo/sparse.git dump-macros
> based on commit:
> 14964df5373292af78b29529d4fc7e1a26b67a97 (sparse-next @ 2017-03-31)
> up to commit:
> 9a01ec7d42d6013ead12cb111b1a1879d0c856ab
Just a heads up this week I am very occupied, don't have much
time for sparse at all. I will resume sparse hacking in the week
end. Hopefully make some progress on sparse-next.
Sorry for the delay guys.
Chris
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 0/6] dump macros definitions
2017-04-06 8:05 ` [PATCH 0/6] dump macros definitions Christopher Li
@ 2017-04-06 11:51 ` Luc Van Oostenryck
0 siblings, 0 replies; 11+ messages in thread
From: Luc Van Oostenryck @ 2017-04-06 11:51 UTC (permalink / raw)
To: Christopher Li; +Cc: Linux-Sparse
On Thu, Apr 6, 2017 at 10:05 AM, Christopher Li <sparse@chrisli.org> wrote:
> Just a heads up this week I am very occupied, don't have much
> time for sparse at all. I will resume sparse hacking in the week
> end. Hopefully make some progress on sparse-next.
>
> Sorry for the delay guys.
>
> Chris
No problem.
-- Luc
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/6] teach sparse how to dump macro definitions
2017-04-04 21:49 ` [PATCH 2/6] teach sparse how to dump macro definitions Luc Van Oostenryck
@ 2017-06-01 6:56 ` Christopher Li
2017-06-01 14:08 ` Luc Van Oostenryck
0 siblings, 1 reply; 11+ messages in thread
From: Christopher Li @ 2017-06-01 6:56 UTC (permalink / raw)
To: Luc Van Oostenryck; +Cc: Linux-Sparse
On Tue, Apr 4, 2017 at 2:49 PM, Luc Van Oostenryck
<luc.vanoostenryck@gmail.com> wrote:
> diff --git a/pre-process.c b/pre-process.c
> index 7c57ba1cd..74414dfeb 100644
> --- a/pre-process.c
> +++ b/pre-process.c
> @@ -44,6 +44,7 @@
> #include "expression.h"
> #include "scope.h"
>
> +static struct ident_list *macros; // only needed for -dD
I think the macros list should be initialized as NULL.
Chris
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/6] teach sparse how to dump macro definitions
2017-06-01 6:56 ` Christopher Li
@ 2017-06-01 14:08 ` Luc Van Oostenryck
0 siblings, 0 replies; 11+ messages in thread
From: Luc Van Oostenryck @ 2017-06-01 14:08 UTC (permalink / raw)
To: Christopher Li; +Cc: Linux-Sparse
On Thu, Jun 1, 2017 at 8:56 AM, Christopher Li <sparse@chrisli.org> wrote:
> On Tue, Apr 4, 2017 at 2:49 PM, Luc Van Oostenryck
> <luc.vanoostenryck@gmail.com> wrote:
>> diff --git a/pre-process.c b/pre-process.c
>> index 7c57ba1cd..74414dfeb 100644
>> --- a/pre-process.c
>> +++ b/pre-process.c
>> @@ -44,6 +44,7 @@
>> #include "expression.h"
>> #include "scope.h"
>>
>> +static struct ident_list *macros; // only needed for -dD
>
> I think the macros list should be initialized as NULL.
It certainly doesn't need to be explicitly initialized to NULL since
all top-level variables that are not explicitly initialized are initialized
to zero by the environment before main() is called.
-- Luc
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2017-06-01 14:08 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-04 21:49 [PATCH 0/6] dump macros definitions Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 1/6] define ident_list Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 2/6] teach sparse how to dump macro definitions Luc Van Oostenryck
2017-06-01 6:56 ` Christopher Li
2017-06-01 14:08 ` Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 3/6] teach sparse how to handle -dD flag Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 4/6] let -dD report macro defintions Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 5/6] let -dD report #undef too Luc Van Oostenryck
2017-04-04 21:49 ` [PATCH 6/6] fix -dD for never-defined #undef Luc Van Oostenryck
2017-04-06 8:05 ` [PATCH 0/6] dump macros definitions Christopher Li
2017-04-06 11:51 ` Luc Van Oostenryck
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.