Skip to content

Commit 2f20f89

Browse files
authored
flambda-backend: Fix mixed block macros so users don't get wrong platform's macros (#2494)
1 parent ba63be3 commit 2f20f89

File tree

4 files changed

+97
-44
lines changed

4 files changed

+97
-44
lines changed

runtime/alloc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ CAMLexport value caml_alloc_mixed_shr_check_gc (mlsize_t wosize, tag_t tag,
100100
mlsize_t scannable_prefix_len)
101101
{
102102
reserved_t reserved =
103-
Reserved_mixed_block_scannable_wosize(scannable_prefix_len);
103+
Reserved_mixed_block_scannable_wosize_native(scannable_prefix_len);
104104
return caml_alloc_shr_reserved_check_gc(wosize, tag, reserved);
105105
}
106106
#endif
@@ -371,7 +371,7 @@ CAMLprim value caml_alloc_dummy_mixed (value size, value scannable_size)
371371
*/
372372
CAML_STATIC_ASSERT(Double_wosize == 1);
373373
reserved_t reserved =
374-
Reserved_mixed_block_scannable_wosize(scannable_wosize);
374+
Reserved_mixed_block_scannable_wosize_native(scannable_wosize);
375375
#else
376376
/* [scannable_size] can't be used meaningfully in bytecode */
377377
(void)scannable_size;

runtime/caml/mlvalues.h

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -150,23 +150,14 @@ mixed blocks. In the upstream compiler, R is set with the
150150

151151
#endif
152152

153-
/* Header bits reserved for mixed blocks */
154153

155-
#define Is_mixed_block_reserved(res) (((reserved_t)(res)) > 0)
154+
/* Header bits reserved for mixed blocks */
156155

157-
#ifdef NATIVE_CODE
158-
#define Scannable_wosize_val(val) (Scannable_wosize_hd (Hd_val (val)))
159-
#define Reserved_mixed_block_scannable_wosize(sz) (((mlsize_t)(sz)) + 1)
160-
#define Mixed_block_scannable_wosize_reserved_native(res) (((reserved_t)(res)) - 1)
156+
#define Is_mixed_block_reserved(res) (((reserved_t)(res)) > 0)
161157

162-
Caml_inline mlsize_t Scannable_wosize_reserved(reserved_t res, mlsize_t sz) {
163-
return
164-
Is_mixed_block_reserved(res)
165-
? Mixed_block_scannable_wosize_reserved_native(res)
166-
: sz;
167-
}
158+
/* Native code versions of mixed block macros.
168159
169-
/* The scannable size of a block is how many fields are values as opposed
160+
The scannable size of a block is how many fields are values as opposed
170161
to flat floats/ints/etc. This is different than the (normal) size of a
171162
block for mixed blocks.
172163
@@ -182,25 +173,61 @@ Caml_inline mlsize_t Scannable_wosize_reserved(reserved_t res, mlsize_t sz) {
182173
Otherwise, the traversal could attempt to recursively descend into
183174
a flat field, which could segfault (or worse).
184175
*/
185-
Caml_inline mlsize_t Scannable_wosize_hd(header_t hd) {
176+
177+
#define Scannable_wosize_val_native(val) (Scannable_wosize_hd (Hd_val (val)))
178+
#define Reserved_mixed_block_scannable_wosize_native(sz) (((mlsize_t)(sz)) + 1)
179+
#define Mixed_block_scannable_wosize_reserved_native(res) \
180+
(((reserved_t)(res)) - 1)
181+
182+
Caml_inline mlsize_t Scannable_wosize_reserved_native(reserved_t res,
183+
mlsize_t sz) {
184+
return
185+
Is_mixed_block_reserved(res)
186+
? Mixed_block_scannable_wosize_reserved_native(res)
187+
: sz;
188+
}
189+
190+
Caml_inline mlsize_t Scannable_wosize_hd_native(header_t hd) {
186191
reserved_t res = Reserved_hd(hd);
187192
return
188193
Is_mixed_block_reserved(res)
189194
? Mixed_block_scannable_wosize_reserved_native(res)
190195
: Wosize_hd(hd);
191196
}
192197

193-
#else
194-
#define Scannable_wosize_hd(val) (Wosize_hd (val))
195-
#define Scannable_wosize_val(val) (Wosize_hd (Hd_val (val)))
196-
#define Faux_mixed_block_sentinel ((reserved_t) 0xff)
198+
/* Bytecode versions of mixed block macros.
197199
198-
// In bytecode always use the size of the block as the scannable size
199-
Caml_inline mlsize_t Scannable_wosize_reserved(reserved_t res, mlsize_t size) {
200+
Bytecode always uses the size of the block as the scannable size. That's
201+
because bytecode doesn't represent mixed records as mixed blocks. They're
202+
"faux mixed blocks", which are regular blocks with a sentinel value set
203+
in the header bits.
204+
*/
205+
206+
#define Scannable_wosize_hd_byte(hd) (Wosize_hd (hd))
207+
#define Scannable_wosize_val_byte(val) (Wosize_hd (Hd_val (val)))
208+
Caml_inline mlsize_t Scannable_wosize_reserved_byte(reserved_t res,
209+
mlsize_t size) {
210+
(void)res;
200211
return size;
201212
}
202213

214+
/* Users should specify whether they want to use the bytecode or native
215+
versions of these macros. Internally to the runtime, the NATIVE_CODE
216+
macro lets us make that determination, so we can define suffixless
217+
versions of the mixed block macros.
218+
*/
219+
#ifdef CAML_INTERNALS
220+
#ifdef NATIVE_CODE
221+
#define Scannable_wosize_reserved(r, s) Scannable_wosize_reserved_native(r, s)
222+
#define Scannable_wosize_hd(hd) Scannable_wosize_hd_native(hd)
223+
#define Scannable_wosize_val(val) Scannable_wosize_val_native(val)
224+
#else
225+
#define Faux_mixed_block_sentinel ((reserved_t) 0xff)
226+
#define Scannable_wosize_reserved(r, s) Scannable_wosize_reserved_byte(r, s)
227+
#define Scannable_wosize_hd(hd) Scannable_wosize_hd_byte(hd)
228+
#define Scannable_wosize_val(val) Scannable_wosize_val_byte(val)
203229
#endif // NATIVE_CODE
230+
#endif // CAML_INTERNALS
204231

205232
/* Color values are pre-shifted */
206233

runtime4/alloc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ CAMLexport value caml_alloc (mlsize_t wosize, tag_t tag) {
7171
CAMLexport value caml_alloc_mixed (mlsize_t wosize, tag_t tag,
7272
mlsize_t scannable_prefix) {
7373
reserved_t reserved =
74-
Reserved_mixed_block_scannable_wosize(scannable_prefix);
74+
Reserved_mixed_block_scannable_wosize_native(scannable_prefix);
7575
return caml_alloc_with_reserved (wosize, tag, reserved);
7676
}
7777
#endif // NATIVE_CODE
@@ -263,7 +263,7 @@ CAMLprim value caml_alloc_dummy_mixed (value size, value scannable_size)
263263
*/
264264
CAML_STATIC_ASSERT(Double_wosize == 1);
265265
reserved_t reserved =
266-
Reserved_mixed_block_scannable_wosize(scannable_wosize);
266+
Reserved_mixed_block_scannable_wosize_native(scannable_wosize);
267267
#else
268268
/* [scannable_size] can't be used meaningfully in bytecode */
269269
(void)scannable_size;

runtime4/caml/mlvalues.h

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -145,21 +145,11 @@ originally built for Spacetime profiling, hence the odd name.
145145
#define Reserved_hd(hd) ((reserved_t)(Profinfo_hd(hd)))
146146
#define Reserved_val(val) ((reserved_t)(Profinfo_val(val)))
147147

148-
#define Is_mixed_block_reserved(res) (((reserved_t)(res)) > 0)
148+
#define Is_mixed_block_reserved(res) (((reserved_t)(res)) > 0)
149149

150-
#ifdef NATIVE_CODE
151-
#define Scannable_wosize_val(val) (Scannable_wosize_hd (Hd_val (val)))
152-
#define Reserved_mixed_block_scannable_wosize(sz) (((mlsize_t)(sz)) + 1)
153-
#define Mixed_block_scannable_wosize_reserved_native(res) (((reserved_t)(res)) - 1)
154-
155-
Caml_inline mlsize_t Scannable_wosize_reserved(reserved_t res, mlsize_t sz) {
156-
return
157-
Is_mixed_block_reserved(res)
158-
? Mixed_block_scannable_wosize_reserved_native(res)
159-
: sz;
160-
}
150+
/* Native code versions of mixed block macros.
161151
162-
/* The scannable size of a block is how many fields are values as opposed
152+
The scannable size of a block is how many fields are values as opposed
163153
to flat floats/ints/etc. This is different than the (normal) size of a
164154
block for mixed blocks.
165155
@@ -175,25 +165,61 @@ Caml_inline mlsize_t Scannable_wosize_reserved(reserved_t res, mlsize_t sz) {
175165
Otherwise, the traversal could attempt to recursively descend into
176166
a flat field, which could segfault (or worse).
177167
*/
178-
Caml_inline mlsize_t Scannable_wosize_hd(header_t hd) {
168+
169+
#define Scannable_wosize_val_native(val) (Scannable_wosize_hd (Hd_val (val)))
170+
#define Reserved_mixed_block_scannable_wosize_native(sz) (((mlsize_t)(sz)) + 1)
171+
#define Mixed_block_scannable_wosize_reserved_native(res) \
172+
(((reserved_t)(res)) - 1)
173+
174+
Caml_inline mlsize_t Scannable_wosize_reserved_native(reserved_t res,
175+
mlsize_t sz) {
176+
return
177+
Is_mixed_block_reserved(res)
178+
? Mixed_block_scannable_wosize_reserved_native(res)
179+
: sz;
180+
}
181+
182+
Caml_inline mlsize_t Scannable_wosize_hd_native(header_t hd) {
179183
reserved_t res = Reserved_hd(hd);
180184
return
181185
Is_mixed_block_reserved(res)
182186
? Mixed_block_scannable_wosize_reserved_native(res)
183187
: Wosize_hd(hd);
184188
}
185189

186-
#else
187-
#define Scannable_wosize_hd(val) (Wosize_hd (val))
188-
#define Scannable_wosize_val(val) (Wosize_hd (Hd_val (val)))
189-
#define Faux_mixed_block_sentinel ((reserved_t) 0xff)
190+
/* Bytecode versions of mixed block macros.
190191
191-
// In bytecode always use the size of the block as the scannable size
192-
Caml_inline mlsize_t Scannable_wosize_reserved(reserved_t res, mlsize_t size) {
192+
Bytecode always uses the size of the block as the scannable size. That's
193+
because bytecode doesn't represent mixed records as mixed blocks. They're
194+
"faux mixed blocks", which are regular blocks with a sentinel value set
195+
in the header bits.
196+
*/
197+
198+
#define Scannable_wosize_hd_byte(hd) (Wosize_hd (hd))
199+
#define Scannable_wosize_val_byte(val) (Wosize_hd (Hd_val (val)))
200+
Caml_inline mlsize_t Scannable_wosize_reserved_byte(reserved_t res,
201+
mlsize_t size) {
202+
(void)res;
193203
return size;
194204
}
195205

206+
/* Users should specify whether they want to use the bytecode or native
207+
versions of these macros. Internally to the runtime, the NATIVE_CODE
208+
macro lets us make that determination, so we can define suffixless
209+
versions of the mixed block macros.
210+
*/
211+
#ifdef CAML_INTERNALS
212+
#ifdef NATIVE_CODE
213+
#define Scannable_wosize_reserved(r, s) Scannable_wosize_reserved_native(r, s)
214+
#define Scannable_wosize_hd(hd) Scannable_wosize_hd_native(hd)
215+
#define Scannable_wosize_val(val) Scannable_wosize_val_native(val)
216+
#else
217+
#define Faux_mixed_block_sentinel ((reserved_t) 0xff)
218+
#define Scannable_wosize_reserved(r, s) Scannable_wosize_reserved_byte(r, s)
219+
#define Scannable_wosize_hd(hd) Scannable_wosize_hd_byte(hd)
220+
#define Scannable_wosize_val(val) Scannable_wosize_val_byte(val)
196221
#endif // NATIVE_CODE
222+
#endif // CAML_INTERNALS
197223

198224
#define Hd_val(val) (((header_t *) (val)) [-1]) /* Also an l-value. */
199225
#define Hd_op(op) (Hd_val (op)) /* Also an l-value. */

0 commit comments

Comments
 (0)