stage4/generate_c/generate_location_list.cc
author Mario de Sousa <msousa@fe.up.pt>
Fri, 20 Apr 2018 17:38:09 +0100
changeset 1071 7fd69f29320a
parent 718 a9f8cc778444
permissions -rw-r--r--
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     1
/*
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     3
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     4
 *  Copyright (C) 2003-2011  Mario de Sousa (msousa@fe.up.pt)
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     5
 *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     6
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     7
 *  This program is free software: you can redistribute it and/or modify
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     8
 *  it under the terms of the GNU General Public License as published by
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     9
 *  the Free Software Foundation, either version 3 of the License, or
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    10
 *  (at your option) any later version.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    11
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    12
 *  This program is distributed in the hope that it will be useful,
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    15
 *  GNU General Public License for more details.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    16
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    17
 *  You should have received a copy of the GNU General Public License
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    18
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    19
 *
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    20
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    21
 * This code is made available on the understanding that it will not be
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    22
 * used in safety-critical situations without a full and competent review.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    23
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    24
185
39c23046dad6 Newer versions of g++ require access controls to be correct!
mario
parents: 70
diff changeset
    25
class generate_location_list_c: public iterator_visitor_c {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    26
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    27
  protected:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    28
    stage4out_c &s4o;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    29
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    30
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    31
    symbol_c *current_var_type_symbol;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    32
    generate_c_base_c *generate_c_base;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    33
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    34
  public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    35
    generate_location_list_c(stage4out_c *s4o_ptr): s4o(*s4o_ptr) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    36
      generate_c_base = new generate_c_base_c(s4o_ptr);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    37
      current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    38
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    39
    ~generate_location_list_c(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    40
      delete generate_c_base;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    41
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    42
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    43
    bool test_location_type(symbol_c *direct_variable) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    44
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    45
      token_c *location = dynamic_cast<token_c *>(direct_variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    46
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    47
      if (location == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    48
        /* invalid identifiers... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    49
        return false;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    50
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    51
      switch (location->value[2]) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    52
        case 'X': // bit
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    53
          if (typeid(*current_var_type_symbol) == typeid(bool_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    54
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    55
        case 'B': // Byte, 8 bits
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    56
          if (typeid(*current_var_type_symbol) == typeid(sint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    57
          if (typeid(*current_var_type_symbol) == typeid(usint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    58
          if (typeid(*current_var_type_symbol) == typeid(string_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    59
          if (typeid(*current_var_type_symbol) == typeid(byte_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    60
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    61
        case 'W': // Word, 16 bits
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    62
          if (typeid(*current_var_type_symbol) == typeid(int_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    63
          if (typeid(*current_var_type_symbol) == typeid(uint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    64
          if (typeid(*current_var_type_symbol) == typeid(word_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    65
          if (typeid(*current_var_type_symbol) == typeid(wstring_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    66
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    67
        case 'D': // Double, 32 bits
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    68
          if (typeid(*current_var_type_symbol) == typeid(dint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    69
          if (typeid(*current_var_type_symbol) == typeid(udint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    70
          if (typeid(*current_var_type_symbol) == typeid(real_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    71
          if (typeid(*current_var_type_symbol) == typeid(dword_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    72
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    73
        case 'L': // Long, 64 bits
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    74
          if (typeid(*current_var_type_symbol) == typeid(lint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    75
          if (typeid(*current_var_type_symbol) == typeid(ulint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    76
          if (typeid(*current_var_type_symbol) == typeid(lreal_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    77
          if (typeid(*current_var_type_symbol) == typeid(lword_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    78
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    79
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    80
          if (typeid(*current_var_type_symbol) == typeid(bool_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    81
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    82
      return false;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    83
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    84
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    85
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    86
/* B.1.4.1   Directly Represented Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    87
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    88
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    89
    void *visit(direct_variable_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    90
      if (current_var_type_symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    91
        s4o.print("__LOCATED_VAR(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    92
        current_var_type_symbol->accept(*generate_c_base);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    93
        s4o.print(",");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    94
        /* Do not use print_token() as it will change everything into uppercase */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    95
        s4o.printlocation((symbol->value)+1);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    96
        s4o.print(",");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    97
        s4o.printlocation_comasep((symbol->value)+1);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    98
        s4o.print(")\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    99
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   100
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   101
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   102
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   103
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   104
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   105
/* B.1.4.3   Declaration and initilization  */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   106
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   107
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   108
/*  [variable_name] location ':' located_var_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   109
/* variable_name -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   110
//SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   111
    void *visit(located_var_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   112
        current_var_type_symbol = spec_init_sperator_c::get_spec(symbol->located_var_spec_init);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   113
        if (current_var_type_symbol == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   114
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   115
        
718
a9f8cc778444 Make search_base_type_c a singleton!
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   116
        current_var_type_symbol = search_base_type_c::get_basetype_decl(current_var_type_symbol);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   117
        if (current_var_type_symbol == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   118
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   119
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   120
        symbol->location->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   121
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   122
        current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   123
        return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   124
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   125
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   126
/*| global_var_spec ':' [located_var_spec_init|function_block_type_name] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   127
/* type_specification ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   128
//SYM_REF2(global_var_decl_c, global_var_spec, type_specification)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   129
    void *visit(global_var_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   130
        current_var_type_symbol = spec_init_sperator_c::get_spec(symbol->type_specification);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   131
        if (current_var_type_symbol == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   132
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   133
        
718
a9f8cc778444 Make search_base_type_c a singleton!
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   134
        current_var_type_symbol = search_base_type_c::get_basetype_decl(current_var_type_symbol);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   135
        if (current_var_type_symbol == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   136
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   137
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   138
        symbol->global_var_spec->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   139
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   140
        current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   141
        return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   142
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   143
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   144
/*  AT direct_variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   145
//SYM_REF2(location_c, direct_variable, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   146
    void *visit(location_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   147
      if (test_location_type(symbol->direct_variable))
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   148
        symbol->direct_variable->accept(*this); 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   149
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   150
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   151
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   152
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   153
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   154
}; /* generate_location_list_c */