From f5bc95eb349c75c8378a0a35104fd763db7742a1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 13 Sep 2021 01:07:24 +0100 Subject: [PATCH] More culling --- src/check_type.cpp | 13 ++-------- src/main.cpp | 5 ++++ src/types.cpp | 60 ++++++++++++++++------------------------------ 3 files changed, 27 insertions(+), 51 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 2c9f589c7..32a40de12 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -188,13 +188,6 @@ void check_struct_fields(CheckerContext *ctx, Ast *node, Slice *fields } -Entity *make_names_field_for_struct(CheckerContext *ctx, Scope *scope) { - Entity *e = alloc_entity_field(scope, make_token_ident(str_lit("names")), t_string_slice, false, 0); - e->flags |= EntityFlag_TypeField; - e->flags |= EntityFlag_Value; - return e; -} - bool check_custom_align(CheckerContext *ctx, Ast *node, i64 *align_) { GB_ASSERT(align_ != nullptr); Operand o = {}; @@ -565,8 +558,7 @@ void check_struct_type(CheckerContext *ctx, Type *struct_type, Ast *node, Array< case_end; } } - struct_type->Struct.names = make_names_field_for_struct(ctx, ctx->scope); - + scope_reserve(ctx->scope, min_field_count); if (st->is_raw_union && min_field_count > 1) { @@ -658,7 +650,7 @@ void check_union_type(CheckerContext *ctx, Type *union_type, Ast *node, ArrayUnion.variants = variants; + union_type->Union.variants = slice_from_array(variants); union_type->Union.no_nil = ut->no_nil; union_type->Union.maybe = ut->maybe; if (union_type->Union.no_nil) { @@ -818,7 +810,6 @@ void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *named_type, Ast enum_type->Enum.fields = fields; - enum_type->Enum.names = make_names_field_for_struct(ctx, ctx->scope); *enum_type->Enum.min_value = min_value; *enum_type->Enum.max_value = max_value; diff --git a/src/main.cpp b/src/main.cpp index b38a23b5f..d9630a38a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2221,6 +2221,11 @@ int strip_semicolons(Parser *parser) { int main(int arg_count, char const **arg_ptr) { #define TIME_SECTION(str) do { debugf("[Section] %s\n", str); timings_start_section(&global_timings, str_lit(str)); } while (0) + #define TYPE_KIND(k, ...) gb_printf("%s %td\n", #k, sizeof(Type##k)); + TYPE_KINDS + #undef TYPE_KIND + gb_printf("Type %td\n", sizeof(Type)); + if (arg_count < 2) { usage(make_string_c(arg_ptr[0])); return 1; diff --git a/src/types.cpp b/src/types.cpp index 4362ae45b..47a949699 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -121,7 +121,7 @@ struct BasicType { String name; }; -enum StructSoaKind { +enum StructSoaKind : u8 { StructSoa_None = 0, StructSoa_Fixed = 1, StructSoa_Slice = 2, @@ -135,38 +135,37 @@ struct TypeStruct { Ast * node; Scope * scope; - Type * polymorphic_params; // Type_Tuple - Type * polymorphic_parent; + i64 custom_align; + Type * polymorphic_params; // Type_Tuple + Type * polymorphic_parent; - i64 custom_align; - Entity * names; - Type * soa_elem; - i64 soa_count; - StructSoaKind soa_kind; + Type * soa_elem; + i64 soa_count; + StructSoaKind soa_kind; - bool is_polymorphic; - bool are_offsets_set : 1; - bool are_offsets_being_processed : 1; - bool is_packed : 1; - bool is_raw_union : 1; - bool is_poly_specialized : 1; + bool is_polymorphic; + bool are_offsets_set : 1; + bool are_offsets_being_processed : 1; + bool is_packed : 1; + bool is_raw_union : 1; + bool is_poly_specialized : 1; }; struct TypeUnion { - Array variants; + Slice variants; Ast * node; Scope * scope; i64 variant_block_size; i64 custom_align; - i64 tag_size; Type * polymorphic_params; // Type_Tuple Type * polymorphic_parent; - bool no_nil; - bool maybe; + i16 tag_size; bool is_polymorphic; - bool is_poly_specialized; + bool is_poly_specialized : 1; + bool no_nil : 1; + bool maybe : 1; }; struct TypeProc { @@ -237,7 +236,6 @@ struct TypeProc { Array fields; \ Ast *node; \ Scope * scope; \ - Entity * names; \ Type * base_type; \ ExactValue *min_value; \ ExactValue *max_value; \ @@ -2311,7 +2309,7 @@ i64 union_tag_size(Type *u) { } } - u->Union.tag_size = gb_min3(max_align, build_context.max_align, 8); + u->Union.tag_size = cast(i16)gb_min3(max_align, build_context.max_align, 8); return u->Union.tag_size; } @@ -2478,24 +2476,6 @@ Selection lookup_field_with_selection(Type *type_, String field_name, bool is_ty type = base_type(type); if (is_type) { - switch (type->kind) { - case Type_Struct: - if (type->Struct.names != nullptr && - field_name == "names") { - sel.entity = type->Struct.names; - return sel; - } - break; - case Type_Enum: - if (type->Enum.names != nullptr && - field_name == "names") { - sel.entity = type->Enum.names; - return sel; - } - break; - } - - if (is_type_enum(type)) { // NOTE(bill): These may not have been added yet, so check in case for_array(i, type->Enum.fields) { @@ -3269,7 +3249,7 @@ i64 type_size_of_internal(Type *t, TypePath *path) { i64 tag_size = union_tag_size(t); size = align_formula(max, tag_size); // NOTE(bill): Calculate the padding between the common fields and the tag - t->Union.tag_size = tag_size; + t->Union.tag_size = cast(i16)tag_size; t->Union.variant_block_size = size - field_size; size += tag_size;