WONKY



LOG | FILES | OVERVIEW


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_MOV
void 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.h
void 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);
+
#endif
F 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.c
Queue_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.c
return 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.h
struct 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.c
ret->is_finished=0;
ret->has_constant_member=0;
ret->id=id;
+ ret->size=0;
return ret;
}