LCOV - code coverage report
Current view: top level - gcc/fortran - st.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 98.9 % 181 179
Test Date: 2024-07-13 14:16:58 Functions: 100.0 % 6 6
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-2024 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                 :    26847671 : gfc_clear_new_st (void)
      38                 :             : {
      39                 :    26847671 :   memset (&new_st, '\0', sizeof (new_st));
      40                 :    26847671 :   new_st.op = EXEC_NOP;
      41                 :    26847671 : }
      42                 :             : 
      43                 :             : 
      44                 :             : /* Get a gfc_code structure, initialized with the current locus
      45                 :             :    and a statement code 'op'.  */
      46                 :             : 
      47                 :             : gfc_code *
      48                 :      428002 : gfc_get_code (gfc_exec_op op)
      49                 :             : {
      50                 :      428002 :   gfc_code *c;
      51                 :             : 
      52                 :      428002 :   c = XCNEW (gfc_code);
      53                 :      428002 :   c->op = op;
      54                 :      428002 :   c->loc = gfc_current_locus;
      55                 :      428002 :   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                 :       75721 : gfc_append_code (gfc_code *tail, gfc_code *new_code)
      64                 :             : {
      65                 :       75721 :   if (tail != NULL)
      66                 :             :     {
      67                 :       62891 :       while (tail->next != NULL)
      68                 :             :         tail = tail->next;
      69                 :             : 
      70                 :       47046 :       tail->next = new_code;
      71                 :             :     }
      72                 :             : 
      73                 :       76232 :   while (new_code->next != NULL)
      74                 :             :     new_code = new_code->next;
      75                 :             : 
      76                 :       75721 :   return new_code;
      77                 :             : }
      78                 :             : 
      79                 :             : 
      80                 :             : /* Free a single code structure, but not the actual structure itself.  */
      81                 :             : 
      82                 :             : void
      83                 :    26098173 : gfc_free_statement (gfc_code *p)
      84                 :             : {
      85                 :    26098173 :   if (p->expr1)
      86                 :      980542 :     gfc_free_expr (p->expr1);
      87                 :    26098173 :   if (p->expr2)
      88                 :      219198 :     gfc_free_expr (p->expr2);
      89                 :             : 
      90                 :    26098173 :   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                 :       13171 :     case EXEC_BLOCK:
     131                 :       13171 :       gfc_free_namespace (p->ext.block.ns);
     132                 :       13171 :       gfc_free_association_list (p->ext.block.assoc);
     133                 :       13171 :       break;
     134                 :             : 
     135                 :       77250 :     case EXEC_COMPCALL:
     136                 :       77250 :     case EXEC_CALL_PPC:
     137                 :       77250 :     case EXEC_CALL:
     138                 :       77250 :     case EXEC_ASSIGN_CALL:
     139                 :       77250 :       gfc_free_actual_arglist (p->ext.actual);
     140                 :       77250 :       break;
     141                 :             : 
     142                 :       14013 :     case EXEC_SELECT:
     143                 :       14013 :     case EXEC_SELECT_TYPE:
     144                 :       14013 :     case EXEC_SELECT_RANK:
     145                 :       14013 :       if (p->ext.block.case_list)
     146                 :        9185 :         gfc_free_case_list (p->ext.block.case_list);
     147                 :             :       break;
     148                 :             : 
     149                 :       76839 :     case EXEC_DO:
     150                 :       76839 :       gfc_free_iterator (p->ext.iterator, 1);
     151                 :       76839 :       break;
     152                 :             : 
     153                 :       20458 :     case EXEC_ALLOCATE:
     154                 :       20458 :     case EXEC_DEALLOCATE:
     155                 :       20458 :       gfc_free_alloc_list (p->ext.alloc.list);
     156                 :       20458 :       break;
     157                 :             : 
     158                 :        3821 :     case EXEC_OPEN:
     159                 :        3821 :       gfc_free_open (p->ext.open);
     160                 :        3821 :       break;
     161                 :             : 
     162                 :        3044 :     case EXEC_CLOSE:
     163                 :        3044 :       gfc_free_close (p->ext.close);
     164                 :        3044 :       break;
     165                 :             : 
     166                 :        2608 :     case EXEC_BACKSPACE:
     167                 :        2608 :     case EXEC_ENDFILE:
     168                 :        2608 :     case EXEC_REWIND:
     169                 :        2608 :     case EXEC_FLUSH:
     170                 :        2608 :       gfc_free_filepos (p->ext.filepos);
     171                 :        2608 :       break;
     172                 :             : 
     173                 :         817 :     case EXEC_INQUIRE:
     174                 :         817 :       gfc_free_inquire (p->ext.inquire);
     175                 :         817 :       break;
     176                 :             : 
     177                 :          89 :     case EXEC_WAIT:
     178                 :          89 :       gfc_free_wait (p->ext.wait);
     179                 :          89 :       break;
     180                 :             : 
     181                 :       61180 :     case EXEC_READ:
     182                 :       61180 :     case EXEC_WRITE:
     183                 :       61180 :       gfc_free_dt (p->ext.dt);
     184                 :       61180 :       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                 :        4072 :     case EXEC_DO_CONCURRENT:
     192                 :        4072 :     case EXEC_FORALL:
     193                 :        4072 :       gfc_free_forall_iterator (p->ext.forall_iterator);
     194                 :        4072 :       break;
     195                 :             : 
     196                 :         146 :     case EXEC_OACC_DECLARE:
     197                 :         146 :       if (p->ext.oacc_declare)
     198                 :          73 :         gfc_free_oacc_declare_clauses (p->ext.oacc_declare);
     199                 :             :       break;
     200                 :             : 
     201                 :       55930 :     case EXEC_OACC_ATOMIC:
     202                 :       55930 :     case EXEC_OACC_PARALLEL_LOOP:
     203                 :       55930 :     case EXEC_OACC_PARALLEL:
     204                 :       55930 :     case EXEC_OACC_KERNELS_LOOP:
     205                 :       55930 :     case EXEC_OACC_KERNELS:
     206                 :       55930 :     case EXEC_OACC_SERIAL_LOOP:
     207                 :       55930 :     case EXEC_OACC_SERIAL:
     208                 :       55930 :     case EXEC_OACC_DATA:
     209                 :       55930 :     case EXEC_OACC_HOST_DATA:
     210                 :       55930 :     case EXEC_OACC_LOOP:
     211                 :       55930 :     case EXEC_OACC_UPDATE:
     212                 :       55930 :     case EXEC_OACC_WAIT:
     213                 :       55930 :     case EXEC_OACC_CACHE:
     214                 :       55930 :     case EXEC_OACC_ENTER_DATA:
     215                 :       55930 :     case EXEC_OACC_EXIT_DATA:
     216                 :       55930 :     case EXEC_OACC_ROUTINE:
     217                 :       55930 :     case EXEC_OMP_ALLOCATE:
     218                 :       55930 :     case EXEC_OMP_ALLOCATORS:
     219                 :       55930 :     case EXEC_OMP_ASSUME:
     220                 :       55930 :     case EXEC_OMP_ATOMIC:
     221                 :       55930 :     case EXEC_OMP_CANCEL:
     222                 :       55930 :     case EXEC_OMP_CANCELLATION_POINT:
     223                 :       55930 :     case EXEC_OMP_CRITICAL:
     224                 :       55930 :     case EXEC_OMP_DEPOBJ:
     225                 :       55930 :     case EXEC_OMP_DISTRIBUTE:
     226                 :       55930 :     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
     227                 :       55930 :     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
     228                 :       55930 :     case EXEC_OMP_DISTRIBUTE_SIMD:
     229                 :       55930 :     case EXEC_OMP_DO:
     230                 :       55930 :     case EXEC_OMP_DO_SIMD:
     231                 :       55930 :     case EXEC_OMP_ERROR:
     232                 :       55930 :     case EXEC_OMP_LOOP:
     233                 :       55930 :     case EXEC_OMP_END_SINGLE:
     234                 :       55930 :     case EXEC_OMP_MASKED_TASKLOOP:
     235                 :       55930 :     case EXEC_OMP_MASKED_TASKLOOP_SIMD:
     236                 :       55930 :     case EXEC_OMP_MASTER_TASKLOOP:
     237                 :       55930 :     case EXEC_OMP_MASTER_TASKLOOP_SIMD:
     238                 :       55930 :     case EXEC_OMP_ORDERED:
     239                 :       55930 :     case EXEC_OMP_MASKED:
     240                 :       55930 :     case EXEC_OMP_PARALLEL:
     241                 :       55930 :     case EXEC_OMP_PARALLEL_DO:
     242                 :       55930 :     case EXEC_OMP_PARALLEL_DO_SIMD:
     243                 :       55930 :     case EXEC_OMP_PARALLEL_LOOP:
     244                 :       55930 :     case EXEC_OMP_PARALLEL_MASKED:
     245                 :       55930 :     case EXEC_OMP_PARALLEL_MASKED_TASKLOOP:
     246                 :       55930 :     case EXEC_OMP_PARALLEL_MASKED_TASKLOOP_SIMD:
     247                 :       55930 :     case EXEC_OMP_PARALLEL_MASTER:
     248                 :       55930 :     case EXEC_OMP_PARALLEL_MASTER_TASKLOOP:
     249                 :       55930 :     case EXEC_OMP_PARALLEL_MASTER_TASKLOOP_SIMD:
     250                 :       55930 :     case EXEC_OMP_PARALLEL_SECTIONS:
     251                 :       55930 :     case EXEC_OMP_PARALLEL_WORKSHARE:
     252                 :       55930 :     case EXEC_OMP_SCAN:
     253                 :       55930 :     case EXEC_OMP_SCOPE:
     254                 :       55930 :     case EXEC_OMP_SECTIONS:
     255                 :       55930 :     case EXEC_OMP_SIMD:
     256                 :       55930 :     case EXEC_OMP_SINGLE:
     257                 :       55930 :     case EXEC_OMP_TARGET:
     258                 :       55930 :     case EXEC_OMP_TARGET_DATA:
     259                 :       55930 :     case EXEC_OMP_TARGET_ENTER_DATA:
     260                 :       55930 :     case EXEC_OMP_TARGET_EXIT_DATA:
     261                 :       55930 :     case EXEC_OMP_TARGET_PARALLEL:
     262                 :       55930 :     case EXEC_OMP_TARGET_PARALLEL_DO:
     263                 :       55930 :     case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
     264                 :       55930 :     case EXEC_OMP_TARGET_PARALLEL_LOOP:
     265                 :       55930 :     case EXEC_OMP_TARGET_SIMD:
     266                 :       55930 :     case EXEC_OMP_TARGET_TEAMS:
     267                 :       55930 :     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
     268                 :       55930 :     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
     269                 :       55930 :     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
     270                 :       55930 :     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
     271                 :       55930 :     case EXEC_OMP_TARGET_TEAMS_LOOP:
     272                 :       55930 :     case EXEC_OMP_TARGET_UPDATE:
     273                 :       55930 :     case EXEC_OMP_TASK:
     274                 :       55930 :     case EXEC_OMP_TASKLOOP:
     275                 :       55930 :     case EXEC_OMP_TASKLOOP_SIMD:
     276                 :       55930 :     case EXEC_OMP_TEAMS:
     277                 :       55930 :     case EXEC_OMP_TEAMS_DISTRIBUTE:
     278                 :       55930 :     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
     279                 :       55930 :     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
     280                 :       55930 :     case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
     281                 :       55930 :     case EXEC_OMP_TEAMS_LOOP:
     282                 :       55930 :     case EXEC_OMP_TILE:
     283                 :       55930 :     case EXEC_OMP_UNROLL:
     284                 :       55930 :     case EXEC_OMP_WORKSHARE:
     285                 :       55930 :       gfc_free_omp_clauses (p->ext.omp_clauses);
     286                 :       55930 :       break;
     287                 :             : 
     288                 :           3 :     case EXEC_OMP_END_CRITICAL:
     289                 :           3 :       free (CONST_CAST (char *, p->ext.omp_name));
     290                 :           3 :       break;
     291                 :             : 
     292                 :          77 :     case EXEC_OMP_FLUSH:
     293                 :          77 :       gfc_free_omp_namelist (p->ext.omp_namelist, false, false, false);
     294                 :          77 :       break;
     295                 :             : 
     296                 :             :     case EXEC_OMP_BARRIER:
     297                 :             :     case EXEC_OMP_MASTER:
     298                 :             :     case EXEC_OMP_END_NOWAIT:
     299                 :             :     case EXEC_OMP_TASKGROUP:
     300                 :             :     case EXEC_OMP_TASKWAIT:
     301                 :             :     case EXEC_OMP_TASKYIELD:
     302                 :             :       break;
     303                 :             : 
     304                 :           0 :     default:
     305                 :           0 :       gfc_internal_error ("gfc_free_statement(): Bad statement");
     306                 :             :     }
     307                 :    26098173 : }
     308                 :             : 
     309                 :             : 
     310                 :             : /* Free a code statement and all other code structures linked to it.  */
     311                 :             : 
     312                 :             : void
     313                 :    50362785 : gfc_free_statements (gfc_code *p)
     314                 :             : {
     315                 :    50362785 :   gfc_code *q;
     316                 :             : 
     317                 :    51660951 :   for (; p; p = q)
     318                 :             :     {
     319                 :     1298166 :       q = p->next;
     320                 :             : 
     321                 :     1298166 :       if (p->block)
     322                 :      314705 :         gfc_free_statements (p->block);
     323                 :     1298166 :       gfc_free_statement (p);
     324                 :     1298166 :       free (p);
     325                 :             :     }
     326                 :    50362785 : }
     327                 :             : 
     328                 :             : 
     329                 :             : /* Free an association list (of an ASSOCIATE statement).  */
     330                 :             : 
     331                 :             : void
     332                 :       19869 : gfc_free_association_list (gfc_association_list* assoc)
     333                 :             : {
     334                 :       19869 :   if (!assoc)
     335                 :             :     return;
     336                 :             : 
     337                 :        6686 :   gfc_free_association_list (assoc->next);
     338                 :        6686 :   free (assoc);
     339                 :             : }
        

Generated by: LCOV version 2.1-beta

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,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.