ProtoCore
v1.0.16
Deterministic, zero-heap network stack for embedded targets
Loading...
Searching...
No Matches
ns_contract.h
Go to the documentation of this file.
1
// ProtoCore v1.0.16 - Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
2
// SPDX-License-Identifier: AGPL-3.0-or-later
3
#ifndef PROTOCORE_NS_CONTRACT_H
4
#define PROTOCORE_NS_CONTRACT_H
5
6
/**
7
* @file ns_contract.h
8
* @brief What a namespace IS: how its table is stored, how its slots are pinned, and how a call
9
* with several operands is written.
10
*
11
* Taken from MMgr (include/MMgr/src/mmgr_compiler_directives.h), which is the shape this tree is
12
* converging on. The three pieces are the whole contract:
13
*
14
* PROTOCORE_NS the table is `static const`, which is what lets a call through it inline
15
* PROTOCORE_NS_LAYOUT every entry is pinned to its dispatch slot, at compile time
16
* PROTOCORE_CALL an entry's operands travel as a compound literal, not on a shared global
17
*
18
* @author Douglas Quigg (dstroy0)
19
* @date 2026
20
*/
21
22
#include <assert.h>
// static_assert, which every pin below is written with
23
#include <stddef.h>
// offsetof
24
25
/**
26
* @brief Suppress the unused warning. Every module ends in a namespace most callers only partly use.
27
*
28
* The table is `static const` in the header, so a translation unit that includes the module and
29
* calls two of its twelve entries still declares all twelve, and a plain -Wunused build would
30
* report the ones it did not reach.
31
*/
32
#ifndef PROTOCORE_UNUSED
33
#if defined(__GNUC__) || defined(__clang__)
34
#define PROTOCORE_UNUSED __attribute__((unused))
35
#else
36
#define PROTOCORE_UNUSED
37
#endif
38
#endif
39
40
/** @brief Paste two tokens after expanding both. */
41
#define PROTOCORE_CAT_(a, b) a##b
42
#define PROTOCORE_CAT(a, b) PROTOCORE_CAT_(a, b)
43
44
/** @brief Count variadic arguments, up to 72 - the longest dispatch table in the tree is 69. */
45
#define PROTOCORE_NARG(...) \
46
PROTOCORE_NARG_(__VA_ARGS__, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, \
47
51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, \
48
27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, \
49
0)
50
#define PROTOCORE_NARG_(...) PROTOCORE_ARG_N(__VA_ARGS__)
51
#define PROTOCORE_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
52
_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \
53
_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, \
54
_59, _60, _61, _62, _63, _64, _65, _66, _67, _68, _69, _70, _71, _72, N, ...) \
55
N
56
57
/**
58
* @brief Call an entry with a compound literal, so the aggregate never appears at the call site.
59
*
60
* #define protocore_sha256_hash(...) PROTOCORE_CALL(protocore_sha256_hash_at, Sha256HashArgs, __VA_ARGS__)
61
* Sha256.hash(.data = p, .len = n, .out = digest);
62
*
63
* This is what replaces the operands global. Writing `Sha256V.hash_args.data = p;` before every call
64
* put one module's arguments in a place every other translation unit can reach and every reentrant
65
* path can overwrite; a compound literal is the caller's, lives on the caller's stack, and cannot be
66
* read by anyone else.
67
*
68
* Two properties come from the standard rather than the compiler, so they hold on every target:
69
* unnamed fields are zero initialised, which is how a default costs nothing and is never spelled;
70
* and a compound literal in argument position lives until the end of the enclosing block, so the
71
* entry may hold the pointer for the whole call.
72
*
73
* Designated initialisers are the intended spelling. A positional call still compiles, but -Wextra
74
* reports the fields it left behind and designated calls it does not.
75
*/
76
#define PROTOCORE_CALL(entry, ArgsType, ...) entry(&(ArgsType){__VA_ARGS__})
77
78
/** @brief Size of a function pointer. Not void *, which is the wrong ruler where code and data
79
* pointers differ in width. */
80
#define PROTOCORE_FP_SIZE (sizeof(void (*)(void)))
81
82
/** @brief Assert one member sits at one dispatch slot. */
83
#define PROTOCORE_NS_SLOT(T, member, slot) \
84
static_assert(offsetof(T, member) == (size_t)(slot) * PROTOCORE_FP_SIZE, \
85
#T "." #member " is not at dispatch slot " #slot)
86
87
/*
88
* Unrolled rather than recursive, because a failed assert should name the member and the slot and
89
* nothing else. One line per arity.
90
*/
91
#define PROTOCORE_NS_L1(T, a1) PROTOCORE_NS_SLOT(T, a1, 0);
92
#define PROTOCORE_NS_L2(T, a1, a2) PROTOCORE_NS_L1(T, a1) PROTOCORE_NS_SLOT(T, a2, 1);
93
#define PROTOCORE_NS_L3(T, a1, a2, a3) PROTOCORE_NS_L2(T, a1, a2) PROTOCORE_NS_SLOT(T, a3, 2);
94
#define PROTOCORE_NS_L4(T, a1, a2, a3, a4) PROTOCORE_NS_L3(T, a1, a2, a3) PROTOCORE_NS_SLOT(T, a4, 3);
95
#define PROTOCORE_NS_L5(T, a1, a2, a3, a4, a5) PROTOCORE_NS_L4(T, a1, a2, a3, a4) PROTOCORE_NS_SLOT(T, a5, 4);
96
#define PROTOCORE_NS_L6(T, a1, a2, a3, a4, a5, a6) PROTOCORE_NS_L5(T, a1, a2, a3, a4, a5) PROTOCORE_NS_SLOT(T, a6, 5);
97
#define PROTOCORE_NS_L7(T, a1, a2, a3, a4, a5, a6, a7) \
98
PROTOCORE_NS_L6(T, a1, a2, a3, a4, a5, a6) PROTOCORE_NS_SLOT(T, a7, 6);
99
#define PROTOCORE_NS_L8(T, a1, a2, a3, a4, a5, a6, a7, a8) \
100
PROTOCORE_NS_L7(T, a1, a2, a3, a4, a5, a6, a7) PROTOCORE_NS_SLOT(T, a8, 7);
101
#define PROTOCORE_NS_L9(T, a1, a2, a3, a4, a5, a6, a7, a8, a9) \
102
PROTOCORE_NS_L8(T, a1, a2, a3, a4, a5, a6, a7, a8) PROTOCORE_NS_SLOT(T, a9, 8);
103
#define PROTOCORE_NS_L10(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) \
104
PROTOCORE_NS_L9(T, a1, a2, a3, a4, a5, a6, a7, a8, a9) PROTOCORE_NS_SLOT(T, a10, 9);
105
#define PROTOCORE_NS_L11(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) \
106
PROTOCORE_NS_L10(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) PROTOCORE_NS_SLOT(T, a11, 10);
107
#define PROTOCORE_NS_L12(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) \
108
PROTOCORE_NS_L11(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) PROTOCORE_NS_SLOT(T, a12, 11);
109
#define PROTOCORE_NS_L13(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) \
110
PROTOCORE_NS_L12(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) PROTOCORE_NS_SLOT(T, a13, 12);
111
#define PROTOCORE_NS_L14(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) \
112
PROTOCORE_NS_L13(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) PROTOCORE_NS_SLOT(T, a14, 13);
113
#define PROTOCORE_NS_L15(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) \
114
PROTOCORE_NS_L14(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) PROTOCORE_NS_SLOT(T, a15, 14);
115
#define PROTOCORE_NS_L16(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) \
116
PROTOCORE_NS_L15(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) PROTOCORE_NS_SLOT(T, a16, 15);
117
#define PROTOCORE_NS_L17(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) \
118
PROTOCORE_NS_L16(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) \
119
PROTOCORE_NS_SLOT(T, a17, 16);
120
#define PROTOCORE_NS_L18(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) \
121
PROTOCORE_NS_L17(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) \
122
PROTOCORE_NS_SLOT(T, a18, 17);
123
#define PROTOCORE_NS_L19(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) \
124
PROTOCORE_NS_L18(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) \
125
PROTOCORE_NS_SLOT(T, a19, 18);
126
#define PROTOCORE_NS_L20(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) \
127
PROTOCORE_NS_L19(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) \
128
PROTOCORE_NS_SLOT(T, a20, 19);
129
#define PROTOCORE_NS_L21(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
130
a21) \
131
PROTOCORE_NS_L20(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) \
132
PROTOCORE_NS_SLOT(T, a21, 20);
133
#define PROTOCORE_NS_L22(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
134
a21, a22) \
135
PROTOCORE_NS_L21(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
136
a21) \
137
PROTOCORE_NS_SLOT(T, a22, 21);
138
#define PROTOCORE_NS_L23(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
139
a21, a22, a23) \
140
PROTOCORE_NS_L22(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
141
a21, a22) \
142
PROTOCORE_NS_SLOT(T, a23, 22);
143
#define PROTOCORE_NS_L24(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
144
a21, a22, a23, a24) \
145
PROTOCORE_NS_L23(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
146
a21, a22, a23) \
147
PROTOCORE_NS_SLOT(T, a24, 23);
148
#define PROTOCORE_NS_L25(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
149
a21, a22, a23, a24, a25) \
150
PROTOCORE_NS_L24(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
151
a21, a22, a23, a24) \
152
PROTOCORE_NS_SLOT(T, a25, 24);
153
#define PROTOCORE_NS_L26(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
154
a21, a22, a23, a24, a25, a26) \
155
PROTOCORE_NS_L25(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
156
a21, a22, a23, a24, a25) \
157
PROTOCORE_NS_SLOT(T, a26, 25);
158
#define PROTOCORE_NS_L27(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
159
a21, a22, a23, a24, a25, a26, a27) \
160
PROTOCORE_NS_L26(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
161
a21, a22, a23, a24, a25, a26) \
162
PROTOCORE_NS_SLOT(T, a27, 26);
163
#define PROTOCORE_NS_L28(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
164
a21, a22, a23, a24, a25, a26, a27, a28) \
165
PROTOCORE_NS_L27(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
166
a21, a22, a23, a24, a25, a26, a27) \
167
PROTOCORE_NS_SLOT(T, a28, 27);
168
#define PROTOCORE_NS_L29(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
169
a21, a22, a23, a24, a25, a26, a27, a28, a29) \
170
PROTOCORE_NS_L28(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
171
a21, a22, a23, a24, a25, a26, a27, a28) \
172
PROTOCORE_NS_SLOT(T, a29, 28);
173
#define PROTOCORE_NS_L30(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
174
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30) \
175
PROTOCORE_NS_L29(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
176
a21, a22, a23, a24, a25, a26, a27, a28, a29) \
177
PROTOCORE_NS_SLOT(T, a30, 29);
178
#define PROTOCORE_NS_L31(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
179
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31) \
180
PROTOCORE_NS_L30(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
181
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30) \
182
PROTOCORE_NS_SLOT(T, a31, 30);
183
#define PROTOCORE_NS_L32(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
184
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32) \
185
PROTOCORE_NS_L31(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
186
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31) \
187
PROTOCORE_NS_SLOT(T, a32, 31);
188
#define PROTOCORE_NS_L33(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
189
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33) \
190
PROTOCORE_NS_L32(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
191
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32) \
192
PROTOCORE_NS_SLOT(T, a33, 32);
193
#define PROTOCORE_NS_L34(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
194
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34) \
195
PROTOCORE_NS_L33(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
196
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33) \
197
PROTOCORE_NS_SLOT(T, a34, 33);
198
#define PROTOCORE_NS_L35(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
199
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35) \
200
PROTOCORE_NS_L34(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
201
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34) \
202
PROTOCORE_NS_SLOT(T, a35, 34);
203
#define PROTOCORE_NS_L36(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
204
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36) \
205
PROTOCORE_NS_L35(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
206
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35) \
207
PROTOCORE_NS_SLOT(T, a36, 35);
208
#define PROTOCORE_NS_L37(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
209
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37) \
210
PROTOCORE_NS_L36(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
211
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36) \
212
PROTOCORE_NS_SLOT(T, a37, 36);
213
#define PROTOCORE_NS_L38(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
214
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38) \
215
PROTOCORE_NS_L37(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
216
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37) \
217
PROTOCORE_NS_SLOT(T, a38, 37);
218
#define PROTOCORE_NS_L39(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
219
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
220
a39) \
221
PROTOCORE_NS_L38(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
222
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38) \
223
PROTOCORE_NS_SLOT(T, a39, 38);
224
#define PROTOCORE_NS_L40(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
225
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
226
a39, a40) \
227
PROTOCORE_NS_L39(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
228
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39) \
229
PROTOCORE_NS_SLOT(T, a40, 39);
230
#define PROTOCORE_NS_L41(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
231
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
232
a39, a40, a41) \
233
PROTOCORE_NS_L40(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
234
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
235
a40) \
236
PROTOCORE_NS_SLOT(T, a41, 40);
237
#define PROTOCORE_NS_L42(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
238
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
239
a39, a40, a41, a42) \
240
PROTOCORE_NS_L41(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
241
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
242
a40, a41) \
243
PROTOCORE_NS_SLOT(T, a42, 41);
244
#define PROTOCORE_NS_L43(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
245
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
246
a39, a40, a41, a42, a43) \
247
PROTOCORE_NS_L42(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
248
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
249
a40, a41, a42) \
250
PROTOCORE_NS_SLOT(T, a43, 42);
251
#define PROTOCORE_NS_L44(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
252
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
253
a39, a40, a41, a42, a43, a44) \
254
PROTOCORE_NS_L43(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
255
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
256
a40, a41, a42, a43) \
257
PROTOCORE_NS_SLOT(T, a44, 43);
258
#define PROTOCORE_NS_L45(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
259
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
260
a39, a40, a41, a42, a43, a44, a45) \
261
PROTOCORE_NS_L44(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
262
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
263
a40, a41, a42, a43, a44) \
264
PROTOCORE_NS_SLOT(T, a45, 44);
265
#define PROTOCORE_NS_L46(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
266
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
267
a39, a40, a41, a42, a43, a44, a45, a46) \
268
PROTOCORE_NS_L45(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
269
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
270
a40, a41, a42, a43, a44, a45) \
271
PROTOCORE_NS_SLOT(T, a46, 45);
272
#define PROTOCORE_NS_L47(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
273
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
274
a39, a40, a41, a42, a43, a44, a45, a46, a47) \
275
PROTOCORE_NS_L46(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
276
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
277
a40, a41, a42, a43, a44, a45, a46) \
278
PROTOCORE_NS_SLOT(T, a47, 46);
279
#define PROTOCORE_NS_L48(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
280
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
281
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48) \
282
PROTOCORE_NS_L47(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
283
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
284
a40, a41, a42, a43, a44, a45, a46, a47) \
285
PROTOCORE_NS_SLOT(T, a48, 47);
286
#define PROTOCORE_NS_L49(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
287
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
288
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49) \
289
PROTOCORE_NS_L48(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
290
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
291
a40, a41, a42, a43, a44, a45, a46, a47, a48) \
292
PROTOCORE_NS_SLOT(T, a49, 48);
293
#define PROTOCORE_NS_L50(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
294
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
295
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50) \
296
PROTOCORE_NS_L49(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
297
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
298
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49) \
299
PROTOCORE_NS_SLOT(T, a50, 49);
300
#define PROTOCORE_NS_L51(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
301
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
302
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51) \
303
PROTOCORE_NS_L50(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
304
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
305
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50) \
306
PROTOCORE_NS_SLOT(T, a51, 50);
307
#define PROTOCORE_NS_L52(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
308
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
309
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52) \
310
PROTOCORE_NS_L51(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
311
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
312
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51) \
313
PROTOCORE_NS_SLOT(T, a52, 51);
314
#define PROTOCORE_NS_L53(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
315
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
316
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53) \
317
PROTOCORE_NS_L52(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
318
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
319
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52) \
320
PROTOCORE_NS_SLOT(T, a53, 52);
321
#define PROTOCORE_NS_L54(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
322
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
323
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54) \
324
PROTOCORE_NS_L53(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
325
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
326
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53) \
327
PROTOCORE_NS_SLOT(T, a54, 53);
328
#define PROTOCORE_NS_L55(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
329
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
330
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55) \
331
PROTOCORE_NS_L54(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
332
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
333
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54) \
334
PROTOCORE_NS_SLOT(T, a55, 54);
335
#define PROTOCORE_NS_L56(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
336
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
337
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56) \
338
PROTOCORE_NS_L55(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
339
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
340
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55) \
341
PROTOCORE_NS_SLOT(T, a56, 55);
342
#define PROTOCORE_NS_L57(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
343
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
344
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
345
a57) \
346
PROTOCORE_NS_L56(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
347
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
348
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56) \
349
PROTOCORE_NS_SLOT(T, a57, 56);
350
#define PROTOCORE_NS_L58(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
351
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
352
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
353
a57, a58) \
354
PROTOCORE_NS_L57(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
355
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
356
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57) \
357
PROTOCORE_NS_SLOT(T, a58, 57);
358
#define PROTOCORE_NS_L59(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
359
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
360
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
361
a57, a58, a59) \
362
PROTOCORE_NS_L58(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
363
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
364
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58) \
365
PROTOCORE_NS_SLOT(T, a59, 58);
366
#define PROTOCORE_NS_L60(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
367
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
368
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
369
a57, a58, a59, a60) \
370
PROTOCORE_NS_L59(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
371
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
372
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
373
a59) \
374
PROTOCORE_NS_SLOT(T, a60, 59);
375
#define PROTOCORE_NS_L61(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
376
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
377
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
378
a57, a58, a59, a60, a61) \
379
PROTOCORE_NS_L60(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
380
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
381
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
382
a59, a60) \
383
PROTOCORE_NS_SLOT(T, a61, 60);
384
#define PROTOCORE_NS_L62(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
385
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
386
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
387
a57, a58, a59, a60, a61, a62) \
388
PROTOCORE_NS_L61(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
389
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
390
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
391
a59, a60, a61) \
392
PROTOCORE_NS_SLOT(T, a62, 61);
393
#define PROTOCORE_NS_L63(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
394
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
395
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
396
a57, a58, a59, a60, a61, a62, a63) \
397
PROTOCORE_NS_L62(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
398
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
399
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
400
a59, a60, a61, a62) \
401
PROTOCORE_NS_SLOT(T, a63, 62);
402
#define PROTOCORE_NS_L64(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
403
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
404
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
405
a57, a58, a59, a60, a61, a62, a63, a64) \
406
PROTOCORE_NS_L63(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
407
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
408
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
409
a59, a60, a61, a62, a63) \
410
PROTOCORE_NS_SLOT(T, a64, 63);
411
#define PROTOCORE_NS_L65(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
412
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
413
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
414
a57, a58, a59, a60, a61, a62, a63, a64, a65) \
415
PROTOCORE_NS_L64(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
416
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
417
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
418
a59, a60, a61, a62, a63, a64) \
419
PROTOCORE_NS_SLOT(T, a65, 64);
420
#define PROTOCORE_NS_L66(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
421
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
422
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
423
a57, a58, a59, a60, a61, a62, a63, a64, a65, a66) \
424
PROTOCORE_NS_L65(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
425
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
426
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
427
a59, a60, a61, a62, a63, a64, a65) \
428
PROTOCORE_NS_SLOT(T, a66, 65);
429
#define PROTOCORE_NS_L67(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
430
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
431
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
432
a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67) \
433
PROTOCORE_NS_L66(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
434
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
435
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
436
a59, a60, a61, a62, a63, a64, a65, a66) \
437
PROTOCORE_NS_SLOT(T, a67, 66);
438
#define PROTOCORE_NS_L68(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
439
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
440
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
441
a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68) \
442
PROTOCORE_NS_L67(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
443
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
444
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
445
a59, a60, a61, a62, a63, a64, a65, a66, a67) \
446
PROTOCORE_NS_SLOT(T, a68, 67);
447
#define PROTOCORE_NS_L69(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
448
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
449
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
450
a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69) \
451
PROTOCORE_NS_L68(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
452
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
453
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
454
a59, a60, a61, a62, a63, a64, a65, a66, a67, a68) \
455
PROTOCORE_NS_SLOT(T, a69, 68);
456
#define PROTOCORE_NS_L70(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
457
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
458
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
459
a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70) \
460
PROTOCORE_NS_L69(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
461
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
462
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
463
a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69) \
464
PROTOCORE_NS_SLOT(T, a70, 69);
465
#define PROTOCORE_NS_L71(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
466
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
467
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
468
a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71) \
469
PROTOCORE_NS_L70(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
470
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
471
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
472
a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70) \
473
PROTOCORE_NS_SLOT(T, a71, 70);
474
#define PROTOCORE_NS_L72(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
475
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, \
476
a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, \
477
a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72) \
478
PROTOCORE_NS_L71(T, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, \
479
a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, \
480
a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, \
481
a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71) \
482
PROTOCORE_NS_SLOT(T, a72, 71);
483
484
/**
485
* @brief Pin every dispatch slot of a table that is nothing but function pointers.
486
*
487
* PROTOCORE_NS_LAYOUT(Sha256Ns, init, update, final, hash);
488
*
489
* A `<X>Ns` is a run of function pointers, and a positional initialiser mis-wires silently when a
490
* member is inserted, removed or moved - which this tree has already been bitten by: radio_power.c
491
* initialised its table positionally across a feature-flag split, so an arm that compiled out
492
* shifted every member below it onto the wrong function, and it still built. This asserts each
493
* named member is at its own slot, in the order given, and that sizeof is exactly that many
494
* pointers, so the mis-wiring fails at the declaration instead of at a wrong call.
495
*
496
* Costs nothing at run time.
497
*/
498
#define PROTOCORE_NS_LAYOUT(T, ...) \
499
PROTOCORE_CAT(PROTOCORE_NS_L, PROTOCORE_NARG(__VA_ARGS__))(T, __VA_ARGS__) static_assert( \
500
sizeof(T) == (size_t)PROTOCORE_NARG(__VA_ARGS__) * PROTOCORE_FP_SIZE, \
501
#T " has a member that is not in its dispatch list, or is padded")
502
503
/**
504
* @brief Pin the dispatch slots of a table that carries state after its entries.
505
*
506
* A table whose tail is not function pointers cannot be pinned by sizeof, so @p tail names the
507
* first member after the run and its offset does the same job: insert or drop an entry and the tail
508
* moves, which fails.
509
*/
510
#define PROTOCORE_NS_LAYOUT_OPEN(T, tail, ...) \
511
PROTOCORE_CAT(PROTOCORE_NS_L, PROTOCORE_NARG(__VA_ARGS__))(T, __VA_ARGS__) static_assert( \
512
offsetof(T, tail) == (size_t)PROTOCORE_NARG(__VA_ARGS__) * PROTOCORE_FP_SIZE, \
513
#T "." #tail " does not begin where the dispatch run ends")
514
515
/**
516
* @brief Storage for a dispatch table. The const is load bearing.
517
*
518
* Measured on gcc: a call through a `static const <X>Ns` devirtualises to the inlined body, the same
519
* instructions as calling the entry directly, and the same call through a non-const one does not -
520
* that becomes a real call with a frame. clang devirtualises both, so const is what makes the two
521
* agree.
522
*/
523
#define PROTOCORE_NS static const
524
525
#endif
// PROTOCORE_NS_CONTRACT_H
src
config
platform
ns_contract.h
Generated by
1.9.8