diff -r b08167f156a1 -r 268bf4ca5fa1 stage4/generate_c/generate_c_vardecl.cc --- a/stage4/generate_c/generate_c_vardecl.cc Thu Jan 03 17:04:04 2013 +0000 +++ b/stage4/generate_c/generate_c_vardecl.cc Thu Jan 03 18:23:07 2013 +0000 @@ -26,31 +26,31 @@ class initialization_analyzer_c: public null_visitor_c { public: - typedef enum { - simple_it, - array_it, - struct_it - } initialization_type_t; + typedef enum { + simple_it, + array_it, + struct_it + } initialization_type_t; private: - initialization_type_t current_type; + initialization_type_t current_type; public: - initialization_analyzer_c(symbol_c* symbol) { - current_type = simple_it; + initialization_analyzer_c(symbol_c* symbol) { + current_type = simple_it; symbol->accept(*this); - } - ~initialization_analyzer_c(void) {} - - initialization_type_t get_initialization_type(void) { - return current_type; - } - - void *visit(array_initial_elements_list_c *symbol) { + } + ~initialization_analyzer_c(void) {} + + initialization_type_t get_initialization_type(void) { + return current_type; + } + + void *visit(array_initial_elements_list_c *symbol) { current_type = array_it; return NULL; - } + } void *visit(structure_element_initialization_list_c *symbol) { current_type = struct_it; @@ -94,6 +94,10 @@ array_specification->accept(*this); } + void set_array_default_initialisation(symbol_c *array_initialization) { + array_default_initialization = array_initialization; + } + void init_array(symbol_c *var1_list, symbol_c *array_specification, symbol_c *array_initialization) { int i; @@ -250,7 +254,7 @@ array_initial_elements_c *array_initial_element = dynamic_cast(symbol->elements[i]); if (array_initial_element != NULL) { - symbol->elements[i]->accept(*this); + symbol->elements[i]->accept(*this); } } current_initialization_count++; @@ -269,7 +273,7 @@ /* This code assumes that unsigned long long int is >= uint64_t */ if (std::numeric_limits< uint64_t >::max() > std::numeric_limits< unsigned long long int >::max()) - ERROR_MSG("Assertion (sizeof(uint64_t) > sizeof(unsigned long long int)) failed! Compiler cannot execute correctly on the current platform!"); + ERROR_MSG("Assertion (sizeof(uint64_t) > sizeof(unsigned long long int)) failed! Compiler cannot execute correctly on the current platform!"); switch (current_mode) { case initializationvalue_am: @@ -421,6 +425,7 @@ if (next_element == element_count) { current_element_default_value = spec_init_sperator_c::get_init(symbol->spec_init); current_element_type = spec_init_sperator_c::get_spec(symbol->spec_init); + if (current_element_type == NULL) ERROR; return symbol->structure_element_name; } /* not yet the desired element... */ @@ -500,6 +505,7 @@ private: symbol_c* structure_type_decl; symbol_c* current_element_type; + symbol_c* current_element_default_value; public: generate_c_structure_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {} @@ -508,6 +514,7 @@ void init_structure_default(symbol_c *structure_type_name) { structure_type_decl = NULL; current_element_type = NULL; + current_element_default_value = NULL; current_mode = initdefault_sm; structure_type_name->accept(*this); @@ -604,19 +611,21 @@ if (i > 1) s4o.print(","); + current_element_type = structure_iterator.element_type(); + if (current_element_type == NULL) ERROR; + + /* Check whether default value specified in structure declaration...*/ + current_element_default_value = structure_iterator.default_value(); + /* Get the value from an initialization */ symbol_c *element_value = structure_init_element_iterator.search(element_name); if (element_value == NULL) { /* No value given for parameter, so we must use the default... */ - /* First check whether default value specified in function declaration...*/ - element_value = structure_iterator.default_value(); - current_element_type = structure_iterator.element_type(); + element_value = current_element_default_value; } if (element_value == NULL) { - if (current_element_type == NULL) ERROR; - /* If not, get the default value of this variable's type */ element_value = type_initial_value_c::get(current_element_type); } @@ -644,6 +653,8 @@ void *visit(array_initial_elements_list_c *symbol) { generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); array_initialization->init_array_size(current_element_type); + if (current_element_default_value != NULL) + array_initialization->set_array_default_initialisation(current_element_default_value); array_initialization->init_array_values(symbol); delete array_initialization; return NULL; @@ -900,17 +911,17 @@ symbol_c *globalnamespace; void *print_retain(void) { - s4o.print(","); + s4o.print(","); switch (current_varqualifier) { - case retain_vq: + case retain_vq: s4o.print("1"); break; case non_retain_vq: s4o.print("0"); break; - default: - s4o.print("retain"); - break; + default: + s4o.print("retain"); + break; } return NULL; } @@ -932,32 +943,32 @@ for(int i = 0; i < list->n; i++) { s4o.print(s4o.indent_spaces); if (wanted_varformat == local_vf) { - if (!is_fb) { - s4o.print(DECLARE_VAR); - s4o.print("("); - } - this->current_var_type_symbol->accept(*this); - if (is_fb) - s4o.print(" "); - else - s4o.print(","); - print_variable_prefix(); + if (!is_fb) { + s4o.print(DECLARE_VAR); + s4o.print("("); + } + this->current_var_type_symbol->accept(*this); + if (is_fb) + s4o.print(" "); + else + s4o.print(","); + print_variable_prefix(); } else if (wanted_varformat == localinit_vf) { - this->current_var_type_symbol->accept(*this); + this->current_var_type_symbol->accept(*this); s4o.print(" "); print_variable_prefix(); } else if (wanted_varformat == init_vf) { - s4o.print(SET_VAR); - s4o.print("("); - print_variable_prefix(); - s4o.print(","); + s4o.print(SET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print(","); } list->elements[i]->accept(*this); if (wanted_varformat != local_vf) { - if (wanted_varformat == localinit_vf && - (current_vartype & inoutput_vt) != 0) { + if (wanted_varformat == localinit_vf && + (current_vartype & inoutput_vt) != 0) { s4o.print(";\n"); s4o.print(s4o.indent_spaces); s4o.print("if (__"); @@ -988,13 +999,13 @@ s4o.print(s4o.indent_spaces); s4o.print("}\n"); } - else if (wanted_varformat == init_vf) { - s4o.print(","); - this->current_var_init_symbol->accept(*this); - s4o.print(");\n"); - } - else { - if (this->current_var_init_symbol != NULL) { + else if (wanted_varformat == init_vf) { + s4o.print(","); + this->current_var_init_symbol->accept(*this); + s4o.print(");\n"); + } + else { + if (this->current_var_init_symbol != NULL) { s4o.print(" = "); this->current_var_init_symbol->accept(*this); } @@ -1002,7 +1013,7 @@ } } else if (is_fb) - s4o.print(";\n"); + s4o.print(";\n"); else s4o.print(")\n"); } @@ -1266,9 +1277,9 @@ (wanted_varformat == localinit_vf)) { s4o.print(s4o.indent_spaces); if (wanted_varformat == local_vf) { - s4o.print(DECLARE_VAR); - s4o.print("("); - symbol->type->accept(*this); + s4o.print(DECLARE_VAR); + s4o.print("("); + symbol->type->accept(*this); s4o.print(","); } else if (wanted_varformat == localinit_vf) { @@ -1278,7 +1289,7 @@ print_variable_prefix(); symbol->name->accept(*this); if (wanted_varformat == local_vf) - s4o.print(")\n"); + s4o.print(")\n"); else { s4o.print(" = "); symbol->value->accept(*this); @@ -1324,8 +1335,8 @@ (wanted_varformat == localinit_vf)) { s4o.print(s4o.indent_spaces); if (wanted_varformat == local_vf) { - s4o.print(DECLARE_VAR); - s4o.print("("); + s4o.print(DECLARE_VAR); + s4o.print("("); symbol->type->accept(*this); s4o.print(","); } @@ -1336,9 +1347,9 @@ print_variable_prefix(); symbol->name->accept(*this); if (wanted_varformat == local_vf) - s4o.print(")\n"); + s4o.print(")\n"); else - s4o.print(" = __BOOL_LITERAL(TRUE);\n"); + s4o.print(" = __BOOL_LITERAL(TRUE);\n"); } if (wanted_varformat == foutputassign_vf) { @@ -1569,10 +1580,10 @@ void *visit(array_initial_elements_list_c *symbol) { if (wanted_varformat == localinit_vf || wanted_varformat == constructorinit_vf) { - generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); - array_initialization->init_array_size(this->current_var_type_symbol); - array_initialization->init_array_values(this->current_var_init_symbol); - delete array_initialization; + generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); + array_initialization->init_array_size(this->current_var_type_symbol); + array_initialization->init_array_values(this->current_var_init_symbol); + delete array_initialization; } return NULL; } @@ -1614,7 +1625,7 @@ generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); structure_initialization->init_structure_default(this->current_var_type_symbol); structure_initialization->init_structure_values(this->current_var_init_symbol); - delete structure_initialization; + delete structure_initialization; } return NULL; } @@ -1729,15 +1740,15 @@ print_retain(); s4o.print(")\n"); if (this->current_var_init_symbol != NULL) { - s4o.print(s4o.indent_spaces); - s4o.print(INIT_LOCATED_VALUE); - s4o.print("("); - print_variable_prefix(); - if (symbol->variable_name != NULL) + s4o.print(s4o.indent_spaces); + s4o.print(INIT_LOCATED_VALUE); + s4o.print("("); + print_variable_prefix(); + if (symbol->variable_name != NULL) symbol->variable_name->accept(*this); else symbol->location->accept(*this); - s4o.print(","); + s4o.print(","); this->current_var_init_symbol->accept(*this); s4o.print(")"); } @@ -1837,13 +1848,17 @@ */ this->current_var_type_symbol = symbol->specification; this->current_var_init_symbol = NULL; + bool is_fb = type_is_fb(this->current_var_type_symbol); /* now to produce the c equivalent... */ switch (wanted_varformat) { case local_vf: case localinit_vf: s4o.print(s4o.indent_spaces); - s4o.print(DECLARE_EXTERNAL); + if (is_fb) + s4o.print(DECLARE_EXTERNAL_FB); + else + s4o.print(DECLARE_EXTERNAL); s4o.print("("); this->current_var_type_symbol->accept(*this); s4o.print(","); @@ -1853,7 +1868,10 @@ case constructorinit_vf: s4o.print(nv->get()); - s4o.print(INIT_EXTERNAL); + if (is_fb) + s4o.print(INIT_EXTERNAL_FB); + else + s4o.print(INIT_EXTERNAL); s4o.print("("); this->current_var_type_symbol->accept(*this); s4o.print(","); @@ -1982,50 +2000,50 @@ case constructorinit_vf: if (symbol->global_var_name != NULL) { - s4o.print(nv->get()); - s4o.print(INIT_GLOBAL_LOCATED); - s4o.print("("); - if (this->resource_name != NULL) { - this->resource_name->accept(*this); - } + s4o.print(nv->get()); + s4o.print(INIT_GLOBAL_LOCATED); + s4o.print("("); + if (this->resource_name != NULL) { + this->resource_name->accept(*this); + } s4o.print(","); symbol->global_var_name->accept(*this); - s4o.print(","); - symbol->location->accept(*this); + s4o.print(","); + symbol->location->accept(*this); print_retain(); - s4o.print(")"); + s4o.print(")"); } if (this->current_var_init_symbol != NULL) { - s4o.print(nv->get()); - s4o.print(INIT_GLOBAL); - s4o.print("("); - this->current_var_type_symbol->accept(*this); - s4o.print(","); - if (symbol->global_var_name != NULL) - symbol->global_var_name->accept(*this); - else - symbol->location->accept(*this); - s4o.print(","); - s4o.print(INITIAL_VALUE); - s4o.print("("); - this->current_var_init_symbol->accept(*this); - s4o.print(")"); - print_retain(); - s4o.print(")"); + s4o.print(nv->get()); + s4o.print(INIT_GLOBAL); + s4o.print("("); + this->current_var_type_symbol->accept(*this); + s4o.print(","); + if (symbol->global_var_name != NULL) + symbol->global_var_name->accept(*this); + else + symbol->location->accept(*this); + s4o.print(","); + s4o.print(INITIAL_VALUE); + s4o.print("("); + this->current_var_init_symbol->accept(*this); + s4o.print(")"); + print_retain(); + s4o.print(")"); } break; case globalprototype_vf: s4o.print(s4o.indent_spaces); s4o.print(DECLARE_GLOBAL_PROTOTYPE); - s4o.print("("); - this->current_var_type_symbol->accept(*this); - s4o.print(","); - if (symbol->global_var_name != NULL) - symbol->global_var_name->accept(*this); - else - symbol->location->accept(*this); - s4o.print(")\n"); + s4o.print("("); + this->current_var_type_symbol->accept(*this); + s4o.print(","); + if (symbol->global_var_name != NULL) + symbol->global_var_name->accept(*this); + else + symbol->location->accept(*this); + s4o.print(")\n"); break; default: @@ -2050,6 +2068,7 @@ void *visit(global_var_list_c *symbol) { TRACE("global_var_list_c"); list_c *list = dynamic_cast(symbol); + bool is_fb = type_is_fb(this->current_var_type_symbol); /* should NEVER EVER occur!! */ if (list == NULL) ERROR; @@ -2058,9 +2077,12 @@ case local_vf: case localinit_vf: for(int i = 0; i < list->n; i++) { - s4o.print(s4o.indent_spaces); - s4o.print(DECLARE_GLOBAL); - s4o.print("("); + s4o.print(s4o.indent_spaces); + if (is_fb) + s4o.print(DECLARE_GLOBAL_FB); + else + s4o.print(DECLARE_GLOBAL); + s4o.print("("); this->current_var_type_symbol->accept(*this); s4o.print(","); if(this->resource_name != NULL) @@ -2072,27 +2094,32 @@ break; case constructorinit_vf: - if (this->current_var_init_symbol != NULL) { + if (this->current_var_init_symbol != NULL || is_fb) { for(int i = 0; i < list->n; i++) { s4o.print(nv->get()); - s4o.print(INIT_GLOBAL); + if (is_fb) + s4o.print(INIT_GLOBAL_FB); + else + s4o.print(INIT_GLOBAL); s4o.print("("); this->current_var_type_symbol->accept(*this); s4o.print(","); list->elements[i]->accept(*this); - s4o.print(","); - s4o.print(INITIAL_VALUE); - s4o.print("("); - this->current_var_init_symbol->accept(*this); - s4o.print(")"); + if (this->current_var_init_symbol != NULL) { + s4o.print(","); + s4o.print(INITIAL_VALUE); + s4o.print("("); + this->current_var_init_symbol->accept(*this); + s4o.print(")"); + } print_retain(); s4o.print(")"); #if 0 - /* The following code would be for globalinit_vf !! - * But it is not currently required... - */ - s4o.print(s4o.indent_spaces + "__ext_element_c<"); + /* The following code would be for globalinit_vf !! + * But it is not currently required... + */ + s4o.print(s4o.indent_spaces + "__ext_element_c<"); this->current_var_type_symbol->accept(*this); s4o.print("> "); if (this->globalnamespace != NULL) { @@ -2108,7 +2135,7 @@ s4o.print(">("); this->current_var_init_symbol->accept(*this); s4o.print(")"); - } + } s4o.print(";\n"); #endif } @@ -2515,19 +2542,19 @@ case function_param_iterator_c::direction_extref: #if 0 if (param_value == NULL) - /* This is illegal in ST and IL languages. - * All variables declared in a VAR_EXTERNAL __must__ - * be initialised to reference a specific VAR_GLOBAL variable!! - * - * The semantic checker should have caught this, we check again just the - * same (especially since the semantic checker has not yet been written!). - */ - ERROR; + /* This is illegal in ST and IL languages. + * All variables declared in a VAR_EXTERNAL __must__ + * be initialised to reference a specific VAR_GLOBAL variable!! + * + * The semantic checker should have caught this, we check again just the + * same (especially since the semantic checker has not yet been written!). + */ + ERROR; s4o.print(nv->get()); s4o.print("&"); param_value->accept(*this); #endif - break; + break; } /* switch */ } /* for(...) */