diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/all_types.hpp | 7 | ||||
| -rw-r--r-- | src/bigint.cpp | 5 | ||||
| -rw-r--r-- | src/bigint.hpp | 1 | ||||
| -rw-r--r-- | src/codegen.cpp | 28 | ||||
| -rw-r--r-- | src/hash_map.hpp | 12 | ||||
| -rw-r--r-- | src/ir.cpp | 63 | ||||
| -rw-r--r-- | src/memory_profiling.cpp | 9 | ||||
| -rw-r--r-- | src/memory_profiling.hpp | 8 | ||||
| -rw-r--r-- | src/util.cpp | 8 |
9 files changed, 118 insertions, 23 deletions
diff --git a/src/all_types.hpp b/src/all_types.hpp index f58519de4e..cbe875113f 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -2021,6 +2021,13 @@ struct CodeGen { ZigType *entry_any_frame; } builtin_types; + struct { + ZigValue x_undefined; + ZigValue x_void; + ZigValue x_null; + ZigValue x_unreachable; + } intern_values; + ZigType *align_amt_type; ZigType *stack_trace_type; ZigType *err_tag_type; diff --git a/src/bigint.cpp b/src/bigint.cpp index b227b3b4f7..6c74b5f64a 100644 --- a/src/bigint.cpp +++ b/src/bigint.cpp @@ -195,6 +195,11 @@ void bigint_init_bigint(BigInt *dest, const BigInt *src) { memcpy(dest->data.digits, src->data.digits, sizeof(uint64_t) * dest->digit_count); } +void bigint_deinit(BigInt *bi) { + if (bi->digit_count > 1) + deallocate<uint64_t>(bi->data.digits, bi->digit_count); +} + void bigint_init_bigfloat(BigInt *dest, const BigFloat *op) { float128_t zero; ui32_to_f128M(0, &zero); diff --git a/src/bigint.hpp b/src/bigint.hpp index 276ccd64f9..483adaba54 100644 --- a/src/bigint.hpp +++ b/src/bigint.hpp @@ -34,6 +34,7 @@ void bigint_init_signed(BigInt *dest, int64_t x); void bigint_init_bigint(BigInt *dest, const BigInt *src); void bigint_init_bigfloat(BigInt *dest, const BigFloat *op); void bigint_init_data(BigInt *dest, const uint64_t *digits, size_t digit_count, bool is_negative); +void bigint_deinit(BigInt *bi); // panics if number won't fit uint64_t bigint_as_u64(const BigInt *bigint); diff --git a/src/codegen.cpp b/src/codegen.cpp index 4060bbd069..30ac5af4a1 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -8008,6 +8008,33 @@ static void define_builtin_types(CodeGen *g) { } } +static void define_intern_values(CodeGen *g) { + { + auto& value = g->intern_values.x_undefined; + value.type = g->builtin_types.entry_undef; + value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.undefined"); + value.special = ConstValSpecialStatic; + } + { + auto& value = g->intern_values.x_void; + value.type = g->builtin_types.entry_void; + value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.void"); + value.special = ConstValSpecialStatic; + } + { + auto& value = g->intern_values.x_null; + value.type = g->builtin_types.entry_null; + value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.null"); + value.special = ConstValSpecialStatic; + } + { + auto& value = g->intern_values.x_unreachable; + value.type = g->builtin_types.entry_unreachable; + value.global_refs = allocate<ConstGlobalRefs>(1, "ConstGlobalRefs.unreachable"); + value.special = ConstValSpecialStatic; + } +} + static BuiltinFnEntry *create_builtin_fn(CodeGen *g, BuiltinFnId id, const char *name, size_t count) { BuiltinFnEntry *builtin_fn = allocate<BuiltinFnEntry>(1); buf_init_from_str(&builtin_fn->name, name); @@ -8629,6 +8656,7 @@ static void init(CodeGen *g) { g->dummy_di_file = nullptr; define_builtin_types(g); + define_intern_values(g); IrInstruction *sentinel_instructions = allocate<IrInstruction>(2); g->invalid_instruction = &sentinel_instructions[0]; diff --git a/src/hash_map.hpp b/src/hash_map.hpp index 51ec352eda..e819ea1c10 100644 --- a/src/hash_map.hpp +++ b/src/hash_map.hpp @@ -23,10 +23,10 @@ public: } struct Entry { - bool used; - int distance_from_start_index; K key; V value; + bool used; + int distance_from_start_index; }; void clear() { @@ -187,10 +187,10 @@ private: if (distance_from_start_index > _max_distance_from_start_index) _max_distance_from_start_index = distance_from_start_index; *entry = { - true, - distance_from_start_index, key, value, + true, + distance_from_start_index, }; key = tmp.key; value = tmp.value; @@ -208,10 +208,10 @@ private: if (distance_from_start_index > _max_distance_from_start_index) _max_distance_from_start_index = distance_from_start_index; *entry = { - true, - distance_from_start_index, key, value, + true, + distance_from_start_index, }; return; } diff --git a/src/ir.cpp b/src/ir.cpp index 759fc153d3..f4bcfb6330 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -1162,6 +1162,22 @@ static T *ir_create_instruction(IrBuilder *irb, Scope *scope, AstNode *source_no } template<typename T> +static T *ir_create_instruction_noval(IrBuilder *irb, Scope *scope, AstNode *source_node) { + const char *name = nullptr; +#ifdef ZIG_ENABLE_MEM_PROFILE + T *dummy = nullptr; + name = ir_instruction_type_str(ir_instruction_id(dummy)); +#endif + T *special_instruction = allocate<T>(1, name); + special_instruction->base.id = ir_instruction_id(special_instruction); + special_instruction->base.scope = scope; + special_instruction->base.source_node = source_node; + special_instruction->base.debug_id = exec_next_debug_id(irb->exec); + special_instruction->base.owner_bb = irb->current_basic_block; + return special_instruction; +} + +template<typename T> static T *ir_build_instruction(IrBuilder *irb, Scope *scope, AstNode *source_node) { T *special_instruction = ir_create_instruction<T>(irb, scope, source_node); ir_instruction_append(irb->current_basic_block, &special_instruction->base); @@ -1214,16 +1230,22 @@ static IrInstruction *ir_build_return(IrBuilder *irb, Scope *scope, AstNode *sou } static IrInstruction *ir_build_const_void(IrBuilder *irb, Scope *scope, AstNode *source_node) { - IrInstructionConst *const_instruction = ir_build_instruction<IrInstructionConst>(irb, scope, source_node); - const_instruction->base.value->type = irb->codegen->builtin_types.entry_void; - const_instruction->base.value->special = ConstValSpecialStatic; +#ifdef ZIG_ENABLE_MEM_PROFILE + memprof_intern_count.x_void += 1; +#endif + IrInstructionConst *const_instruction = ir_create_instruction_noval<IrInstructionConst>(irb, scope, source_node); + ir_instruction_append(irb->current_basic_block, &const_instruction->base); + const_instruction->base.value = &irb->codegen->intern_values.x_void; return &const_instruction->base; } static IrInstruction *ir_build_const_undefined(IrBuilder *irb, Scope *scope, AstNode *source_node) { - IrInstructionConst *const_instruction = ir_build_instruction<IrInstructionConst>(irb, scope, source_node); - const_instruction->base.value->special = ConstValSpecialUndef; - const_instruction->base.value->type = irb->codegen->builtin_types.entry_undef; +#ifdef ZIG_ENABLE_MEM_PROFILE + memprof_intern_count.x_undefined += 1; +#endif + IrInstructionConst *const_instruction = ir_create_instruction_noval<IrInstructionConst>(irb, scope, source_node); + ir_instruction_append(irb->current_basic_block, &const_instruction->base); + const_instruction->base.value = &irb->codegen->intern_values.x_undefined; return &const_instruction->base; } @@ -1252,9 +1274,12 @@ static IrInstruction *ir_build_const_bigfloat(IrBuilder *irb, Scope *scope, AstN } static IrInstruction *ir_build_const_null(IrBuilder *irb, Scope *scope, AstNode *source_node) { - IrInstructionConst *const_instruction = ir_build_instruction<IrInstructionConst>(irb, scope, source_node); - const_instruction->base.value->type = irb->codegen->builtin_types.entry_null; - const_instruction->base.value->special = ConstValSpecialStatic; +#ifdef ZIG_ENABLE_MEM_PROFILE + memprof_intern_count.x_null += 1; +#endif + IrInstructionConst *const_instruction = ir_create_instruction_noval<IrInstructionConst>(irb, scope, source_node); + ir_instruction_append(irb->current_basic_block, &const_instruction->base); + const_instruction->base.value = &irb->codegen->intern_values.x_null; return &const_instruction->base; } @@ -11113,6 +11138,12 @@ static IrInstruction *ir_const(IrAnalyze *ira, IrInstruction *old_instruction, Z return new_instruction; } +static IrInstruction *ir_const_noval(IrAnalyze *ira, IrInstruction *old_instruction) { + IrInstructionConst *const_instruction = ir_create_instruction_noval<IrInstructionConst>(&ira->new_irb, + old_instruction->scope, old_instruction->source_node); + return &const_instruction->base; +} + static IrInstruction *ir_resolve_cast(IrAnalyze *ira, IrInstruction *source_instr, IrInstruction *value, ZigType *wanted_type, CastOp cast_op) { @@ -11429,13 +11460,21 @@ static IrInstruction *ir_const_undef(IrAnalyze *ira, IrInstruction *source_instr } static IrInstruction *ir_const_unreachable(IrAnalyze *ira, IrInstruction *source_instruction) { - IrInstruction *result = ir_const(ira, source_instruction, ira->codegen->builtin_types.entry_unreachable); - result->value->special = ConstValSpecialStatic; +#ifdef ZIG_ENABLE_MEM_PROFILE + memprof_intern_count.x_unreachable += 1; +#endif + IrInstruction *result = ir_const_noval(ira, source_instruction); + result->value = &ira->codegen->intern_values.x_unreachable; return result; } static IrInstruction *ir_const_void(IrAnalyze *ira, IrInstruction *source_instruction) { - return ir_const(ira, source_instruction, ira->codegen->builtin_types.entry_void); +#ifdef ZIG_ENABLE_MEM_PROFILE + memprof_intern_count.x_void += 1; +#endif + IrInstruction *result = ir_const_noval(ira, source_instruction); + result->value = &ira->codegen->intern_values.x_void; + return result; } static IrInstruction *ir_const_unsigned(IrAnalyze *ira, IrInstruction *source_instruction, uint64_t value) { diff --git a/src/memory_profiling.cpp b/src/memory_profiling.cpp index 494ffae117..7457ba9f3f 100644 --- a/src/memory_profiling.cpp +++ b/src/memory_profiling.cpp @@ -6,6 +6,8 @@ #ifdef ZIG_ENABLE_MEM_PROFILE +MemprofInternCount memprof_intern_count; + static bool str_eql_str(const char *a, const char *b) { return strcmp(a, b) == 0; } @@ -29,7 +31,6 @@ ZigList<const char *> unknown_names = {}; HashMap<const char *, CountAndSize, str_hash, str_eql_str> usage_table = {}; bool table_active = false; - static const char *get_default_name(const char *name_or_null, size_t type_size) { if (name_or_null != nullptr) return name_or_null; if (type_size >= unknown_names.length) { @@ -134,6 +135,12 @@ void memprof_dump_stats(FILE *file) { list.deinit(); table_active = true; + + fprintf(stderr, "\n"); + fprintf(stderr, "undefined: interned %zu times\n", memprof_intern_count.x_undefined); + fprintf(stderr, "void: interned %zu times\n", memprof_intern_count.x_void); + fprintf(stderr, "null: interned %zu times\n", memprof_intern_count.x_null); + fprintf(stderr, "unreachable: interned %zu times\n", memprof_intern_count.x_unreachable); } #endif diff --git a/src/memory_profiling.hpp b/src/memory_profiling.hpp index 6d43d81e3c..56321564d0 100644 --- a/src/memory_profiling.hpp +++ b/src/memory_profiling.hpp @@ -13,6 +13,14 @@ #include <stddef.h> #include <stdio.h> +struct MemprofInternCount { + size_t x_undefined; + size_t x_void; + size_t x_null; + size_t x_unreachable; +}; +extern MemprofInternCount memprof_intern_count; + void memprof_init(void); void memprof_alloc(const char *name, size_t item_count, size_t type_size); diff --git a/src/util.cpp b/src/util.cpp index d3dc57e098..56f1de9839 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -121,18 +121,18 @@ SplitIterator memSplit(Slice<uint8_t> buffer, Slice<uint8_t> split_bytes) { void zig_pretty_print_bytes(FILE *f, double n) { if (n > 1024.0 * 1024.0 * 1024.0) { - fprintf(f, "%.02f GiB", n / 1024.0 / 1024.0 / 1024.0); + fprintf(f, "%.03f GiB", n / 1024.0 / 1024.0 / 1024.0); return; } if (n > 1024.0 * 1024.0) { - fprintf(f, "%.02f MiB", n / 1024.0 / 1024.0); + fprintf(f, "%.03f MiB", n / 1024.0 / 1024.0); return; } if (n > 1024.0) { - fprintf(f, "%.02f KiB", n / 1024.0); + fprintf(f, "%.03f KiB", n / 1024.0); return; } - fprintf(f, "%.02f bytes", n ); + fprintf(f, "%.03f bytes", n ); return; } |
