1818#include " stdlib.h"
1919#include " time.h"
2020#include " jasmine/jobj.h"
21+ #include " runtime/sys.h"
2122#include " runtime/core.h"
2223
2324namespace basil {
2425 void init () {
2526 init_types_and_symbols ();
27+ sys::init_io ();
2628 }
2729
2830 void deinit () {
@@ -31,7 +33,17 @@ namespace basil {
3133 }
3234
3335 void init_rt (jasmine::Object& obj) {
34- // obj.define_native(jasmine::global("print_i"), (void*)print_i);
36+ obj.define_native (jasmine::global (" write_N6Streamii" ), (void *)write_N6Streamii);
37+ obj.define_native (jasmine::global (" write_N6Streamif" ), (void *)write_N6Streamif);
38+ obj.define_native (jasmine::global (" write_N6Streamid" ), (void *)write_N6Streamid);
39+ obj.define_native (jasmine::global (" write_N6Streamic" ), (void *)write_N6Streamic);
40+ obj.define_native (jasmine::global (" write_N6Streamib" ), (void *)write_N6Streamib);
41+ obj.define_native (jasmine::global (" write_N6Streamis" ), (void *)write_N6Streamis);
42+ obj.define_native (jasmine::global (" write_N6Streamiv" ), (void *)write_N6Streamiv);
43+ obj.define_native (jasmine::global (" init_v" ), (void *)init_v);
44+ obj.define_native (jasmine::global (" exit_i" ), (void *)exit_i);
45+ obj.define_native (jasmine::global (" open_si" ), (void *)open_si);
46+ obj.define_native (jasmine::global (" close_N6Streami" ), (void *)close_N6Streami);
3547 }
3648
3749 static bool repl_mode = false ;
@@ -165,12 +177,23 @@ namespace basil {
165177 rc<IRFunction> main_ir = ref<IRFunction>(symbol_from (" .basil_main" ), t_func (T_VOID, T_INT));
166178 main_ir->finish (T_INT, main->gen_ssa (env, main_ir));
167179
180+ rc<IRFunction> entry = ref<IRFunction>(symbol_from (" _start" ), t_func (T_VOID, T_VOID));
181+ entry->add_insn (ir_call (entry, t_func (T_VOID, T_VOID),
182+ ir_label (symbol_from (" init_v" )), vector_of<IRParam>()));
183+ IRParam ret = entry->add_insn (ir_call (entry, t_func (T_VOID, T_INT),
184+ ir_label (symbol_from (" .basil_main" )), vector_of<IRParam>()));
185+ entry->add_insn (ir_call (entry, t_func (T_INT, T_VOID),
186+ ir_label (symbol_from (" exit_i" )), vector_of<IRParam>(ret)));
187+ entry->finish (T_VOID, ir_int (0 ));
188+
168189 map<Symbol, rc<IRFunction>> ir_functions;
169190 for (auto & [k, v] : functions) {
170191 v->gen_ssa (root_env (), main_ir);
171192 if (v->kind () == AST_FUNCTION) ir_functions[k] = get_ssa_function (v);
172193 }
173194
195+ ir_functions[symbol_from (" _start" )] = entry;
196+
174197 if (error_count ()) {
175198 print_errors (_stdout, nullptr );
176199 discard_errors ();
@@ -379,7 +402,8 @@ namespace basil {
379402 else return false ;
380403 }
381404
382- void write_asm (bytebuf buf, stream& io) {
405+ void write_asm (void * base, bytebuf buf, stream& io) {
406+ writeln (io, BOLDCYAN, " #" , u64 (base), RESET, " :" );
383407 while (buf.size ()) {
384408 u8 byte = buf.read ();
385409 u8 upper = byte >> 4 , lower = byte & 15 ;
@@ -474,7 +498,8 @@ namespace basil {
474498 // native.writeELF("out.o");
475499 init_rt (native);
476500 native.load ();
477- // write_asm(native.code(), _stdout);
501+ // write_asm(native.get_loaded(jasmine::OS_CODE), native.code(), _stdout);
502+ // write_asm(native.get_loaded(jasmine::OS_DATA), native.data(), _stdout);
478503 auto main = (i64 (*)())native.find (jasmine::global (" .basil_main" ));
479504 i64 main_result = main ();
480505 if (ast->type (global) != T_VOID) {
@@ -504,9 +529,11 @@ namespace basil {
504529 rc<jasmine::Object> native = native_from_section (obj->sections [*obj->main_section ]);
505530 init_rt (*native);
506531 native->load ();
507- // write_asm(native->code(), _stdout);
532+ // write_asm(native->get_loaded(jasmine::OS_CODE), native->code(), _stdout);
533+ // write_asm(native->get_loaded(jasmine::OS_DATA), native->data(), _stdout);
508534 auto main = (i64 (*)())native->find (jasmine::global (" .basil_main" ));
509535 main ();
536+ exit (0 );
510537 // println("= ", BOLD, ITALICBLUE, main(), RESET);
511538 }
512539
@@ -560,7 +587,7 @@ namespace basil {
560587 case NT_EXECUTABLE: {
561588 ustring obj = compute_object_name (filename, OBJ_FILE_EXT);
562589 native->writeObj (obj.raw ());
563- ustring cmd = format<ustring>(" gcc -nostdlib " , obj, " -Wl,-e.basil_main - o " , compute_object_name (obj.raw (), " " ));
590+ ustring cmd = format<ustring>(" gcc -nostdlib " , obj, " -o " , compute_object_name (obj.raw (), " " ));
564591 for (const char * arg : args) cmd += " " , cmd += arg; // add linker args
565592 // println(cmd);
566593 system (cmd.raw ());
0 commit comments