F diff --git a/src/backend/asm/intel/intel_compile.c b/src/backend/asm/intel/intel_compile.c --- a/src/backend/asm/intel/intel_compile.c +++ b/src/backend/asm/intel/intel_compile.c{struct Intel_Asm_Memory_Location *string_location;string_location=reserve_static_space_for_string(compile_data,literal->value->constant);- push_intel_asm_instruction(compile_data,- get_intel_asm_binary_instruction(+ push_intel_asm_instruction(compile_data, get_intel_asm_binary_instruction(get_intel_asm_register(INTEL_ASM_REGISTER_RAX),string_location,INTEL_ASM_OP_MOVvoid compile_object_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Object_Declaration *objd){reserve_stack_space_for_object(compile_data,objd->object->object);+ compile_initilizer_for_declaration_to_intel_asm(compile_data,objd->object->object,objd->initializer);+ }+ void compile_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser *init)+ {+ wonky_assert(obj!=NULL);+ wonky_assert(init!=NULL);++ #error teq trqbva da se izchislqvat constantno zashtoto inache nqma da mojem da inicializirame statichite obekti++ switch(init->kind)+ {+ case INITIALISER_DENOTED:+ compile_denoted_initilizer_for_declaration_to_intel_asm(compile_data,obj,init);+ break;+ case INITIALISER_INDEXED:+ compile_indexed_initilizer_for_declaration_to_intel_asm(compile_data,obj,init);+ break;+ case INITIALISER_COMPOUND:+ compile_compound_initilizer_for_declaration_to_intel_asm(compile_data,obj,init);+ break;+ case INITIALISER_EXPRESSION:+ compile_expression_initilizer_for_declaration_to_intel_asm(compile_data,obj,init);+ break;+ default:+ wonky_assert(SHOULD_NOT_REACH_HERE);+ }++ }++ void compile_denoted_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser_Denoted *init)+ {+ wonky_assert(obj!=NULL && init!=NULL);+ push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ }+ void compile_indexed_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser_Indexed *init)+ {+ wonky_assert(obj!=NULL && init!=NULL);+ push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ }+ void compile_expression_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser_Expression *init)+ {+ wonky_assert(obj!=NULL && init!=NULL);+ compile_ast_to_intel_asm(compile_data,init->expression);+ push_intel_asm_instruction(compile_data,intel_asm_get_pop(INTEL_ASM_REGISTER_RAX));++ push_intel_asm_instruction(compile_data, get_intel_asm_binary_instruction(+ get_intel_asm_register(INTEL_ASM_REGISTER_RAX),+ obj->location,+ INTEL_ASM_OP_MOV+ )+ );+ }+ void compile_compound_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser_Compound *init)+ {+ wonky_assert(obj!=NULL && init!=NULL);+ push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));}+void compile_function_definition_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Function_Definition *def){int current_register;void compile_translation_unit_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Translation_Unit *unit){struct Queue_Node *it;- Map_Map_Extended(((struct Normal_Scope*)unit->file_scope)->ordinary,(void (*)(void*,void*))intel_asm_anotate_denoted,compile_data);+ Map_Map_Extended(((struct Normal_Scope*)unit->file_scope)->ordinary,+ (void (*)(void*,void*))intel_asm_anotate_denoted,compile_data);for(it=unit->function_definitions->first;it!=NULL;it=it->prev)compile_ast_to_intel_asm(compile_data,it->data);}}void compile_dereference_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Unary_Expression *unary){- enum Intel_Asm_Registers ax;compile_ast_to_intel_asm(compile_data,(struct AST*)unary->operand);lvalue_to_rax(compile_data,unary->operand->value);push_intel_asm_instruction(compile_data,get_intel_asm_binary_instruction(get_intel_asm_register(INTEL_ASM_REGISTER_RAX),get_intel_asm_by_register(INTEL_ASM_REGISTER_RAX,8),INTEL_ASM_OP_MOV));}void compile_member_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin){- push_intel_asm_instruction(compile_data,get_intel_asm_simple_instruction(INTEL_ASM_OP_NOP));+ struct identifier *id;+ struct Type_Struct_Union *type;+ struct Struct_Union *su;+ int offset=0;++ wonky_assert(bin->right->type==OP_DESIGNATOR);++ compile_ast_to_intel_asm(compile_data,(struct AST*)bin->left);++ id=((struct AST_Designator*)bin->right)->id;+ wonky_assert(id!=NULL);++ type=(struct Type_Struct_Union*)get_ast_expression_type(bin->left);+ wonky_assert(type!=NULL && (type->specifier==TS_STRUCT || type->specifier==TS_UNION));++ if(type->specifier==TS_STRUCT)+ {+ struct Queue_Node *it;++ su=type->struct_union;+ wonky_assert(su!=NULL && type->specifier==su->specifier);++ for(it=su->members->first;it!=NULL;it=it->prev)+ {+ struct Denoted_Object *obj=it->data;+ if(obj->id==id)+ break;+ offset+=get_type_size(obj->object->type);+ }+ wonky_assert(it!=NULL);+++ lvalue_to_rax(compile_data,bin->left->value);+ push_intel_asm_instruction(compile_data,+ get_intel_asm_binary_instruction(+ get_intel_asm_register(INTEL_ASM_REGISTER_RAX),+ get_intel_asm_in_instruction_number(offset),+ INTEL_ASM_OP_ADD)+ );+ }else //UNION+ {+ lvalue_to_rax(compile_data,bin->left->value);+ }+ push_intel_asm_instruction(compile_data,intel_asm_get_push(INTEL_ASM_REGISTER_RAX));}void compile_subscript_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin){F diff --git a/src/backend/asm/intel/intel_compile.h b/src/backend/asm/intel/intel_compile.h --- a/src/backend/asm/intel/intel_compile.h +++ b/src/backend/asm/intel/intel_compile.hvoid compile_case_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Case_Statement *cs);void compile_return_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Return_Statement *ret);void compile_object_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Object_Declaration *objd);+ void compile_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser *init);++ void compile_denoted_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser_Denoted *init);+ void compile_indexed_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser_Indexed *init);+ void compile_expression_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser_Expression *init);+ void compile_compound_initilizer_for_declaration_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct Object *obj,struct Initialiser_Compound *init);+++void compile_function_definition_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Function_Definition *def);void compile_translation_unit_to_intel_asm(struct Compile_Data_Intel_Asm *compile_data,struct AST_Translation_Unit *unit);void compile_expression_statement(struct Compile_Data_Intel_Asm *compile_data,struct AST_Expression *expression);void compile_shift_assign_inner(struct Compile_Data_Intel_Asm *compile_data,struct AST_Binary_Expression *bin,enum Intel_Asm_Instruction_Type op);+#endifF diff --git a/src/frontend/parse/parse_declaration.c b/src/frontend/parse/parse_declaration.c --- a/src/frontend/parse/parse_declaration.c +++ b/src/frontend/parse/parse_declaration.cQueue_Push(base->members,hold_denoted);if(type_is_constant_or_has_constant_member(hold_denoted_object->object->type))base->has_constant_member=1;++ wonky_assert(hold_denoted_object && hold_denoted_object->object &&+ hold_denoted_object->object->type);+ base->size+=get_type_size(hold_denoted_object->object->type);}else{push_translation_error("non object declaration in struct definition",translation_data);F diff --git a/src/semantics/ast.c b/src/semantics/ast.c --- a/src/semantics/ast.c +++ b/src/semantics/ast.creturn ret;}+ struct Type* get_ast_expression_type(struct AST_Expression *exp)+ {+ wonky_assert(exp!=NULL && exp->value!=NULL);+ return extract_expresion_value_type(exp->value);+ }+struct AST_Function_Declaration* get_function_declaration_tree(struct Scope *scope,struct Denoted_Function *function){struct AST_Function_Declaration *ret;F diff --git a/src/semantics/ast.h b/src/semantics/ast.h --- a/src/semantics/ast.h +++ b/src/semantics/ast.hstruct AST_Function_Declaration* get_function_declaration_tree(struct Scope *scope,struct Denoted_Function *function);struct AST_Function_Definition* get_function_definition_tree(struct Scope *scope,struct Denoted_Function *function,struct AST_Compound_Statement *function_body,struct Translation_Data *translation_data);struct AST_Translation_Unit* get_translation_unit_tree();+ struct Type* get_ast_expression_type(struct AST_Expression *exp);F diff --git a/src/semantics/value/type.c b/src/semantics/value/type.c --- a/src/semantics/value/type.c +++ b/src/semantics/value/type.cret->is_finished=0;ret->has_constant_member=0;ret->id=id;+ ret->size=0;return ret;}