stage4/generate_c/generate_c.cc
changeset 1071 7fd69f29320a
parent 1061 f762b43c8fad
child 1072 2dc67df52e59
--- 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;
-    }
-
-};
-
-
 /***********************************************************************/
 /***********************************************************************/
 /***********************************************************************/