Skip to content
Snippets Groups Projects
Commit 6d03f4ec authored by FlorianKrull's avatar FlorianKrull
Browse files

Moved constants to end of file

parent 6f8f678b
No related branches found
No related tags found
No related merge requests found
......@@ -19,23 +19,29 @@ struct mcc_asm_gen_container {
Dynamic_Array *variable_offsets;
int labelCounter;
Dynamic_Array *assignment_map;
unsigned int constants_size;
unsigned int constant_count;
struct mcc_asm_constant **constants;
};
/*enum mcc_asm_contant_type {MCC_ASM_CONST_FLOAT, MCC_ASM_CONST_STRING};
enum mcc_asm_contant_type {MCC_ASM_CONST_FLOAT, MCC_ASM_CONST_STRING};
struct mcc_asm_constant {
enum mcc_asm_contant_type const_type;
int number;
struct mcc_asm_constant *next;
char *const_value;
};
union {
double f_value;
char *s_value;
};
}*/
int mcc_asm_gen_creator(FILE *out, struct mcc_tac *tac, struct mcc_symbol_table *st);
void mcc_assembly_add_constant(struct mcc_asm_gen_container *ac, enum mcc_asm_contant_type type, char *constant_value);
void mcc_invoke_gcc(char *file_name, char *output);
// void mcc_asm_print_constant(FILE *out, struct mcc_asm_constant *constant);
......
......@@ -14,6 +14,29 @@ int mcc_assembly_get_current_offset(struct mcc_asm_gen_container *ac) {
return last_entry -> offset;
}
void mcc_assembly_add_constant(struct mcc_asm_gen_container *ac, enum mcc_asm_contant_type type, char *constant_value)
{
struct mcc_asm_constant *constant = malloc(sizeof(*constant));
constant->const_type = type;
constant->const_value = constant_value;
if (ac->constant_count < ac->constants_size) {
ac->constants[ac->constant_count++] = constant;
return;
}
struct mCc_assembly_constant **temp_consts;
ac->constants_size += 10;
if ((temp_consts =
realloc(ac->constants, ac->constants_size *
sizeof(*constant))) == NULL) {
return;
}
ac->constants = temp_consts;
ac->constants[ac->constant_count++] = constant;
}
void mcc_assembly_add_offset_variable(struct mcc_asm_gen_container *ac, struct mcc_tac_entry *te) {
int current_offset = mcc_assembly_get_current_offset(ac);
......
......@@ -128,16 +128,18 @@ void asm_gen_assignment_bool(FILE *out, struct mcc_tac_entry *te, struct mcc_asm
void asm_gen_assignment_string(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container) {
mcc_assembly_add_offset_variable(asm_container, te);
te->arg1[strlen(te->arg1) - 2] = '\0';
fprintf(out, "\t.LC%d:\n", asm_container->labelCounter);
fprintf(out, "\t .string \"%s\"\n", te->arg1 + 2);
// fprintf(out, "\t.LC%d:\n", asm_container->labelCounter);
// fprintf(out, "\t .string \"%s\"\n", te->arg1 + 2);
mcc_assembly_add_constant(asm_container,MCC_ASM_CONST_STRING,te->arg1 + 2);
fprintf(out, "\tmovl\t$.LC%d, %d(%%ebp)\n", asm_container->labelCounter++, mcc_assembly_get_current_offset(asm_container));
}
void asm_gen_assignment_float(FILE *out, struct mcc_tac_entry *te, struct mcc_asm_gen_container *asm_container) {
mcc_assembly_add_offset_variable(asm_container, te);
fprintf(out, "\t.LC%d:\n", asm_container->labelCounter);
fprintf(out, "\t .long %s\n", te->arg1);
// fprintf(out, "\t.LC%d:\n", asm_container->labelCounter);
// fprintf(out, "\t .long %s\n", te->arg1);
fprintf(out,"\tflds .LC%d\n", asm_container->labelCounter++);
mcc_assembly_add_constant(asm_container,MCC_ASM_CONST_FLOAT,te->arg1);
fprintf(out, "\tfstps %d(%%ebp)\n",mcc_assembly_get_current_offset(asm_container));
}
......@@ -373,6 +375,8 @@ void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *a
switch (entry -> tac_op) {
case MCC_TAC_FUNCTION_START:
asm_container -> variable_offsets = mcc_create_dynamic_array(20);
asm_container->labelCounter = 0;
asm_gen_function_start(out, entry -> arg2);
break;
case MCC_TAC_FUNCTION_END:
......@@ -382,8 +386,6 @@ void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *a
fprintf(out, "\tcall\t%s\n", entry->result);
break;
case MCC_TAC_LABEL :
asm_container -> variable_offsets = mcc_create_dynamic_array(20);
asm_container->labelCounter = 0;
fprintf(out, ".%s:\n",entry->result);
break;
case MCC_TAC_JMP :
......@@ -396,16 +398,16 @@ void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *a
case MCC_TAC_RETURN:
asm_gen_function_end_with_return(out, entry, asm_container);
break;
case MCC_TAC_INT_LITERAL:
case MCC_TAC_INT:
asm_gen_assignment_int(out, entry, asm_container);
break;
case MCC_TAC_STRING_LITERAL:
case MCC_TAC_STRING:
asm_gen_assignment_string(out, entry, asm_container);
break;
case MCC_TAC_FLOAT_LITERAL:
case MCC_TAC_FLOAT:
asm_gen_assignment_float(out, entry, asm_container);
break;
case MCC_TAC_BOOL_LITERAL:
case MCC_TAC_BOOL:
asm_gen_assignment_bool(out, entry, asm_container);
break;
case MCC_TAC_PLUS_INT:
......@@ -472,6 +474,15 @@ void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *a
mcc_assembly_add_offset_variable(asm_container, entry);
break;
//copy
// case MCC_TAC_INT:
// case MCC_TAC_BOOL:
// case MCC_TAC_STRING:
// break;
// case MCC_TAC_FLOAT:
break;
//load
case MCC_TAC_LOAD_BOOL:
case MCC_TAC_LOAD_INT:
......@@ -494,6 +505,16 @@ void mcc_asm_gen(FILE *out, struct mcc_tac *tac, struct mcc_asm_gen_container *a
break;
}
}
for(int i = 0; i < asm_container->constant_count; i++){
fprintf(out, ".LC%d:\n", i);
struct mcc_asm_constant *temp_const = asm_container->constants[i];
if(temp_const->const_type == MCC_ASM_CONST_FLOAT){
fprintf(out, "\t.float\t%s\n", temp_const->const_value);
}else{
fprintf(out, "\t .string \"%s\"\n", temp_const->const_value);
}
}
}
int mcc_asm_gen_creator(FILE *out, struct mcc_tac *tac, struct mcc_symbol_table *st) {
......@@ -501,6 +522,9 @@ int mcc_asm_gen_creator(FILE *out, struct mcc_tac *tac, struct mcc_symbol_table
ac -> variable_offsets = mcc_create_dynamic_array(20);
ac->labelCounter = 0;
ac->constants_size = 0;
ac->constant_count = 0;
ac->constants = NULL;
mcc_asm_gen(out, tac, ac);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment