stage4/generate_c/generate_location_list.cc
author Andrey Skvortsov <andrej.skvortzov@gmail.com>
Sun, 14 Oct 2018 20:14:13 +0300
changeset 1073 24ef30a9bcee
parent 718 a9f8cc778444
permissions -rw-r--r--
revert commits improved performance of some extensible Standard Functions (ADD, MUL, AND, OR, XOR)

Following commits are reverted:
mjsousa 0b275a2 improve performance of some extensible Standard Functions (ADD, MUL, AND, OR, XOR) -- increase hardcoded limit to 499
mjsousa 2228799 improve performance of some extensible Standard Functions (ADD, MUL, AND, OR, XOR) -- Add comments!!
mjsousa ce81fa6 improve performance of some extensible Standard Functions (ADD, MUL, AND, OR, XOR)"

The reason is that they cause regression in some cases (if function is
used as argument for function block, for example) and this is not
fixed for a long time.
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 */