F diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txtset(TEST_DIR ${CMAKE_SOURCE_DIR}/tests)set(WOBLER_DUMP_LOG ${CMAKE_BINARY_DIR}/log.wobler)- message("BUILDING ${CMAKE_BUILD_TYPE}")include_directories(src/)set(SOURCES- src/backend/text/print/print.c- src/backend/text/lines.csrc/backend/asm/intel/intel_asm.c+ src/backend/asm/intel/intel_compile.csrc/backend/asm/intel/intel_instruction.csrc/backend/asm/intel/intel_location.c- src/backend/asm/intel/intel_compile.csrc/backend/compile.c+ src/backend/text/lines.c+ src/backend/text/print/print.c+ src/debug/debug_ast.csrc/debug/debug_ast.csrc/debug/debug_denoted.csrc/debug/debug_initialiser.csrc/debug/debug_scope.csrc/debug/debug_type.csrc/debug/debug_value.c- src/debug/debug_ast.c+ src/environment/command_arguments/gcc_arguments.c+ src/environment/error/gcc_error.csrc/frontend/lex/automatas/chonky.csrc/frontend/lex/automatas/chonky_jr.csrc/frontend/lex/lexer.csrc/misc/map.csrc/misc/queue.csrc/misc/stack.c- src/environment/command_arguments/gcc_arguments.c- src/environment/error/gcc_error.c- src/semantics/program/program.c+ src/misc/wonky_malloc.csrc/semantics/ast.csrc/semantics/constraints/expression_constraints.csrc/semantics/constraints/initialiser_constraints.csrc/semantics/identifiers/scope.csrc/semantics/memory/location.csrc/semantics/memory/object.c+ src/semantics/program/program.csrc/semantics/value/constant.csrc/semantics/value/evaluation.csrc/semantics/value/initialiser.cfile(COPY ${CMAKE_SOURCE_DIR}/tools/wsh DESTINATION ${CMAKE_BINARY_DIR})+ message("BUILD TYPE: ${CMAKE_BUILD_TYPE}")++ message("make test runs tests and copies test .c files to build directory")+ message("./wsh does the compile ritual for a linux machine. Tested only on debian 11")F diff --git a/doc/todo.txt b/doc/todo.txt --- a/doc/todo.txt +++ b/doc/todo.txtFinish implementing initialiser parsingMake multiple definitions checkMake variadic functions and macros+ Implement declarations in for cycle - for(int i=0;i<10;++i)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.cvoid 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);}F diff --git a/src/backend/text/print/print.c b/src/backend/text/print/print.c --- a/src/backend/text/print/print.c +++ b/src/backend/text/print/print.c{struct Source_File *base_file;+ struct Memory *memory;struct Translation_Data *hold_translation_data;char *this_directory[]={"./",NULL};char ret;}ret=0;- hold_translation_data=get_translation_data(NULL,get_linkage(),get_linkage());+ memory=get_memory();++ hold_translation_data=get_translation_data(NULL,get_linkage(),get_linkage(),memory);do{base_file=get_source_file(*base_source_names,this_directory);F diff --git a/src/environment/error/gcc_error.h b/src/environment/error/gcc_error.h --- a/src/environment/error/gcc_error.h +++ b/src/environment/error/gcc_error.h#include <gcc_string.h>#include <common.h>#include <compile.h>-+ #include <type.h>struct Translation_Message{F diff --git a/src/frontend/lex/lexer.h b/src/frontend/lex/lexer.h --- a/src/frontend/lex/lexer.h +++ b/src/frontend/lex/lexer.h#ifndef LEXER_H#define LEXER_H LEXER_H#include <lexer.hh>+#include <stdio.h>#include <chonky.h>#include <chonky_jr.h>F diff --git a/src/frontend/lex/preprocessing.c b/src/frontend/lex/preprocessing.c --- a/src/frontend/lex/preprocessing.c +++ b/src/frontend/lex/preprocessing.chold_index=malloc(sizeof(int));*hold_index=number_of_arguments;++number_of_arguments;- Map_Push(new_macro->arguments,hold_token->data,hold_token->data_size,hold_index);+ Map_Push(new_macro->arguments,hold_token->data,hold_token->data_size,hold_index,translation_data->memory);free(hold_token);hold_token=get_next_token(src,&chonky[0],0);if(hold_token->type!=KW_COMMA)translation_data->tokens=hold_tokens;/*push the directive into the macro map*/- Map_Push(translation_data->macros,macro_name->data,macro_name->data_size,new_macro);+ Map_Push(translation_data->macros,macro_name->data,macro_name->data_size,new_macro,translation_data->memory);//free(macro_name);chase_new_line(src,translation_data);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.cexit:if(ret->specifier==TS_ENUM){- ret->type=(struct Type*)get_enum_type(ret);+ ret->type=(struct Type*)get_enum_type(ret,translation_data);}else if(ret->specifier==TS_STRUCT || ret->specifier==TS_UNION){- ret->type=(struct Type*)get_struct_union_type(ret);+ ret->type=(struct Type*)get_struct_union_type(ret,translation_data);}else if(ret->type==NULL){- ret->type=(struct Type*)get_basic_type(ret);+ ret->type=(struct Type*)get_basic_type(ret,translation_data);}return ret;}break;}}- base->type=(struct Type*)get_pointer_type(base->type,is_const,is_volatile);+ base->type=(struct Type*)get_pointer_type(base->type,is_const,is_volatile,translation_data);}parse_direct_declarator(translation_data,scope,base);{/*TODO error*/push_translation_error("']' expected",translation_data);- base->type=(struct Type*)get_type_error(base->type);+ base->type=(struct Type*)get_type_error(base->type,translation_data);delete_ast(hold_expression);return;}F diff --git a/src/misc/map.c b/src/misc/map.c --- a/src/misc/map.c +++ b/src/misc/map.c/** tree must not be null* */- void Map_Push(Map *tree,void *str,size_t size,void *id)+ void Map_Push(Map *tree,void *str,size_t size,void *id,struct Memory *mem){size_t temp;Map_Scour(tree,str,size,&temp,&tree);}for(temp;temp<size;++temp){- tree=tree->delta[((unsigned char*)str)[temp]]=calloc(1,sizeof(Map));+ tree=tree->delta[((unsigned char*)str)[temp]]=wonky_malloc_map_node(mem);/*Map_Init(tree=tree->delta[((unsigned char*)str)[temp]]=malloc(sizeof(Map))}}- struct Map* Map_Push_And_Get(struct Map* tree,void *str,size_t size,void *id)+ struct Map* Map_Push_And_Get(struct Map* tree,void *str,size_t size,void *id,struct Memory *mem){size_t temp;Map_Scour(tree,str,size,&temp,&tree);return tree;}- void* Map_Check_And_Push(struct Map *tree,void *str,size_t size,void *id)+ void* Map_Check_And_Push(struct Map *tree,void *str,size_t size,void *id,struct Memory *mem){size_t temp;Map_Scour(tree,str,size,&temp,&tree);F diff --git a/src/misc/map.h b/src/misc/map.h --- a/src/misc/map.h +++ b/src/misc/map.h#ifndef GMAP_H#define GMAP_H GMAP_H+ #include <map.hh>++#include <stdlib.h>#include <stdio.h>#include <stack.h>#include <queue.h>#include <common.h>+ #include <wonky_malloc.h>- typedef struct Map Map;void Map_Init(Map *tree);void Map_Scour(Map *tree,void *str,size_t size,size_t *where,Map **final_node);- void Map_Push(Map *tree,void *str,size_t size,void *id);+ void Map_Push(Map *tree,void *str,size_t size,void *id,struct Memory *mem);void* Map_Check(Map *tree, void *str,size_t size);struct Map* Map_Check_And_Get(Map *tree, void *str,size_t size);void Map_Remove(Map *tree, void *str,size_t size);void Map_Delete_Map(struct Map *tree);struct Condensed_Map* Map_Condense(Map* tree);- struct Map* Map_Push_And_Get(struct Map* tree,void *str,size_t size,void *id);+ struct Map* Map_Push_And_Get(struct Map* tree,void *str,size_t size,void *id,struct Memory *mem);/*returns NULL if id is not taken , returns pointer to taken id otherwise*/- void* Map_Check_And_Push(struct Map *tree,void *str,size_t size,void *id);+ void* Map_Check_And_Push(struct Map *tree,void *str,size_t size,void *id,struct Memory *mem);#endifF diff --git a/src/misc/map.hh b/src/misc/map.hh new file mode 100644 --- /dev/null +++ b/src/misc/map.hh+ #ifndef GMAP_HH+ #define GMAP_HH GMAP_HH++ struct Map;+ typedef struct Map Map;++ #endifF diff --git a/src/misc/queue.h b/src/misc/queue.h --- a/src/misc/queue.h +++ b/src/misc/queue.h#ifndef GQUEUE_H#define GQUEUE_H GQUEUE_H- #include<stdlib.h>//malloc free- #include<wonky_assert.h>+ #include <queue.hh>++ #include <stdlib.h>+ #include <wonky_assert.h>#include <common.h>- typedef struct Queue Queue;struct Queue{F diff --git a/src/misc/queue.hh b/src/misc/queue.hh new file mode 100644 --- /dev/null +++ b/src/misc/queue.hh+ #ifndef GQUEUE_HH+ #define GQUEUE_HH GQUEUE_HH++ struct Queue;+ typedef struct Queue Queue;++ #endifF diff --git a/src/misc/stack.h b/src/misc/stack.h --- a/src/misc/stack.h +++ b/src/misc/stack.h#ifndef GSTACK_H#define GSTACK_H GSTACK_H- #include<stdlib.h>+ #include <stack.hh>++ #include <stdlib.h>#include <common.h>- typedef struct Stack Stack;struct Stack_Node{F diff --git a/src/misc/stack.hh b/src/misc/stack.hh new file mode 100644 --- /dev/null +++ b/src/misc/stack.hh+ #ifndef GSTACK_HH+ #define GSTACK_HH GSTACK_HH+++ struct Stack_Node;+ struct Stack;++ typedef struct Stack Stack;++ #endifF diff --git a/src/misc/wonky_malloc.c b/src/misc/wonky_malloc.c new file mode 100644 --- /dev/null +++ b/src/misc/wonky_malloc.c+ #ifndef WONKY_MALLOC_C+ #define WONKY_MALLOC_C WONKY_MALLOC_C+ #include <wonky_malloc.h>++ struct Memory* get_memory()+ {+ struct Memory *ret;+ ret=malloc(sizeof(struct Memory));+ if(ret==NULL)+ return NULL;++ ret->map_nodes=calloc_memory_segment(NULL,NUMBER_OF_MAP_NODES_IN_INCREMENTATION_OF_MAP_MEMORY_SEGMENT,sizeof(struct Map));+ if(ret->map_nodes==NULL)+ {+ free(ret);+ return NULL;+ }+++ ret->tokens=get_memory_segment(NULL);+ if(ret->tokens==NULL)+ {+ delete_memory_segment(ret->map_nodes);+ free(ret);+ return NULL;+ }++ ret->generic=calloc_memory_segment(NULL,NUMBER_OF_TOKENS_IN_INCREMENTATION_OF_TOKEN_MEMORY_SEGMENT,sizeof(struct token));+ if(ret->generic==NULL)+ {+ delete_memory_segment(ret->map_nodes);+ delete_memory_segment(ret->tokens);+ free(ret);+ return NULL;+ }++ return ret;+ }+ void delete_memory(struct Memory *mem)+ {+ struct Memory_Segment *current_segment;+ struct Memory_Segment *hold_previous_segment;++ current_segment=mem->map_nodes;++ while(current_segment!=NULL)+ {+ hold_previous_segment=current_segment->previous;+ delete_memory_segment(current_segment);+ current_segment=hold_previous_segment;+ }+ free(mem);+ }+ void delete_memory_segment(struct Memory_Segment *segment)+ {+ free(segment->data);+ free(segment);+ }+ void* wonky_malloc(size_t size,struct Memory *mem)+ {+ if(mem->generic->capacity - mem->generic->size < size)+ {+ if(mem->generic->capacity/REALLOC_TRIGGER>=size)+ mem->generic=resize_memory_segment(mem->generic->size+size,mem->generic);+ else+ mem->generic=get_memory_segment(mem->generic);+ }+ mem->generic->size+=size;+ return mem->generic->data + mem->generic->size - size;+ }+ struct Map* wonky_malloc_map_node(struct Memory *mem)+ {+ if(mem->map_nodes->size==mem->map_nodes->capacity)+ mem->map_nodes=calloc_memory_segment(mem->map_nodes,NUMBER_OF_MAP_NODES_IN_INCREMENTATION_OF_MAP_MEMORY_SEGMENT,sizeof(struct Map));++ ++mem->map_nodes->size;+ return (struct Map*) (mem->map_nodes->data + mem->map_nodes->size*sizeof(struct Map) - sizeof(struct Map));+ }+ struct token* wonky_malloc_token(struct Memory *mem)+ {+ if(mem->tokens->size==mem->tokens->capacity)+ mem->tokens=calloc_memory_segment(mem->tokens,NUMBER_OF_TOKENS_IN_INCREMENTATION_OF_TOKEN_MEMORY_SEGMENT,sizeof(struct token));++ ++mem->tokens->size;+ return (struct token*) (mem->tokens->data + mem->tokens->size*sizeof(struct token) - sizeof(struct token));+ }+++ struct Memory_Segment* get_memory_segment(struct Memory_Segment *previous)+ {+ struct Memory_Segment *ret;+ if(previous==NULL)+ {+ ret=malloc(sizeof(struct Memory_Segment));+ ret->data=malloc(NUMBER_OF_BYTES_IN_INCREMENTATION_OF_GENERIC_MEMORY_SEGMENT);++ ret->capacity=NUMBER_OF_BYTES_IN_INCREMENTATION_OF_GENERIC_MEMORY_SEGMENT;+ ret->size=0;+ ret->previous=NULL;+ }else+ {+ ret=malloc(sizeof(struct Memory_Segment));+ ret->data=malloc(NUMBER_OF_BYTES_IN_INCREMENTATION_OF_GENERIC_MEMORY_SEGMENT+previous->capacity);++ ret->capacity=NUMBER_OF_BYTES_IN_INCREMENTATION_OF_GENERIC_MEMORY_SEGMENT+previous->capacity;+ ret->size=0;+ ret->previous=previous;+ }++ return ret;+ }+ struct Memory_Segment* resize_memory_segment(size_t new_capacity,struct Memory_Segment *to_be_resized)+ {+ struct Memory_Segment *ret;++ wonky_assert(to_be_resized!=NULL && to_be_resized->capacity<=new_capacity);++ ret=realloc(to_be_resized->data,new_capacity);+ ret->capacity=new_capacity;++ return ret;+ }+ struct Memory_Segment* calloc_memory_segment(struct Memory_Segment *previous,size_t increment_size,size_t element_size)+ {+ struct Memory_Segment *ret;+ if(previous==NULL)+ {+ ret=malloc(sizeof(struct Memory_Segment));+ ret->data=calloc(element_size,increment_size);++ ret->capacity=increment_size;+ ret->size=0;+ ret->previous=NULL;+ }else+ {+ ret=malloc(sizeof(struct Memory_Segment));+ ret->data=calloc(element_size,increment_size+previous->capacity);++ ret->capacity=increment_size+previous->capacity;+ ret->size=0;+ ret->previous=previous;+ }++ return ret;+ }+ #endifF diff --git a/src/misc/wonky_malloc.h b/src/misc/wonky_malloc.h new file mode 100644 --- /dev/null +++ b/src/misc/wonky_malloc.h+ #ifndef WONKY_MALLOC_H+ #define WONKY_MALLOC_H WONKY_MALLOC_H+ #include <wonky_malloc.hh>++ #include <program.h>+ #include <map.h>+ #include <lexer.h>++ #include <stdlib.h>++ #define NUMBER_OF_MAP_NODES_IN_INCREMENTATION_OF_MAP_MEMORY_SEGMENT 1024+ #define NUMBER_OF_TOKENS_IN_INCREMENTATION_OF_TOKEN_MEMORY_SEGMENT 1024+ #define NUMBER_OF_BYTES_IN_INCREMENTATION_OF_GENERIC_MEMORY_SEGMENT 1024++ /*+ if the memory requested in a wonky_malloc can't fit in the current segment+ then if it overflows by 1/REALLOC_TRIGGER of the capacity of the segment,+ then the segment is realloced+ */+ #define REALLOC_TRIGGER 2++ struct Memory_Segment+ {+ size_t capacity;+ size_t size;+ struct Memory_Segment *previous;+ unsigned char *data;+ };+ struct Memory+ {+ struct Memory_Segment *map_nodes;+ struct Memory_Segment *tokens;+ struct Memory_Segment *generic;+ };++ struct Memory* get_memory();+ void delete_memory(struct Memory *mem);+ void delete_memory_segment(struct Memory_Segment *segment);++ void* wonky_malloc(size_t size,struct Memory *mem);+ struct Map* wonky_malloc_map_node(struct Memory *mem);+ struct token* wonky_malloc_token(struct Memory *mem);++ struct Memory_Segment* get_memory_segment(struct Memory_Segment *previous);+ struct Memory_Segment* resize_memory_segment(size_t new_capacity,struct Memory_Segment *to_be_resized);+ struct Memory_Segment* calloc_memory_segment(struct Memory_Segment *previous,size_t increment_size,size_t element_size);++ #define wonky_free(x)+ #define wonky_free_token(x)+ #define wonky_free_map_node(x)++ #endifF diff --git a/src/misc/wonky_malloc.hh b/src/misc/wonky_malloc.hh new file mode 100644 --- /dev/null +++ b/src/misc/wonky_malloc.hh+ #ifndef WONKY_MALLOC_HH+ #define WONKY_MALLOC_HH WONKY_MALLOC_HH++ struct Memory_Segment;+ struct Memory;++ #endifF diff --git a/src/semantics/ast.c b/src/semantics/ast.c --- a/src/semantics/ast.c +++ b/src/semantics/ast.cif(expression_type->specifier==TS_ARRAY){array_type=(struct Type_Array*)expression_type;- expression_type=get_pointer_type(array_type->is_array_of,1,0);+ expression_type=get_pointer_type(array_type->is_array_of,1,0,translation_data);wonky_assert(expression_type!=NULL);ret->operand=operand;operand_type=extract_expresion_value_type(operand->value,translation_data);- ret->value=get_expression_value_rvalue(get_temp_object(get_pointer_type(operand_type,0,0)));+ ret->value=get_expression_value_rvalue(get_temp_object(get_pointer_type(operand_type,0,0,translation_data)));return ret;}elseF diff --git a/src/semantics/constraints/linkage_constraints.c b/src/semantics/constraints/linkage_constraints.c --- a/src/semantics/constraints/linkage_constraints.c +++ b/src/semantics/constraints/linkage_constraints.c{struct AST_Object_Declaration *hold_object;linkage=(denoted_object->linkage==LINKAGE_EXTERNAL?translation_data->external_linkage:translation_data->internal_linkage);- hold_object=check_and_push_id(denoted_object,linkage->ids,denoted_object->id);+ hold_object=check_and_push_id(denoted_object,linkage->ids,denoted_object->id,translation_data);if(hold_object!=NULL)}else if(denoted_function->linkage==LINKAGE_EXTERNAL || denoted_function->linkage==LINKAGE_INTERNAL){linkage=(denoted_function->linkage==LINKAGE_EXTERNAL?translation_data->external_linkage:translation_data->internal_linkage);- function_tree=check_and_push_id(denoted_function,linkage->ids,denoted_function->id);+ function_tree=check_and_push_id(denoted_function,linkage->ids,denoted_function->id,translation_data);if(function_tree!=NULL){F diff --git a/src/semantics/identifiers/denoted.h b/src/semantics/identifiers/denoted.h --- a/src/semantics/identifiers/denoted.h +++ b/src/semantics/identifiers/denoted.h#ifndef WONKY_DENOTED_H#define WONKY_DENOTED_H WONKY_DENOTED_H#include <denoted.hh>++ #include <map.h>+ #include <lexer.h>#include <type.h>#include <scope.h>#include <evaluation.h>#include <linkage.h>#include <object.h>#include <common.h>+ #include <location.h>struct Denoted{F diff --git a/src/semantics/identifiers/linkage.c b/src/semantics/identifiers/linkage.c --- a/src/semantics/identifiers/linkage.c +++ b/src/semantics/identifiers/linkage.cif(possible_declaration==NULL){if(object->object->linkage==LINKAGE_EXTERNAL)- Map_Push(translation_data->external_linkage->ids,object->object->id->data,object->object->id->data_size,object);+ Map_Push(translation_data->external_linkage->ids,object->object->id->data,object->object->id->data_size,object,translation_data->memory);else if(object->object->linkage==LINKAGE_INTERNAL)- Map_Push(translation_data->internal_linkage->ids,object->object->id->data,object->object->id->data_size,object);+ Map_Push(translation_data->internal_linkage->ids,object->object->id->data,object->object->id->data_size,object,translation_data->memory);}else{if(object->initializer!=NULL && possible_declaration->initializer!=NULL)possible_declaration=Map_Check(translation_data->external_linkage->ids,function->function->id->data,function->function->id->data_size);if(function->function->linkage==LINKAGE_EXTERNAL)- Map_Push(translation_data->external_linkage->ids,function->function->id->data,function->function->id->data_size,function);+ Map_Push(translation_data->external_linkage->ids,function->function->id->data,function->function->id->data_size,function,translation_data->memory);else- Map_Push(translation_data->internal_linkage->ids,function->function->id->data,function->function->id->data_size,function);+ Map_Push(translation_data->internal_linkage->ids,function->function->id->data,function->function->id->data_size,function,translation_data->memory);if(possible_declaration!=NULL){if(possible_definition==NULL){if(function->function->linkage==LINKAGE_EXTERNAL)- Map_Push(translation_data->external_linkage->ids,function->function->id->data,function->function->id->data_size,function);+ Map_Push(translation_data->external_linkage->ids,function->function->id->data,function->function->id->data_size,function,translation_data->memory);else- Map_Push(translation_data->internal_linkage->ids,function->function->id->data,function->function->id->data_size,function);+ Map_Push(translation_data->internal_linkage->ids,function->function->id->data,function->function->id->data_size,function,translation_data->memory);}}#endifF diff --git a/src/semantics/identifiers/linkage.h b/src/semantics/identifiers/linkage.h --- a/src/semantics/identifiers/linkage.h +++ b/src/semantics/identifiers/linkage.h#include <map.h>#include <denoted.h>#include <common.h>+ #include <scope.h>enum Linkage_Type;F diff --git a/src/semantics/identifiers/scope.c b/src/semantics/identifiers/scope.c --- a/src/semantics/identifiers/scope.c +++ b/src/semantics/identifiers/scope.cret=malloc(sizeof(struct Normal_Scope));ret->type=type;+ ret->tags=malloc(sizeof(struct Map));+ ret->ordinary=malloc(sizeof(struct Map));wonky_assert((type!=FILE_SCOPE) || parent==NULL);ret->parent=parent;- Map_Init(&ret->tags);--- Map_Init(&ret->ordinary);+ Map_Init(ret->tags);+ Map_Init(ret->ordinary);ret->type=FUNCTION_SCOPE;ret->parent=parent;ret->function=function;+ ret->labels=malloc(sizeof(struct Map));- Map_Init(&ret->labels);+ Map_Init(ret->labels);ret->label_order=malloc(sizeof(struct Queue));Queue_Init(ret->label_order);void delete_normal_scope(struct Normal_Scope *scope){- Map_Map(&scope->tags,delete_denoted_wrapper);- Map_Destroy(&scope->tags);- Map_Map(&scope->ordinary,delete_denoted_with_no_linkage_wrapper);- Map_Destroy(&scope->ordinary);+ Map_Map(scope->tags,delete_denoted_wrapper);+ Map_Destroy(scope->tags);+ Map_Map(scope->ordinary,delete_denoted_with_no_linkage_wrapper);+ Map_Destroy(scope->ordinary);while(scope->object_order->size>0)Queue_Pop(scope->object_order);free(scope->object_order);void delete_function_scope(struct Function_Scope *scope){- Map_Map(&scope->labels,delete_denoted_wrapper);- Map_Destroy(&scope->labels);+ Map_Map(scope->labels,delete_denoted_wrapper);+ Map_Destroy(scope->labels);while(scope->label_order->size>0)Queue_Pop(scope->label_order);free(scope->label_order);function_scope=get_enclosing_function_scope(current);if(function_scope!=NULL)- hold=Map_Check(&function_scope->labels,id->data,id->data_size);+ hold=Map_Check(function_scope->labels,id->data,id->data_size);return hold;}case FILE_SCOPE:case BLOCK_SCOPE:case FUNCTION_PROTOTYPE_SCOPE:- hold=Map_Check(&((struct Normal_Scope*)current)->tags,id->data,id->data_size);+ hold=Map_Check(((struct Normal_Scope*)current)->tags,id->data,id->data_size);}current=current->parent;case FILE_SCOPE:case BLOCK_SCOPE:case FUNCTION_PROTOTYPE_SCOPE:- hold=Map_Check(&((struct Normal_Scope*)current)->ordinary,id->data,id->data_size);+ hold=Map_Check(((struct Normal_Scope*)current)->ordinary,id->data,id->data_size);}current=current->parent;void* check_struct_union_member(struct Normal_Scope *inner,struct token *id){- return Map_Check(&inner->ordinary,id->data,id->data_size);+ return Map_Check(inner->ordinary,id->data,id->data_size);}void Scope_Push(struct Scope *scope,struct Denoted *declarator,struct Translation_Data *translation_data){current_function_scope=get_enclosing_function_scope(current);- hold_statement=(struct Denoted_Statement*)Map_Check(¤t_function_scope->labels,label->data,label->data_size);+ hold_statement=(struct Denoted_Statement*)Map_Check(current_function_scope->labels,label->data,label->data_size);if(hold_statement!=NULL){{hold_statement=(struct Denoted_Statement*)get_denoted_statement(label,statement,get_last_known_denoted_object((struct Normal_Scope*)current));- Map_Push(¤t_function_scope->labels,label->data,label->data_size,hold_statement);+ Map_Push(current_function_scope->labels,label->data,label->data_size,hold_statement,translation_data->memory);Queue_Push(current_function_scope->label_order,hold_statement);- hold_previous=check_and_push_id(denoted_object,&AS_NORMAL_SCOPE(current)->ordinary,denoted_object->id);+ hold_previous=check_and_push_id(denoted_object,AS_NORMAL_SCOPE(current)->ordinary,denoted_object->id,translation_data);if(has_new_errors(translation_data) || !constraint_check_object_linkage(denoted_object,hold_previous,current,translation_data) ){- hold_previous=check_and_push_id(denoted_function,&AS_NORMAL_SCOPE(current)->ordinary,denoted_function->id);+ hold_previous=check_and_push_id(denoted_function,AS_NORMAL_SCOPE(current)->ordinary,denoted_function->id,translation_data);if(has_new_errors(translation_data) || !constraint_check_function_linkage(denoted_function,hold_previous,current,translation_data)){translation_data->number_of_errors_when_last_checked--;}}- #define CHECK_AND_PUSH(thing,scope) Map_Check_And_Push(scope,thing->id->data,thing->id->data_size,thing)+ #define CHECK_AND_PUSH(thing,scope) Map_Check_And_Push(scope,thing->id->data,thing->id->data_size,thing,translation_data->memory)void push_typedef(struct Scope *current,struct Translation_Data *translation_data,struct Denoted_Type *denoted_typedef){struct Denoted *hold_denotated;- hold_denotated=CHECK_AND_PUSH(denoted_typedef,&AS_NORMAL_SCOPE(current)->ordinary);+ hold_denotated=CHECK_AND_PUSH(denoted_typedef,AS_NORMAL_SCOPE(current)->ordinary);if(hold_denotated){delete_denoted_typedef(denoted_typedef);void push_denoted_enum_tag(struct Scope *current,struct Translation_Data *translation_data,struct Denoted_Enum *denoted_enum){struct Denoted *hold_denotated;- hold_denotated=Map_Check_And_Push(&AS_NORMAL_SCOPE(current)->tags,denoted_enum->enumeration->id->data,denoted_enum->enumeration->id->data_size,denoted_enum);+ hold_denotated=Map_Check_And_Push(AS_NORMAL_SCOPE(current)->tags,denoted_enum->enumeration->id->data,denoted_enum->enumeration->id->data_size,denoted_enum,translation_data->memory);if(hold_denotated){delete_denoted_enum(denoted_enum);void push_denoted_enum_constant(struct Scope *current,struct Translation_Data *translation_data,struct Denoted_Enum_Const *denoted_enum_constant){struct Denoted *hold_denotated;- hold_denotated=CHECK_AND_PUSH(denoted_enum_constant,&AS_NORMAL_SCOPE(current)->ordinary);+ hold_denotated=CHECK_AND_PUSH(denoted_enum_constant,AS_NORMAL_SCOPE(current)->ordinary);if(hold_denotated){delete_denoted_enum_constant(denoted_enum_constant);void push_denoted_struct_union_tag(struct Scope *current,struct Translation_Data *translation_data,struct Denoted_Struct_Union *denoted_struct_union){struct Denoted *hold_denotated;- hold_denotated=Map_Check_And_Push(&AS_NORMAL_SCOPE(current)->tags,denoted_struct_union->struct_union->id->data,denoted_struct_union->struct_union->id->data_size,denoted_struct_union);+ hold_denotated=Map_Check_And_Push(AS_NORMAL_SCOPE(current)->tags,denoted_struct_union->struct_union->id->data,denoted_struct_union->struct_union->id->data_size,denoted_struct_union,translation_data->memory);if(hold_denotated){delete_denoted_struct_union(denoted_struct_union);push_translation_error("redefinition of tag",translation_data);}}- void* check_and_push_id(void *data,struct Map *scope_map,struct token *id)+ void* check_and_push_id(void *data,struct Map *scope_map,struct token *id,struct Translation_Data *translation_data){- return Map_Check_And_Push(scope_map,id->data,id->data_size,data);+ return Map_Check_And_Push(scope_map,id->data,id->data_size,data,translation_data->memory);}#endifF diff --git a/src/semantics/identifiers/scope.h b/src/semantics/identifiers/scope.h --- a/src/semantics/identifiers/scope.h +++ b/src/semantics/identifiers/scope.h#ifndef WONKY_SCOPE_H#define WONKY_SCOPE_H WONKY_SCOPE_H#include <scope.hh>+#include <map.h>#include <denoted.h>#include <location.h>enum Scope_Type type;struct Scope *parent;- Map tags;- Map ordinary;+ struct Map *tags;+ struct Map *ordinary;/*we need the object order for the unconditional jumps*/struct Queue *object_order; /*queue of denoted objects*/struct Scope *parent;struct Denoted_Function *function;- Map labels;+ struct Map *labels;/*here to ease checking of undeclared but used labels*/struct Queue *label_order; /*queue of denoted statements*/- void* check_and_push_id(void *data,struct Map *scope_map,struct token *id);+ void* check_and_push_id(void *data,struct Map *scope_map,struct token *id,struct Translation_Data *translation_data);_Bool check_if_typedefed(struct Scope* scope,struct token *id);#endifF diff --git a/src/semantics/program/program.c b/src/semantics/program/program.c --- a/src/semantics/program/program.c +++ b/src/semantics/program/program.cret->types=malloc(sizeof(struct Map));ret->functions_without_a_definition=malloc(sizeof(struct Queue));ret->external_objects_without_an_initialiser=malloc(sizeof(struct Queue));+ ret->memory=get_memory();ret->external_linkage=get_linkage();fclose(in);return src;}- struct Translation_Data* get_translation_data(struct Map *types,struct Linkage *internal_linkage,struct Linkage *external_linkage)+ struct Translation_Data* get_translation_data(struct Map *types,struct Linkage *internal_linkage,struct Linkage *external_linkage,struct Memory *program_memory){struct Translation_Data *ret;ret=malloc(sizeof(struct Translation_Data));ret->external_linkage=external_linkage;ret->internal_linkage=internal_linkage;+ ret->memory=program_memory;return ret;}}program=get_program();- hold_translation_data=get_translation_data(program->types,get_linkage(),program->external_linkage);+ hold_translation_data=get_translation_data(program->types,get_linkage(),program->external_linkage,program->memory);do{base_file=get_source_file(*base_source_names,this_directory);F diff --git a/src/semantics/program/program.h b/src/semantics/program/program.h --- a/src/semantics/program/program.h +++ b/src/semantics/program/program.h#ifndef WONKY_PROGRAM_H#define WONKY_PROGRAM_H WONKY_PROGRAM_H--#include <program.hh>+#include <queue.h>+ #include <map.h>+ #include <linkage.h>+#include <scope.h>#include <lexer.h>#include <gcc_string.h>#include <parse_translation_unit.h>#include <common.h>#include <ast.h>+ #include <wonky_malloc.h>struct Program/*ASTs*/struct Queue *functions_without_a_definition;struct Queue *external_objects_without_an_initialiser;++ struct Memory *memory;};struct Translation_Data{struct Map *types;struct Linkage *external_linkage;struct Linkage *internal_linkage;+ struct Memory *memory;/*end of passed from program struct*/+};struct Program* get_program();struct Source_File* get_source_file(char *filename,char **where_to_search);void normalise_source_name(struct Source_Name *name);- struct Translation_Data* get_translation_data(struct Map *types,struct Linkage *internal_linkage,struct Linkage *external_linkage);+ struct Translation_Data* get_translation_data(struct Map *types,struct Linkage *internal_linkage,struct Linkage *external_linkage,struct Memory *program_memory);struct Program* parse_program(char **base_source_names);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- struct Type* type_check_and_push(struct Type *type,struct Map *base,size_t struct_size)+ struct Type* type_check_and_push(struct Type *type,struct Map *base,size_t struct_size,struct Translation_Data *translation_data){struct Map *hold_node;hold_node=Map_Check_And_Get(base,type,struct_size);if(hold_node==NULL){- type->node=Map_Push_And_Get(base,type,struct_size,type);+ type->node=Map_Push_And_Get(base,type,struct_size,type,translation_data->memory);return type;}else{}}- struct Type* get_type_error(struct Type *type)+ struct Type* get_type_error(struct Type *type,struct Translation_Data *translation_data){struct Type_Error *ret;ret->specifier=TS_ERROR;ret->error=type;if(type!=NULL)- ret=(struct Type_Error*)type_check_and_push((struct Type*)ret,type->node,sizeof(struct Type_Error));+ ret=(struct Type_Error*)type_check_and_push((struct Type*)ret,type->node,sizeof(struct Type_Error),translation_data);wonky_assert(is_valid_type_error(ret));return (struct Type*)ret;}- struct Type* get_struct_union_type(struct Denotation_Prototype *prototype)+ struct Type* get_struct_union_type(struct Denotation_Prototype *prototype,struct Translation_Data *translation_data){struct Type_Struct_Union *ret;ret->is_const=prototype->is_const;ret->is_volatile=prototype->is_volatile;- ret=(struct Type_Struct_Union*)type_check_and_push((struct Type*)ret,prototype->node,sizeof(struct Type_Struct_Union));+ ret=(struct Type_Struct_Union*)type_check_and_push((struct Type*)ret,prototype->node,sizeof(struct Type_Struct_Union),translation_data);if(prototype->constraint!=TC_NONE || prototype->sign!=TSIGN_NONE || (prototype->specifier!=TS_UNION && prototype->specifier!=TS_STRUCT)){- return get_type_error((struct Type*)ret);+ return get_type_error((struct Type*)ret,translation_data);}else{wonky_assert(is_valid_type_struct(ret) || is_valid_type_union(ret));return ret;}- struct Type* get_basic_type(struct Denotation_Prototype *prototype)+ struct Type* get_basic_type(struct Denotation_Prototype *prototype,struct Translation_Data *translation_data){struct Type_Basic *ret;ret=calloc(1,sizeof(struct Type_Basic));}- ret=(struct Type_Basic*)type_check_and_push((struct Type*)ret,prototype->node,sizeof(struct Type_Basic));+ ret=(struct Type_Basic*)type_check_and_push((struct Type*)ret,prototype->node,sizeof(struct Type_Basic),translation_data);switch(ret->specifier){|| prototype->constraint==TC_SHORT|| prototype->sign!=TSIGN_NONE){- return get_type_error((struct Type*)ret);+ return get_type_error((struct Type*)ret,translation_data);}break;case TS_CHAR:if(prototype->constraint!=TC_NONE){- return get_type_error((struct Type*)ret);+ return get_type_error((struct Type*)ret,translation_data);}break;case TS_INT:default:if(prototype->constraint!=TC_NONE || prototype->sign!=TSIGN_NONE){- return get_type_error((struct Type*)ret);+ return get_type_error((struct Type*)ret,translation_data);}}return (struct Type*)ret;}- struct Type* get_pointer_type(struct Type *points_to,_Bool is_const,_Bool is_volatile)+ struct Type* get_pointer_type(struct Type *points_to,_Bool is_const,_Bool is_volatile,struct Translation_Data *translation_data){struct Type_Pointer *ret;ret=calloc(1,sizeof(struct Type_Pointer));ret->is_const=is_const;ret->is_volatile=is_volatile;- ret=(struct Type_Pointer*)type_check_and_push((struct Type*)ret,points_to->node,sizeof(struct Type_Pointer));+ ret=(struct Type_Pointer*)type_check_and_push((struct Type*)ret,points_to->node,sizeof(struct Type_Pointer),translation_data);wonky_assert(is_valid_type_pointer(ret));return (struct Type*)ret;ret->number_of_elements=0;}ret->is_array_of=array_of;- ret=(struct Type_Array*)type_check_and_push((struct Type*)ret,array_of->node,sizeof(struct Type_Array));+ ret=(struct Type_Array*)type_check_and_push((struct Type*)ret,array_of->node,sizeof(struct Type_Array),translation_data);wonky_assert(is_valid_type_array(ret));return (struct Type*)ret;ret->specifier=TS_ARRAY;ret->size=size;ret->is_array_of=array_of;- ret=(struct Type_Array*)type_check_and_push((struct Type*)ret,array_of->node,sizeof(struct Type_Array));+ ret=(struct Type_Array*)type_check_and_push((struct Type*)ret,array_of->node,sizeof(struct Type_Array),translation_data);wonky_assert(is_valid_type_array(ret));return (struct Type*)ret;}- struct Type* get_enum_type(struct Denotation_Prototype *prototype)+ struct Type* get_enum_type(struct Denotation_Prototype *prototype,struct Translation_Data *translation_data){struct Type_Enum *ret;ret->is_const=prototype->is_const;ret->is_volatile=prototype->is_volatile;- ret=(struct Type_Enum*)type_check_and_push((struct Type*)ret,prototype->node,sizeof(struct Type_Enum));+ ret=(struct Type_Enum*)type_check_and_push((struct Type*)ret,prototype->node,sizeof(struct Type_Enum),translation_data);if(prototype->sign!=TSIGN_NONE || prototype->constraint!=TC_NONE){- return get_type_error((struct Type*)ret);+ return get_type_error((struct Type*)ret,translation_data);}wonky_assert(is_valid_type_enum(ret));ret->arguments[i]=(struct Denoted_Object*)Queue_Pop(parameters);}free(parameters);- ret=(struct Type_Function*)type_check_and_push((struct Type*)ret,return_type->node,sizeof(struct Type_Function));+ ret=(struct Type_Function*)type_check_and_push((struct Type*)ret,return_type->node,sizeof(struct Type_Function),translation_data);if(is_variadic && ret->number_of_arguments==0){push_translation_error("variadic function needs atleast one named argument",translation_data);- return (struct Type*)get_type_error((struct Type*)ret);+ return (struct Type*)get_type_error((struct Type*)ret,translation_data);}wonky_assert(is_valid_type_function(ret));ret->constraint=constraint;ret->sign=sign;- ret=(struct Type_Basic*)type_check_and_push((struct Type*)ret,translation_data->types,sizeof(struct Type_Basic));+ ret=(struct Type_Basic*)type_check_and_push((struct Type*)ret,translation_data->types,sizeof(struct Type_Basic),translation_data);wonky_assert(is_valid_type_basic(ret));return ret;case TS_DOUBLE:prototype->specifier=type->specifier;- hold_unqualified_type=get_basic_type(prototype);+ hold_unqualified_type=get_basic_type(prototype,translation_data);break;case TS_STRUCT:case TS_UNION:prototype->specifier=type->specifier;prototype->struct_union=((struct Type_Struct_Union*)type)->struct_union;- hold_unqualified_type=get_struct_union_type(prototype);+ hold_unqualified_type=get_struct_union_type(prototype,translation_data);break;case TS_ENUM:prototype->specifier=TS_ENUM;prototype->enumerator=((struct Type_Enum*)type)->enumeration;- hold_unqualified_type=get_enum_type(prototype);+ hold_unqualified_type=get_enum_type(prototype,translation_data);break;case TS_POINTER:- hold_unqualified_type=get_pointer_type(((struct Type_Pointer*)type)->points_to,0,0);+ hold_unqualified_type=get_pointer_type(((struct Type_Pointer*)type)->points_to,0,0,translation_data);break;case TS_ARRAY:hold_unqualified_type=type;F diff --git a/src/semantics/value/type.h b/src/semantics/value/type.h --- a/src/semantics/value/type.h +++ b/src/semantics/value/type.h#ifndef WONKY_TYPE_H#define WONKY_TYPE_H WONKY_TYPE_H#include <type.hh>+#include <denoted.h>#include <scope.h>#include <limits.h>- struct Type* type_check_and_push(struct Type *type,struct Map *base,size_t struct_size);+ struct Type* type_check_and_push(struct Type *type,struct Map *base,size_t struct_size,struct Translation_Data *translation_data);- struct Type* get_type_error(struct Type *type);- struct Type* get_struct_union_type(struct Denotation_Prototype *prototype);+ struct Type* get_type_error(struct Type *type,struct Translation_Data *translation_data);+ struct Type* get_struct_union_type(struct Denotation_Prototype *prototype,struct Translation_Data *translation_data);struct Struct_Union* get_struct_union_base(struct Scope *scope ,enum Type_Specifier struct_or_union,struct token *id);struct Enum *get_enum_base(struct token *id);- struct Type* get_basic_type(struct Denotation_Prototype *prototype);- struct Type* get_pointer_type(struct Type *points_to,_Bool is_const,_Bool is_volatile);+ struct Type* get_basic_type(struct Denotation_Prototype *prototype,struct Translation_Data *translation_data);+ struct Type* get_pointer_type(struct Type *points_to,_Bool is_const,_Bool is_volatile,struct Translation_Data *translation_data);struct Type* get_array_type(struct Type *array_of,struct AST* number_of_elements,struct Translation_Data *translation_data);struct Type* get_array_type_raw(struct Type *array_of,size_t size,struct Translation_Data *translation_data);- struct Type* get_enum_type(struct Denotation_Prototype *prototype);+ struct Type* get_enum_type(struct Denotation_Prototype *prototype,struct Translation_Data *translation_data);struct Type* get_function_type(struct Type *return_type,struct Queue *parameters,struct Normal_Scope* function_prototype_scope,_Bool is_variadic,struct Translation_Data *translation_data);