From bc99bacb2122f073133ddf6eeb31b4db56a99fa7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 13 Dec 2023 12:38:01 +0000 Subject: Update Tilde --- src/tilde_stmt.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/tilde_stmt.cpp') diff --git a/src/tilde_stmt.cpp b/src/tilde_stmt.cpp index 1a7dcce4d..984fc1a0e 100644 --- a/src/tilde_stmt.cpp +++ b/src/tilde_stmt.cpp @@ -326,7 +326,7 @@ gb_internal void cg_addr_store(cgProcedure *p, cgAddr addr, cgValue value) { GB_ASSERT(value.type != nullptr); if (is_type_untyped_uninit(value.type)) { Type *t = cg_addr_type(addr); - value = cg_value(tb_inst_poison(p->func), t); + value = cg_value(tb_inst_poison(p->func, cg_data_type(t)), t); // TODO(bill): IS THIS EVEN A GOOD IDEA? } else if (is_type_untyped_nil(value.type)) { Type *t = cg_addr_type(addr); @@ -2481,7 +2481,7 @@ gb_internal void cg_build_mutable_value_decl(cgProcedure *p, Ast *node) { TB_DebugType *debug_type = cg_debug_type(m, e->type); TB_Global *global = tb_global_create(m->mod, mangled_name.len, cast(char const *)mangled_name.text, debug_type, TB_LINKAGE_PRIVATE); - TB_ModuleSection *section = tb_module_get_data(m->mod); + TB_ModuleSectionHandle section = tb_module_get_data(m->mod); if (e->Variable.thread_local_model != "") { section = tb_module_get_tls(m->mod); String model = e->Variable.thread_local_model; -- cgit v1.2.3 From e0652ee2f46284a21c1752f66e792b28d2c06871 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 13 Dec 2023 13:10:51 +0000 Subject: Minor fix to call expr in tilde with variadic parameters --- src/tilde_proc.cpp | 3 +-- src/tilde_stmt.cpp | 2 +- src/tilde_type_info.cpp | 4 ---- 3 files changed, 2 insertions(+), 7 deletions(-) (limited to 'src/tilde_stmt.cpp') diff --git a/src/tilde_proc.cpp b/src/tilde_proc.cpp index edd57f567..8e9b80144 100644 --- a/src/tilde_proc.cpp +++ b/src/tilde_proc.cpp @@ -861,7 +861,6 @@ gb_internal cgValue cg_build_call_expr_internal(cgProcedure *p, Ast *expr) { } GB_ASSERT(e->kind == Entity_Variable); - if (pt->variadic && pt->variadic_index == i) { cgValue variadic_args = cg_const_nil(p, e->type); auto variadic = slice(ce->split_args->positional, pt->variadic_index, ce->split_args->positional.count); @@ -964,8 +963,8 @@ gb_internal cgValue cg_build_call_expr_internal(cgProcedure *p, Ast *expr) { if (pt->variadic && param_index == pt->variadic_index) { if (!is_c_vararg && args[arg_index].node == nullptr) { args[arg_index++] = cg_const_nil(p, e->type); + continue; } - continue; } cgValue arg = args[arg_index]; diff --git a/src/tilde_stmt.cpp b/src/tilde_stmt.cpp index 984fc1a0e..7c090064c 100644 --- a/src/tilde_stmt.cpp +++ b/src/tilde_stmt.cpp @@ -24,7 +24,7 @@ gb_internal TB_Node *cg_control_region(cgProcedure *p, char const *name) { } gb_internal cgValue cg_emit_load(cgProcedure *p, cgValue const &ptr, bool is_volatile) { - GB_ASSERT(is_type_pointer(ptr.type)); + GB_ASSERT_MSG(is_type_pointer(ptr.type), "%s", type_to_string(ptr.type)); Type *type = type_deref(ptr.type); TB_DataType dt = cg_data_type(type); diff --git a/src/tilde_type_info.cpp b/src/tilde_type_info.cpp index ad219071f..2188f1cc2 100644 --- a/src/tilde_type_info.cpp +++ b/src/tilde_type_info.cpp @@ -119,10 +119,6 @@ gb_internal u64 cg_typeid_as_u64(cgModule *m, Type *type) { data |= (reserved &~ (1ull<<1)) << 63ull; // reserved } - if (type == t_string) { - gb_printf_err("%llu\n", data); - } - return data; } -- cgit v1.2.3 From ca2b2c498e446895412bf297de0770a0bab839f7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 13 Dec 2023 16:47:34 +0000 Subject: Add `-obfuscate-source-code-locations` --- src/build_settings.cpp | 2 ++ src/llvm_backend_const.cpp | 41 +++++++++++++++++++++++++++++++++++++---- src/main.cpp | 12 ++++++++++++ src/tilde_stmt.cpp | 11 ++++++++++- src/tilde_type_info.cpp | 9 +++++++-- 5 files changed, 68 insertions(+), 7 deletions(-) (limited to 'src/tilde_stmt.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 94807a852..d91a31ff2 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -381,6 +381,8 @@ struct BuildContext { bool dynamic_map_calls; + bool obfuscate_source_code_locations; + RelocMode reloc_mode; bool disable_red_zone; diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 7584df3ee..2291f24ac 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -287,11 +287,44 @@ gb_internal lbValue lb_expr_untyped_const_to_typed(lbModule *m, Ast *expr, Type return lb_const_value(m, t, tv.value); } -gb_internal lbValue lb_const_source_code_location_const(lbModule *m, String const &procedure, TokenPos const &pos) { +gb_internal String lb_obfuscate_string(String const &s, char const *prefix) { + if (s.len == 0) { + return {}; + } + GB_ASSERT(prefix != nullptr); + u64 hash = gb_fnv64a(s.text, s.len); + gbString res = gb_string_make(temporary_allocator(), prefix); + res = gb_string_append_fmt(res, "x%llx", cast(long long unsigned)hash); + return make_string_c(res); +} + +gb_internal i32 lb_obfuscate_i32(i32 i) { + i32 x = cast(i32)gb_fnv64a(&i, sizeof(i)); + if (x < 0) { + x = 1-x; + } + return cast(i32)x; +} + +gb_internal lbValue lb_const_source_code_location_const(lbModule *m, String const &procedure_, TokenPos const &pos) { + String file = get_file_path_string(pos.file_id); + String procedure = procedure_; + + i32 line = pos.line; + i32 column = pos.column; + + if (build_context.obfuscate_source_code_locations) { + file = lb_obfuscate_string(file, "F"); + procedure = lb_obfuscate_string(procedure, "P"); + + line = lb_obfuscate_i32(line); + column = lb_obfuscate_i32(column); + } + LLVMValueRef fields[4] = {}; - fields[0]/*file*/ = lb_find_or_add_entity_string(m, get_file_path_string(pos.file_id)).value; - fields[1]/*line*/ = lb_const_int(m, t_i32, pos.line).value; - fields[2]/*column*/ = lb_const_int(m, t_i32, pos.column).value; + fields[0]/*file*/ = lb_find_or_add_entity_string(m, file).value; + fields[1]/*line*/ = lb_const_int(m, t_i32, line).value; + fields[2]/*column*/ = lb_const_int(m, t_i32, column).value; fields[3]/*procedure*/ = lb_find_or_add_entity_string(m, procedure).value; lbValue res = {}; diff --git a/src/main.cpp b/src/main.cpp index 14f7e84ec..4d4e01ada 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -277,6 +277,7 @@ enum BuildFlagKind { BuildFlag_ForeignErrorProcedures, BuildFlag_NoRTTI, BuildFlag_DynamicMapCalls, + BuildFlag_ObfuscateSourceCodeLocations, BuildFlag_Compact, BuildFlag_GlobalDefinitions, @@ -467,6 +468,8 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_DynamicMapCalls, str_lit("dynamic-map-calls"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_ObfuscateSourceCodeLocations, str_lit("obfuscate-source-code-locations"), BuildFlagParam_None, Command__does_build); + add_flag(&build_flags, BuildFlag_Short, str_lit("short"), BuildFlagParam_None, Command_doc); add_flag(&build_flags, BuildFlag_AllPackages, str_lit("all-packages"), BuildFlagParam_None, Command_doc); add_flag(&build_flags, BuildFlag_DocFormat, str_lit("doc-format"), BuildFlagParam_None, Command_doc); @@ -1113,6 +1116,11 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_DynamicMapCalls: build_context.dynamic_map_calls = true; break; + + case BuildFlag_ObfuscateSourceCodeLocations: + build_context.obfuscate_source_code_locations = true; + break; + case BuildFlag_DefaultToNilAllocator: build_context.ODIN_DEFAULT_TO_NIL_ALLOCATOR = true; break; @@ -1947,6 +1955,10 @@ gb_internal void print_show_help(String const arg0, String const &command) { } if (run_or_build) { + print_usage_line(1, "-obfuscate-source-code-locations"); + print_usage_line(2, "Obfuscate the file and procedure strings, and line and column numbers, stored with a 'runtime.Source_Code_Location' value."); + print_usage_line(0, ""); + print_usage_line(1, "-sanitize:"); print_usage_line(2, "Enables sanitization analysis."); print_usage_line(2, "Available options:"); diff --git a/src/tilde_stmt.cpp b/src/tilde_stmt.cpp index 7c090064c..597a4262c 100644 --- a/src/tilde_stmt.cpp +++ b/src/tilde_stmt.cpp @@ -1982,16 +1982,25 @@ gb_internal bool cg_switch_stmt_can_be_trivial_jump_table(AstSwitchStmt *ss) { if (ss->tag == nullptr) { return false; } + enum { DISALLOW_64_SWITCH = true }; + bool is_typeid = false; TypeAndValue tv = type_and_value_of_expr(ss->tag); if (is_type_integer(core_type(tv.type))) { - if (type_size_of(tv.type) > 8) { + i64 sz = type_size_of(tv.type); + if (sz > 8) { + return false; + } + if (DISALLOW_64_SWITCH && sz == 8) { return false; } // okay } else if (is_type_typeid(tv.type)) { // okay is_typeid = true; + if (DISALLOW_64_SWITCH && build_context.ptr_size == 8) { + return false; + } } else { return false; } diff --git a/src/tilde_type_info.cpp b/src/tilde_type_info.cpp index 2188f1cc2..58e8d3087 100644 --- a/src/tilde_type_info.cpp +++ b/src/tilde_type_info.cpp @@ -475,6 +475,13 @@ gb_internal void cg_setup_type_info_data(cgModule *m) { // } tag_type = t_type_info_named; + i64 name_offset = type_offset_of(tag_type, 0); + String name = t->Named.type_name->token.string; + cg_global_const_string(m, name, t_string, global, offset+name_offset); + + i64 base_offset = type_offset_of(tag_type, 1); + cg_global_const_type_info_ptr(m, t->Named.base, global, offset+base_offset); + if (t->Named.type_name->pkg) { i64 pkg_offset = type_offset_of(tag_type, 2); String pkg_name = t->Named.type_name->pkg->name; @@ -495,8 +502,6 @@ gb_internal void cg_setup_type_info_data(cgModule *m) { TokenPos pos = t->Named.type_name->token.pos; cg_global_source_code_location_const(m, proc_name, pos, global, offset+loc_offset); - i64 base_offset = type_offset_of(tag_type, 1); - cg_global_const_type_info_ptr(m, t->Named.base, global, offset+base_offset); break; } -- cgit v1.2.3