--- a/stage4/generate_c/generate_c.cc Thu Sep 14 10:50:41 2017 +0100
+++ b/stage4/generate_c/generate_c.cc Fri Apr 20 17:38:09 2018 +0100
@@ -2148,6 +2148,15 @@
s4o.print("_restore__" "(void **buffer, int *maxsize);\n");
return NULL;
}
+
+
+ void *visit(single_resource_declaration_c *symbol) {
+ /* __Must__ not insert any code! */
+ /* sinlge resources will not create a specific function for the resource */
+ /* backup and restore opertions will be inserted together with the configuration! */
+ return NULL;
+ }
+
};
@@ -2194,6 +2203,116 @@
}
+
+
+
+/* generate the backup/restore function for a RESOURCE */
+/* the backup/restore function generated here will be called by the backup/restore
+ * function generated for the configuration in which the resource is embedded
+ */
+class generate_c_backup_resource_c: public generate_c_base_and_typeid_c {
+ public:
+ const char *operation;
+
+ generate_c_backup_resource_c(stage4out_c *s4o_ptr)
+ : generate_c_base_and_typeid_c(s4o_ptr) {
+ operation = NULL;
+ };
+
+
+ virtual ~generate_c_backup_resource_c(void) {}
+
+
+private:
+ void print_forward_declarations(void) {
+ s4o.print("\n\n\n");
+
+ s4o.print("void ");
+ s4o.print("_backup__");
+ s4o.print("(void *varptr, int varsize, void **buffer, int *maxsize);\n");
+ s4o.print("void ");
+ s4o.print("_restore__");
+ s4o.print("(void *varptr, int varsize, void **buffer, int *maxsize);\n");
+
+ s4o.print("\n\n\n");
+ s4o.print("#undef " DECLARE_GLOBAL "\n");
+ s4o.print("#undef " DECLARE_GLOBAL_FB "\n");
+ s4o.print("#undef " DECLARE_GLOBAL_LOCATION "\n");
+ s4o.print("#undef " DECLARE_GLOBAL_LOCATED "\n");
+ }
+
+ public:
+ /********************/
+ /* 2.1.6 - Pragmas */
+ /********************/
+ void *visit(enable_code_generation_pragma_c * symbol) {s4o.enable_output(); return NULL;}
+ void *visit(disable_code_generation_pragma_c * symbol) {s4o.disable_output();return NULL;}
+
+
+ /********************************/
+ /* B 1.7 Configuration elements */
+ /********************************/
+ void *visit(resource_declaration_c *symbol) {
+ char *resource_name = strdup(symbol->resource_name->token->value);
+ /* convert to upper case */
+ for (char *c = resource_name; *c != '\0'; *c = toupper(*c), c++);
+
+ generate_c_vardecl_c vardecl = generate_c_vardecl_c(&s4o,
+ generate_c_vardecl_c::local_vf,
+ generate_c_vardecl_c::global_vt,
+ symbol->resource_name);
+
+ print_forward_declarations();
+
+ print_backup_restore_function_beg(s4o, resource_name, "_backup__");
+ if (symbol->global_var_declarations != NULL)
+ vardecl.print(symbol->global_var_declarations);
+ if (symbol->resource_declaration != NULL) {
+ operation = "_backup__";
+ symbol->resource_declaration->accept(*this); // will call visit(single_resource_declaration_c *)
+ operation = NULL;
+ }
+ print_backup_restore_function_end(s4o);
+
+ print_backup_restore_function_beg(s4o, resource_name, "_restore__");
+ if (symbol->global_var_declarations != NULL)
+ vardecl.print(symbol->global_var_declarations);
+ if (symbol->resource_declaration != NULL) {
+ operation = "_restore__";
+ symbol->resource_declaration->accept(*this); // will call visit(single_resource_declaration_c *)
+ operation = NULL;
+ }
+ print_backup_restore_function_end(s4o);
+
+ return NULL;
+ }
+
+ void *visit(single_resource_declaration_c *symbol) {
+ /* Must store the declared/instatiated PROGRAMS */
+ if (symbol->program_configuration_list != NULL)
+ symbol->program_configuration_list->accept(*this);
+ return NULL;
+ }
+
+ /* PROGRAM [RETAIN | NON_RETAIN] program_name [WITH task_name] ':' program_type_name ['(' prog_conf_elements ')'] */
+ // SYM_REF5(program_configuration_c, retain_option, program_name, task_name, program_type_name, prog_conf_elements)
+ void *visit(program_configuration_c *symbol) {
+ // generate the following source code:
+ // _xxxxxx__(&program_name, sizeof(program_name), buffer, maxsize);
+ s4o.print(s4o.indent_spaces);
+ s4o.print(operation); // call _restore__() or _backup__()
+ s4o.print("(&");
+ symbol->program_name->accept(*this);
+ s4o.print(", sizeof(");
+ symbol->program_name->accept(*this);
+ s4o.print("), buffer, maxsize);\n");
+ return NULL;
+ }
+
+
+};
+
+
/* generate the backup/restore function for a CONFIGURATION */
/* the generated function will backup/restore the global variables declared in the
* configuration, and call the backup/restore functions of each embedded resource to do
@@ -2264,7 +2383,7 @@
vardecl.print(symbol);
s4o.print("\n");
func_to_call = "_backup__";
- symbol->resource_declarations->accept(*this);
+ symbol->resource_declarations->accept(*this); // will call resource_declaration_list_c or single_resource_declaration_c
func_to_call = NULL;
print_backup_restore_function_end(s4o);
@@ -2272,7 +2391,7 @@
vardecl.print(symbol);
s4o.print("\n");
func_to_call = "_restore__";
- symbol->resource_declarations->accept(*this);
+ symbol->resource_declarations->accept(*this); // will call resource_declaration_list_c or single_resource_declaration_c
func_to_call = NULL;
print_backup_restore_function_end(s4o);
@@ -2280,8 +2399,6 @@
}
void *visit(resource_declaration_c *symbol) {
- if (symbol->global_var_declarations == NULL)
- return NULL;
s4o.print(s4o.indent_spaces);
symbol->resource_name->accept(*this);
s4o.print(func_to_call);
@@ -2290,7 +2407,12 @@
}
void *visit(single_resource_declaration_c *symbol) {
- /* A single resource never has global variables declared, so nothing to do! */
+ /* If the configuration does not have any resources, we must store/restore the declared program instances
+ * inside the backup() restore() functions created for the configuration.
+ */
+ generate_c_backup_resource_c handle_resource = generate_c_backup_resource_c(&s4o);
+ handle_resource.operation = func_to_call;
+ symbol->accept(handle_resource);
return NULL;
}
@@ -2298,76 +2420,6 @@
-/* generate the backup/restore function for a RESOURCE */
-/* the backup/restore function generated here will be called by the backup/restore
- * function generated for the configuration in which the resource is embedded
- */
-class generate_c_backup_resource_c: public generate_c_base_and_typeid_c {
- public:
- generate_c_backup_resource_c(stage4out_c *s4o_ptr)
- : generate_c_base_and_typeid_c(s4o_ptr) {
- };
-
- virtual ~generate_c_backup_resource_c(void) {}
-
-
- public:
- /********************/
- /* 2.1.6 - Pragmas */
- /********************/
- void *visit(enable_code_generation_pragma_c * symbol) {s4o.enable_output(); return NULL;}
- void *visit(disable_code_generation_pragma_c * symbol) {s4o.disable_output();return NULL;}
-
-
- /********************************/
- /* B 1.7 Configuration elements */
- /********************************/
- void *visit(resource_declaration_c *symbol) {
- if (symbol->global_var_declarations == NULL)
- return NULL;
-
- char *resource_name = strdup(symbol->resource_name->token->value);
- /* convert to upper case */
- for (char *c = resource_name; *c != '\0'; *c = toupper(*c), c++);
-
- generate_c_vardecl_c vardecl = generate_c_vardecl_c(&s4o,
- generate_c_vardecl_c::local_vf,
- generate_c_vardecl_c::global_vt,
- symbol->resource_name);
- s4o.print("\n\n\n");
-
- s4o.print("void ");
- s4o.print("_backup__");
- s4o.print("(void *varptr, int varsize, void **buffer, int *maxsize);\n");
- s4o.print("void ");
- s4o.print("_restore__");
- s4o.print("(void *varptr, int varsize, void **buffer, int *maxsize);\n");
-
- s4o.print("\n\n\n");
- s4o.print("#undef " DECLARE_GLOBAL "\n");
- s4o.print("#undef " DECLARE_GLOBAL_FB "\n");
- s4o.print("#undef " DECLARE_GLOBAL_LOCATION "\n");
- s4o.print("#undef " DECLARE_GLOBAL_LOCATED "\n");
-
- print_backup_restore_function_beg(s4o, resource_name, "_backup__");
- vardecl.print(symbol->global_var_declarations);
- print_backup_restore_function_end(s4o);
-
- print_backup_restore_function_beg(s4o, resource_name, "_restore__");
- vardecl.print(symbol->global_var_declarations);
- print_backup_restore_function_end(s4o);
-
- return NULL;
- }
-
- void *visit(single_resource_declaration_c *symbol) {
- /* A single resource never has global variables declared, so nothing to do! */
- return NULL;
- }
-
-};
-
-
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/