Skip to content

Commit 5f75b46

Browse files
committed
Merge pull request #1850 from pguyot/w39/jit-add-trace
JIT: Add TRACE to most primitive calls These changes are made under both the "Apache 2.0" and the "GNU Lesser General Public License 2.1 or later" license terms (dual license). SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
2 parents 287f3d4 + 33873b2 commit 5f75b46

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

src/libAtomVM/jit.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ static void destroy_extended_registers(Context *ctx, unsigned int live)
111111

112112
static void jit_trim_live_regs(Context *ctx, uint32_t live)
113113
{
114+
TRACE("jit_trim_live_regs: ctx->process_id = %d, live = %d\n", ctx->process_id, live);
114115
if (UNLIKELY(!list_is_empty(&ctx->extended_x_regs))) {
115116
destroy_extended_registers(ctx, live);
116117
}
@@ -126,6 +127,7 @@ static void jit_trim_live_regs(Context *ctx, uint32_t live)
126127
static Context *jit_return(Context *ctx, JITState *jit_state)
127128
{
128129
int module_index = ctx->cp >> 24;
130+
TRACE("jit_return: ctx->cp = %d, module_index = %d, offset = %d\n", (int) ctx->cp, module_index, (int) (ctx->cp & 0xFFFFFF) >> 2);
129131
Module *mod = globalcontext_get_module_by_index(ctx->global, module_index);
130132

131133
// Native case
@@ -145,6 +147,7 @@ static Context *jit_return(Context *ctx, JITState *jit_state)
145147

146148
static Context *jit_terminate_context(Context *ctx, JITState *jit_state)
147149
{
150+
TRACE("jit_terminate_context: ctx->process_id = %d\n", ctx->process_id);
148151
TRACE("-- Code execution finished for %i--\n", ctx->process_id);
149152
GlobalContext *global = ctx->global;
150153
if (ctx->leader) {
@@ -157,6 +160,7 @@ static Context *jit_terminate_context(Context *ctx, JITState *jit_state)
157160

158161
static Context *jit_handle_error(Context *ctx, JITState *jit_state, int offset)
159162
{
163+
TRACE("jit_terminate_context: ctx->process_id = %d, offset = %d\n", ctx->process_id, offset);
160164
if (offset || term_is_invalid_term(ctx->x[2])) {
161165
ctx->x[2] = stacktrace_create_raw(ctx, jit_state->module, offset, ctx->x[0]);
162166
}
@@ -223,12 +227,14 @@ static void set_error(Context *ctx, JITState *jit_state, int offset, term error_
223227

224228
static Context *jit_raise_error(Context *ctx, JITState *jit_state, int offset, term error_type_atom)
225229
{
230+
TRACE("jit_raise_error: ctx->process_id = %d, offset = %d\n", ctx->process_id, offset);
226231
set_error(ctx, jit_state, offset, error_type_atom);
227232
return jit_handle_error(ctx, jit_state, 0);
228233
}
229234

230235
static Context *jit_raise_error_tuple(Context *ctx, JITState *jit_state, int offset, term error_atom, term arg1)
231236
{
237+
TRACE("jit_raise_error_tuple: ctx->process_id = %d, offset = %d\n", ctx->process_id, offset);
232238
// We can gc as we are raising
233239
if (UNLIKELY(memory_ensure_free_with_roots(ctx, TUPLE_SIZE(2), 1, &arg1, MEMORY_CAN_SHRINK) != MEMORY_GC_OK)) {
234240
set_error(ctx, jit_state, offset, OUT_OF_MEMORY_ATOM);
@@ -245,6 +251,7 @@ static Context *jit_raise_error_tuple(Context *ctx, JITState *jit_state, int off
245251

246252
static Context *jit_raise(Context *ctx, JITState *jit_state, int offset, term stacktrace, term exc_value)
247253
{
254+
TRACE("jit_raise: ctx->process_id = %d, offset = %d\n", ctx->process_id, offset);
248255
ctx->x[0] = stacktrace_exception_class(stacktrace);
249256
ctx->x[1] = exc_value;
250257
ctx->x[2] = stacktrace_create_raw(ctx, jit_state->module, offset, stacktrace);
@@ -253,6 +260,7 @@ static Context *jit_raise(Context *ctx, JITState *jit_state, int offset, term st
253260

254261
static Context *jit_schedule_next_cp(Context *ctx, JITState *jit_state)
255262
{
263+
TRACE("jit_schedule_next_cp: ctx->process_id = %d\n", ctx->process_id);
256264
ctx->saved_ip = jit_state->continuation;
257265
ctx->saved_module = jit_state->module;
258266
jit_state->remaining_reductions = 0;
@@ -261,6 +269,7 @@ static Context *jit_schedule_next_cp(Context *ctx, JITState *jit_state)
261269

262270
static Context *jit_schedule_wait_cp(Context *ctx, JITState *jit_state)
263271
{
272+
TRACE("jit_schedule_wait_cp: ctx->process_id = %d\n", ctx->process_id);
264273
ctx->saved_ip = jit_state->continuation;
265274
ctx->saved_module = jit_state->module;
266275
jit_state->remaining_reductions = 0;
@@ -291,6 +300,7 @@ enum TrapAndLoadResult jit_trap_and_load(Context *ctx, Module *mod, uint32_t lab
291300

292301
static Context *jit_call_ext(Context *ctx, JITState *jit_state, int offset, int arity, int index, int n_words)
293302
{
303+
TRACE("jit_call_ext: arity=%d index=%d n_words=%d\n", arity, index, n_words);
294304
const struct ExportedFunction *func = module_resolve_function(jit_state->module, index, ctx->global);
295305
if (IS_NULL_PTR(func)) {
296306
return jit_raise_error(ctx, jit_state, 0, UNDEF_ATOM);
@@ -440,11 +450,13 @@ static Context *jit_call_ext(Context *ctx, JITState *jit_state, int offset, int
440450

441451
static term jit_module_get_atom_term_by_id(JITState *jit_state, int atom_index)
442452
{
453+
TRACE("jit_module_get_atom_term_by_id: atom_index=%d\n", atom_index);
443454
return module_get_atom_term_by_id(jit_state->module, atom_index);
444455
}
445456

446457
static bool jit_allocate(Context *ctx, JITState *jit_state, uint32_t stack_need, uint32_t heap_need, uint32_t live)
447458
{
459+
TRACE("jit_allocate: stack_need=%u heap_need=%u live=%u\n", stack_need, heap_need, live);
448460
if (ctx->heap.root->next || ((ctx->heap.heap_ptr + heap_need > ctx->e - (stack_need + 1)))) {
449461
TRIM_LIVE_REGS(live);
450462
if (UNLIKELY(memory_ensure_free_with_roots(ctx, heap_need + stack_need + 1, live, ctx->x, MEMORY_CAN_SHRINK) != MEMORY_GC_OK)) {
@@ -459,13 +471,15 @@ static bool jit_allocate(Context *ctx, JITState *jit_state, uint32_t stack_need,
459471

460472
static void *jit_get_imported_bif(JITState *jit_state, uint32_t bif)
461473
{
474+
TRACE("jit_get_imported_bif: bif=%u\n", bif);
462475
const struct ExportedFunction *exported_bif = jit_state->module->imported_funcs[bif];
463476
void *result = EXPORTED_FUNCTION_TO_BIF(exported_bif)->bif0_ptr;
464477
return result;
465478
}
466479

467480
static bool jit_deallocate(Context *ctx, JITState *jit_state, uint32_t n_words)
468481
{
482+
TRACE("jit_deallocate: n_words=%u\n", n_words);
469483
ctx->cp = ctx->e[n_words];
470484
ctx->e += n_words + 1;
471485
// Hopefully, we only need x[0]
@@ -484,11 +498,13 @@ static TermCompareResult jit_term_compare(Context *ctx, JITState *jit_state, ter
484498
if (UNLIKELY(result == 0)) {
485499
set_error(ctx, jit_state, 0, OUT_OF_MEMORY_ATOM);
486500
}
501+
TRACE("jit_term_compare: t=%p other=%p opts=%d, result=%d\n", (void *) t, (void *) other, opts, result);
487502
return result;
488503
}
489504

490505
static bool jit_test_heap(Context *ctx, JITState *jit_state, uint32_t heap_need, uint32_t live_registers)
491506
{
507+
TRACE("jit_test_heap: heap_need=%u live_registers=%u\n", heap_need, live_registers);
492508
size_t heap_free = context_avail_free_memory(ctx);
493509
// if we need more heap space than is currently free, then try to GC the needed space
494510
if (heap_free < heap_need) {
@@ -512,18 +528,21 @@ static bool jit_test_heap(Context *ctx, JITState *jit_state, uint32_t heap_need,
512528

513529
static term jit_put_list(Context *ctx, term head, term tail)
514530
{
531+
TRACE("jit_put_list: head=%p tail=%p\n", (void *) head, (void *) tail);
515532
term *list_elem = term_list_alloc(&ctx->heap);
516533
term t = term_list_init_prepend(list_elem, head, tail);
517534
return t;
518535
}
519536

520537
static term jit_module_load_literal(Context *ctx, JITState *jit_state, int index)
521538
{
539+
TRACE("jit_module_load_literal: index=%d\n", index);
522540
return module_load_literal(jit_state->module, index, ctx);
523541
}
524542

525543
static term jit_alloc_boxed_integer_fragment(Context *ctx, avm_int64_t value)
526544
{
545+
TRACE("jit_alloc_boxed_integer_fragment: value=%lld\n", (long long) value);
527546
#if BOXED_TERMS_REQUIRED_FOR_INT64 > 1
528547
if ((value < AVM_INT_MIN) || (value > AVM_INT_MAX)) {
529548
Heap heap;
@@ -580,11 +599,13 @@ static term maybe_alloc_boxed_integer_fragment(Context *ctx, avm_int64_t value)
580599

581600
static term jit_term_alloc_tuple(Context *ctx, uint32_t size)
582601
{
602+
TRACE("jit_term_alloc_tuple: size=%u\n", size);
583603
return term_alloc_tuple(size, &ctx->heap);
584604
}
585605

586606
static term jit_term_alloc_fun(Context *ctx, JITState *jit_state, uint32_t fun_index, uint32_t numfree)
587607
{
608+
TRACE("jit_term_alloc_fun: fun_index=%u numfree=%u\n", fun_index, numfree);
588609
size_t size = numfree + BOXED_FUN_SIZE;
589610
term *boxed_func = memory_heap_alloc(&ctx->heap, size);
590611

@@ -596,6 +617,7 @@ static term jit_term_alloc_fun(Context *ctx, JITState *jit_state, uint32_t fun_i
596617

597618
static bool jit_send(Context *ctx, JITState *jit_state)
598619
{
620+
TRACE("jit_send: recipient=%p message=%p\n", (void *) ctx->x[0], (void *) ctx->x[1]);
599621
term recipient_term = ctx->x[0];
600622
if (UNLIKELY(term_is_external_pid(recipient_term) || term_is_tuple(recipient_term))) {
601623
term return_value = dist_send_message(recipient_term, ctx->x[1], ctx);
@@ -627,6 +649,7 @@ static bool jit_send(Context *ctx, JITState *jit_state)
627649

628650
static term *jit_extended_register_ptr(Context *ctx, unsigned int index)
629651
{
652+
TRACE("jit_extended_register_ptr: index=%u\n", index);
630653
struct ListHead *item;
631654
LIST_FOR_EACH (item, &ctx->extended_x_regs) {
632655
struct ExtendedRegister *ext_reg = GET_LIST_ENTRY(item, struct ExtendedRegister, head);
@@ -644,6 +667,7 @@ static term *jit_extended_register_ptr(Context *ctx, unsigned int index)
644667

645668
static Context *jit_process_signal_messages(Context *ctx, JITState *jit_state)
646669
{
670+
TRACE("jit_process_signal_messages\n");
647671
MailboxMessage *signal_message = mailbox_process_outer_list(&ctx->mailbox);
648672
bool handle_error = false;
649673
bool reprocess_outer = false;
@@ -787,41 +811,48 @@ static Context *jit_process_signal_messages(Context *ctx, JITState *jit_state)
787811

788812
static term jit_mailbox_peek(Context *ctx)
789813
{
814+
TRACE("jit_mailbox_peek: ctx->process_id=%d\n", ctx->process_id);
790815
term out = term_invalid_term();
791816
mailbox_peek(ctx, &out);
792817
return out;
793818
}
794819

795820
static void jit_mailbox_remove_message(Context *ctx)
796821
{
822+
TRACE("jit_mailbox_remove_message: ctx->process_id=%d\n", ctx->process_id);
797823
mailbox_remove_message(&ctx->mailbox, &ctx->heap);
798824
}
799825

800826
static void jit_timeout(Context *ctx)
801827
{
828+
TRACE("jit_timeout: ctx->process_id=%d\n", ctx->process_id);
802829
context_update_flags(ctx, ~WaitingTimeoutExpired, NoFlags);
803830
mailbox_reset(&ctx->mailbox);
804831
}
805832

806833
static void jit_mailbox_next(Context *ctx)
807834
{
835+
TRACE("jit_mailbox_next: ctx->process_id=%d\n", ctx->process_id);
808836
mailbox_next(&ctx->mailbox);
809837
}
810838

811839
static void jit_cancel_timeout(Context *ctx)
812840
{
841+
TRACE("jit_cancel_timeout: ctx->process_id=%d\n", ctx->process_id);
813842
if (context_get_flags(ctx, WaitingTimeout | WaitingTimeoutExpired)) {
814843
scheduler_cancel_timeout(ctx);
815844
}
816845
}
817846

818847
static void jit_clear_timeout_flag(Context *ctx)
819848
{
849+
TRACE("jit_clear_timeout_flag: ctx->process_id=%d\n", ctx->process_id);
820850
context_update_flags(ctx, ~WaitingTimeoutExpired, NoFlags);
821851
}
822852

823853
static Context *jit_wait_timeout(Context *ctx, JITState *jit_state, term timeout, int label)
824854
{
855+
TRACE("jit_wait_timeout: timeout=%p label=%d\n", (void *) timeout, label);
825856
avm_int64_t t = 0;
826857
if (term_is_any_integer(timeout)) {
827858
t = term_maybe_unbox_int64(timeout);
@@ -861,6 +892,7 @@ static Context *jit_wait_timeout(Context *ctx, JITState *jit_state, term timeout
861892

862893
static Context *jit_wait_timeout_trap_handler(Context *ctx, JITState *jit_state, int label)
863894
{
895+
TRACE("jit_wait_timeout_trap_handler: label=%d\n", label);
864896
if (UNLIKELY(!mailbox_has_next(&ctx->mailbox))) {
865897
// No message is here.
866898
// We were signaled for another reason.
@@ -928,6 +960,7 @@ static bool maybe_call_native(Context *ctx, atom_index_t module_name, atom_index
928960

929961
static Context *jit_call_fun(Context *ctx, JITState *jit_state, int offset, term fun, unsigned int args_count)
930962
{
963+
TRACE("jit_call_fun: fun=%p args_count=%u\n", (void *) fun, args_count);
931964
Module *fun_module;
932965
unsigned int fun_arity;
933966
uint32_t n_freeze = 0;
@@ -1005,16 +1038,19 @@ static Context *jit_call_fun(Context *ctx, JITState *jit_state, int offset, term
10051038

10061039
static term jit_term_from_float(Context *ctx, int freg)
10071040
{
1041+
TRACE("jit_term_from_float: freg=%d -- float = %f\n", freg, ctx->fr[freg]);
10081042
return term_from_float(ctx->fr[freg], &ctx->heap);
10091043
}
10101044

10111045
static void jit_term_conv_to_float(Context *ctx, term t, int freg)
10121046
{
1047+
TRACE("jit_term_conv_to_float: t=%p freg=%d\n", (void *) t, freg);
10131048
ctx->fr[freg] = term_conv_to_float(t);
10141049
}
10151050

10161051
static bool jit_fadd(Context *ctx, int freg1, int freg2, int freg3)
10171052
{
1053+
TRACE("jit_fadd: freg1=%d [%f] freg2=%d [%f] freg3=%d\n", freg1, ctx->fr[freg1], freg2, ctx->fr[freg2], freg3);
10181054
#ifdef HAVE_PRAGMA_STDC_FENV_ACCESS
10191055
#pragma STDC FENV_ACCESS ON
10201056
feclearexcept(FE_OVERFLOW);
@@ -1034,6 +1070,7 @@ static bool jit_fadd(Context *ctx, int freg1, int freg2, int freg3)
10341070

10351071
static bool jit_fsub(Context *ctx, int freg1, int freg2, int freg3)
10361072
{
1073+
TRACE("jit_fsub: freg1=%d freg2=%d freg3=%d\n", freg1, freg2, freg3);
10371074
#ifdef HAVE_PRAGMA_STDC_FENV_ACCESS
10381075
#pragma STDC FENV_ACCESS ON
10391076
feclearexcept(FE_OVERFLOW);
@@ -1053,6 +1090,7 @@ static bool jit_fsub(Context *ctx, int freg1, int freg2, int freg3)
10531090

10541091
static bool jit_fmul(Context *ctx, int freg1, int freg2, int freg3)
10551092
{
1093+
TRACE("jit_fmul: freg1=%d freg2=%d freg3=%d\n", freg1, freg2, freg3);
10561094
#ifdef HAVE_PRAGMA_STDC_FENV_ACCESS
10571095
#pragma STDC FENV_ACCESS ON
10581096
feclearexcept(FE_OVERFLOW);
@@ -1072,6 +1110,7 @@ static bool jit_fmul(Context *ctx, int freg1, int freg2, int freg3)
10721110

10731111
static bool jit_fdiv(Context *ctx, int freg1, int freg2, int freg3)
10741112
{
1113+
TRACE("jit_fdiv: freg1=%d freg2=%d freg3=%d\n", freg1, freg2, freg3);
10751114
#ifdef HAVE_PRAGMA_STDC_FENV_ACCESS
10761115
#pragma STDC FENV_ACCESS ON
10771116
feclearexcept(FE_OVERFLOW | FE_DIVBYZERO);
@@ -1091,11 +1130,13 @@ static bool jit_fdiv(Context *ctx, int freg1, int freg2, int freg3)
10911130

10921131
static void jit_fnegate(Context *ctx, int freg1, int freg2)
10931132
{
1133+
TRACE("jit_fnegate: freg1=%d freg2=%d\n", freg1, freg2);
10941134
ctx->fr[freg2] = -ctx->fr[freg1];
10951135
}
10961136

10971137
static bool jit_catch_end(Context *ctx, JITState *jit_state)
10981138
{
1139+
TRACE("jit_catch_end\n");
10991140
// C.f. https://www.erlang.org/doc/reference_manual/expressions.html#catch-and-throw
11001141
switch (term_to_atom_index(ctx->x[0])) {
11011142
case THROW_ATOM_INDEX:
@@ -1138,6 +1179,7 @@ static bool jit_catch_end(Context *ctx, JITState *jit_state)
11381179

11391180
static bool jit_memory_ensure_free_with_roots(Context *ctx, JITState *jit_state, int sz, int live, int flags)
11401181
{
1182+
TRACE("jit_memory_ensure_free_with_roots: sz=%d live=%d flags=%d\n", sz, live, flags);
11411183
if (UNLIKELY(memory_ensure_free_with_roots(ctx, sz, live, ctx->x, flags) != MEMORY_GC_OK)) {
11421184
set_error(ctx, jit_state, 0, OUT_OF_MEMORY_ATOM);
11431185
return false;
@@ -1147,11 +1189,13 @@ static bool jit_memory_ensure_free_with_roots(Context *ctx, JITState *jit_state,
11471189

11481190
static term jit_term_alloc_bin_match_state(Context *ctx, term src, int slots)
11491191
{
1192+
TRACE("jit_term_alloc_bin_match_state: src=%p slots=%d\n", (void *) src, slots);
11501193
return term_alloc_bin_match_state(src, slots, &ctx->heap);
11511194
}
11521195

11531196
static term jit_bitstring_extract_integer(Context *ctx, JITState *jit_state, term *bin_ptr, size_t offset, int n, int bs_flags)
11541197
{
1198+
TRACE("jit_bitstring_extract_integer: bin_ptr=%p offset=%d n=%d bs_flags=%d\n", (void *) bin_ptr, (int) offset, n, bs_flags);
11551199
union maybe_unsigned_int64 value;
11561200
bool status = bitstring_extract_integer(((term) bin_ptr) | TERM_PRIMARY_BOXED, offset, n, bs_flags, &value);
11571201
if (UNLIKELY(!status)) {
@@ -1166,6 +1210,7 @@ static term jit_bitstring_extract_integer(Context *ctx, JITState *jit_state, ter
11661210

11671211
static term jit_bitstring_extract_float(Context *ctx, term *bin_ptr, size_t offset, int n, int bs_flags)
11681212
{
1213+
TRACE("jit_bitstring_extract_float: bin_ptr=%p offset=%d n=%d bs_flags=%d\n", (void *) bin_ptr, (int) offset, n, bs_flags);
11691214
avm_float_t value;
11701215
bool status;
11711216
switch (n) {
@@ -1187,11 +1232,13 @@ static term jit_bitstring_extract_float(Context *ctx, term *bin_ptr, size_t offs
11871232
static size_t jit_term_sub_binary_heap_size(term *bin_ptr, size_t size)
11881233
{
11891234
term binary = ((term) bin_ptr) | TERM_PRIMARY_BOXED;
1235+
TRACE("jit_term_sub_binary_heap_size: binary=%p size=%d\n", (void *) binary, (int) size);
11901236
return term_sub_binary_heap_size(binary, size);
11911237
}
11921238

11931239
static term jit_term_maybe_create_sub_binary(Context *ctx, term binary, size_t offset, size_t len)
11941240
{
1241+
TRACE("jit_term_maybe_create_sub_binary: binary=%p offset=%d len=%d\n", (void *) binary, (int) offset, (int) len);
11951242
return term_maybe_create_sub_binary(binary, offset, len, &ctx->heap, ctx->global);
11961243
}
11971244

@@ -1220,6 +1267,7 @@ static int jit_bitstring_utf16_size(int c)
12201267

12211268
static term jit_term_create_empty_binary(Context *ctx, size_t len)
12221269
{
1270+
TRACE("jit_term_create_empty_binary: len=%d\n", (int) len);
12231271
return term_create_empty_binary(len, &ctx->heap, ctx->global);
12241272
}
12251273

@@ -1272,6 +1320,7 @@ static int jit_bitstring_insert_utf16(term bin, size_t offset, int c, enum Bitst
12721320

12731321
static void jit_bitstring_copy_module_str(Context *ctx, JITState *jit_state, term bin, size_t offset, int str_id, size_t len)
12741322
{
1323+
TRACE("jit_bitstring_copy_module_str: bin=%p offset=%d str_id=%d len=%d\n", (void *) bin, (int) offset, str_id, (int) len);
12751324
UNUSED(ctx);
12761325
uint8_t *dst = (uint8_t *) term_binary_data(bin);
12771326
size_t remaining = 0;
@@ -1281,6 +1330,7 @@ static void jit_bitstring_copy_module_str(Context *ctx, JITState *jit_state, ter
12811330

12821331
static int jit_bitstring_copy_binary(Context *ctx, JITState *jit_state, term t, size_t offset, term src, term size)
12831332
{
1333+
TRACE("jit_bitstring_copy_binary: t=%p offset=%d src=%p size=%p\n", (void *) t, (int) offset, (void *) src, (void *) size);
12841334
if (offset % 8) {
12851335
set_error(ctx, jit_state, 0, UNSUPPORTED_ATOM);
12861336
return -1;
@@ -1297,6 +1347,7 @@ static int jit_bitstring_copy_binary(Context *ctx, JITState *jit_state, term t,
12971347

12981348
static Context *jit_apply(Context *ctx, JITState *jit_state, int offset, term module, term function, unsigned int arity)
12991349
{
1350+
TRACE("jit_apply: module=%p function=%p arity=%u\n", (void *) module, (void *) function, arity);
13001351
atom_index_t module_name = term_to_atom_index(module);
13011352
atom_index_t function_name = term_to_atom_index(function);
13021353

@@ -1343,6 +1394,7 @@ static Context *jit_apply(Context *ctx, JITState *jit_state, int offset, term mo
13431394

13441395
static void *jit_malloc(Context *ctx, JITState *jit_state, size_t sz)
13451396
{
1397+
TRACE("jit_malloc: sz=%d\n", (int) sz);
13461398
void *ptr = malloc(sz);
13471399
if (IS_NULL_PTR(ptr)) {
13481400
set_error(ctx, jit_state, 0, OUT_OF_MEMORY_ATOM);
@@ -1383,6 +1435,7 @@ static bool sort_kv_pairs(term *kv, int size, GlobalContext *global)
13831435

13841436
static term jit_put_map_assoc(Context *ctx, JITState *jit_state, term src, size_t new_entries, size_t num_elements, term *kv)
13851437
{
1438+
TRACE("jit_put_map_assoc: src=%p new_entries=%d num_elements=%d\n", (void *) src, (int) new_entries, (int) num_elements);
13861439
size_t src_size = term_get_map_size(src);
13871440
size_t new_map_size = src_size + new_entries;
13881441
bool is_shared = new_entries == 0;

0 commit comments

Comments
 (0)