aboutsummaryrefslogtreecommitdiff
path: root/src/tilde_backend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tilde_backend.cpp')
-rw-r--r--src/tilde_backend.cpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/tilde_backend.cpp b/src/tilde_backend.cpp
index 87e1a1329..63466e132 100644
--- a/src/tilde_backend.cpp
+++ b/src/tilde_backend.cpp
@@ -19,8 +19,24 @@ bool tb_generate_code(Checker *c) {
defer (tb_module_destroy(m));
tb_module_set_tls_index(m, "_tls_index");
+ TB_Arena *arena = tb_default_arena();
- TB_Arena *arena = nullptr;
+ TB_Global *str = nullptr;
+ {
+ TB_Global *str_data = nullptr;
+ {
+ str_data = tb_global_create(m, "csb$1", nullptr, TB_LINKAGE_PRIVATE);
+ tb_global_set_storage(m, tb_module_get_rdata(m), str_data, 8, 1, 1);
+ void *region = tb_global_add_region(m, str_data, 0, 8);
+ memcpy(region, "Hellope\x00", 8);
+ }
+
+ str = tb_global_create(m, "global$str", nullptr, TB_LINKAGE_PRIVATE);
+ tb_global_set_storage(m, tb_module_get_rdata(m), str, 16, 8, 2);
+ tb_global_add_symbol_reloc(m, str, 0, cast(TB_Symbol *)str_data);
+ void *len = tb_global_add_region(m, str, 8, 8);
+ *cast(i64 *)len = 7;
+ }
{
TB_PrototypeParam printf_ret = {TB_TYPE_I32};
@@ -34,9 +50,18 @@ bool tb_generate_code(Checker *c) {
tb_function_set_prototype(p, main_proto, arena);
- TB_Node *params[2] = {};
- params[0] = tb_inst_cstring(p, "Hellope %s!\n");
- params[1] = tb_inst_cstring(p, "World");
+ auto str_ptr = tb_inst_get_symbol_address(p, cast(TB_Symbol *)str);
+ auto str_data_ptr_ptr = tb_inst_member_access(p, str_ptr, 0);
+ auto str_data_ptr = tb_inst_load(p, TB_TYPE_PTR, str_data_ptr_ptr, 1, false);
+ auto str_len_ptr = tb_inst_member_access(p, str_ptr, 8);
+ auto str_len = tb_inst_load(p, TB_TYPE_I64, str_len_ptr, 8, false);
+
+
+ TB_Node *params[4] = {};
+ params[0] = tb_inst_cstring(p, "%.*s %s!\n");
+ params[1] = tb_inst_trunc(p, str_len, TB_TYPE_I32);
+ params[2] = str_data_ptr;
+ params[3] = tb_inst_cstring(p, "World");
TB_MultiOutput output = tb_inst_call(p, printf_proto, tb_inst_get_symbol_address(p, cast(TB_Symbol *)printf_proc), gb_count_of(params), params);
gb_unused(output);