1use super::error::CodeGenError;
8use std::collections::HashMap;
9use std::fmt::Write as _;
10use std::sync::LazyLock;
11
12pub struct RuntimeDecl {
14 pub decl: &'static str,
16 pub category: Option<&'static str>,
18}
19
20pub static RUNTIME_DECLARATIONS: LazyLock<Vec<RuntimeDecl>> = LazyLock::new(|| {
23 vec![
24 RuntimeDecl {
26 decl: "declare ptr @patch_seq_push_int(ptr, i64)",
27 category: Some("; Runtime function declarations"),
28 },
29 RuntimeDecl {
30 decl: "declare ptr @patch_seq_push_string(ptr, ptr)",
31 category: None,
32 },
33 RuntimeDecl {
34 decl: "declare ptr @patch_seq_push_symbol(ptr, ptr)",
35 category: None,
36 },
37 RuntimeDecl {
38 decl: "declare ptr @patch_seq_push_interned_symbol(ptr, ptr)",
39 category: None,
40 },
41 RuntimeDecl {
43 decl: "declare ptr @patch_seq_write(ptr)",
44 category: None,
45 },
46 RuntimeDecl {
47 decl: "declare ptr @patch_seq_write_line(ptr)",
48 category: None,
49 },
50 RuntimeDecl {
51 decl: "declare ptr @patch_seq_read_line(ptr)",
52 category: None,
53 },
54 RuntimeDecl {
55 decl: "declare ptr @patch_seq_read_line_plus(ptr)",
56 category: None,
57 },
58 RuntimeDecl {
59 decl: "declare ptr @patch_seq_read_n(ptr)",
60 category: None,
61 },
62 RuntimeDecl {
64 decl: "declare ptr @patch_seq_int_to_string(ptr)",
65 category: None,
66 },
67 RuntimeDecl {
68 decl: "declare ptr @patch_seq_symbol_to_string(ptr)",
69 category: None,
70 },
71 RuntimeDecl {
72 decl: "declare ptr @patch_seq_string_to_symbol(ptr)",
73 category: None,
74 },
75 RuntimeDecl {
77 decl: "declare ptr @patch_seq_add(ptr)",
78 category: None,
79 },
80 RuntimeDecl {
81 decl: "declare ptr @patch_seq_subtract(ptr)",
82 category: None,
83 },
84 RuntimeDecl {
85 decl: "declare ptr @patch_seq_multiply(ptr)",
86 category: None,
87 },
88 RuntimeDecl {
89 decl: "declare ptr @patch_seq_divide(ptr)",
90 category: None,
91 },
92 RuntimeDecl {
93 decl: "declare ptr @patch_seq_modulo(ptr)",
94 category: None,
95 },
96 RuntimeDecl {
98 decl: "declare ptr @patch_seq_eq(ptr)",
99 category: None,
100 },
101 RuntimeDecl {
102 decl: "declare ptr @patch_seq_lt(ptr)",
103 category: None,
104 },
105 RuntimeDecl {
106 decl: "declare ptr @patch_seq_gt(ptr)",
107 category: None,
108 },
109 RuntimeDecl {
110 decl: "declare ptr @patch_seq_lte(ptr)",
111 category: None,
112 },
113 RuntimeDecl {
114 decl: "declare ptr @patch_seq_gte(ptr)",
115 category: None,
116 },
117 RuntimeDecl {
118 decl: "declare ptr @patch_seq_neq(ptr)",
119 category: None,
120 },
121 RuntimeDecl {
123 decl: "declare ptr @patch_seq_and(ptr)",
124 category: Some("; Boolean operations"),
125 },
126 RuntimeDecl {
127 decl: "declare ptr @patch_seq_or(ptr)",
128 category: None,
129 },
130 RuntimeDecl {
131 decl: "declare ptr @patch_seq_not(ptr)",
132 category: None,
133 },
134 RuntimeDecl {
136 decl: "declare ptr @patch_seq_band(ptr)",
137 category: Some("; Bitwise operations"),
138 },
139 RuntimeDecl {
140 decl: "declare ptr @patch_seq_bor(ptr)",
141 category: None,
142 },
143 RuntimeDecl {
144 decl: "declare ptr @patch_seq_bxor(ptr)",
145 category: None,
146 },
147 RuntimeDecl {
148 decl: "declare ptr @patch_seq_bnot(ptr)",
149 category: None,
150 },
151 RuntimeDecl {
152 decl: "declare ptr @patch_seq_shl(ptr)",
153 category: None,
154 },
155 RuntimeDecl {
156 decl: "declare ptr @patch_seq_shr(ptr)",
157 category: None,
158 },
159 RuntimeDecl {
160 decl: "declare ptr @patch_seq_popcount(ptr)",
161 category: None,
162 },
163 RuntimeDecl {
164 decl: "declare ptr @patch_seq_clz(ptr)",
165 category: None,
166 },
167 RuntimeDecl {
168 decl: "declare ptr @patch_seq_ctz(ptr)",
169 category: None,
170 },
171 RuntimeDecl {
172 decl: "declare ptr @patch_seq_int_bits(ptr)",
173 category: None,
174 },
175 RuntimeDecl {
177 decl: "declare i64 @llvm.ctpop.i64(i64)",
178 category: None,
179 },
180 RuntimeDecl {
181 decl: "declare i64 @llvm.ctlz.i64(i64, i1)",
182 category: None,
183 },
184 RuntimeDecl {
185 decl: "declare i64 @llvm.cttz.i64(i64, i1)",
186 category: None,
187 },
188 RuntimeDecl {
189 decl: "declare void @llvm.memmove.p0.p0.i64(ptr, ptr, i64, i1)",
190 category: None,
191 },
192 RuntimeDecl {
193 decl: "declare void @llvm.trap() noreturn nounwind",
194 category: None,
195 },
196 RuntimeDecl {
198 decl: "declare ptr @patch_seq_dup(ptr)",
199 category: Some("; Stack operations"),
200 },
201 RuntimeDecl {
202 decl: "declare ptr @patch_seq_drop_op(ptr)",
203 category: None,
204 },
205 RuntimeDecl {
206 decl: "declare ptr @patch_seq_swap(ptr)",
207 category: None,
208 },
209 RuntimeDecl {
210 decl: "declare ptr @patch_seq_over(ptr)",
211 category: None,
212 },
213 RuntimeDecl {
214 decl: "declare ptr @patch_seq_rot(ptr)",
215 category: None,
216 },
217 RuntimeDecl {
218 decl: "declare ptr @patch_seq_nip(ptr)",
219 category: None,
220 },
221 RuntimeDecl {
222 decl: "declare void @patch_seq_clone_value(ptr, ptr)",
223 category: None,
224 },
225 RuntimeDecl {
226 decl: "declare ptr @patch_seq_tuck(ptr)",
227 category: None,
228 },
229 RuntimeDecl {
230 decl: "declare ptr @patch_seq_2dup(ptr)",
231 category: None,
232 },
233 RuntimeDecl {
234 decl: "declare ptr @patch_seq_3drop(ptr)",
235 category: None,
236 },
237 RuntimeDecl {
238 decl: "declare ptr @patch_seq_pick_op(ptr)",
239 category: None,
240 },
241 RuntimeDecl {
242 decl: "declare ptr @patch_seq_roll(ptr)",
243 category: None,
244 },
245 RuntimeDecl {
246 decl: "declare ptr @patch_seq_push_value(ptr, %Value)",
247 category: None,
248 },
249 RuntimeDecl {
251 decl: "declare ptr @patch_seq_push_quotation(ptr, i64, i64)",
252 category: Some("; Quotation operations"),
253 },
254 RuntimeDecl {
255 decl: "declare ptr @patch_seq_call(ptr)",
256 category: None,
257 },
258 RuntimeDecl {
259 decl: "declare i64 @patch_seq_peek_is_quotation(ptr)",
260 category: None,
261 },
262 RuntimeDecl {
263 decl: "declare i64 @patch_seq_peek_quotation_fn_ptr(ptr)",
264 category: None,
265 },
266 RuntimeDecl {
267 decl: "declare ptr @patch_seq_times(ptr)",
268 category: None,
269 },
270 RuntimeDecl {
271 decl: "declare ptr @patch_seq_while_loop(ptr)",
272 category: None,
273 },
274 RuntimeDecl {
275 decl: "declare ptr @patch_seq_until_loop(ptr)",
276 category: None,
277 },
278 RuntimeDecl {
279 decl: "declare ptr @patch_seq_spawn(ptr)",
280 category: None,
281 },
282 RuntimeDecl {
283 decl: "declare ptr @patch_seq_weave(ptr)",
284 category: None,
285 },
286 RuntimeDecl {
287 decl: "declare ptr @patch_seq_resume(ptr)",
288 category: None,
289 },
290 RuntimeDecl {
291 decl: "declare ptr @patch_seq_weave_cancel(ptr)",
292 category: None,
293 },
294 RuntimeDecl {
295 decl: "declare ptr @patch_seq_yield(ptr)",
296 category: None,
297 },
298 RuntimeDecl {
299 decl: "declare ptr @patch_seq_cond(ptr)",
300 category: None,
301 },
302 RuntimeDecl {
304 decl: "declare ptr @patch_seq_create_env(i32)",
305 category: Some("; Closure operations"),
306 },
307 RuntimeDecl {
308 decl: "declare void @patch_seq_env_set(ptr, i32, %Value)",
309 category: None,
310 },
311 RuntimeDecl {
312 decl: "declare %Value @patch_seq_env_get(ptr, i64, i32)",
313 category: None,
314 },
315 RuntimeDecl {
316 decl: "declare i64 @patch_seq_env_get_int(ptr, i64, i32)",
317 category: None,
318 },
319 RuntimeDecl {
320 decl: "declare i64 @patch_seq_env_get_bool(ptr, i64, i32)",
321 category: None,
322 },
323 RuntimeDecl {
324 decl: "declare double @patch_seq_env_get_float(ptr, i64, i32)",
325 category: None,
326 },
327 RuntimeDecl {
328 decl: "declare i64 @patch_seq_env_get_quotation(ptr, i64, i32)",
329 category: None,
330 },
331 RuntimeDecl {
332 decl: "declare ptr @patch_seq_env_get_string(ptr, i64, i32)",
333 category: None,
334 },
335 RuntimeDecl {
336 decl: "declare ptr @patch_seq_env_push_string(ptr, ptr, i64, i32)",
337 category: None,
338 },
339 RuntimeDecl {
340 decl: "declare %Value @patch_seq_make_closure(i64, ptr)",
341 category: None,
342 },
343 RuntimeDecl {
344 decl: "declare ptr @patch_seq_push_closure(ptr, i64, i32)",
345 category: None,
346 },
347 RuntimeDecl {
348 decl: "declare ptr @patch_seq_push_seqstring(ptr, ptr)",
349 category: None,
350 },
351 RuntimeDecl {
353 decl: "declare ptr @patch_seq_make_channel(ptr)",
354 category: Some("; Concurrency operations"),
355 },
356 RuntimeDecl {
357 decl: "declare ptr @patch_seq_chan_send(ptr)",
358 category: None,
359 },
360 RuntimeDecl {
361 decl: "declare ptr @patch_seq_chan_receive(ptr)",
362 category: None,
363 },
364 RuntimeDecl {
365 decl: "declare ptr @patch_seq_close_channel(ptr)",
366 category: None,
367 },
368 RuntimeDecl {
369 decl: "declare ptr @patch_seq_yield_strand(ptr)",
370 category: None,
371 },
372 RuntimeDecl {
373 decl: "declare void @patch_seq_maybe_yield()",
374 category: None,
375 },
376 RuntimeDecl {
378 decl: "declare void @patch_seq_scheduler_init()",
379 category: Some("; Scheduler operations"),
380 },
381 RuntimeDecl {
382 decl: "declare ptr @patch_seq_scheduler_run()",
383 category: None,
384 },
385 RuntimeDecl {
386 decl: "declare i64 @patch_seq_strand_spawn(ptr, ptr)",
387 category: None,
388 },
389 RuntimeDecl {
391 decl: "declare void @patch_seq_args_init(i32, ptr)",
392 category: Some("; Command-line argument operations"),
393 },
394 RuntimeDecl {
395 decl: "declare ptr @patch_seq_arg_count(ptr)",
396 category: None,
397 },
398 RuntimeDecl {
399 decl: "declare ptr @patch_seq_arg_at(ptr)",
400 category: None,
401 },
402 RuntimeDecl {
404 decl: "declare ptr @patch_seq_file_slurp(ptr)",
405 category: Some("; File operations"),
406 },
407 RuntimeDecl {
408 decl: "declare ptr @patch_seq_file_exists(ptr)",
409 category: None,
410 },
411 RuntimeDecl {
412 decl: "declare ptr @patch_seq_file_for_each_line_plus(ptr)",
413 category: None,
414 },
415 RuntimeDecl {
417 decl: "declare ptr @patch_seq_list_make(ptr)",
418 category: Some("; List operations"),
419 },
420 RuntimeDecl {
421 decl: "declare ptr @patch_seq_list_push(ptr)",
422 category: None,
423 },
424 RuntimeDecl {
425 decl: "declare ptr @patch_seq_list_get(ptr)",
426 category: None,
427 },
428 RuntimeDecl {
429 decl: "declare ptr @patch_seq_list_set(ptr)",
430 category: None,
431 },
432 RuntimeDecl {
433 decl: "declare ptr @patch_seq_list_map(ptr)",
434 category: None,
435 },
436 RuntimeDecl {
437 decl: "declare ptr @patch_seq_list_filter(ptr)",
438 category: None,
439 },
440 RuntimeDecl {
441 decl: "declare ptr @patch_seq_list_fold(ptr)",
442 category: None,
443 },
444 RuntimeDecl {
445 decl: "declare ptr @patch_seq_list_each(ptr)",
446 category: None,
447 },
448 RuntimeDecl {
449 decl: "declare ptr @patch_seq_list_length(ptr)",
450 category: None,
451 },
452 RuntimeDecl {
453 decl: "declare ptr @patch_seq_list_empty(ptr)",
454 category: None,
455 },
456 RuntimeDecl {
458 decl: "declare ptr @patch_seq_make_map(ptr)",
459 category: Some("; Map operations"),
460 },
461 RuntimeDecl {
462 decl: "declare ptr @patch_seq_map_get(ptr)",
463 category: None,
464 },
465 RuntimeDecl {
466 decl: "declare ptr @patch_seq_map_set(ptr)",
467 category: None,
468 },
469 RuntimeDecl {
470 decl: "declare ptr @patch_seq_map_has(ptr)",
471 category: None,
472 },
473 RuntimeDecl {
474 decl: "declare ptr @patch_seq_map_remove(ptr)",
475 category: None,
476 },
477 RuntimeDecl {
478 decl: "declare ptr @patch_seq_map_keys(ptr)",
479 category: None,
480 },
481 RuntimeDecl {
482 decl: "declare ptr @patch_seq_map_values(ptr)",
483 category: None,
484 },
485 RuntimeDecl {
486 decl: "declare ptr @patch_seq_map_size(ptr)",
487 category: None,
488 },
489 RuntimeDecl {
490 decl: "declare ptr @patch_seq_map_empty(ptr)",
491 category: None,
492 },
493 RuntimeDecl {
495 decl: "declare ptr @patch_seq_tcp_listen(ptr)",
496 category: Some("; TCP operations"),
497 },
498 RuntimeDecl {
499 decl: "declare ptr @patch_seq_tcp_accept(ptr)",
500 category: None,
501 },
502 RuntimeDecl {
503 decl: "declare ptr @patch_seq_tcp_read(ptr)",
504 category: None,
505 },
506 RuntimeDecl {
507 decl: "declare ptr @patch_seq_tcp_write(ptr)",
508 category: None,
509 },
510 RuntimeDecl {
511 decl: "declare ptr @patch_seq_tcp_close(ptr)",
512 category: None,
513 },
514 RuntimeDecl {
516 decl: "declare ptr @patch_seq_getenv(ptr)",
517 category: Some("; OS operations"),
518 },
519 RuntimeDecl {
520 decl: "declare ptr @patch_seq_home_dir(ptr)",
521 category: None,
522 },
523 RuntimeDecl {
524 decl: "declare ptr @patch_seq_current_dir(ptr)",
525 category: None,
526 },
527 RuntimeDecl {
528 decl: "declare ptr @patch_seq_path_exists(ptr)",
529 category: None,
530 },
531 RuntimeDecl {
532 decl: "declare ptr @patch_seq_path_is_file(ptr)",
533 category: None,
534 },
535 RuntimeDecl {
536 decl: "declare ptr @patch_seq_path_is_dir(ptr)",
537 category: None,
538 },
539 RuntimeDecl {
540 decl: "declare ptr @patch_seq_path_join(ptr)",
541 category: None,
542 },
543 RuntimeDecl {
544 decl: "declare ptr @patch_seq_path_parent(ptr)",
545 category: None,
546 },
547 RuntimeDecl {
548 decl: "declare ptr @patch_seq_path_filename(ptr)",
549 category: None,
550 },
551 RuntimeDecl {
552 decl: "declare ptr @patch_seq_exit(ptr)",
553 category: None,
554 },
555 RuntimeDecl {
556 decl: "declare ptr @patch_seq_os_name(ptr)",
557 category: None,
558 },
559 RuntimeDecl {
560 decl: "declare ptr @patch_seq_os_arch(ptr)",
561 category: None,
562 },
563 RuntimeDecl {
565 decl: "declare ptr @patch_seq_string_concat(ptr)",
566 category: Some("; String operations"),
567 },
568 RuntimeDecl {
569 decl: "declare ptr @patch_seq_string_length(ptr)",
570 category: None,
571 },
572 RuntimeDecl {
573 decl: "declare ptr @patch_seq_string_byte_length(ptr)",
574 category: None,
575 },
576 RuntimeDecl {
577 decl: "declare ptr @patch_seq_string_char_at(ptr)",
578 category: None,
579 },
580 RuntimeDecl {
581 decl: "declare ptr @patch_seq_string_substring(ptr)",
582 category: None,
583 },
584 RuntimeDecl {
585 decl: "declare ptr @patch_seq_char_to_string(ptr)",
586 category: None,
587 },
588 RuntimeDecl {
589 decl: "declare ptr @patch_seq_string_find(ptr)",
590 category: None,
591 },
592 RuntimeDecl {
593 decl: "declare ptr @patch_seq_string_split(ptr)",
594 category: None,
595 },
596 RuntimeDecl {
597 decl: "declare ptr @patch_seq_string_contains(ptr)",
598 category: None,
599 },
600 RuntimeDecl {
601 decl: "declare ptr @patch_seq_string_starts_with(ptr)",
602 category: None,
603 },
604 RuntimeDecl {
605 decl: "declare ptr @patch_seq_string_empty(ptr)",
606 category: None,
607 },
608 RuntimeDecl {
609 decl: "declare ptr @patch_seq_string_trim(ptr)",
610 category: None,
611 },
612 RuntimeDecl {
613 decl: "declare ptr @patch_seq_string_chomp(ptr)",
614 category: None,
615 },
616 RuntimeDecl {
617 decl: "declare ptr @patch_seq_string_to_upper(ptr)",
618 category: None,
619 },
620 RuntimeDecl {
621 decl: "declare ptr @patch_seq_string_to_lower(ptr)",
622 category: None,
623 },
624 RuntimeDecl {
625 decl: "declare ptr @patch_seq_string_equal(ptr)",
626 category: None,
627 },
628 RuntimeDecl {
629 decl: "declare ptr @patch_seq_json_escape(ptr)",
630 category: None,
631 },
632 RuntimeDecl {
633 decl: "declare ptr @patch_seq_string_to_int(ptr)",
634 category: None,
635 },
636 RuntimeDecl {
638 decl: "declare ptr @patch_seq_symbol_equal(ptr)",
639 category: Some("; Symbol operations"),
640 },
641 RuntimeDecl {
643 decl: "declare ptr @patch_seq_variant_field_count(ptr)",
644 category: Some("; Variant operations"),
645 },
646 RuntimeDecl {
647 decl: "declare ptr @patch_seq_variant_tag(ptr)",
648 category: None,
649 },
650 RuntimeDecl {
651 decl: "declare ptr @patch_seq_variant_field_at(ptr)",
652 category: None,
653 },
654 RuntimeDecl {
655 decl: "declare ptr @patch_seq_variant_append(ptr)",
656 category: None,
657 },
658 RuntimeDecl {
659 decl: "declare ptr @patch_seq_variant_last(ptr)",
660 category: None,
661 },
662 RuntimeDecl {
663 decl: "declare ptr @patch_seq_variant_init(ptr)",
664 category: None,
665 },
666 RuntimeDecl {
667 decl: "declare ptr @patch_seq_make_variant_0(ptr)",
668 category: None,
669 },
670 RuntimeDecl {
671 decl: "declare ptr @patch_seq_make_variant_1(ptr)",
672 category: None,
673 },
674 RuntimeDecl {
675 decl: "declare ptr @patch_seq_make_variant_2(ptr)",
676 category: None,
677 },
678 RuntimeDecl {
679 decl: "declare ptr @patch_seq_make_variant_3(ptr)",
680 category: None,
681 },
682 RuntimeDecl {
683 decl: "declare ptr @patch_seq_make_variant_4(ptr)",
684 category: None,
685 },
686 RuntimeDecl {
687 decl: "declare ptr @patch_seq_unpack_variant(ptr, i64)",
688 category: None,
689 },
690 RuntimeDecl {
691 decl: "declare ptr @patch_seq_symbol_eq_cstr(ptr, ptr)",
692 category: None,
693 },
694 RuntimeDecl {
696 decl: "declare ptr @patch_seq_push_float(ptr, double)",
697 category: Some("; Float operations"),
698 },
699 RuntimeDecl {
700 decl: "declare ptr @patch_seq_f_add(ptr)",
701 category: None,
702 },
703 RuntimeDecl {
704 decl: "declare ptr @patch_seq_f_subtract(ptr)",
705 category: None,
706 },
707 RuntimeDecl {
708 decl: "declare ptr @patch_seq_f_multiply(ptr)",
709 category: None,
710 },
711 RuntimeDecl {
712 decl: "declare ptr @patch_seq_f_divide(ptr)",
713 category: None,
714 },
715 RuntimeDecl {
716 decl: "declare ptr @patch_seq_f_eq(ptr)",
717 category: None,
718 },
719 RuntimeDecl {
720 decl: "declare ptr @patch_seq_f_lt(ptr)",
721 category: None,
722 },
723 RuntimeDecl {
724 decl: "declare ptr @patch_seq_f_gt(ptr)",
725 category: None,
726 },
727 RuntimeDecl {
728 decl: "declare ptr @patch_seq_f_lte(ptr)",
729 category: None,
730 },
731 RuntimeDecl {
732 decl: "declare ptr @patch_seq_f_gte(ptr)",
733 category: None,
734 },
735 RuntimeDecl {
736 decl: "declare ptr @patch_seq_f_neq(ptr)",
737 category: None,
738 },
739 RuntimeDecl {
740 decl: "declare ptr @patch_seq_int_to_float(ptr)",
741 category: None,
742 },
743 RuntimeDecl {
744 decl: "declare ptr @patch_seq_float_to_int(ptr)",
745 category: None,
746 },
747 RuntimeDecl {
748 decl: "declare ptr @patch_seq_float_to_string(ptr)",
749 category: None,
750 },
751 RuntimeDecl {
752 decl: "declare ptr @patch_seq_string_to_float(ptr)",
753 category: None,
754 },
755 RuntimeDecl {
757 decl: "declare ptr @patch_seq_test_init(ptr)",
758 category: Some("; Test framework operations"),
759 },
760 RuntimeDecl {
761 decl: "declare ptr @patch_seq_test_finish(ptr)",
762 category: None,
763 },
764 RuntimeDecl {
765 decl: "declare ptr @patch_seq_test_has_failures(ptr)",
766 category: None,
767 },
768 RuntimeDecl {
769 decl: "declare ptr @patch_seq_test_assert(ptr)",
770 category: None,
771 },
772 RuntimeDecl {
773 decl: "declare ptr @patch_seq_test_assert_not(ptr)",
774 category: None,
775 },
776 RuntimeDecl {
777 decl: "declare ptr @patch_seq_test_assert_eq(ptr)",
778 category: None,
779 },
780 RuntimeDecl {
781 decl: "declare ptr @patch_seq_test_assert_eq_str(ptr)",
782 category: None,
783 },
784 RuntimeDecl {
785 decl: "declare ptr @patch_seq_test_fail(ptr)",
786 category: None,
787 },
788 RuntimeDecl {
789 decl: "declare ptr @patch_seq_test_pass_count(ptr)",
790 category: None,
791 },
792 RuntimeDecl {
793 decl: "declare ptr @patch_seq_test_fail_count(ptr)",
794 category: None,
795 },
796 RuntimeDecl {
798 decl: "declare ptr @patch_seq_time_now(ptr)",
799 category: Some("; Time operations"),
800 },
801 RuntimeDecl {
802 decl: "declare ptr @patch_seq_time_nanos(ptr)",
803 category: None,
804 },
805 RuntimeDecl {
806 decl: "declare ptr @patch_seq_time_sleep_ms(ptr)",
807 category: None,
808 },
809 RuntimeDecl {
811 decl: "declare ptr @patch_seq_stack_dump(ptr)",
812 category: Some("; Stack introspection"),
813 },
814 RuntimeDecl {
816 decl: "declare ptr @patch_seq_son_dump(ptr)",
817 category: Some("; SON serialization"),
818 },
819 RuntimeDecl {
820 decl: "declare ptr @patch_seq_son_dump_pretty(ptr)",
821 category: None,
822 },
823 RuntimeDecl {
825 decl: "declare i64 @patch_seq_peek_int_value(ptr)",
826 category: Some("; Helpers for conditionals"),
827 },
828 RuntimeDecl {
829 decl: "declare i1 @patch_seq_peek_bool_value(ptr)",
830 category: None,
831 },
832 RuntimeDecl {
833 decl: "declare ptr @patch_seq_pop_stack(ptr)",
834 category: None,
835 },
836 RuntimeDecl {
838 decl: "declare ptr @seq_stack_new_default()",
839 category: Some("; Tagged stack operations"),
840 },
841 RuntimeDecl {
842 decl: "declare void @seq_stack_free(ptr)",
843 category: None,
844 },
845 RuntimeDecl {
846 decl: "declare ptr @seq_stack_base(ptr)",
847 category: None,
848 },
849 RuntimeDecl {
850 decl: "declare i64 @seq_stack_sp(ptr)",
851 category: None,
852 },
853 RuntimeDecl {
854 decl: "declare void @seq_stack_set_sp(ptr, i64)",
855 category: None,
856 },
857 RuntimeDecl {
858 decl: "declare void @seq_stack_grow(ptr, i64)",
859 category: None,
860 },
861 RuntimeDecl {
862 decl: "declare void @patch_seq_set_stack_base(ptr)",
863 category: None,
864 },
865 ]
866});
867
868pub static BUILTIN_SYMBOLS: LazyLock<HashMap<&'static str, &'static str>> = LazyLock::new(|| {
875 HashMap::from([
876 ("io.write", "patch_seq_write"),
878 ("io.write-line", "patch_seq_write_line"),
879 ("io.read-line", "patch_seq_read_line"),
880 ("io.read-line+", "patch_seq_read_line_plus"),
881 ("io.read-n", "patch_seq_read_n"),
882 ("int->string", "patch_seq_int_to_string"),
883 ("symbol->string", "patch_seq_symbol_to_string"),
884 ("string->symbol", "patch_seq_string_to_symbol"),
885 ("args.count", "patch_seq_arg_count"),
887 ("args.at", "patch_seq_arg_at"),
888 ("i.add", "patch_seq_add"),
890 ("i.subtract", "patch_seq_subtract"),
891 ("i.multiply", "patch_seq_multiply"),
892 ("i.divide", "patch_seq_divide"),
893 ("i.modulo", "patch_seq_modulo"),
894 ("i.+", "patch_seq_add"),
896 ("i.-", "patch_seq_subtract"),
897 ("i.*", "patch_seq_multiply"),
898 ("i./", "patch_seq_divide"),
899 ("i.%", "patch_seq_modulo"),
900 ("i.=", "patch_seq_eq"),
902 ("i.<", "patch_seq_lt"),
903 ("i.>", "patch_seq_gt"),
904 ("i.<=", "patch_seq_lte"),
905 ("i.>=", "patch_seq_gte"),
906 ("i.<>", "patch_seq_neq"),
907 ("i.eq", "patch_seq_eq"),
909 ("i.lt", "patch_seq_lt"),
910 ("i.gt", "patch_seq_gt"),
911 ("i.lte", "patch_seq_lte"),
912 ("i.gte", "patch_seq_gte"),
913 ("i.neq", "patch_seq_neq"),
914 ("and", "patch_seq_and"),
916 ("or", "patch_seq_or"),
917 ("not", "patch_seq_not"),
918 ("band", "patch_seq_band"),
920 ("bor", "patch_seq_bor"),
921 ("bxor", "patch_seq_bxor"),
922 ("bnot", "patch_seq_bnot"),
923 ("shl", "patch_seq_shl"),
924 ("shr", "patch_seq_shr"),
925 ("popcount", "patch_seq_popcount"),
926 ("clz", "patch_seq_clz"),
927 ("ctz", "patch_seq_ctz"),
928 ("int-bits", "patch_seq_int_bits"),
929 ("dup", "patch_seq_dup"),
931 ("swap", "patch_seq_swap"),
932 ("over", "patch_seq_over"),
933 ("rot", "patch_seq_rot"),
934 ("nip", "patch_seq_nip"),
935 ("tuck", "patch_seq_tuck"),
936 ("2dup", "patch_seq_2dup"),
937 ("3drop", "patch_seq_3drop"),
938 ("drop", "patch_seq_drop_op"),
939 ("pick", "patch_seq_pick_op"),
940 ("roll", "patch_seq_roll"),
941 ("chan.make", "patch_seq_make_channel"),
943 ("chan.send", "patch_seq_chan_send"),
944 ("chan.receive", "patch_seq_chan_receive"),
945 ("chan.close", "patch_seq_close_channel"),
946 ("chan.yield", "patch_seq_yield_strand"),
947 ("call", "patch_seq_call"),
949 ("times", "patch_seq_times"),
950 ("while", "patch_seq_while_loop"),
951 ("until", "patch_seq_until_loop"),
952 ("strand.spawn", "patch_seq_spawn"),
953 ("strand.weave", "patch_seq_weave"),
954 ("strand.resume", "patch_seq_resume"),
955 ("strand.weave-cancel", "patch_seq_weave_cancel"),
956 ("yield", "patch_seq_yield"),
957 ("cond", "patch_seq_cond"),
958 ("tcp.listen", "patch_seq_tcp_listen"),
960 ("tcp.accept", "patch_seq_tcp_accept"),
961 ("tcp.read", "patch_seq_tcp_read"),
962 ("tcp.write", "patch_seq_tcp_write"),
963 ("tcp.close", "patch_seq_tcp_close"),
964 ("os.getenv", "patch_seq_getenv"),
966 ("os.home-dir", "patch_seq_home_dir"),
967 ("os.current-dir", "patch_seq_current_dir"),
968 ("os.path-exists", "patch_seq_path_exists"),
969 ("os.path-is-file", "patch_seq_path_is_file"),
970 ("os.path-is-dir", "patch_seq_path_is_dir"),
971 ("os.path-join", "patch_seq_path_join"),
972 ("os.path-parent", "patch_seq_path_parent"),
973 ("os.path-filename", "patch_seq_path_filename"),
974 ("os.exit", "patch_seq_exit"),
975 ("os.name", "patch_seq_os_name"),
976 ("os.arch", "patch_seq_os_arch"),
977 ("string.concat", "patch_seq_string_concat"),
979 ("string.length", "patch_seq_string_length"),
980 ("string.byte-length", "patch_seq_string_byte_length"),
981 ("string.char-at", "patch_seq_string_char_at"),
982 ("string.substring", "patch_seq_string_substring"),
983 ("char->string", "patch_seq_char_to_string"),
984 ("string.find", "patch_seq_string_find"),
985 ("string.split", "patch_seq_string_split"),
986 ("string.contains", "patch_seq_string_contains"),
987 ("string.starts-with", "patch_seq_string_starts_with"),
988 ("string.empty?", "patch_seq_string_empty"),
989 ("string.trim", "patch_seq_string_trim"),
990 ("string.chomp", "patch_seq_string_chomp"),
991 ("string.to-upper", "patch_seq_string_to_upper"),
992 ("string.to-lower", "patch_seq_string_to_lower"),
993 ("string.equal?", "patch_seq_string_equal"),
994 ("string.json-escape", "patch_seq_json_escape"),
995 ("string->int", "patch_seq_string_to_int"),
996 ("symbol.=", "patch_seq_symbol_equal"),
998 ("file.slurp", "patch_seq_file_slurp"),
1000 ("file.exists?", "patch_seq_file_exists"),
1001 ("file.for-each-line+", "patch_seq_file_for_each_line_plus"),
1002 ("list.make", "patch_seq_list_make"),
1004 ("list.push", "patch_seq_list_push"),
1005 ("list.get", "patch_seq_list_get"),
1006 ("list.set", "patch_seq_list_set"),
1007 ("list.map", "patch_seq_list_map"),
1008 ("list.filter", "patch_seq_list_filter"),
1009 ("list.fold", "patch_seq_list_fold"),
1010 ("list.each", "patch_seq_list_each"),
1011 ("list.length", "patch_seq_list_length"),
1012 ("list.empty?", "patch_seq_list_empty"),
1013 ("map.make", "patch_seq_make_map"),
1015 ("map.get", "patch_seq_map_get"),
1016 ("map.set", "patch_seq_map_set"),
1017 ("map.has?", "patch_seq_map_has"),
1018 ("map.remove", "patch_seq_map_remove"),
1019 ("map.keys", "patch_seq_map_keys"),
1020 ("map.values", "patch_seq_map_values"),
1021 ("map.size", "patch_seq_map_size"),
1022 ("map.empty?", "patch_seq_map_empty"),
1023 ("variant.field-count", "patch_seq_variant_field_count"),
1025 ("variant.tag", "patch_seq_variant_tag"),
1026 ("variant.field-at", "patch_seq_variant_field_at"),
1027 ("variant.append", "patch_seq_variant_append"),
1028 ("variant.last", "patch_seq_variant_last"),
1029 ("variant.init", "patch_seq_variant_init"),
1030 ("variant.make-0", "patch_seq_make_variant_0"),
1031 ("variant.make-1", "patch_seq_make_variant_1"),
1032 ("variant.make-2", "patch_seq_make_variant_2"),
1033 ("variant.make-3", "patch_seq_make_variant_3"),
1034 ("variant.make-4", "patch_seq_make_variant_4"),
1035 ("wrap-0", "patch_seq_make_variant_0"),
1037 ("wrap-1", "patch_seq_make_variant_1"),
1038 ("wrap-2", "patch_seq_make_variant_2"),
1039 ("wrap-3", "patch_seq_make_variant_3"),
1040 ("wrap-4", "patch_seq_make_variant_4"),
1041 ("f.add", "patch_seq_f_add"),
1043 ("f.subtract", "patch_seq_f_subtract"),
1044 ("f.multiply", "patch_seq_f_multiply"),
1045 ("f.divide", "patch_seq_f_divide"),
1046 ("f.+", "patch_seq_f_add"),
1048 ("f.-", "patch_seq_f_subtract"),
1049 ("f.*", "patch_seq_f_multiply"),
1050 ("f./", "patch_seq_f_divide"),
1051 ("f.=", "patch_seq_f_eq"),
1053 ("f.<", "patch_seq_f_lt"),
1054 ("f.>", "patch_seq_f_gt"),
1055 ("f.<=", "patch_seq_f_lte"),
1056 ("f.>=", "patch_seq_f_gte"),
1057 ("f.<>", "patch_seq_f_neq"),
1058 ("f.eq", "patch_seq_f_eq"),
1060 ("f.lt", "patch_seq_f_lt"),
1061 ("f.gt", "patch_seq_f_gt"),
1062 ("f.lte", "patch_seq_f_lte"),
1063 ("f.gte", "patch_seq_f_gte"),
1064 ("f.neq", "patch_seq_f_neq"),
1065 ("int->float", "patch_seq_int_to_float"),
1067 ("float->int", "patch_seq_float_to_int"),
1068 ("float->string", "patch_seq_float_to_string"),
1069 ("string->float", "patch_seq_string_to_float"),
1070 ("test.init", "patch_seq_test_init"),
1072 ("test.finish", "patch_seq_test_finish"),
1073 ("test.has-failures", "patch_seq_test_has_failures"),
1074 ("test.assert", "patch_seq_test_assert"),
1075 ("test.assert-not", "patch_seq_test_assert_not"),
1076 ("test.assert-eq", "patch_seq_test_assert_eq"),
1077 ("test.assert-eq-str", "patch_seq_test_assert_eq_str"),
1078 ("test.fail", "patch_seq_test_fail"),
1079 ("test.pass-count", "patch_seq_test_pass_count"),
1080 ("test.fail-count", "patch_seq_test_fail_count"),
1081 ("time.now", "patch_seq_time_now"),
1083 ("time.nanos", "patch_seq_time_nanos"),
1084 ("time.sleep-ms", "patch_seq_time_sleep_ms"),
1085 ("son.dump", "patch_seq_son_dump"),
1087 ("son.dump-pretty", "patch_seq_son_dump_pretty"),
1088 ("stack.dump", "patch_seq_stack_dump"),
1090 ])
1091});
1092
1093pub fn emit_runtime_decls(ir: &mut String) -> Result<(), CodeGenError> {
1095 for decl in RUNTIME_DECLARATIONS.iter() {
1096 if let Some(cat) = decl.category {
1097 writeln!(ir, "{}", cat)?;
1098 }
1099 writeln!(ir, "{}", decl.decl)?;
1100 }
1101 writeln!(ir)?;
1102 Ok(())
1103}