LCOV - code coverage report
Current view: top level - gcc/fortran - st.c (source / functions) Hit Total Coverage
Test: gcc.info Lines: 149 154 96.8 %
Date: 2020-03-28 11:57:23 Functions: 6 6 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* Build executable statement trees.
       2                 :            :    Copyright (C) 2000-2020 Free Software Foundation, Inc.
       3                 :            :    Contributed by Andy Vaught
       4                 :            : 
       5                 :            : This file is part of GCC.
       6                 :            : 
       7                 :            : GCC is free software; you can redistribute it and/or modify it under
       8                 :            : the terms of the GNU General Public License as published by the Free
       9                 :            : Software Foundation; either version 3, or (at your option) any later
      10                 :            : version.
      11                 :            : 
      12                 :            : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13                 :            : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14                 :            : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15                 :            : for more details.
      16                 :            : 
      17                 :            : You should have received a copy of the GNU General Public License
      18                 :            : along with GCC; see the file COPYING3.  If not see
      19                 :            : <http://www.gnu.org/licenses/>.  */
      20                 :            : 
      21                 :            : /* Executable statements are strung together into a singly linked list
      22                 :            :    of code structures.  These structures are later translated into GCC
      23                 :            :    GENERIC tree structures and from there to executable code for a
      24                 :            :    target.  */
      25                 :            : 
      26                 :            : #include "config.h"
      27                 :            : #include "system.h"
      28                 :            : #include "coretypes.h"
      29                 :            : #include "gfortran.h"
      30                 :            : 
      31                 :            : gfc_code new_st;
      32                 :            : 
      33                 :            : 
      34                 :            : /* Zeroes out the new_st structure.  */
      35                 :            : 
      36                 :            : void
      37                 :   16213300 : gfc_clear_new_st (void)
      38                 :            : {
      39                 :   16213300 :   memset (&new_st, '\0', sizeof (new_st));
      40                 :   16213300 :   new_st.op = EXEC_NOP;
      41                 :   16213300 : }
      42                 :            : 
      43                 :            : 
      44                 :            : /* Get a gfc_code structure, initialized with the current locus
      45                 :            :    and a statement code 'op'.  */
      46                 :            : 
      47                 :            : gfc_code *
      48                 :     314132 : gfc_get_code (gfc_exec_op op)
      49                 :            : {
      50                 :     314132 :   gfc_code *c;
      51                 :            : 
      52                 :     314132 :   c = XCNEW (gfc_code);
      53                 :     314132 :   c->op = op;
      54                 :     314132 :   c->loc = gfc_current_locus;
      55                 :     314132 :   return c;
      56                 :            : }
      57                 :            : 
      58                 :            : 
      59                 :            : /* Given some part of a gfc_code structure, append a set of code to
      60                 :            :    its tail, returning a pointer to the new tail.  */
      61                 :            : 
      62                 :            : gfc_code *
      63                 :      61730 : gfc_append_code (gfc_code *tail, gfc_code *new_code)
      64                 :            : {
      65                 :      61730 :   if (tail != NULL)
      66                 :            :     {
      67                 :      49436 :       while (tail->next != NULL)
      68                 :            :         tail = tail->next;
      69                 :            : 
      70                 :      37778 :       tail->next = new_code;
      71                 :            :     }
      72                 :            : 
      73                 :      62034 :   while (new_code->next != NULL)
      74                 :            :     new_code = new_code->next;
      75                 :            : 
      76                 :      61730 :   return new_code;
      77                 :            : }
      78                 :            : 
      79                 :            : 
      80                 :            : /* Free a single code structure, but not the actual structure itself.  */
      81                 :            : 
      82                 :            : void
      83                 :   15653500 : gfc_free_statement (gfc_code *p)
      84                 :            : {
      85                 :   15653500 :   if (p->expr1)
      86                 :     718280 :     gfc_free_expr (p->expr1);
      87                 :   15653500 :   if (p->expr2)
      88                 :     171553 :     gfc_free_expr (p->expr2);
      89                 :            : 
      90                 :   15653500 :   switch (p->op)
      91                 :            :     {
      92                 :            :     case EXEC_NOP:
      93                 :            :     case EXEC_END_BLOCK:
      94                 :            :     case EXEC_END_NESTED_BLOCK:
      95                 :            :     case EXEC_ASSIGN:
      96                 :            :     case EXEC_INIT_ASSIGN:
      97                 :            :     case EXEC_GOTO:
      98                 :            :     case EXEC_CYCLE:
      99                 :            :     case EXEC_RETURN:
     100                 :            :     case EXEC_END_PROCEDURE:
     101                 :            :     case EXEC_IF:
     102                 :            :     case EXEC_PAUSE:
     103                 :            :     case EXEC_STOP:
     104                 :            :     case EXEC_ERROR_STOP:
     105                 :            :     case EXEC_EXIT:
     106                 :            :     case EXEC_WHERE:
     107                 :            :     case EXEC_IOLENGTH:
     108                 :            :     case EXEC_POINTER_ASSIGN:
     109                 :            :     case EXEC_DO_WHILE:
     110                 :            :     case EXEC_CONTINUE:
     111                 :            :     case EXEC_TRANSFER:
     112                 :            :     case EXEC_LABEL_ASSIGN:
     113                 :            :     case EXEC_ENTRY:
     114                 :            :     case EXEC_ARITHMETIC_IF:
     115                 :            :     case EXEC_CRITICAL:
     116                 :            :     case EXEC_SYNC_ALL:
     117                 :            :     case EXEC_SYNC_IMAGES:
     118                 :            :     case EXEC_SYNC_MEMORY:
     119                 :            :     case EXEC_LOCK:
     120                 :            :     case EXEC_UNLOCK:
     121                 :            :     case EXEC_EVENT_POST:
     122                 :            :     case EXEC_EVENT_WAIT:
     123                 :            :     case EXEC_FAIL_IMAGE:
     124                 :            :     case EXEC_CHANGE_TEAM:
     125                 :            :     case EXEC_END_TEAM:
     126                 :            :     case EXEC_FORM_TEAM:
     127                 :            :     case EXEC_SYNC_TEAM:
     128                 :            :       break;
     129                 :            : 
     130                 :       7081 :     case EXEC_BLOCK:
     131                 :       7081 :       gfc_free_namespace (p->ext.block.ns);
     132                 :       7081 :       gfc_free_association_list (p->ext.block.assoc);
     133                 :       7081 :       break;
     134                 :            : 
     135                 :      53050 :     case EXEC_COMPCALL:
     136                 :      53050 :     case EXEC_CALL_PPC:
     137                 :      53050 :     case EXEC_CALL:
     138                 :      53050 :     case EXEC_ASSIGN_CALL:
     139                 :      53050 :       gfc_free_actual_arglist (p->ext.actual);
     140                 :      53050 :       break;
     141                 :            : 
     142                 :       7860 :     case EXEC_SELECT:
     143                 :       7860 :     case EXEC_SELECT_TYPE:
     144                 :       7860 :     case EXEC_SELECT_RANK:
     145                 :       7860 :       if (p->ext.block.case_list)
     146                 :       5098 :         gfc_free_case_list (p->ext.block.case_list);
     147                 :            :       break;
     148                 :            : 
     149                 :      58443 :     case EXEC_DO:
     150                 :      58443 :       gfc_free_iterator (p->ext.iterator, 1);
     151                 :      58443 :       break;
     152                 :            : 
     153                 :      15513 :     case EXEC_ALLOCATE:
     154                 :      15513 :     case EXEC_DEALLOCATE:
     155                 :      15513 :       gfc_free_alloc_list (p->ext.alloc.list);
     156                 :      15513 :       break;
     157                 :            : 
     158                 :       3468 :     case EXEC_OPEN:
     159                 :       3468 :       gfc_free_open (p->ext.open);
     160                 :       3468 :       break;
     161                 :            : 
     162                 :       2890 :     case EXEC_CLOSE:
     163                 :       2890 :       gfc_free_close (p->ext.close);
     164                 :       2890 :       break;
     165                 :            : 
     166                 :       2473 :     case EXEC_BACKSPACE:
     167                 :       2473 :     case EXEC_ENDFILE:
     168                 :       2473 :     case EXEC_REWIND:
     169                 :       2473 :     case EXEC_FLUSH:
     170                 :       2473 :       gfc_free_filepos (p->ext.filepos);
     171                 :       2473 :       break;
     172                 :            : 
     173                 :        800 :     case EXEC_INQUIRE:
     174                 :        800 :       gfc_free_inquire (p->ext.inquire);
     175                 :        800 :       break;
     176                 :            : 
     177                 :         58 :     case EXEC_WAIT:
     178                 :         58 :       gfc_free_wait (p->ext.wait);
     179                 :         58 :       break;
     180                 :            : 
     181                 :      51072 :     case EXEC_READ:
     182                 :      51072 :     case EXEC_WRITE:
     183                 :      51072 :       gfc_free_dt (p->ext.dt);
     184                 :      51072 :       break;
     185                 :            : 
     186                 :            :     case EXEC_DT_END:
     187                 :            :       /* The ext.dt member is a duplicate pointer and doesn't need to
     188                 :            :          be freed.  */
     189                 :            :       break;
     190                 :            : 
     191                 :       3971 :     case EXEC_DO_CONCURRENT:
     192                 :       3971 :     case EXEC_FORALL:
     193                 :       3971 :       gfc_free_forall_iterator (p->ext.forall_iterator);
     194                 :       3971 :       break;
     195                 :            : 
     196                 :         86 :     case EXEC_OACC_DECLARE:
     197                 :         86 :       if (p->ext.oacc_declare)
     198                 :         43 :         gfc_free_oacc_declare_clauses (p->ext.oacc_declare);
     199                 :            :       break;
     200                 :            : 
     201                 :      34195 :     case EXEC_OACC_PARALLEL_LOOP:
     202                 :      34195 :     case EXEC_OACC_PARALLEL:
     203                 :      34195 :     case EXEC_OACC_KERNELS_LOOP:
     204                 :      34195 :     case EXEC_OACC_KERNELS:
     205                 :      34195 :     case EXEC_OACC_SERIAL_LOOP:
     206                 :      34195 :     case EXEC_OACC_SERIAL:
     207                 :      34195 :     case EXEC_OACC_DATA:
     208                 :      34195 :     case EXEC_OACC_HOST_DATA:
     209                 :      34195 :     case EXEC_OACC_LOOP:
     210                 :      34195 :     case EXEC_OACC_UPDATE:
     211                 :      34195 :     case EXEC_OACC_WAIT:
     212                 :      34195 :     case EXEC_OACC_CACHE:
     213                 :      34195 :     case EXEC_OACC_ENTER_DATA:
     214                 :      34195 :     case EXEC_OACC_EXIT_DATA:
     215                 :      34195 :     case EXEC_OACC_ROUTINE:
     216                 :      34195 :     case EXEC_OMP_CANCEL:
     217                 :      34195 :     case EXEC_OMP_CANCELLATION_POINT:
     218                 :      34195 :     case EXEC_OMP_CRITICAL:
     219                 :      34195 :     case EXEC_OMP_DISTRIBUTE:
     220                 :      34195 :     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
     221                 :      34195 :     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
     222                 :      34195 :     case EXEC_OMP_DISTRIBUTE_SIMD:
     223                 :      34195 :     case EXEC_OMP_DO:
     224                 :      34195 :     case EXEC_OMP_DO_SIMD:
     225                 :      34195 :     case EXEC_OMP_END_SINGLE:
     226                 :      34195 :     case EXEC_OMP_ORDERED:
     227                 :      34195 :     case EXEC_OMP_PARALLEL:
     228                 :      34195 :     case EXEC_OMP_PARALLEL_DO:
     229                 :      34195 :     case EXEC_OMP_PARALLEL_DO_SIMD:
     230                 :      34195 :     case EXEC_OMP_PARALLEL_SECTIONS:
     231                 :      34195 :     case EXEC_OMP_PARALLEL_WORKSHARE:
     232                 :      34195 :     case EXEC_OMP_SECTIONS:
     233                 :      34195 :     case EXEC_OMP_SIMD:
     234                 :      34195 :     case EXEC_OMP_SINGLE:
     235                 :      34195 :     case EXEC_OMP_TARGET:
     236                 :      34195 :     case EXEC_OMP_TARGET_DATA:
     237                 :      34195 :     case EXEC_OMP_TARGET_ENTER_DATA:
     238                 :      34195 :     case EXEC_OMP_TARGET_EXIT_DATA:
     239                 :      34195 :     case EXEC_OMP_TARGET_PARALLEL:
     240                 :      34195 :     case EXEC_OMP_TARGET_PARALLEL_DO:
     241                 :      34195 :     case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
     242                 :      34195 :     case EXEC_OMP_TARGET_SIMD:
     243                 :      34195 :     case EXEC_OMP_TARGET_TEAMS:
     244                 :      34195 :     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
     245                 :      34195 :     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
     246                 :      34195 :     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
     247                 :      34195 :     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
     248                 :      34195 :     case EXEC_OMP_TARGET_UPDATE:
     249                 :      34195 :     case EXEC_OMP_TASK:
     250                 :      34195 :     case EXEC_OMP_TASKLOOP:
     251                 :      34195 :     case EXEC_OMP_TASKLOOP_SIMD:
     252                 :      34195 :     case EXEC_OMP_TEAMS:
     253                 :      34195 :     case EXEC_OMP_TEAMS_DISTRIBUTE:
     254                 :      34195 :     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
     255                 :      34195 :     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
     256                 :      34195 :     case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
     257                 :      34195 :     case EXEC_OMP_WORKSHARE:
     258                 :      34195 :       gfc_free_omp_clauses (p->ext.omp_clauses);
     259                 :      34195 :       break;
     260                 :            : 
     261                 :          0 :     case EXEC_OMP_END_CRITICAL:
     262                 :          0 :       free (CONST_CAST (char *, p->ext.omp_name));
     263                 :          0 :       break;
     264                 :            : 
     265                 :         63 :     case EXEC_OMP_FLUSH:
     266                 :         63 :       gfc_free_omp_namelist (p->ext.omp_namelist);
     267                 :         63 :       break;
     268                 :            : 
     269                 :            :     case EXEC_OACC_ATOMIC:
     270                 :            :     case EXEC_OMP_ATOMIC:
     271                 :            :     case EXEC_OMP_BARRIER:
     272                 :            :     case EXEC_OMP_MASTER:
     273                 :            :     case EXEC_OMP_END_NOWAIT:
     274                 :            :     case EXEC_OMP_TASKGROUP:
     275                 :            :     case EXEC_OMP_TASKWAIT:
     276                 :            :     case EXEC_OMP_TASKYIELD:
     277                 :            :       break;
     278                 :            : 
     279                 :          0 :     default:
     280                 :          0 :       gfc_internal_error ("gfc_free_statement(): Bad statement");
     281                 :            :     }
     282                 :   15653500 : }
     283                 :            : 
     284                 :            : 
     285                 :            : /* Free a code statement and all other code structures linked to it.  */
     286                 :            : 
     287                 :            : void
     288                 :   29908300 : gfc_free_statements (gfc_code *p)
     289                 :            : {
     290                 :   30858200 :   gfc_code *q;
     291                 :            : 
     292                 :   30858200 :   for (; p; p = q)
     293                 :            :     {
     294                 :     949889 :       q = p->next;
     295                 :            : 
     296                 :     949889 :       if (p->block)
     297                 :     225479 :         gfc_free_statements (p->block);
     298                 :     949889 :       gfc_free_statement (p);
     299                 :     949889 :       free (p);
     300                 :            :     }
     301                 :   29908300 : }
     302                 :            : 
     303                 :            : 
     304                 :            : /* Free an association list (of an ASSOCIATE statement).  */
     305                 :            : 
     306                 :            : void
     307                 :      10774 : gfc_free_association_list (gfc_association_list* assoc)
     308                 :            : {
     309                 :      10774 :   if (!assoc)
     310                 :            :     return;
     311                 :            : 
     312                 :       3681 :   gfc_free_association_list (assoc->next);
     313                 :       3681 :   free (assoc);
     314                 :            : }

Generated by: LCOV version 1.0

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto --enable-host-shared. GCC test suite is run with the built compiler.